Files
openvino/ngraph/python/src/pyngraph/node_factory.cpp
T
Ivan Tikhonov b792214d04 Fix python API for Loop/TensorIterator/Assign/ReadValue operations (#3275)
* update python API for the Loop operation (attempt 1)

* fix code style

* update visitor API, pep8

* codestyle

* delete TensorItertorBuilder

* update visitor API for Loop and TensorIterator

* fix code issues (python)

* update python api:assign/read value

* fix unit tests

* fix python code style

* fix loop unit test

* fix loop unit test

* fix build on centOS
2021-03-11 13:22:24 +03:00

117 lines
4.0 KiB
C++

//*****************************************************************************
// Copyright 2017-2021 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//*****************************************************************************
#include <algorithm>
#include <cctype>
#include <functional>
#include <locale>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <pybind11/numpy.h>
#include <pybind11/stl.h>
#include "dict_attribute_visitor.hpp"
#include "ngraph/check.hpp"
#include "ngraph/except.hpp"
#include "ngraph/node.hpp"
#include "ngraph/op/util/op_types.hpp"
#include "ngraph/op/util/variable.hpp"
#include "ngraph/opsets/opset.hpp"
#include "node_factory.hpp"
namespace py = pybind11;
namespace
{
class NodeFactory
{
public:
NodeFactory() {}
NodeFactory(const std::string& opset_name)
: m_opset(get_opset(opset_name))
{
}
std::shared_ptr<ngraph::Node> create(const std::string op_type_name,
const ngraph::OutputVector& arguments,
const py::dict& attributes = py::dict())
{
std::shared_ptr<ngraph::Node> op_node =
std::shared_ptr<ngraph::Node>(m_opset.create(op_type_name));
NGRAPH_CHECK(op_node != nullptr, "Couldn't create operator: ", op_type_name);
NGRAPH_CHECK(!ngraph::op::is_constant(op_node),
"Currently NodeFactory doesn't support Constant node: ",
op_type_name);
util::DictAttributeDeserializer visitor(attributes, m_variables);
op_node->set_arguments(arguments);
op_node->visit_attributes(visitor);
op_node->constructor_validate_and_infer_types();
return op_node;
}
private:
const ngraph::OpSet& get_opset(std::string opset_ver)
{
std::locale loc;
std::transform(opset_ver.begin(), opset_ver.end(), opset_ver.begin(), [&loc](char c) {
return std::tolower(c, loc);
});
using OpsetFunction = std::function<const ngraph::OpSet&()>;
static const std::map<std::string, OpsetFunction> s_opsets{
{"opset1", OpsetFunction(ngraph::get_opset1)},
{"opset2", OpsetFunction(ngraph::get_opset2)},
{"opset3", OpsetFunction(ngraph::get_opset3)},
{"opset4", OpsetFunction(ngraph::get_opset4)},
{"opset5", OpsetFunction(ngraph::get_opset5)},
{"opset6", OpsetFunction(ngraph::get_opset6)},
{"opset7", OpsetFunction(ngraph::get_opset7)},
};
auto it = s_opsets.find(opset_ver);
if (it == s_opsets.end())
{
throw ngraph::ngraph_error("Unsupported opset version requested.");
}
return it->second();
}
const ngraph::OpSet& m_opset = ngraph::get_opset7();
std::unordered_map<std::string, std::shared_ptr<ngraph::Variable>> m_variables;
};
} // namespace
void regclass_pyngraph_NodeFactory(py::module m)
{
py::class_<NodeFactory> node_factory(m, "NodeFactory");
node_factory.doc() = "NodeFactory creates nGraph nodes";
node_factory.def(py::init());
node_factory.def(py::init<std::string>());
node_factory.def("create", &NodeFactory::create);
node_factory.def("__repr__", [](const NodeFactory& self) { return "<NodeFactory>"; });
}