diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py index 683b4bf4efb..f0b7e96fbf0 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/data_dispatcher.py @@ -8,7 +8,7 @@ from typing import Any, Dict, Union, Optional import numpy as np from openvino._pyopenvino import ConstOutput, Tensor, Type -from openvino.runtime.utils.data_helpers.wrappers import _InferRequestWrapper +from openvino.runtime.utils.data_helpers.wrappers import _InferRequestWrapper, OVDict ContainerTypes = Union[dict, list, tuple] ScalarTypes = Union[np.number, int, float] @@ -132,6 +132,14 @@ def _( return {k: to_c_style(v) if is_shared else v for k, v in inputs.items()} +@normalize_arrays.register(OVDict) +def _( + inputs: OVDict, + is_shared: bool = False, +) -> dict: + return {i: to_c_style(v) if is_shared else v for i, (_, v) in enumerate(inputs.items())} + + @normalize_arrays.register(list) @normalize_arrays.register(tuple) def _( @@ -174,6 +182,7 @@ def create_shared( @create_shared.register(dict) @create_shared.register(list) @create_shared.register(tuple) +@create_shared.register(OVDict) def _( inputs: ContainerTypes, request: _InferRequestWrapper, @@ -300,7 +309,7 @@ def update_inputs(inputs: dict, request: _InferRequestWrapper) -> dict: @singledispatch def create_copied( - inputs: Union[ContainerTypes, np.ndarray, ScalarTypes], + inputs: Union[ContainerTypes, OVDict, np.ndarray, ScalarTypes], request: _InferRequestWrapper, ) -> Union[dict, None]: # Check the special case of the array-interface @@ -314,8 +323,9 @@ def create_copied( @create_copied.register(dict) @create_copied.register(list) @create_copied.register(tuple) +@create_copied.register(OVDict) def _( - inputs: ContainerTypes, + inputs: Union[ContainerTypes, OVDict], request: _InferRequestWrapper, ) -> dict: return update_inputs(normalize_arrays(inputs, is_shared=False), request) @@ -346,7 +356,7 @@ def _( def _data_dispatch( request: _InferRequestWrapper, - inputs: Union[ContainerTypes, Tensor, np.ndarray, ScalarTypes] = None, + inputs: Union[ContainerTypes, OVDict, Tensor, np.ndarray, ScalarTypes] = None, is_shared: bool = False, ) -> Union[dict, Tensor]: if inputs is None: diff --git a/src/bindings/python/src/openvino/runtime/utils/data_helpers/wrappers.py b/src/bindings/python/src/openvino/runtime/utils/data_helpers/wrappers.py index 1bf23a7cad4..bb535aa31c6 100644 --- a/src/bindings/python/src/openvino/runtime/utils/data_helpers/wrappers.py +++ b/src/bindings/python/src/openvino/runtime/utils/data_helpers/wrappers.py @@ -4,13 +4,7 @@ import numpy as np -# TODO: remove this WA and refactor OVDict when Python3.8 -# becomes minimal supported version. -try: - from functools import singledispatchmethod -except ImportError: - from singledispatchmethod import singledispatchmethod # type: ignore[no-redef] - +from functools import singledispatchmethod from collections.abc import Mapping from typing import Dict, Set, Tuple, Union, Iterator, Optional from typing import KeysView, ItemsView, ValuesView diff --git a/src/bindings/python/tests/test_runtime/test_async_infer_request.py b/src/bindings/python/tests/test_runtime/test_async_infer_request.py index 1c6fd5f2551..6b8140809d0 100644 --- a/src/bindings/python/tests/test_runtime/test_async_infer_request.py +++ b/src/bindings/python/tests/test_runtime/test_async_infer_request.py @@ -17,9 +17,6 @@ from openvino import ( Type, Tensor, ) -from openvino.runtime import ProfilingInfo -from openvino.preprocess import PrePostProcessor - from tests import skip_need_mock_op from tests.utils.helpers import generate_image, get_relu_model, generate_model_with_memory diff --git a/src/bindings/python/tests/test_runtime/test_sync_infer_request.py b/src/bindings/python/tests/test_runtime/test_sync_infer_request.py index 27a6503f16f..f223b49f1a1 100644 --- a/src/bindings/python/tests/test_runtime/test_sync_infer_request.py +++ b/src/bindings/python/tests/test_runtime/test_sync_infer_request.py @@ -2,7 +2,7 @@ # Copyright (C) 2018-2023 Intel Corporation # SPDX-License-Identifier: Apache-2.0 -from collections.abc import Iterable +from contextlib import nullcontext as does_not_raise from copy import deepcopy import numpy as np import os @@ -14,18 +14,17 @@ import openvino.runtime.opset13 as ops from openvino import ( Core, CompiledModel, - InferRequest, Model, Layout, PartialShape, Shape, Type, Tensor, + compile_model, ) from openvino.runtime import ProfilingInfo from openvino.preprocess import PrePostProcessor -from tests import skip_need_mock_op from tests.utils.helpers import generate_image, get_relu_model, generate_model_with_memory @@ -990,3 +989,35 @@ def test_infer_request_share_memory(device, share_inputs, share_outputs, is_posi else: assert not out_tensor_shares assert results[0].flags["OWNDATA"] is True + + +def test_output_result_to_input(): + def create_model_1(): + param1 = ops.parameter(Shape([1, 1]), Type.i32) + param1.set_friendly_name("input_1") + add = ops.add(param1, ops.constant([1], Type.i32)) + add1 = ops.add(param1, ops.constant([[5]], Type.i32)) + model = Model([add, add1], [param1]) + model.output(0).tensor.set_names({"output_1_1"}) + model.output(1).tensor.set_names({"outputs_1_2"}) + return model + + def create_model_2(): + param1 = ops.parameter(Shape([1, 1]), Type.i32) + param1.set_friendly_name("output_1_1") + param2 = ops.parameter(Shape([1, 1]), Type.i32) + param2.set_friendly_name("outputs_1_2") + + add = ops.add(param1, param2) + model = Model([add], [param1, param2]) + model.output(0).tensor.set_names({"output_2_1"}) + return model + + model_1 = create_model_1() + model_2 = create_model_2() + compiled_1, compiled_2 = compile_model(model_1), compile_model(model_2) + input_data = np.array([[1]]) + result_1 = compiled_1(input_data, share_inputs=False) + with does_not_raise(): + result_2 = compiled_2(result_1, share_inputs=False) + assert np.array_equal(result_2[0], [[8]]) diff --git a/src/bindings/python/tests/test_utils/test_data_dispatch.py b/src/bindings/python/tests/test_utils/test_data_dispatch.py index 09b175f5f41..d78a4405177 100644 --- a/src/bindings/python/tests/test_utils/test_data_dispatch.py +++ b/src/bindings/python/tests/test_utils/test_data_dispatch.py @@ -7,8 +7,8 @@ import pytest import numpy as np from tests.utils.helpers import generate_relu_compiled_model -from openvino import Model, Type, Shape, Core, Tensor -from openvino.runtime import ConstOutput + +from openvino import Type, Shape, Tensor from openvino.runtime.utils.data_helpers import _data_dispatch is_myriad = os.environ.get("TEST_DEVICE") == "MYRIAD"