From fcd95f2169f537263d29732d8e9c866c08cee8b6 Mon Sep 17 00:00:00 2001 From: Anastasia Kuporosova Date: Tue, 17 Jan 2023 20:53:13 +0100 Subject: [PATCH] [PyOV] Move py_object_to_any under namespace (#15147) * [PyOV] Move py_object_to_any under namespace * remove inline * codestyle * fix frontend --- .../src/pyopenvino/core/compiled_model.cpp | 2 +- .../python/src/pyopenvino/core/core.cpp | 4 +- .../src/pyopenvino/frontend/extension.cpp | 4 +- .../pyopenvino/frontend/frontend_module.cmake | 2 +- .../pyopenvino/frontend/onnx/extension.cpp | 6 +- .../frontend/tensorflow/extension.cpp | 4 +- .../python/src/pyopenvino/graph/any.cpp | 6 +- .../python/src/pyopenvino/graph/model.cpp | 4 +- .../python/src/pyopenvino/utils/utils.cpp | 77 ++++++++++++++++++- .../python/src/pyopenvino/utils/utils.hpp | 76 +----------------- .../{test_function.py => test_model.py} | 0 11 files changed, 94 insertions(+), 91 deletions(-) rename src/bindings/python/tests/test_runtime/{test_function.py => test_model.py} (100%) diff --git a/src/bindings/python/src/pyopenvino/core/compiled_model.cpp b/src/bindings/python/src/pyopenvino/core/compiled_model.cpp index 1b4d887c3e5..e2fd048ec6e 100644 --- a/src/bindings/python/src/pyopenvino/core/compiled_model.cpp +++ b/src/bindings/python/src/pyopenvino/core/compiled_model.cpp @@ -135,7 +135,7 @@ void regclass_CompiledModel(py::module m) { cls.def( "set_property", [](ov::CompiledModel& self, const std::pair& property) { - ov::AnyMap _properties{{property.first, py_object_to_any(property.second)}}; + ov::AnyMap _properties{{property.first, Common::utils::py_object_to_any(property.second)}}; self.set_property(_properties); }, py::arg("property"), diff --git a/src/bindings/python/src/pyopenvino/core/core.cpp b/src/bindings/python/src/pyopenvino/core/core.cpp index f64ad90b8ea..218a342e86a 100644 --- a/src/bindings/python/src/pyopenvino/core/core.cpp +++ b/src/bindings/python/src/pyopenvino/core/core.cpp @@ -47,7 +47,7 @@ void regclass_Core(py::module m) { cls.def( "set_property", [](ov::Core& self, const std::pair& property) { - ov::AnyMap _properties{{property.first, py_object_to_any(property.second)}}; + ov::AnyMap _properties{{property.first, Common::utils::py_object_to_any(property.second)}}; self.set_property(_properties); }, py::arg("property"), @@ -78,7 +78,7 @@ void regclass_Core(py::module m) { cls.def( "set_property", [](ov::Core& self, const std::string& device_name, const std::pair& property) { - ov::AnyMap _properties{{property.first, py_object_to_any(property.second)}}; + ov::AnyMap _properties{{property.first, Common::utils::py_object_to_any(property.second)}}; self.set_property(device_name, _properties); }, py::arg("device_name"), diff --git a/src/bindings/python/src/pyopenvino/frontend/extension.cpp b/src/bindings/python/src/pyopenvino/frontend/extension.cpp index 34bacd2355f..72b18d58f74 100644 --- a/src/bindings/python/src/pyopenvino/frontend/extension.cpp +++ b/src/bindings/python/src/pyopenvino/frontend/extension.cpp @@ -117,7 +117,7 @@ void regclass_frontend_OpExtension(py::module m) { const std::map& attr_values_map) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(fw_type_name, attr_names_map, any_map); }), @@ -131,7 +131,7 @@ void regclass_frontend_OpExtension(py::module m) { const std::map& attr_values_map) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(ov_type_name, fw_type_name, attr_names_map, any_map); diff --git a/src/bindings/python/src/pyopenvino/frontend/frontend_module.cmake b/src/bindings/python/src/pyopenvino/frontend/frontend_module.cmake index b2d3e175f7c..33aaa10a6b3 100644 --- a/src/bindings/python/src/pyopenvino/frontend/frontend_module.cmake +++ b/src/bindings/python/src/pyopenvino/frontend/frontend_module.cmake @@ -14,7 +14,7 @@ function(frontend_module TARGET FRAMEWORK INSTALL_COMPONENT) set(CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY ${PYTHON_BRIDGE_OUTPUT_DIRECTORY}/frontend/${FRAMEWORK}) set(CMAKE_PDB_OUTPUT_DIRECTORY ${PYTHON_BRIDGE_OUTPUT_DIRECTORY}/frontend/${FRAMEWORK}) - file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp) + file(GLOB SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp ${OpenVINOPython_SOURCE_DIR}/src/pyopenvino/utils/utils.cpp) # create target diff --git a/src/bindings/python/src/pyopenvino/frontend/onnx/extension.cpp b/src/bindings/python/src/pyopenvino/frontend/onnx/extension.cpp index 46a75898174..38556621986 100644 --- a/src/bindings/python/src/pyopenvino/frontend/onnx/extension.cpp +++ b/src/bindings/python/src/pyopenvino/frontend/onnx/extension.cpp @@ -62,7 +62,7 @@ void regclass_frontend_onnx_OpExtension(py::module m) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(fw_type_name, attr_names_map, any_map); }), py::arg("fw_type_name"), @@ -76,7 +76,7 @@ void regclass_frontend_onnx_OpExtension(py::module m) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(ov_type_name, fw_type_name, attr_names_map, any_map); }), @@ -93,7 +93,7 @@ void regclass_frontend_onnx_OpExtension(py::module m) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(ov_type_name, fw_type_name, fw_domain, attr_names_map, any_map); }), diff --git a/src/bindings/python/src/pyopenvino/frontend/tensorflow/extension.cpp b/src/bindings/python/src/pyopenvino/frontend/tensorflow/extension.cpp index 3df3af68b00..96326859b19 100644 --- a/src/bindings/python/src/pyopenvino/frontend/tensorflow/extension.cpp +++ b/src/bindings/python/src/pyopenvino/frontend/tensorflow/extension.cpp @@ -54,7 +54,7 @@ void regclass_frontend_tensorflow_OpExtension(py::module m) { const std::map& attr_values_map) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(fw_type_name, attr_names_map, any_map); }), py::arg("fw_type_name"), @@ -67,7 +67,7 @@ void regclass_frontend_tensorflow_OpExtension(py::module m) { const std::map& attr_values_map) { std::map any_map; for (const auto& it : attr_values_map) { - any_map[it.first] = py_object_to_any(it.second); + any_map[it.first] = Common::utils::py_object_to_any(it.second); } return std::make_shared>(ov_type_name, fw_type_name, attr_names_map, any_map); }), diff --git a/src/bindings/python/src/pyopenvino/graph/any.cpp b/src/bindings/python/src/pyopenvino/graph/any.cpp index bc4bae7a1ff..19c9e3c52cb 100644 --- a/src/bindings/python/src/pyopenvino/graph/any.cpp +++ b/src/bindings/python/src/pyopenvino/graph/any.cpp @@ -19,7 +19,7 @@ void regclass_graph_Any(py::module m) { "into C++ based core of the project."; ov_any.def(py::init([](py::object& input_value) { - return ov::Any(py_object_to_any(input_value)); + return ov::Any(Common::utils::py_object_to_any(input_value)); })); ov_any.def("__repr__", [](const ov::Any& self) { @@ -60,7 +60,7 @@ void regclass_graph_Any(py::module m) { return a == b; }); ov_any.def("__eq__", [](const ov::Any& a, py::object& b) -> bool { - return a == ov::Any(py_object_to_any(b)); + return a == ov::Any(Common::utils::py_object_to_any(b)); }); ov_any.def( "get", @@ -74,7 +74,7 @@ void regclass_graph_Any(py::module m) { ov_any.def( "set", [](ov::Any& self, py::object& value) { - self = ov::Any(py_object_to_any(value)); + self = ov::Any(Common::utils::py_object_to_any(value)); }, R"( :param: Value to be set in OVAny. diff --git a/src/bindings/python/src/pyopenvino/graph/model.cpp b/src/bindings/python/src/pyopenvino/graph/model.cpp index bb9ad1be8f1..19202b678c1 100644 --- a/src/bindings/python/src/pyopenvino/graph/model.cpp +++ b/src/bindings/python/src/pyopenvino/graph/model.cpp @@ -796,7 +796,7 @@ void regclass_graph_Model(py::module m) { for (size_t i = 0; i < path.size(); i++) { cpp_args[i] = path[i].cast(); } - self.set_rt_info(py_object_to_any(obj), cpp_args); + self.set_rt_info(Common::utils::py_object_to_any(obj), cpp_args); }, py::arg("obj"), py::arg("path"), @@ -811,7 +811,7 @@ void regclass_graph_Model(py::module m) { model.def( "set_rt_info", [](ov::Model& self, const py::object& obj, const py::str& path) -> void { - self.set_rt_info(py_object_to_any(obj), path.cast()); + self.set_rt_info(Common::utils::py_object_to_any(obj), path.cast()); }, py::arg("obj"), py::arg("path"), diff --git a/src/bindings/python/src/pyopenvino/utils/utils.cpp b/src/bindings/python/src/pyopenvino/utils/utils.cpp index 8755f12e172..a729ccc2537 100644 --- a/src/bindings/python/src/pyopenvino/utils/utils.cpp +++ b/src/bindings/python/src/pyopenvino/utils/utils.cpp @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 // -#include "pyopenvino/utils/utils.hpp" +#include "utils.hpp" #include @@ -132,7 +132,7 @@ py::object from_ov_any(const ov::Any& any) { std::map properties_to_any_map(const std::map& properties) { std::map properties_to_cpp; for (const auto& property : properties) { - properties_to_cpp[property.first] = py_object_to_any(property.second); + properties_to_cpp[property.first] = Common::utils::py_object_to_any(property.second); } return properties_to_cpp; } @@ -166,5 +166,78 @@ void deprecation_warning(const std::string& function_name, const std::string& ve } PyErr_WarnEx(PyExc_DeprecationWarning, ss.str().data(), 2); } + +ov::Any py_object_to_any(const py::object& py_obj) { + // Python types + if (py::isinstance(py_obj)) { + return py_obj.cast(); + } else if (py::isinstance(py_obj)) { + return py_obj.cast(); + } else if (py::isinstance(py_obj)) { + return py_obj.cast(); + } else if (py::isinstance(py_obj)) { + return py_obj.cast(); + } else if (py::isinstance(py_obj)) { + auto _list = py_obj.cast(); + enum class PY_TYPE : int { UNKNOWN = 0, STR, INT, FLOAT, BOOL }; + PY_TYPE detected_type = PY_TYPE::UNKNOWN; + for (const auto& it : _list) { + auto check_type = [&](PY_TYPE type) { + if (detected_type == PY_TYPE::UNKNOWN || detected_type == type) { + detected_type = type; + return; + } + OPENVINO_ASSERT("Incorrect attribute. Mixed types in the list are not allowed."); + }; + if (py::isinstance(it)) { + check_type(PY_TYPE::STR); + } else if (py::isinstance(it)) { + check_type(PY_TYPE::INT); + } else if (py::isinstance(it)) { + check_type(PY_TYPE::FLOAT); + } else if (py::isinstance(it)) { + check_type(PY_TYPE::BOOL); + } + } + + // In case of empty vector works like with vector of strings + if (_list.empty()) + return _list.cast>(); + + switch (detected_type) { + case PY_TYPE::STR: + return _list.cast>(); + case PY_TYPE::FLOAT: + return _list.cast>(); + case PY_TYPE::INT: + return _list.cast>(); + case PY_TYPE::BOOL: + return _list.cast>(); + default: + OPENVINO_ASSERT(false, "Unsupported attribute type."); + } + // OV types + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + } else if (py::isinstance(py_obj)) { + return py::cast(py_obj); + // If there is no match fallback to py::object + } else if (py::isinstance(py_obj)) { + return py_obj; + } + OPENVINO_ASSERT(false, "Unsupported attribute type."); +} }; // namespace utils }; // namespace Common diff --git a/src/bindings/python/src/pyopenvino/utils/utils.hpp b/src/bindings/python/src/pyopenvino/utils/utils.hpp index 283d959e535..4f602dc7efb 100644 --- a/src/bindings/python/src/pyopenvino/utils/utils.hpp +++ b/src/bindings/python/src/pyopenvino/utils/utils.hpp @@ -20,78 +20,8 @@ namespace utils { std::string convert_path_to_string(const py::object& path); void deprecation_warning(const std::string& function_name, const std::string& version = std::string(), const std::string& message = std::string()); + + ov::Any py_object_to_any(const py::object& py_obj); + }; // namespace utils }; // namespace Common - -inline ov::Any py_object_to_any(const py::object& py_obj) { - // Python types - if (py::isinstance(py_obj)) { - return py_obj.cast(); - } else if (py::isinstance(py_obj)) { - return py_obj.cast(); - } else if (py::isinstance(py_obj)) { - return py_obj.cast(); - } else if (py::isinstance(py_obj)) { - return py_obj.cast(); - } else if (py::isinstance(py_obj)) { - auto _list = py_obj.cast(); - enum class PY_TYPE : int { UNKNOWN = 0, STR, INT, FLOAT, BOOL }; - PY_TYPE detected_type = PY_TYPE::UNKNOWN; - for (const auto& it : _list) { - auto check_type = [&](PY_TYPE type) { - if (detected_type == PY_TYPE::UNKNOWN || detected_type == type) { - detected_type = type; - return; - } - OPENVINO_ASSERT("Incorrect attribute. Mixed types in the list are not allowed."); - }; - if (py::isinstance(it)) { - check_type(PY_TYPE::STR); - } else if (py::isinstance(it)) { - check_type(PY_TYPE::INT); - } else if (py::isinstance(it)) { - check_type(PY_TYPE::FLOAT); - } else if (py::isinstance(it)) { - check_type(PY_TYPE::BOOL); - } - } - - // In case of empty vector works like with vector of strings - if (_list.empty()) - return _list.cast>(); - - switch (detected_type) { - case PY_TYPE::STR: - return _list.cast>(); - case PY_TYPE::FLOAT: - return _list.cast>(); - case PY_TYPE::INT: - return _list.cast>(); - case PY_TYPE::BOOL: - return _list.cast>(); - default: - OPENVINO_ASSERT(false, "Unsupported attribute type."); - } - // OV types - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - } else if (py::isinstance(py_obj)) { - return py::cast(py_obj); - // If there is no match fallback to py::object - } else if (py::isinstance(py_obj)) { - return py_obj; - } - OPENVINO_ASSERT(false, "Unsupported attribute type."); -} diff --git a/src/bindings/python/tests/test_runtime/test_function.py b/src/bindings/python/tests/test_runtime/test_model.py similarity index 100% rename from src/bindings/python/tests/test_runtime/test_function.py rename to src/bindings/python/tests/test_runtime/test_model.py