From 5da132bdfe7140bee87d5842b2bfa0fe903b4aca Mon Sep 17 00:00:00 2001 From: Anastasia Kuporosova Date: Fri, 22 Dec 2023 17:13:21 +0100 Subject: [PATCH] [PyOV] Delete compatibility tests (#21820) Co-authored-by: Michal Lukaszewski Co-authored-by: Ilya Lavrenov --- .github/workflows/job_python_unit_tests.yml | 8 - .github/workflows/windows.yml | 6 - src/bindings/python/docs/test_examples.md | 9 - src/bindings/python/setup.cfg | 2 - .../src/compatibility/pyngraph/CMakeLists.txt | 5 - .../python/tests_compatibility/__init__.py | 192 -- .../python/tests_compatibility/conftest.py | 150 - .../python/tests_compatibility/runtime.py | 191 -- .../test_inference_engine/__init__.py | 2 - .../test_inference_engine/test_Blob.py | 129 - .../test_inference_engine/test_CDataPtr.py | 59 - .../test_inference_engine/test_DataPtr.py | 46 - .../test_ExecutableNetwork.py | 319 --- .../test_inference_engine/test_IECore.py | 349 --- .../test_inference_engine/test_IENetwork.py | 259 -- .../test_InferRequest.py | 517 ---- .../test_InputInfoCPtr.py | 75 - .../test_InputInfoPtr.py | 88 - .../test_inference_engine/test_NGraph.py | 68 - .../test_PreProcessInfo.py | 155 -- .../test_inference_engine/test_TensorDesc.py | 58 - .../test_ngraph/__init__.py | 6 - .../test_ngraph/test_adaptive_pool.py | 30 - .../test_ngraph/test_basic.py | 416 --- .../test_ngraph/test_convolution.py | 70 - .../test_ngraph/test_core.py | 262 -- .../test_ngraph/test_create_op.py | 2427 ----------------- .../test_ngraph/test_ctc_loss.py | 27 - .../test_ngraph/test_data_movement.py | 108 - .../test_ngraph/test_detection_output.py | 111 - .../test_ngraph/test_dft.py | 101 - .../test_ngraph/test_dyn_attributes.py | 164 -- .../test_ngraph/test_einsum.py | 88 - .../test_ngraph/test_eye.py | 89 - .../test_ngraph/test_gather.py | 62 - .../test_ngraph/test_idft.py | 112 - .../test_ngraph/test_if.py | 174 -- .../test_ngraph/test_input_validation.py | 157 -- .../test_ngraph/test_log_softmax.py | 17 - .../test_ngraph/test_manager.py | 35 - .../test_ngraph/test_node_factory.py | 94 - .../test_ngraph/test_normalization.py | 71 - .../test_ngraph/test_ops.py | 775 ------ .../test_ngraph/test_ops_binary.py | 179 -- .../test_ngraph/test_ops_fused.py | 362 --- .../test_ngraph/test_ops_matmul.py | 37 - .../test_ngraph/test_ops_multioutput.py | 37 - .../test_ngraph/test_ops_reshape.py | 205 -- .../test_ngraph/test_ops_scatter.py | 35 - .../test_ngraph/test_ops_unary.py | 195 -- .../test_ngraph/test_pooling.py | 266 -- .../test_ngraph/test_proposal.py | 36 - .../test_ngraph/test_random_uniform.py | 24 - .../test_ngraph/test_reduction.py | 166 -- .../test_ngraph/test_roll.py | 20 - .../test_ngraph/test_sequence_processing.py | 23 - .../test_ngraph/test_swish.py | 29 - .../test_ngraph/test_utils.py | 28 - .../tests_compatibility/test_ngraph/util.py | 10 - .../tests_compatibility/test_onnx/__init__.py | 2 - .../test_onnx/model_zoo_preprocess.sh | 169 -- .../test_onnx/models/add_abc.onnx | 24 - .../test_onnx/models/data/tensor.data | Bin 12 -> 0 bytes .../test_onnx/models/external_data.onnx | 22 - .../test_onnx/test_backend.py | 935 ------- .../test_onnx/test_onnx_external_data.py | 32 - .../test_onnx/test_onnx_import.py | 54 - .../test_onnx/test_ops_batchnorm.py | 84 - .../test_onnx/test_ops_binary.py | 136 - .../test_onnx/test_ops_convpool.py | 402 --- .../test_onnx/test_ops_logical.py | 44 - .../test_onnx/test_ops_matmul.py | 155 -- .../test_onnx/test_ops_nonlinear.py | 115 - .../test_onnx/test_ops_reduction.py | 376 --- .../test_onnx/test_ops_reshape.py | 350 --- .../test_onnx/test_ops_unary.py | 489 ---- .../test_onnx/test_ops_variadic.py | 43 - .../test_onnx/test_zoo_models.py | 192 -- .../test_onnx/utils/__init__.py | 87 - .../test_onnx/utils/model_importer.py | 153 -- .../test_onnx/utils/onnx_backend.py | 135 - .../test_onnx/utils/onnx_helpers.py | 19 - .../test_utils/test_utils.py | 41 - .../test_utils/utils/plugins.xml | 11 - .../test_utils/utils/plugins_apple.xml | 11 - .../test_utils/utils/plugins_win.xml | 11 - .../test_utils/utils/test_model.onnx | Bin 356721 -> 0 bytes .../test_utils/utils/test_model_fp16.bin | Bin 168804 -> 0 bytes .../test_utils/utils/test_model_fp16.xml | 467 ---- .../test_utils/utils/test_model_fp32.bin | Bin 337592 -> 0 bytes .../test_utils/utils/test_model_fp32.xml | 467 ---- 91 files changed, 14761 deletions(-) delete mode 100644 src/bindings/python/tests_compatibility/__init__.py delete mode 100644 src/bindings/python/tests_compatibility/conftest.py delete mode 100644 src/bindings/python/tests_compatibility/runtime.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/__init__.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_Blob.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_CDataPtr.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_DataPtr.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_ExecutableNetwork.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_IECore.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_IENetwork.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_InferRequest.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoCPtr.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoPtr.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_NGraph.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_PreProcessInfo.py delete mode 100644 src/bindings/python/tests_compatibility/test_inference_engine/test_TensorDesc.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/__init__.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_adaptive_pool.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_basic.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_convolution.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_core.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_create_op.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ctc_loss.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_data_movement.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_detection_output.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_dft.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_dyn_attributes.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_einsum.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_eye.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_gather.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_idft.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_if.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_input_validation.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_log_softmax.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_manager.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_node_factory.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_normalization.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_binary.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_fused.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_matmul.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_multioutput.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_reshape.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_scatter.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_ops_unary.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_pooling.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_proposal.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_random_uniform.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_reduction.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_roll.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_sequence_processing.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_swish.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/test_utils.py delete mode 100644 src/bindings/python/tests_compatibility/test_ngraph/util.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/__init__.py delete mode 100755 src/bindings/python/tests_compatibility/test_onnx/model_zoo_preprocess.sh delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/models/add_abc.onnx delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/models/data/tensor.data delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/models/external_data.onnx delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_backend.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_onnx_external_data.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_onnx_import.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_batchnorm.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_binary.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_convpool.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_logical.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_matmul.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_nonlinear.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_reduction.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_reshape.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_unary.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_ops_variadic.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/test_zoo_models.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/utils/__init__.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/utils/model_importer.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/utils/onnx_backend.py delete mode 100644 src/bindings/python/tests_compatibility/test_onnx/utils/onnx_helpers.py delete mode 100644 src/bindings/python/tests_compatibility/test_utils/test_utils.py delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/plugins.xml delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/plugins_apple.xml delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/plugins_win.xml delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/test_model.onnx delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp16.bin delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp16.xml delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.bin delete mode 100644 src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.xml diff --git a/.github/workflows/job_python_unit_tests.yml b/.github/workflows/job_python_unit_tests.yml index 38b35d17623..9cc3c4a6491 100644 --- a/.github/workflows/job_python_unit_tests.yml +++ b/.github/workflows/job_python_unit_tests.yml @@ -121,14 +121,6 @@ jobs: # Tests # - - name: Python API 1.0 Tests - # if: fromJSON(inputs.affected-components).Python_API.test # Ticket: 127101 - run: | - python3 -m pytest -s ${INSTALL_TEST_DIR}/pyngraph \ - --junitxml=${INSTALL_TEST_DIR}/TEST-Pyngraph.xml \ - --ignore=${INSTALL_TEST_DIR}/pyngraph/tests_compatibility/test_onnx/test_zoo_models.py \ - --ignore=${INSTALL_TEST_DIR}/pyngraph/tests_compatibility/test_onnx/test_backend.py - - name: Python API 2.0 Tests # if: ${{ fromJSON(inputs.affected-components).Python_API.test && runner.arch != 'ARM64' }} # Ticket: 126380, 127101 run: | diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 93f5acb10df..312bc1a4f73 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -364,12 +364,6 @@ jobs: # TODO: replace with Python API tests requirements python3 -m pip install -r ${{ env.INSTALL_TEST_DIR }}/mo/requirements_dev.txt - - name: Python API 1.0 Tests - #if: fromJSON(needs.smart_ci.outputs.affected_components).Python_API.test # Ticket: 127101 - shell: cmd - run: | - python3 -m pytest -s ${{ env.INSTALL_TEST_DIR }}/pyngraph ${{ env.PYTHON_STATIC_ARGS }} --junitxml=${{ env.INSTALL_TEST_DIR }}/TEST-Pyngraph.xml --ignore=${{ env.INSTALL_TEST_DIR }}/pyngraph/tests_compatibility/test_onnx/test_zoo_models.py - - name: Python API 2.0 Tests #if: fromJSON(needs.smart_ci.outputs.affected_components).Python_API.test # Ticket: 127101 shell: cmd diff --git a/src/bindings/python/docs/test_examples.md b/src/bindings/python/docs/test_examples.md index 80808fdbfd5..c7078c08cc8 100644 --- a/src/bindings/python/docs/test_examples.md +++ b/src/bindings/python/docs/test_examples.md @@ -23,11 +23,6 @@ To run OpenVINO Python API 2.0 tests: pytest tests/ ``` -To run OpenVINO Python API 1.0 tests, use this command: -``` -pytest tests_compatibility/ -``` - By default, tests are run on the CPU plugin. If you want to run them on a different plugin, you need to specify this environment variable: ``` @@ -147,10 +142,6 @@ Notice that the test name is shared between cases. In a real-life pull request, * ... or create reference values during runtime. Always use a good, thrust-worthy library for that! * Re-use common parts of the code (like multiple lines that create helper object) and move them out to make tests easier to read. -### Difference between *tests* and *tests_compatibility* directories - -Someone could notice two similar folders [`tests`](./../tests/) and [`tests_compatibility`](./../tests_compatibility/). First one is the desired place for all upcoming features and tests. Compatibility layer is only supported in specific cases and any updates to it should be explicitly approved by OpenVINOâ„¢ reviewers. Please do not duplicate tests in both directories if not necessary. - ## See also * [OpenVINOâ„¢ README](../../../../README.md) * [OpenVINOâ„¢ bindings README](../../README.md) diff --git a/src/bindings/python/setup.cfg b/src/bindings/python/setup.cfg index 5ea6fe46cd5..dd8b0a75c27 100644 --- a/src/bindings/python/setup.cfg +++ b/src/bindings/python/setup.cfg @@ -19,7 +19,6 @@ passenv = https_proxy commands= pytest tests -m "not template_extension" -v -k 'not _cuda' --ignore=tests/test_utils - pytest --backend={env:OV_BACKEND} tests_compatibility/test_ngraph -v -k 'not _cuda' --ignore=tests_compatibility/test_onnx/test_zoo_models.py pytest --backend={env:OV_BACKEND} /openvino/src/frontends/onnx/tests -v --ignore=/openvino/src/frontends/onnx/tests/tests_python/test_zoo_models.py [testenv:zoo_models] @@ -68,7 +67,6 @@ docstring-convention = google enable-extensions = G per-file-ignores = src/openvino/runtime/*/ops.py: VNE001,VNE003 - tests_compatibility/test_ngraph/*: C101,C812,C815,C816,C819,CCE001,D212,E800,ECE001,N400,N802,N806,P101,P103,PT001,PT005,PT006,PT011,PT019,PT023,RST201,S001,VNE002 src/compatibility/ngraph/*: C101,C812,C819,CCE001,E800,N806,P101,RST201,RST202,RST203,RST206,VNE001,VNE003 src/openvino/preprocess/torchvision/*: N801, VNE001 *__init__.py: F401 diff --git a/src/bindings/python/src/compatibility/pyngraph/CMakeLists.txt b/src/bindings/python/src/compatibility/pyngraph/CMakeLists.txt index a5c41c2b613..8d3ac1ab0c0 100644 --- a/src/bindings/python/src/compatibility/pyngraph/CMakeLists.txt +++ b/src/bindings/python/src/compatibility/pyngraph/CMakeLists.txt @@ -83,8 +83,3 @@ install(DIRECTORY ${CMAKE_CURRENT_LIST_DIR}/../ngraph COMPONENT ${OV_CPACK_COMP_PYTHON_OPENVINO}_${pyversion} ${OV_CPACK_COMP_PYTHON_OPENVINO_EXCLUDE_ALL} USE_SOURCE_PERMISSIONS) - -install(DIRECTORY ${OpenVINOPython_SOURCE_DIR}/tests_compatibility - DESTINATION tests/${PROJECT_NAME} - COMPONENT tests - EXCLUDE_FROM_ALL) diff --git a/src/bindings/python/tests_compatibility/__init__.py b/src/bindings/python/tests_compatibility/__init__.py deleted file mode 100644 index 9556eb9b8fe..00000000000 --- a/src/bindings/python/tests_compatibility/__init__.py +++ /dev/null @@ -1,192 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -# test.BACKEND_NAME is a configuration variable determining which -# nGraph backend tests will use. It's set during pytest configuration time. -# See `pytest_configure` hook in `conftest.py` for more details. -BACKEND_NAME = None - -# test.MODEL_ZOO_DIR is a configuration variable providing the path -# to the ZOO of ONNX models to test. It's set during pytest configuration time. -# See `pytest_configure` hook in `conftest.py` for more -# details. -MODEL_ZOO_DIR = None - -# test.MODEL_ZOO_XFAIL is a configuration variable which enable xfails for model zoo. -MODEL_ZOO_XFAIL = False - - -def xfail_test(reason="Mark the test as expected to fail", strict=True): - return pytest.mark.xfail(reason=reason, strict=strict) - - -skip_segfault = pytest.mark.skip(reason="Segmentation fault error") -xfail_accuracy = xfail_test(reason="Accuracy") -xfail_unsupported_by_legacy_api = xfail_test(reason="RuntimeError: This feature is not supported via legacy API.") -xfail_issue_69444 = xfail_test(reason="ONNX Resize - AssertionError: Mismatched elements.") -xfail_issue_67415 = xfail_test(reason="RuntimeError: Unsupported data type for when filling blob!") -xfail_issue_33488 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "MaxUnpool") -skip_issue_38084 = pytest.mark.skip(reason="Aborted (core dumped) Assertion " - "`(layer->get_output_partial_shape(i).is_static())' failed.") -xfail_issue_33595 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "Unique") -xfail_issue_33596 = xfail_test(reason="RuntimeError: nGraph does not support different sequence operations: " - "ConcatFromSequence, SequenceConstruct, SequenceAt, SplitToSequence, " - "SequenceEmpty, SequenceInsert, SequenceErase, SequenceLength ") -xfail_issue_33606 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "Det") -xfail_issue_33651 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "TfIdfVectorizer") -xfail_issue_33581 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "GatherElements") -xfail_issue_35923 = xfail_test(reason="RuntimeError: PReLU without weights is not supported") -xfail_issue_35927 = xfail_test(reason="RuntimeError: B has zero dimension that is not allowable") -xfail_issue_38084 = xfail_test(reason="RuntimeError: AssertionFailed: layer->get_output_partial_shape(i)." - "is_static() nGraph operation with name: cannot be " - "converted to layer with name: because output " - "with index 0 contains dynamic shapes: {}. Try to use " - "CNNNetwork::reshape() method in order to specialize shapes " - "before the conversion.") -xfail_issue_38091 = xfail_test(reason="AssertionError: Mismatched elements") -xfail_issue_38699 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "ai.onnx.preview.training.Gradient") -xfail_issue_38701 = xfail_test(reason="RuntimeError: unsupported element type: STRING") -xfail_issue_38706 = xfail_test(reason="RuntimeError: output_3.0 has zero dimension which is not allowed") -xfail_issue_38708 = xfail_test(reason="RuntimeError: While validating ONNX node '': " - "Axes input must be constant") -xfail_issue_38710 = xfail_test(reason="RuntimeError: data has zero dimension which is not allowed") -xfail_issue_38713 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "ai.onnx.preview.training.Momentum") -xfail_issue_38724 = xfail_test(reason="RuntimeError: While validating ONNX node '': " - "tf_crop_and_resize - this type of coordinate transformation mode " - "is not supported. Choose one of the following modes: " - "tf_half_pixel_for_nn, asymmetric, align_corners, pytorch_half_pixel, " - "half_pixel") -xfail_issue_38725 = xfail_test(reason="RuntimeError: While validating ONNX node ''") -xfail_issue_99958 = xfail_test(reason="LogSoftmax - Results mismatch") -xfail_issue_99959 = xfail_test(reason="Mish function is not supported") -xfail_issue_99960 = xfail_test(reason="MVN - Results mismatch") -xfail_issue_99961 = xfail_test(reason="Optional has/get element operators are not supported)'") -xfail_issue_99962 = pytest.mark.skip(reason="ReduceL1/L2 - Unrecognized attribute: axes for operator ReduceL1/L2") -xfail_issue_99968 = xfail_test(reason="ReduceL1/L2 - Results mismatch or unsupported ReduceSum with " - "dynamic rank by CPU plugin") -xfail_issue_99969 = xfail_test(reason="Resize - Results mismatch / " - "RuntimeError: While validating ONNX node '' / " - "RuntimeError: Check '(false)' failed at onnx/frontend/src/op/resize.cpp") -xfail_issue_99970 = xfail_test(reason="Scatter and ScatterND - RuntimeError: Check '(reduction == none)' failed at " - "src/frontends/onnx/frontend/src/op/scatter_elements.cpp OR at " - "src/frontends/onnx/frontend/src/op/scatter_nd") -xfail_issue_99972 = xfail_test(reason="Softmax - Results mismatch") -xfail_issue_99973 = xfail_test(reason="Split - RuntimeError: While validating ONNX node " - "''") - -# Model MSFT issues: -xfail_issue_37957 = xfail_test(reason="RuntimeError: nGraph does not support the following ONNX operations: " - "com.microsoft.CropAndResize, com.microsoft.GatherND, " - "com.microsoft.Pad, com.microsoft.Range") -xfail_issue_39669 = xfail_test(reason="AssertionError: This model has no test data") -xfail_issue_36534 = xfail_test(reason="RuntimeError: node input index is out of range") -xfail_issue_36536 = xfail_test(reason="RuntimeError: can't protect") -xfail_issue_36538 = xfail_test(reason="RuntimeError: Check 'PartialShape::broadcast_merge_into( pshape, " - "node->get_input_partial_shape(i), autob)' failed at " - "/openvino/ngraph/src/ngraph/op/util/elementwise_args.cpp:48:") -xfail_issue_39658 = xfail_test(reason="RuntimeError: Tile operation has a form that is not supported." - " z should be converted to TileIE operation.") - - -xfail_issue_37973 = xfail_test(reason="TF Inception V2 - AssertionError: zoo models results mismatch") -xfail_issue_47430 = xfail_test(reason="FCN ResNet models - AssertionError: zoo models results mismatch") -xfail_issue_47495 = xfail_test(reason="BertSquad-10 from MSFT - AssertionError: zoo models results mismatch") -xfail_issue_48145 = xfail_test(reason="BertSquad-8 - AssertionError: Items are not equal: ACTUAL: 4 " - "DESIRED: 3") -xfail_issue_48190 = xfail_test(reason="RobertaBase-11 - AssertionError: Items are not equal: " - "ACTUAL: dtype('float64') DESIRED: dtype('float32')") -xfail_issue_49752 = xfail_test(reason="RuntimeError: Unsupported dynamic ops: v1::Pad") -xfail_issue_49753 = xfail_test(reason="RuntimeError: Unsupported dynamic ops: v1::StridedSlice") -xfail_issue_49754 = xfail_test(reason="RuntimeError: Unsupported dynamic ops: v1::TopKIE") -xfail_issue_52463 = xfail_test(reason="test_operator_add_size1_singleton_broadcast_cpu - " - "Not equal to tolerance") -xfail_issue_58033 = xfail_test(reason="Einsum operation misses support for complex ellipsis equations") -xfail_issue_onnx_models_140 = xfail_test(reason="https://github.com/onnx/models/issues/140") - -xfail_issue_63033 = xfail_test(reason="BatchNormalization: Training mode is not supported") -xfail_issue_63036 = xfail_test(reason="Changes in ConvTranspose padding") -xfail_issue_63043 = xfail_test(reason="Recurrent node expects constants as W, R, B inputs.") - -skip_rng_tests = pytest.mark.skip(reason="Tests use random number generator with no seed.") -xfail_issue_63137 = xfail_test(reason="Unsupported operations: OptionalHasElement, OptionalGetElement") -xfail_issue_63138 = xfail_test(reason="Missing ONNX Shape-15 support") - -xfail_issue_78843 = xfail_test(reason="Missing reference output files for ssd mobilenet models") -xfail_issue_78741 = xfail_test(reason="Cannot get dims for non-static shapes. " - "Requires dynamism support enabled.") - -xfail_issue_81976 = xfail_test(reason="RuntimeError: z node not found in graph cache") -xfail_issue_82038 = xfail_test(reason="ScatterElements, ScatterND, AssertionError: Result mismatch") -xfail_issue_82039 = xfail_test(reason="Unsupported data type Optional, RuntimeError: [ NOT_IMPLEMENTED ] " - "CPU plugin: Input image format UNSPECIFIED is not supported yet...") -xfail_issue_90649 = xfail_test(reason="RuntimeError: OV does not support the following ONNX operations:" - "BlackmanWindow, DFT, HammingWindow, HannWindow, LayerNormalization, " - "MelWeightMatrix, SequenceMap, STFT") -skip_issue_91151 = pytest.mark.skip(reason="RuntimeError: model input (shape={3,4}) and blob (shape=(1)) are incompatible") # Need to enable after bumping to 1.15 -xfail_issue_91490 = xfail_test(reason="y has zero dimension which is not allowed") -xfail_issue_101965 = xfail_test(reason="Mismatch with numpy-based expected results.") -xfail_issue_113506 = xfail_test(reason="Unsupported operation of type: LSTMSequence Node expects 7 inputs. Actual: 8") - -skip_dynamic_model = pytest.mark.skip(reason="CPU plug-in can't load a model with dynamic output shapes via legacy API") - -# ONNX 1.14 -xfail_issue_119896 = xfail_test(reason="Unsupported element type: FLOAT8") -xfail_issue_119900 = xfail_test(reason="While validating ONNX node '': " - "half_pixel_symmetric - this type of coordinate transformation mode " - "is not supported. Choose one of the following modes: " - "tf_half_pixel_for_nn, asymmetric, align_corners, pytorch_half_pixel, " - "half_pixel") -xfail_issue_119903 = xfail_test(reason="DeformConv operation is not supported") -xfail_issue_119906 = xfail_test(reason="LpPool operation is not supported") -xfail_issue_119919 = xfail_test(reason="While validating ONNX node '': Unsupported padding mode: [wrap]") -xfail_issue_119922 = xfail_test(reason="ai.onnx.ml operators domain isn't supported") -xfail_issue_119925 = xfail_test(reason="AveragePool AssertionError: Not equal to tolerance rtol=0.001, atol=1e-07") -xfail_issue_119926 = xfail_test(reason="ROIAlign AssertionError: Not equal to tolerance rtol=0.001, atol=1e-07") - -# ONNX 1.15 -xfail_issue_125485 = xfail_test(reason="AffineGrid operation is not supported") -xfail_issue_125486 = xfail_test(reason="Gelu operation is not supported") -xfail_issue_125488 = xfail_test(reason="ImageDecoder operation is not supported") -xfail_issue_125487 = xfail_test(reason="GridSample doesn't support cubic and linear modes, and 4D tensor") -skip_issue_125489 = pytest.mark.skip(reason="IsInf changed behavior since opset-20") # Need to enable after opset-20 will be released -xfail_issue_125491 = xfail_test(reason="AveragePool mismatch with differences in shapes") -xfail_issue_125492 = xfail_test(reason="DFT mismatch") -xfail_issue_125493 = xfail_test(reason="Reduce* mismatch") -xfail_issue_125495 = xfail_test(reason="ReduceMin/Max doesn't support boolean") -xfail_issue_127812 = xfail_test(reason="Reduce* doesn't support zero dimensions") -skip_misalignment = pytest.mark.skip(reason="Misalignment between onnx versions") # Need to enable after bumping to 1.15 diff --git a/src/bindings/python/tests_compatibility/conftest.py b/src/bindings/python/tests_compatibility/conftest.py deleted file mode 100644 index c45bb0ec32d..00000000000 --- a/src/bindings/python/tests_compatibility/conftest.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import os -import pytest -import numpy as np - -import ngraph as ng -import tests_compatibility - -from pathlib import Path - - -def model_path(is_fp16=False): - base_path = os.path.dirname(__file__) - if is_fp16: - test_xml = os.path.join(base_path, "test_utils", "utils", "test_model_fp16.xml") - test_bin = os.path.join(base_path, "test_utils", "utils", "test_model_fp16.bin") - else: - test_xml = os.path.join(base_path, "test_utils", "utils", "test_model_fp32.xml") - test_bin = os.path.join(base_path, "test_utils", "utils", "test_model_fp32.bin") - return (test_xml, test_bin) - - -def model_onnx_path(): - base_path = os.path.dirname(__file__) - test_onnx = os.path.join(base_path, "test_utils", "utils", "test_model.onnx") - return test_onnx - - -def plugins_path(): - base_path = os.path.dirname(__file__) - plugins_xml = os.path.join(base_path, "test_utils", "utils", "plugins.xml") - plugins_win_xml = os.path.join(base_path, "test_utils", "utils", "plugins_win.xml") - plugins_osx_xml = os.path.join(base_path, "test_utils", "utils", "plugins_apple.xml") - return (plugins_xml, plugins_win_xml, plugins_osx_xml) - - -def _get_default_model_zoo_dir(): - return Path(os.getenv("ONNX_HOME", Path.home() / ".onnx/model_zoo")) - - -def pytest_addoption(parser): - parser.addoption( - "--backend", - default="CPU", - choices=["CPU", "GPU", "GNA", "HETERO", "TEMPLATE"], - help="Select target device", - ) - parser.addoption( - "--model_zoo_dir", - default=_get_default_model_zoo_dir(), - type=str, - help="location of the model zoo", - ) - parser.addoption( - "--model_zoo_xfail", - action="store_true", - help="treat model zoo known issues as xfails instead of failures", - ) - - -def pytest_configure(config): - backend_name = config.getvalue("backend") - tests_compatibility.BACKEND_NAME = backend_name - tests_compatibility.MODEL_ZOO_DIR = Path(config.getvalue("model_zoo_dir")) - tests_compatibility.MODEL_ZOO_XFAIL = config.getvalue("model_zoo_xfail") - - # register additional markers - config.addinivalue_line("markers", "skip_on_cpu: Skip test on CPU") - config.addinivalue_line("markers", "skip_on_gpu: Skip test on GPU") - config.addinivalue_line("markers", "skip_on_gna: Skip test on GNA") - config.addinivalue_line("markers", "skip_on_hetero: Skip test on HETERO") - config.addinivalue_line("markers", "skip_on_template: Skip test on TEMPLATE") - config.addinivalue_line("markers", "onnx_coverage: Collect ONNX operator coverage") - config.addinivalue_line("markers", "template_extension") - config.addinivalue_line("markers", "dynamic_library: Runs tests only in dynamic libraries case") - - -def pytest_collection_modifyitems(config, items): - backend_name = config.getvalue("backend") - tests_compatibility.MODEL_ZOO_DIR = Path(config.getvalue("model_zoo_dir")) - tests_compatibility.MODEL_ZOO_XFAIL = config.getvalue("model_zoo_xfail") - - keywords = { - "CPU": "skip_on_cpu", - "GPU": "skip_on_gpu", - "GNA": "skip_on_gna", - "HETERO": "skip_on_hetero", - "TEMPLATE": "skip_on_template", - } - - skip_markers = { - "CPU": pytest.mark.skip(reason="Skipping test on the CPU backend."), - "GPU": pytest.mark.skip(reason="Skipping test on the GPU backend."), - "GNA": pytest.mark.skip(reason="Skipping test on the GNA backend."), - "HETERO": pytest.mark.skip(reason="Skipping test on the HETERO backend."), - "TEMPLATE": pytest.mark.skip(reason="Skipping test on the TEMPLATE backend."), - } - - for item in items: - skip_this_backend = keywords[backend_name] - if skip_this_backend in item.keywords: - item.add_marker(skip_markers[backend_name]) - - -@pytest.fixture(scope="session") -def device(): - return os.environ.get("TEST_DEVICE") if os.environ.get("TEST_DEVICE") else "CPU" - - -def create_encoder(input_shape, levels=4): - # input - input_node = ng.parameter(input_shape, np.float32, name="data") - - padding_begin = padding_end = [0, 0] - strides = [1, 1] - dilations = [1, 1] - input_channels = [input_shape[1]] - last_output = input_node - - # convolution layers - for _ in range(levels): - input_c = input_channels[-1] - output_c = input_c * 2 - conv_w = np.random.uniform(0, 1, [output_c, input_c, 5, 5]).astype(np.float32) - conv_node = ng.convolution(last_output, conv_w, strides, padding_begin, padding_end, dilations) - input_channels.append(output_c) - last_output = conv_node - - # deconvolution layers - for _ in range(levels): - input_c = input_channels[-2] - output_c = input_channels.pop(-1) - deconv_w = np.random.uniform(0, 1, [output_c, input_c, 5, 5]).astype(np.float32) - deconv_node = ng.convolution_backprop_data(last_output, deconv_w, strides) - last_output = deconv_node - - # result - last_output.set_friendly_name("out") - result_node = ng.result(last_output) - return ng.Function(result_node, [input_node], "Encoder") - - -def create_relu(input_shape): - input_shape = ng.impl.PartialShape(input_shape) - param = ng.parameter(input_shape, dtype=np.float32, name="data") - result = ng.relu(param, name="out") - function = ng.Function(result, [param], "TestFunction") - return function diff --git a/src/bindings/python/tests_compatibility/runtime.py b/src/bindings/python/tests_compatibility/runtime.py deleted file mode 100644 index 4a295448532..00000000000 --- a/src/bindings/python/tests_compatibility/runtime.py +++ /dev/null @@ -1,191 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -"""Provide a layer of abstraction for an OpenVINO runtime environment.""" - -import logging -from typing import Dict, List, Union - -import numpy as np -from openvino.inference_engine import IECore, IENetwork, Blob, DataPtr - -from ngraph.exceptions import UserInputError -from ngraph.impl import Function, Node, PartialShape, Type -from ngraph.opset1.ops import result -from ngraph.utils.types import NumericData, get_shape, get_dtype -from _pyngraph.util import get_ie_output_name - -import tests_compatibility - -log = logging.getLogger(__name__) - - -def runtime(backend_name: str = "CPU") -> "Runtime": - """Create a Runtime object (helper factory).""" - return Runtime(backend_name) - - -def get_runtime(): - """Return runtime object.""" - if tests_compatibility.BACKEND_NAME is not None: - return runtime(backend_name=tests_compatibility.BACKEND_NAME) - else: - return runtime() - - -def _convert_inputs(cnn_network: IENetwork) -> None: - """WA converts unsupported input images formats.""" - precision_map = { - "FP64": "FP32", - "U32": "I32", - } - - for cnn_input in cnn_network.input_info: - try: - _precision = precision_map[cnn_network.input_info[cnn_input].precision] - cnn_network.input_info[cnn_input].precision = _precision - except KeyError: - pass - - -def apply_ng_type(output: DataPtr, ng_type: Type): - ng_ie_supported_type_map = { - Type.boolean.to_string(): "BOOL", - Type.f32.to_string(): "FP32", - Type.i8.to_string(): "I8", - Type.i32.to_string(): "I32", - Type.u8.to_string(): "U8", - } - if ng_type.to_string() in ng_ie_supported_type_map: - output.precision = ng_ie_supported_type_map[ng_type.to_string()] - - -class Runtime(object): - """Represents an nGraph runtime environment.""" - - def __init__(self, backend_name: str) -> None: - self.backend_name = backend_name - log.debug("Creating Inference Engine for %s" % backend_name) - self.backend = IECore() - assert backend_name in self.backend.available_devices, ( - 'The requested device "' + backend_name + '" is not supported!' - ) - - def set_config(self, config: Dict[str, str]) -> None: - """Set the inference engine configuration.""" - self.backend.set_config(config, device_name=self.backend_name) - - def __repr__(self) -> str: - return "".format(self.backend_name) - - def computation(self, node_or_function: Union[Node, Function], *inputs: Node) -> "Computation": - """Return a callable Computation object.""" - if isinstance(node_or_function, Node): - ng_function = Function(node_or_function, inputs, node_or_function.name) - return Computation(self, ng_function) - elif isinstance(node_or_function, Function): - return Computation(self, node_or_function) - else: - raise TypeError( - "Runtime.computation must be called with an nGraph Function object " - "or an nGraph node object an optionally Parameter node objects. " - "Called with: %s", - node_or_function, - ) - - -class Computation(object): - """nGraph callable computation object.""" - - def __init__(self, runtime: Runtime, ng_function: Function) -> None: - self.runtime = runtime - self.function = ng_function - self.parameters = ng_function.get_parameters() - self.results = ng_function.get_results() - self.network_cache = {} - - def __repr__(self) -> str: - params_string = ", ".join([param.name for param in self.parameters]) - return "".format(self.function.get_name(), params_string) - - def _get_ie_output_blob_name(self, outputs: Dict, ng_result: result) -> str: - if len(self.results) == 1: - return next(iter(outputs.keys())) - else: - prev_layer_output = ng_result.input(0).get_source_output() - return get_ie_output_name(prev_layer_output) - - def _get_ie_output_blob_buffer(self, output_blobs: Dict[str, Blob], ng_result: result) -> np.ndarray: - out_name = self._get_ie_output_blob_name(output_blobs, ng_result) - out_blob = output_blobs[out_name] - - if out_blob.tensor_desc.layout == "SCALAR": - return out_blob.buffer.reshape(()) - else: - return out_blob.buffer - - def convert_buffers(self, source_buffers, target_dtypes): - converted_buffers = [] - for i in range(len(source_buffers)): - target_dtype = target_dtypes[i] - # custom conversion for bf16 - if self.results[i].get_output_element_type(0) == Type.bf16: - converted_buffers.append((source_buffers[i].view(np.uint32) >> 16).astype(np.uint16)) - else: - converted_buffers.append(source_buffers[i].astype(target_dtype)) - return converted_buffers - - def __call__(self, *input_values: NumericData) -> List[NumericData]: - """Run computation on input values and return result.""" - # Input validation - if len(input_values) < len(self.parameters): - raise UserInputError( - "Expected %s params, received not enough %s values.", len(self.parameters), len(input_values) - ) - # ignore not needed input values - input_values = input_values[:len(self.parameters)] - - input_values = [np.array(input_value) for input_value in input_values] - input_shapes = [get_shape(input_value) for input_value in input_values] - - param_names = [param.friendly_name for param in self.parameters] - - if self.network_cache.get(str(input_shapes)) is None: - capsule = Function.to_capsule(self.function) - cnn_network = IENetwork(capsule) - if self.function.is_dynamic(): - cnn_network.reshape(dict(zip(param_names, input_shapes))) - # Convert unsupported inputs of the network - _convert_inputs(cnn_network) - self.network_cache[str(input_shapes)] = cnn_network - else: - cnn_network = self.network_cache[str(input_shapes)] - - # set output blobs precission based on nG results - for ng_result in self.results: - ie_out_name = self._get_ie_output_blob_name(cnn_network.outputs, ng_result) - apply_ng_type(cnn_network.outputs[ie_out_name], ng_result.get_output_element_type(0)) - - executable_network = self.runtime.backend.load_network(cnn_network, self.runtime.backend_name) - - for parameter, input in zip(self.parameters, input_values): - parameter_shape = parameter.get_output_partial_shape(0) - input_shape = PartialShape(input.shape) - if len(input.shape) > 0 and not parameter_shape.compatible(input_shape): - raise UserInputError( - "Provided tensor's shape: %s does not match the expected: %s.", - input_shape, - parameter_shape, - ) - - request = executable_network.requests[0] - request.infer(dict(zip(param_names, input_values))) - - # Set order of output blobs compatible with nG Function - result_buffers = [self._get_ie_output_blob_buffer(request.output_blobs, result) - for result in self.results] - - # Since OV overwrite result data type we have to convert results to the original one. - original_dtypes = [get_dtype(result.get_output_element_type(0)) for result in self.results] - converted_buffers = self.convert_buffers(result_buffers, original_dtypes) - return converted_buffers diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/__init__.py b/src/bindings/python/tests_compatibility/test_inference_engine/__init__.py deleted file mode 100644 index 46a1a3756d2..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (C) 2021 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_Blob.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_Blob.py deleted file mode 100644 index 8f6c9c00934..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_Blob.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -import numpy as np -import os - -from openvino.inference_engine import TensorDesc, Blob, IECore -from tests_compatibility.conftest import model_path -from tests_compatibility.test_utils.test_utils import generate_image - - -def test_init_with_tensor_desc(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - blob = Blob(tensor_desc) - assert isinstance(blob.buffer, np.ndarray) - assert blob.tensor_desc == tensor_desc - - -@pytest.mark.parametrize("shape, layout", [ - ([1, 3, 127, 127], "NCHW"), - ([], "SCALAR"), -]) -def test_init_with_numpy(shape, layout): - tensor_desc = TensorDesc("FP32", shape, layout) - array = np.ones(shape=shape, dtype=np.float32) - blob = Blob(tensor_desc, array) - assert isinstance(blob.buffer, np.ndarray) - assert np.shares_memory(blob.buffer, array) - assert blob.tensor_desc == tensor_desc - - -def test_get_tensor_desc(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - blob = Blob(tensor_desc) - assert blob.tensor_desc == tensor_desc - - -def test_get_buffer(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NCHW") - array = np.ones(shape=(1, 3, 127, 127), dtype=np.float32) - blob = Blob(tensor_desc, array) - assert np.array_equal(blob.buffer, array) - - -@pytest.mark.parametrize("precision, numpy_precision", [ - ("FP32", np.float32), - ("FP64", np.float64), - ("FP16", np.float16), - ("I8", np.int8), - ("U8", np.uint8), - ("I32", np.int32), - ("I16", np.int16), - ("U16", np.uint16), - ("I64", np.int64), - ("BOOL", np.uint8), - ("BIN", np.int8), - ("BF16", np.float16), -]) -def test_write_to_buffer(precision, numpy_precision): - tensor_desc = TensorDesc(precision, [1, 3, 127, 127], "NCHW") - array = np.zeros(shape=(1, 3, 127, 127), dtype=numpy_precision) - blob = Blob(tensor_desc, array) - ones_arr = np.ones(shape=(1, 3, 127, 127), dtype=numpy_precision) - blob.buffer[:] = ones_arr - assert np.array_equal(blob.buffer, ones_arr) - - -def test_write_numpy_scalar_int64(): - tensor_desc = TensorDesc("I64", [], "SCALAR") - scalar = np.array(0, dtype=np.int64) - blob = Blob(tensor_desc, scalar) - scalar_to_write = np.array(1, dtype=np.int64) - blob.buffer[:] = scalar_to_write - assert np.array_equal(blob.buffer, np.atleast_1d(scalar_to_write)) - - -def test_incompatible_array_and_td(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NCHW") - array = np.zeros(shape=(1, 2, 3, 4), dtype=np.float32) - with pytest.raises(AttributeError) as e: - Blob(tensor_desc, array) - assert "Number of elements in provided numpy array 24 and " \ - "required by TensorDesc 48387 are not equal" in str(e.value) - - -def test_incompatible_input_precision(): - image = generate_image(dtype="float64") - tensor_desc = TensorDesc("FP32", [1, 3, 32, 32], "NCHW") - with pytest.raises(ValueError) as e: - Blob(tensor_desc, image) - assert "Data type float64 of provided numpy array " \ - "doesn't match to TensorDesc precision FP32" in str(e.value) - - -# issue 49903 -@pytest.mark.skip(reason="Test will enable when CPU fix will be merge") -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", reason="Device dependent test") -def test_buffer_values_after_add_outputs(device): - test_net_xml_fp16, test_net_bin_fp16 = model_path(is_fp16=True) - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml_fp16, weights=test_net_bin_fp16) - output_layer = "22" - net.add_outputs(output_layer) - exec_net = ie_core.load_network(net, device) - feed_dict = { - 'data': np.random.normal(0, 1, (1, 3, 32, 32)).astype(np.float32) - } - result = exec_net.infer(feed_dict) - assert np.all(abs(result[output_layer])<30) - assert result[output_layer].dtype == np.float16 - - -def test_set_shape(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - blob = Blob(tensor_desc) - blob.set_shape([1, 4, 128, 128]) - assert blob.tensor_desc.dims == [1, 4, 128, 128] - assert blob.buffer.shape == (1, 4, 128, 128) - - -def test_cannot_set_shape_preallocated_memory(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - array = np.ones([1, 3, 127, 127], dtype=np.float32) - blob = Blob(tensor_desc, array) - with pytest.raises(RuntimeError) as e: - blob.set_shape([1, 4, 128, 128]) - assert "Cannot call setShape for Blobs created on top of preallocated memory" in str(e.value) diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_CDataPtr.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_CDataPtr.py deleted file mode 100644 index ebfa391eb96..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_CDataPtr.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import CDataPtr, IECore -from tests_compatibility.conftest import model_path, create_relu -import ngraph as ng - - -test_net_xml, test_net_bin = model_path() - - -def test_name(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert isinstance(exec_net.outputs['fc_out'], CDataPtr) - assert exec_net.outputs['fc_out'].name == "fc_out", "Incorrect name for layer 'fc_out'" - - -def test_precision(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert isinstance(exec_net.outputs['fc_out'], CDataPtr) - assert exec_net.outputs['fc_out'].precision == "FP32", "Incorrect precision for layer 'fc_out'" - - -def test_no_precision_setter(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - with pytest.raises(AttributeError) as e: - exec_net.outputs['fc_out'].precision = "I8" - assert "attribute 'precision' of 'openvino.inference_engine.ie_api.CDataPtr' objects is not writable" in str(e.value) - - -def test_layout(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert exec_net.outputs['fc_out'].layout == "NC", "Incorrect layout for layer 'fc_out" - - -def test_no_layout_setter(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - with pytest.raises(AttributeError) as e: - exec_net.outputs['fc_out'].layout = "CN" - assert "attribute 'layout' of 'openvino.inference_engine.ie_api.CDataPtr' objects is not writable" in str(e.value) - - -def test_initialized(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert exec_net.outputs['fc_out'].initialized, "Incorrect value for initialized property for layer 'fc_out" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_DataPtr.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_DataPtr.py deleted file mode 100644 index 433e0300fd2..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_DataPtr.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import IECore, DataPtr -from tests_compatibility.conftest import model_path, create_relu -import ngraph as ng - - -test_net_xml, test_net_bin = model_path() - - -def layer_out_data(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - return net.outputs['fc_out'] - - -def test_name(): - assert layer_out_data().name == 'fc_out', "Incorrect name for layer 'fc_out'" - - -def test_precision(): - assert layer_out_data().precision == "FP32", "Incorrect precision for layer 'fc_out'" - - -def test_precision_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.outputs['fc_out'].precision = "I8" - assert net.outputs['fc_out'].precision == "I8", "Incorrect precision for layer 'fc_out'" - - -def test_incorrect_precision_setter(): - with pytest.raises(ValueError) as e: - layer_out_data().precision = "123" - assert "Unsupported precision 123! List of supported precisions:" in str(e.value) - - -def test_layout(): - assert layer_out_data().layout == "NC", "Incorrect layout for layer 'fc_out'" - - -def test_initialized(): - assert layer_out_data().initialized, "Incorrect value for initialized property for layer 'fc_out'" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_ExecutableNetwork.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_ExecutableNetwork.py deleted file mode 100644 index 13a899520d5..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_ExecutableNetwork.py +++ /dev/null @@ -1,319 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import os -import pytest -import time - -from openvino.inference_engine import ie_api as ie -from tests_compatibility.conftest import model_path -from tests_compatibility.test_utils.test_utils import generate_image, generate_relu_model - - -test_net_xml, test_net_bin = model_path(False) - - -def test_infer(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device) - img = generate_image() - res = exec_net.infer({'parameter': img}) - assert np.argmax(res['relu'][0]) == 531 - del exec_net - del ie_core - - -def test_infer_wrong_input_name(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - img = generate_image() - with pytest.raises(AssertionError) as e: - exec_net.infer({'_data_': img}) - assert "No input with name _data_ found in network" in str(e.value) - del exec_net - del ie_core - - -def test_input_info(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=5) - assert isinstance(exec_net.input_info['data'], ie.InputInfoCPtr) - assert exec_net.input_info['data'].name == "data" - assert exec_net.input_info['data'].precision == "FP32" - assert isinstance(exec_net.input_info['data'].input_data, ie.DataPtr) - del exec_net - del ie_core - - -def test_outputs(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=5) - assert len(exec_net.outputs) == 1 - assert "fc_out" in exec_net.outputs - assert isinstance(exec_net.outputs['fc_out'], ie.CDataPtr) - del exec_net - del ie_core - - -def test_access_requests(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=5) - assert len(exec_net.requests) == 5 - assert isinstance(exec_net.requests[0], ie.InferRequest) - del exec_net - del ie_core - - -def test_async_infer_one_req(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request_handler = exec_net.start_async(request_id=0, inputs={'parameter': img}) - request_handler.wait() - res = request_handler.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - - -def test_async_infer_many_req(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=5) - img = generate_image() - for id in range(5): - request_handler = exec_net.start_async(request_id=id, inputs={'parameter': img}) - request_handler.wait() - res = request_handler.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - - -def test_async_infer_many_req_get_idle(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - num_requests = 5 - exec_net = ie_core.load_network(net, device, num_requests=num_requests) - img = generate_image() - check_id = set() - for id in range(2*num_requests): - request_id = exec_net.get_idle_request_id() - if request_id == -1: - status = exec_net.wait(num_requests=1, timeout=ie.WaitMode.RESULT_READY) - assert(status == ie.StatusCode.OK) - request_id = exec_net.get_idle_request_id() - assert(request_id >= 0) - request_handler = exec_net.start_async(request_id=request_id, inputs={'parameter': img}) - check_id.add(request_id) - status = exec_net.wait(timeout=ie.WaitMode.RESULT_READY) - assert status == ie.StatusCode.OK - for id in range(num_requests): - if id in check_id: - assert np.argmax(exec_net.requests[id].output_blobs['relu'].buffer) == 531 - del exec_net - del ie_core - - -def test_wait_before_start(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - num_requests = 5 - exec_net = ie_core.load_network(net, device, num_requests=num_requests) - img = generate_image() - requests = exec_net.requests - for id in range(num_requests): - status = requests[id].wait() - # Plugin API 2.0 has the different behavior will not return this status - # assert status == ie.StatusCode.INFER_NOT_STARTED - request_handler = exec_net.start_async(request_id=id, inputs={'parameter': img}) - status = requests[id].wait() - assert status == ie.StatusCode.OK - assert np.argmax(request_handler.output_blobs['relu'].buffer) == 531 - del exec_net - del ie_core - - -def test_wait_for_callback(device): - def callback(status, callbacks_info): - time.sleep(0.01) - callbacks_info['finished'] += 1 - - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - num_requests = 3 - exec_net = ie_core.load_network(net, device, num_requests=num_requests) - callbacks_info = {} - callbacks_info['finished'] = 0 - img = generate_image() - for request in exec_net.requests: - request.set_completion_callback(callback, callbacks_info) - request.async_infer({'data': img}) - - exec_net.wait(num_requests) - assert callbacks_info['finished'] == num_requests - - -def test_wrong_request_id(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - with pytest.raises(ValueError) as e: - exec_net.start_async(request_id=20, inputs={'data': img}) - assert "Incorrect request_id specified!" in str(e.value) - del exec_net - del ie_core - - -def test_wrong_num_requests(device): - with pytest.raises(ValueError) as e: - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - ie_core.load_network(net, device, num_requests=-1) - assert "Incorrect number of requests specified: -1. Expected positive integer number or zero for auto detection" \ - in str(e.value) - del ie_core - - -def test_wrong_num_requests_core(device): - with pytest.raises(ValueError) as e: - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=-1) - assert "Incorrect number of requests specified: -1. Expected positive integer number or zero for auto detection" \ - in str(e.value) - del ie_core - - -def test_plugin_accessible_after_deletion(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device) - img = generate_image() - res = exec_net.infer({'parameter': img}) - assert np.argmax(res['relu'][0]) == 531 - del exec_net - del ie_core - - -def test_exec_graph(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - img = generate_image() - res = exec_net.infer({'data': img}) - exec_graph = exec_net.get_exec_graph_info() - exec_graph_file = 'exec_graph.xml' - exec_graph.serialize(exec_graph_file) - assert os.path.exists(exec_graph_file) - os.remove(exec_graph_file) - del exec_net - del exec_graph - del ie_core - - -def test_export_import(device): - ie_core = ie.IECore() - if "EXPORT_IMPORT" not in ie_core.get_metric(device, "OPTIMIZATION_CAPABILITIES"): - pytest.skip(f"{ie_core.get_metric(device, 'FULL_DEVICE_NAME')} plugin due-to export, import model API isn't implemented.") - - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, "CPU") - exported_net_file = 'exported_model.bin' - exec_net.export(exported_net_file) - assert os.path.exists(exported_net_file) - exec_net = ie_core.import_network(exported_net_file, "CPU") - os.remove(exported_net_file) - img = generate_image() - res = exec_net.infer({'data': img}) - assert np.argmax(res['fc_out'][0]) == 9 - del exec_net - del ie_core - - -def test_multi_out_data(device): - # Regression test 23965 - # Check that CDataPtr for all output layers not copied between outputs map items - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - net.add_outputs(['28/Reshape']) - exec_net = ie_core.load_network(net, device) - assert "fc_out" in exec_net.outputs and "28/Reshape" in exec_net.outputs - assert isinstance(exec_net.outputs["fc_out"], ie.CDataPtr) - assert isinstance(exec_net.outputs["28/Reshape"], ie.CDataPtr) - assert exec_net.outputs["fc_out"].name == "fc_out" and exec_net.outputs["fc_out"].shape == [1, 10] - assert exec_net.outputs["28/Reshape"].name == "28/Reshape" and exec_net.outputs["28/Reshape"].shape == [1, 5184] - del ie_core - pass - - -def test_get_metric(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - network_name = exec_net.get_metric("NETWORK_NAME") - assert network_name == "test_model" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", reason="Device dependent test") -def test_get_config(device): - ie_core = ie.IECore() - if ie_core.get_metric(device, "FULL_DEVICE_NAME") == "arm_compute::NEON": - pytest.skip("Can't run on ARM plugin due-to CPU dependent test") - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - config = exec_net.get_config("PERF_COUNT") - assert config == "NO" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "GNA", reason="Device dependent test") -def test_set_config(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - exec_net.set_config({"DEVICE_MODE" : "GNA_HW"}) - parameter = exec_net.get_config("DEVICE_MODE") - assert parameter == "GNA_HW" - exec_net.set_config({"DEVICE_MODE" : "GNA_SW_EXACT"}) - parameter = exec_net.get_config("DEVICE_MODE") - assert parameter == "GNA_SW_EXACT" - - -# issue 28996 -# checks that objects can deallocate in this order, if not - segfault happends -def test_input_info_deallocation(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - input_info = exec_net.input_info["data"] - del ie_core - del exec_net - del input_info - - -def test_outputs_deallocation(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - output = exec_net.outputs["fc_out"] - del ie_core - del exec_net - del output - - -def test_exec_graph_info_deallocation(device): - ie_core = ie.IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie_core.load_network(net, device) - exec_graph_info = exec_net.get_exec_graph_info() - del ie_core - del exec_net - del exec_graph_info diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_IECore.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_IECore.py deleted file mode 100644 index edda335c011..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_IECore.py +++ /dev/null @@ -1,349 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import os -import platform -import pytest -import sys -from pathlib import Path -from threading import Event, Thread -from time import sleep, time -from queue import Queue - -from openvino.inference_engine import IENetwork, IECore, ExecutableNetwork -from tests_compatibility.conftest import model_path, plugins_path, model_onnx_path -import ngraph as ng - - -test_net_xml, test_net_bin = model_path() -test_net_onnx = model_onnx_path() -plugins_xml, plugins_win_xml, plugins_osx_xml = plugins_path() - - -def test_init_ie_core_no_cfg(): - ie = IECore() - assert isinstance(ie, IECore) - - -def test_init_ie_core_with_cfg(): - ie = IECore(plugins_xml) - assert isinstance(ie, IECore) - - -def test_get_version(device): - ie = IECore() - version = ie.get_versions(device) - assert isinstance(version, dict), "Returned version must be a dictionary" - assert device in version, "{} plugin version wasn't found in versions" - assert hasattr(version[device], "major"), "Returned version has no field 'major'" - assert hasattr(version[device], "minor"), "Returned version has no field 'minor'" - assert hasattr(version[device], "description"), "Returned version has no field 'description'" - assert hasattr(version[device], "build_number"), "Returned version has no field 'build_number'" - - -def test_load_network(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device) - assert isinstance(exec_net, ExecutableNetwork) - -def test_load_network_without_device(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net) - assert isinstance(exec_net, ExecutableNetwork) - -def test_load_network_from_file(device): - ie = IECore() - exec_net = ie.load_network(test_net_xml, device) - assert isinstance(exec_net, ExecutableNetwork) - -def test_load_network_from_file_without_device(): - ie = IECore() - exec_net = ie.load_network(test_net_xml) - assert isinstance(exec_net, ExecutableNetwork) - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", reason="Device independent test") -def test_load_network_wrong_device(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - with pytest.raises(RuntimeError) as e: - ie.load_network(net, "BLA") - assert 'Device with "BLA" name is not registered in the OpenVINO Runtime' in str(e.value) - - -def test_query_network(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - query_res = ie.query_network(net, device) - func_net = ng.function_from_cnn(net) - ops_net = func_net.get_ordered_ops() - ops_net_names = [op.friendly_name for op in ops_net] - assert [key for key in query_res.keys() if key not in ops_net_names] == [], \ - "Not all network layers present in query_network results" - assert next(iter(set(query_res.values()))) == device, "Wrong device for some layers" - - -@pytest.mark.dynamic_library -def test_register_plugin(): - device = "TEST_DEVICE" - lib_name = "test_plugin" - full_lib_name = lib_name + ".dll" if sys.platform == "win32" else "lib" + lib_name + ".so" - - ie = IECore() - ie.register_plugin(lib_name, device) - with pytest.raises(RuntimeError) as e: - ie.get_versions(device) - assert f"Cannot load library '{full_lib_name}'" in str(e.value) - -@pytest.mark.dynamic_library -def test_register_plugins(): - device = "TEST_DEVICE" - lib_name = "test_plugin" - full_lib_name = lib_name + ".dll" if sys.platform == "win32" else "lib" + lib_name + ".so" - plugins_xml_path = os.path.join(os.getcwd(), "plugin_path.xml") - - plugin_xml = f""" - - - - - """ - - with open(plugins_xml_path, "w") as f: - f.write(plugin_xml) - - ie = IECore() - ie.register_plugins(plugins_xml_path) - os.remove(plugins_xml_path) - - with pytest.raises(RuntimeError) as e: - ie.get_versions(device) - assert f"Cannot load library '{full_lib_name}'" in str(e.value) - - -def test_unload_plugin(device): - ie = IECore() - # Trigger plugin loading - ie.get_versions(device) - # Unload plugin - ie.unregister_plugin(device) - - -def test_available_devices(device): - ie = IECore() - devices = ie.available_devices - assert device in devices, f"Current device '{device}' is not listed in available devices '{', '.join(devices)}'" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", - reason=f"Cannot run test on device {os.environ.get('TEST_DEVICE')}, Plugin specific test") -def test_get_metric_list_of_str(): - ie = IECore() - param = ie.get_metric("CPU", "OPTIMIZATION_CAPABILITIES") - assert isinstance(param, list), "Parameter value for 'OPTIMIZATION_CAPABILITIES' " \ - f"metric must be a list but {type(param)} is returned" - assert all(isinstance(v, str) for v in param), "Not all of the parameter values for 'OPTIMIZATION_CAPABILITIES' " \ - "metric are strings!" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", - reason=f"Cannot run test on device {os.environ.get('TEST_DEVICE')}, Plugin specific test") -def test_get_metric_tuple_of_two_ints(): - ie = IECore() - if ie.get_metric("CPU", "FULL_DEVICE_NAME") == "arm_compute::NEON": - pytest.skip("Can't run on ARM plugin due-to unsupported device metric") - param = ie.get_metric("CPU", "RANGE_FOR_STREAMS") - assert isinstance(param, tuple), "Parameter value for 'RANGE_FOR_STREAMS' " \ - f"metric must be tuple but {type(param)} is returned" - assert all(isinstance(v, int) for v in param), "Not all of the parameter values for 'RANGE_FOR_STREAMS' " \ - "metric are integers!" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", - reason=f"Cannot run test on device {os.environ.get('TEST_DEVICE')}, Plugin specific test") -def test_get_metric_tuple_of_three_ints(): - ie = IECore() - if ie.get_metric("CPU", "FULL_DEVICE_NAME") == "arm_compute::NEON": - pytest.skip("Can't run on ARM plugin due-to unsupported device metric") - param = ie.get_metric("CPU", "RANGE_FOR_ASYNC_INFER_REQUESTS") - assert isinstance(param, tuple), "Parameter value for 'RANGE_FOR_ASYNC_INFER_REQUESTS' " \ - f"metric must be tuple but {type(param)} is returned" - assert all(isinstance(v, int) for v in param), "Not all of the parameter values for " \ - "'RANGE_FOR_ASYNC_INFER_REQUESTS' metric are integers!" - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", - reason=f"Cannot run test on device {os.environ.get('TEST_DEVICE')}, Plugin specific test") -def test_get_metric_str(): - ie = IECore() - param = ie.get_metric("CPU", "FULL_DEVICE_NAME") - assert isinstance(param, str), "Parameter value for 'FULL_DEVICE_NAME' " \ - f"metric must be string but {type(param)} is returned" - - -def test_read_network_from_xml(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert isinstance(net, IENetwork) - - net = ie.read_network(model=test_net_xml) - assert isinstance(net, IENetwork) - - -def test_read_network_as_path(): - ie = IECore() - - net = ie.read_network(model=Path(test_net_xml), weights=test_net_bin) - assert isinstance(net, IENetwork) - - net = ie.read_network(model=test_net_xml, weights=Path(test_net_bin)) - assert isinstance(net, IENetwork) - - net = ie.read_network(model=Path(test_net_xml)) - assert isinstance(net, IENetwork) - - -def test_read_network_from_onnx(): - ie = IECore() - net = ie.read_network(model=test_net_onnx) - assert isinstance(net, IENetwork) - - -def test_read_network_from_onnx_as_path(): - ie = IECore() - net = ie.read_network(model=Path(test_net_onnx)) - assert isinstance(net, IENetwork) - - -def test_incorrect_xml(): - ie = IECore() - with pytest.raises(Exception) as e: - ie.read_network(model="./model.xml", weights=Path(test_net_bin)) - assert "Path to the model ./model.xml doesn't exist or it's a directory" in str(e.value) - - -def test_incorrect_bin(): - ie = IECore() - with pytest.raises(Exception) as e: - ie.read_network(model=test_net_xml, weights="./model.bin") - assert "Path to the weights ./model.bin doesn't exist or it's a directory" in str(e.value) - - -def test_read_net_from_buffer(): - ie = IECore() - with open(test_net_bin, 'rb') as f: - bin = f.read() - with open(model_path()[0], 'rb') as f: - xml = f.read() - net = ie.read_network(model=xml, weights=bin, init_from_buffer=True) - assert isinstance(net, IENetwork) - - -def test_net_from_buffer_valid(): - ie = IECore() - with open(test_net_bin, 'rb') as f: - bin = f.read() - with open(model_path()[0], 'rb') as f: - xml = f.read() - net = ie.read_network(model=xml, weights=bin, init_from_buffer=True) - ref_net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.name == ref_net.name - assert net.batch_size == ref_net.batch_size - ii_net = net.input_info - ii_net2 = ref_net.input_info - o_net = net.outputs - o_net2 = ref_net.outputs - assert ii_net.keys() == ii_net2.keys() - assert o_net.keys() == o_net2.keys() - - -@pytest.mark.skipif(os.environ.get("TEST_DEVICE","CPU") != "GPU", reason=f"Device dependent test") -def test_load_network_release_gil(device): - running = True - message_queue = Queue() - def detect_long_gil_holds(): - sleep_time = 0.01 - latency_alert_threshold = 0.1 - # Send a message to indicate the thread is running and ready to detect GIL locks - message_queue.put("ready to detect") - while running: - start_sleep = time() - sleep(sleep_time) - elapsed = time() - start_sleep - if elapsed > latency_alert_threshold: - # Send a message to the testing thread that a long GIL lock occurred - message_queue.put(latency_alert_threshold) - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - # Wait for the GIL lock detector to be up and running - gil_hold_detection_thread = Thread(daemon=True, target=detect_long_gil_holds) - gil_hold_detection_thread.start() - # Wait to make sure the thread is started and checking for GIL holds - sleep(0.1) - assert message_queue.get(timeout=5) == "ready to detect" - # Run the function that should unlock the GIL - exec_net = ie.load_network(net, device) - # Ensure resources are closed - running = False - gil_hold_detection_thread.join(timeout=5) - # Assert there were never any long gil locks - assert message_queue.qsize() == 0, \ - f"More than 0 GIL locks occured! Latency: {message_queue.get()})" - - -def test_nogil_safe(device): - libc_name, libc_version = platform.libc_ver() - if libc_name == 'glibc': - version = tuple(int(x) for x in libc_version.split('.')) - if version < (2, 34): - pytest.skip("There is an issue in glibc for an older version.") - - call_thread_func = Event() - switch_interval = sys.getswitchinterval() - core = IECore() - net = core.read_network(model=test_net_xml, weights=test_net_bin) - - def thread_target(thread_func, thread_args): - call_thread_func.wait() - call_thread_func.clear() - thread_func(*thread_args) - - def main_thread_target(gil_release_func, args): - call_thread_func.set() - gil_release_func(*args) - - def test_run_parallel(gil_release_func, args, thread_func, thread_args): - thread = Thread(target=thread_target, args=[thread_func, thread_args]) - sys.setswitchinterval(1000) - thread.start() - main_thread_target(gil_release_func, args) - thread.join() - sys.setswitchinterval(switch_interval) - - main_targets = [{ - core.read_network: [test_net_xml, test_net_bin], - core.load_network: [net, device], - }, - { - core.load_network: [net, device], - }] - - thread_targets = [{ - core.get_versions: [device,], - core.read_network: [test_net_xml, test_net_bin], - core.load_network: [net, device], - core.query_network: [net, device], - getattr: [core, "available_devices"], - }, - { - getattr: [net, "name"], - getattr: [net, "input_info"], - getattr: [net, "outputs"], - getattr: [net, "batch_size"], - }] - - for main_target, custom_target in zip(main_targets, thread_targets): - for nogil_func, args in main_target.items(): - for thread_func, thread_args in custom_target.items(): - test_run_parallel(nogil_func, args, thread_func, thread_args) diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_IENetwork.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_IENetwork.py deleted file mode 100644 index 82040639671..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_IENetwork.py +++ /dev/null @@ -1,259 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import os -import pytest - -import ngraph as ng -from openvino.inference_engine import IECore, DataPtr, InputInfoPtr, PreProcessInfo -from tests_compatibility.conftest import model_path - - -test_net_xml, test_net_bin = model_path() - - -def test_name(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.name == "test_model" - - -def test_input_info(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert isinstance(net.input_info['data'], InputInfoPtr) - assert net.input_info['data'].layout == "NCHW" - assert net.input_info['data'].precision == "FP32" - assert isinstance(net.input_info['data'].input_data, DataPtr) - assert isinstance(net.input_info['data'].preprocess_info, PreProcessInfo) - - -def test_input_info_precision_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.input_info['data'].layout == "NCHW" - net.input_info['data'].layout = "NHWC" - assert net.input_info['data'].layout == "NHWC" - - -def test_input_input_info_layout_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.input_info['data'].precision == "FP32" - net.input_info['data'].precision = "I8" - assert net.input_info['data'].precision == "I8" - - -def test_input_unsupported_precision_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - with pytest.raises(ValueError) as e: - net.input_info['data'].precision = "BLA" - assert "Unsupported precision BLA! List of supported precisions: " in str(e.value) - - -def test_input_unsupported_layout_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - with pytest.raises(ValueError) as e: - net.input_info['data'].layout = "BLA" - assert "Unsupported layout BLA! List of supported layouts: " in str(e.value) - - -def test_outputs(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert isinstance(net.outputs['fc_out'], DataPtr) - assert net.outputs['fc_out'].layout == "NC" - assert net.outputs['fc_out'].precision == "FP32" - assert net.outputs['fc_out'].shape == [1, 10] - - -def test_output_precision_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.outputs['fc_out'].precision == "FP32" - net.outputs['fc_out'].precision = "I8" - assert net.outputs['fc_out'].precision == "I8" - - -def test_output_unsupported_precision_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - with pytest.raises(ValueError) as e: - net.outputs['fc_out'].precision = "BLA" - assert "Unsupported precision BLA! List of supported precisions: " in str(e.value) - - -def test_add_ouputs(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.add_outputs('28/Reshape') - net.add_outputs(['29/WithoutBiases']) - assert sorted(net.outputs) == ['28/Reshape', '29/WithoutBiases', 'fc_out'] - - -def test_add_outputs_with_port(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.add_outputs(('28/Reshape', 0)) - net.add_outputs([('29/WithoutBiases', 0)]) - assert sorted(net.outputs) == ['28/Reshape', '29/WithoutBiases', 'fc_out'] - - -def test_add_outputs_with_and_without_port(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.add_outputs('28/Reshape') - net.add_outputs([('29/WithoutBiases', 0)]) - assert sorted(net.outputs) == ['28/Reshape', '29/WithoutBiases', 'fc_out'] - - -def test_batch_size_getter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.batch_size == 1 - - -def test_batch_size_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.batch_size = 4 - assert net.batch_size == 4 - assert net.input_info['data'].input_data.shape == [4, 3, 32, 32] - - -def test_batch_size_after_reshape(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.reshape({'data': [4, 3, 32, 32]}) - assert net.batch_size == 4 - assert net.input_info['data'].input_data.shape == [4, 3, 32, 32] - net.reshape({'data': [8, 3, 32, 32]}) - assert net.batch_size == 8 - assert net.input_info['data'].input_data.shape == [8, 3, 32, 32] - - -def test_serialize(): - def run(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.serialize("./serialized_net.xml", "./serialized_net.bin") - serialized_net = ie.read_network(model="./serialized_net.xml", weights="./serialized_net.bin") - func_net = ng.function_from_cnn(net) - ops_net = func_net.get_ordered_ops() - ops_net_names = [op.friendly_name for op in ops_net] - func_serialized_net = ng.function_from_cnn(serialized_net) - ops_serialized_net = func_serialized_net.get_ordered_ops() - ops_serialized_net_names = [op.friendly_name for op in ops_serialized_net] - assert ops_serialized_net_names == ops_net_names - - run() - # xml/bin files shall not be acquired after by 'net' here, can be removed - os.remove("./serialized_net.xml") - os.remove("./serialized_net.bin") - - -def test_reshape(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.reshape({"data": (2, 3, 32, 32)}) - assert net.input_info["data"].input_data.shape == [2, 3, 32, 32] - - -def test_reshape_dynamic(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - with pytest.raises(ValueError) as e: - net.reshape({"data": (-1, 3, 32, 32)}) - assert "Detected dynamic dimension in the shape (-1, 3, 32, 32) of the `data` input" in str(e.value) - - -def test_net_from_buffer_valid(): - ie = IECore() - with open(test_net_bin, 'rb') as f: - bin = f.read() - with open(model_path()[0], 'rb') as f: - xml = f.read() - net = ie.read_network(model=xml, weights=bin, init_from_buffer=True) - ref_net = ie.read_network(model=test_net_xml, weights=test_net_bin) - assert net.name == ref_net.name - assert net.batch_size == ref_net.batch_size - ii_net = net.input_info - ii_net2 = ref_net.input_info - o_net = net.outputs - o_net2 = ref_net.outputs - assert ii_net.keys() == ii_net2.keys() - assert o_net.keys() == o_net2.keys() - - -def test_multi_out_data(): - # Regression test 23965 - # Check that DataPtr for all output layers not copied between outputs map items - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - net.add_outputs(['28/Reshape']) - assert "28/Reshape" in net.outputs and "fc_out" in net.outputs - assert isinstance(net.outputs["28/Reshape"], DataPtr) - assert isinstance(net.outputs["fc_out"], DataPtr) - assert net.outputs["28/Reshape"].name == "28/Reshape" and net.outputs["28/Reshape"].shape == [1, 5184] - assert net.outputs["fc_out"].name == "fc_out" and net.outputs["fc_out"].shape == [1, 10] - pass - - -def test_tensor_names(): - model = """ - - - - - - - 1 - 3 - 22 - 22 - - - - - - - 1 - 3 - 22 - 22 - - - - - 1 - 3 - 22 - 22 - - - - - - - 1 - 3 - 22 - 22 - - - - - - - - - - """ - ie = IECore() - weights = b'' - net = ie.read_network(model=model.encode('utf-8'), weights=weights, init_from_buffer=True) - assert net.get_ov_name_for_tensor("relu_t") == "activation" - assert net.get_ov_name_for_tensor("identity_t") == "activation" - assert net.get_ov_name_for_tensor("input") == "in1" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_InferRequest.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_InferRequest.py deleted file mode 100644 index 1eedac6a5f3..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_InferRequest.py +++ /dev/null @@ -1,517 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import os -import pytest -import threading -from datetime import datetime -import time - -from openvino.inference_engine import ie_api as ie -from tests_compatibility.conftest import model_path, create_encoder -from tests_compatibility.test_utils.test_utils import generate_image, generate_relu_model -import ngraph as ng -from ngraph.impl import Function, Type - -test_net_xml, test_net_bin = model_path() - - -def create_function_with_memory(input_shape, data_type): - input_data = ng.parameter(input_shape, name="input_data", dtype=data_type) - init_val = ng.constant(np.zeros(input_shape), data_type) - rv = ng.read_value(init_val, "var_id_667") - add = ng.add(rv, input_data, name="MemoryAdd") - node = ng.assign(add, "var_id_667") - res = ng.result(add, "res") - func = Function(results=[res], sinks=[node], parameters=[input_data], name="name") - caps = Function.to_capsule(func) - return caps - - -def load_sample_model(device, num_requests=1): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=num_requests) - return executable_network - - -def test_input_blobs(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=2) - td = ie.TensorDesc("FP32", (1, 3, 32, 32), "NCHW") - assert executable_network.requests[0].input_blobs['data'].tensor_desc == td - - -def test_output_blobs(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=2) - td = ie.TensorDesc("FP32", (1, 10), "NC") - assert executable_network.requests[0].output_blobs['fc_out'].tensor_desc == td - - -def test_inputs_list(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=2) - - for req in executable_network.requests: - assert len(req._inputs_list) == 1 - assert "data" in req._inputs_list - del ie_core - - -def test_outputs_list(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=2) - - for req in executable_network.requests: - assert len(req._outputs_list) == 1 - assert "fc_out" in req._outputs_list - del ie_core - - -def test_access_input_buffer(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=1) - buffer = executable_network.requests[0]._get_blob_buffer("data".encode()).to_numpy() - assert buffer.shape == (1, 3, 32, 32) - assert buffer.strides == (12288, 4096, 128, 4) - assert buffer.dtype == np.float32 - del executable_network - del ie_core - del net - - -def test_access_output_buffer(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=1) - buffer = executable_network.requests[0]._get_blob_buffer("fc_out".encode()).to_numpy() - assert buffer.shape == (1, 10) - assert buffer.strides == (40, 4) - assert buffer.dtype == np.float32 - del executable_network - del ie_core - del net - - -def test_write_to_input_blobs_directly(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = executable_network.requests[0] - input_data = request.input_blobs["data"] - input_data.buffer[:] = img - assert np.array_equal(executable_network.requests[0].input_blobs["data"].buffer, img) - del executable_network - del ie_core - del net - - -def test_write_to_input_blobs_copy(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - executable_network = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = executable_network.requests[0] - request.input_blobs["data"].buffer[:] = img - assert np.allclose(executable_network.requests[0].input_blobs["data"].buffer, img) - del executable_network - del ie_core - del net - - -def test_infer(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.infer({'parameter': img}) - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - del net - - -def test_async_infer_default_timeout(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.async_infer({'parameter': img}) - request.wait() - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - del net - - -def test_async_infer_wait_finish(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.async_infer({'parameter': img}) - request.wait(ie.WaitMode.RESULT_READY) - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - del net - - -def test_async_infer_wait_time(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=2) - img = generate_image() - request = exec_net.requests[0] - request.async_infer({'parameter': img}) - start_time = datetime.utcnow() - status = request.wait(ie.WaitMode.RESULT_READY) - assert status == ie.StatusCode.OK - time_delta = datetime.utcnow() - start_time - latency_ms = (time_delta.microseconds / 1000) + (time_delta.seconds * 1000) - timeout = max(100, latency_ms) - request = exec_net.requests[1] - request.async_infer({'parameter': img}) - max_repeat = 10 - status = ie.StatusCode.REQUEST_BUSY - i = 0 - while i < max_repeat and status != ie.StatusCode.OK: - status = request.wait(timeout) - i += 1 - assert status == ie.StatusCode.OK - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - del exec_net - del ie_core - del net - - -def test_async_infer_wait_status(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.async_infer({'parameter': img}) - request.wait(ie.WaitMode.RESULT_READY) - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - status = request.wait(ie.WaitMode.STATUS_ONLY) - assert status == ie.StatusCode.OK - del exec_net - del ie_core - del net - - -def test_async_infer_fill_inputs(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.input_blobs['parameter'].buffer[:] = img - request.async_infer() - status_end = request.wait() - assert status_end == ie.StatusCode.OK - res = request.output_blobs['relu'].buffer - assert np.argmax(res[0]) == 531 - del exec_net - del ie_core - del net - - -def test_infer_modify_outputs(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - outputs0 = exec_net.infer({'parameter': img}) - status_end = request.wait() - assert status_end == ie.StatusCode.OK - assert np.argmax(outputs0['relu']) == 531 - outputs0['relu'][:] = np.zeros(shape=(1, 3, 32, 32), dtype=np.float32) - outputs1 = request.output_blobs - assert np.argmax(outputs1['relu'].buffer) == 531 - outputs1['relu'].buffer[:] = np.ones(shape=(1, 3, 32, 32), dtype=np.float32) - outputs2 = request.output_blobs - assert np.argmax(outputs2['relu'].buffer) == 531 - del exec_net - del ie_core - del net - - -def test_async_infer_callback(device): - def static_vars(**kwargs): - def decorate(func): - for k in kwargs: - setattr(func, k, kwargs[k]) - return func - - return decorate - - @static_vars(callback_called=0) - def callback(self, status): - callback.callback_called = 1 - - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.set_completion_callback(callback) - request.async_infer({'parameter': img}) - status = request.wait() - assert status == ie.StatusCode.OK - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - assert callback.callback_called == 1 - del exec_net - del ie_core - - -def test_async_infer_callback_wait_before_start(device): - def static_vars(**kwargs): - def decorate(func): - for k in kwargs: - setattr(func, k, kwargs[k]) - return func - return decorate - - @static_vars(callback_called=0) - def callback(self, status): - callback.callback_called = 1 - - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request = exec_net.requests[0] - request.set_completion_callback(callback) - status = request.wait() - # Plugin API 2.0 has the different behavior will not return this status - # assert status == ie.StatusCode.INFER_NOT_STARTED - request.async_infer({'parameter': img}) - status = request.wait() - assert status == ie.StatusCode.OK - res = request.output_blobs['relu'].buffer - assert np.argmax(res) == 531 - assert callback.callback_called == 1 - del exec_net - del ie_core - - -def test_async_infer_callback_wait_in_callback(device): - class InferReqWrap: - def __init__(self, request): - self.request = request - self.cv = threading.Condition() - self.request.set_completion_callback(self.callback) - self.status_code = self.request.wait(ie.WaitMode.STATUS_ONLY) - # Plugin API 2.0 has the different behavior will not return this status - # assert self.status_code == ie.StatusCode.INFER_NOT_STARTED - - def callback(self, statusCode, userdata): - self.status_code = self.request.wait(ie.WaitMode.STATUS_ONLY) - self.cv.acquire() - self.cv.notify() - self.cv.release() - - def execute(self, input_data): - self.request.async_infer(input_data) - self.cv.acquire() - self.cv.wait() - self.cv.release() - status = self.request.wait(ie.WaitMode.RESULT_READY) - assert status == ie.StatusCode.OK - assert self.status_code == ie.StatusCode.RESULT_NOT_READY - - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=1) - img = generate_image() - request_wrap = InferReqWrap(exec_net.requests[0]) - request_wrap.execute({'data': img}) - del exec_net - del ie_core - - -def test_async_infer_wait_while_callback_will_not_finish(device): - def callback(status, callback_status): - time.sleep(0.01) - callback_status['finished'] = True - - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - exec_net = ie_core.load_network(net, device, num_requests=1) - callback_status = {} - callback_status['finished'] = False - request = exec_net.requests[0] - request.set_completion_callback(callback, py_data=callback_status) - img = generate_image() - request.async_infer({'data': img}) - request.wait() - assert callback_status['finished'] == True - - -def test_get_perf_counts(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - ie_core.set_config({"PERF_COUNT": "YES"}, device) - exec_net = ie_core.load_network(net, device) - img = generate_image() - request = exec_net.requests[0] - request.infer({'data': img}) - pc = request.get_perf_counts() - assert pc['29/WithoutBiases']["status"] == "EXECUTED" - del exec_net - del ie_core - del net - - -def test_blob_setter(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - exec_net_1 = ie_core.load_network(network=net, device_name=device, num_requests=1) - - net.input_info['data'].layout = "NHWC" - exec_net_2 = ie_core.load_network(network=net, device_name=device, num_requests=1) - - img = generate_image() - res_1 = np.sort(exec_net_1.infer({"data": img})['fc_out']) - - img = np.transpose(img, axes=(0, 2, 3, 1)).astype(np.float32) - tensor_desc = ie.TensorDesc("FP32", [1, 3, 32, 32], "NHWC") - img_blob = ie.Blob(tensor_desc, img) - request = exec_net_2.requests[0] - request.set_blob('data', img_blob) - request.infer() - res_2 = np.sort(request.output_blobs['fc_out'].buffer) - assert np.allclose(res_1, res_2, atol=1e-2, rtol=1e-2) - - -def test_getting_preprocess(device): - ie_core = ie.IECore() - net = ie_core.read_network(test_net_xml, test_net_bin) - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - preprocess_info = request.preprocess_info["data"] - assert isinstance(preprocess_info, ie.PreProcessInfo) - assert preprocess_info.mean_variant == ie.MeanVariant.NONE - - -def test_resize_algorithm_work(device): - ie_core = ie.IECore() - net = generate_relu_model([1, 3, 32, 32]) - exec_net_1 = ie_core.load_network(network=net, device_name=device, num_requests=1) - - img = generate_image() - res_1 = np.sort(exec_net_1.infer({"parameter": img})['relu']) - - net.input_info['parameter'].preprocess_info.resize_algorithm = ie.ResizeAlgorithm.RESIZE_BILINEAR - - exec_net_2 = ie_core.load_network(net, device) - - tensor_desc = ie.TensorDesc("FP32", [1, 3, img.shape[2], img.shape[3]], "NCHW") - img_blob = ie.Blob(tensor_desc, img) - request = exec_net_2.requests[0] - assert request.preprocess_info["parameter"].resize_algorithm == ie.ResizeAlgorithm.RESIZE_BILINEAR - request.set_blob('parameter', img_blob) - request.infer() - res_2 = np.sort(request.output_blobs['relu'].buffer) - - assert np.allclose(res_1, res_2, atol=1e-2, rtol=1e-2) - - -@pytest.mark.parametrize("mode", ["set_init_memory_state", "reset_memory_state", "normal"]) -@pytest.mark.parametrize("data_type", ["FP32", "FP16", "I32"]) -@pytest.mark.parametrize("input_shape", [[10], [10, 10], [10, 10, 10], [2, 10, 10, 10]]) -@pytest.mark.skipif(os.environ.get("TEST_DEVICE", "CPU") != "CPU", - reason=f"Can't run test on device {os.environ.get('TEST_DEVICE', 'CPU')}, " - "Memory layers fully supported only on CPU") -def test_query_state_write_buffer(device, input_shape, data_type, mode): - ie_core = ie.IECore() - - layout = ["C", "HW", "CHW", "NCHW"] - - from openvino.inference_engine import TensorDesc, Blob, format_map - - net = ie.IENetwork(create_function_with_memory(input_shape, format_map[data_type])) - ie_core = ie.IECore() - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - mem_states = request.query_state() - mem_state = mem_states[0] - - assert mem_state.name == 'var_id_667' - # todo: Uncomment after fix 45611, - # CPU plugin returns outputs and memory state in FP32 in case of FP16 original precision - #assert mem_state.state.tensor_desc.precision == data_type - - for i in range(1, 10): - if mode == "set_init_memory_state": - # create initial value - const_init = 5 - init_array = np.full(input_shape, const_init, dtype=format_map[mem_state.state.tensor_desc.precision]) - tensor_desc = TensorDesc(mem_state.state.tensor_desc.precision, input_shape, layout[len(input_shape) - 1]) - blob = Blob(tensor_desc, init_array) - mem_state.state = blob - - res = exec_net.infer({"input_data": np.full(input_shape, 1, dtype=format_map[data_type])}) - expected_res = np.full(input_shape, 1 + const_init, dtype=format_map[data_type]) - elif mode == "reset_memory_state": - # reset initial state of ReadValue to zero - mem_state.reset() - res = exec_net.infer({"input_data": np.full(input_shape, 1, dtype=format_map[data_type])}) - - # always ones - expected_res = np.full(input_shape, 1, dtype=format_map[data_type]) - else: - res = exec_net.infer({"input_data": np.full(input_shape, 1, dtype=format_map[data_type])}) - expected_res = np.full(input_shape, i, dtype=format_map[data_type]) - - assert np.allclose(res['MemoryAdd'], expected_res, atol=1e-6), \ - "Expected values: {} \n Actual values: {} \n".format(expected_res, res) - - -def test_set_blob_with_incorrect_name(device): - function = create_encoder([4, 4, 20, 20]) - net = ng.function_to_cnn(function) - ie_core = ie.IECore() - exec_net = ie_core.load_network(net, device) - tensor_desc = exec_net.requests[0].input_blobs["data"].tensor_desc - tensor_desc.dims = [4, 4, 20, 20] - blob = ie.Blob(tensor_desc) - with pytest.raises(RuntimeError) as e: - exec_net.requests[0].set_blob("incorrect_name", blob) - assert f"Failed to find input or output with name: 'incorrect_name'" in str(e.value) - - -def test_set_blob_with_incorrect_size(device): - function = create_encoder([4, 4, 20, 20]) - net = ng.function_to_cnn(function) - ie_core = ie.IECore() - exec_net = ie_core.load_network(net, device) - tensor_desc = exec_net.requests[0].input_blobs["data"].tensor_desc - tensor_desc.dims = [tensor_desc.dims[0]*2, 4, 20, 20] - blob = ie.Blob(tensor_desc) - with pytest.raises(RuntimeError) as e: - exec_net.requests[0].set_blob("data", blob) - assert f"Can't set the input tensor" in str(e.value) - with pytest.raises(RuntimeError) as e: - exec_net.requests[0].set_blob("out", blob) - assert f"Can't set the output tensor" in str(e.value) diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoCPtr.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoCPtr.py deleted file mode 100644 index a34598914db..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoCPtr.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import InputInfoCPtr, DataPtr, IECore, TensorDesc -from tests_compatibility.conftest import model_path - - -test_net_xml, test_net_bin = model_path() - - -def test_name(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert isinstance(exec_net.input_info['data'], InputInfoCPtr) - assert exec_net.input_info['data'].name == "data", "Incorrect name" - del ie - del exec_net - - -def test_precision(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert isinstance(exec_net.input_info['data'], InputInfoCPtr) - assert exec_net.input_info['data'].precision == "FP32", "Incorrect precision" - del ie - del exec_net - - -def test_no_precision_setter(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - with pytest.raises(AttributeError) as e: - exec_net.input_info['data'].precision = "I8" - assert "attribute 'precision' of 'openvino.inference_engine.ie_api.InputInfoCPtr' " \ - "objects is not writable" in str(e.value) - del ie - del exec_net - - -def test_input_data(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - assert isinstance(exec_net.input_info['data'], InputInfoCPtr) - assert isinstance(exec_net.input_info['data'].input_data, DataPtr), "Incorrect precision for layer 'fc_out'" - del ie - del exec_net - - -# issue 28996 -# checks that objects can deallocate in this order, if not - segfault happends -def test_input_data_deallocation(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device) - input_info = exec_net.input_info['data'] - input_data = input_info.input_data - del ie - del exec_net - del input_info - del input_data - - -def test_tensor_desc(device): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - exec_net = ie.load_network(net, device, num_requests=5) - tensor_desc = exec_net.input_info['data'].tensor_desc - assert isinstance(tensor_desc, TensorDesc) - assert tensor_desc.layout == "NCHW" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoPtr.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoPtr.py deleted file mode 100644 index f5d1f6efba7..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_InputInfoPtr.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import InputInfoPtr, PreProcessInfo, DataPtr, IECore, TensorDesc, ColorFormat -from tests_compatibility.conftest import model_path - - -test_net_xml, test_net_bin = model_path() - - -def get_input_info(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - return net.input_info["data"] - - -def test_input_info(): - assert isinstance(get_input_info(), InputInfoPtr) - - -def test_input_data(): - assert isinstance(get_input_info().input_data, DataPtr) - - -def test_input_data_setter(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - input_info = net.input_info["data"] - other_input_data = net.outputs["fc_out"] - input_info.input_data = other_input_data - assert input_info.input_data.name == "fc_out" - - -def test_incorrect_input_info_setter(): - with pytest.raises(TypeError) as e: - get_input_info().input_data = "dfds" - assert "Argument 'input_ptr' has incorrect type" in str(e.value) - - -def test_name(): - assert get_input_info().name == "data" - - -def test_precision(): - assert get_input_info().precision == "FP32" - - -def test_precision_setter(): - input_info = get_input_info() - input_info.precision = "I8" - assert input_info.precision == "I8", "Incorrect precision" - - -def test_incorrect_precision_setter(): - with pytest.raises(ValueError) as e: - get_input_info().precision = "123" - assert "Unsupported precision 123! List of supported precisions:" in str(e.value) - - -def test_layout(): - assert get_input_info().layout == "NCHW" - - -def test_layout_setter(): - input_info = get_input_info() - input_info.layout = "NHWC" - assert input_info.layout == "NHWC", "Incorrect layout" - - -def test_incorrect_layout_setter(): - with pytest.raises(ValueError) as e: - get_input_info().layout = "123" - assert "Unsupported layout 123! List of supported layouts:" in str(e.value) - - -def test_preprocess_info(): - input_info = get_input_info() - preprocess_info = input_info.preprocess_info - assert isinstance(preprocess_info, PreProcessInfo) - assert preprocess_info.color_format == ColorFormat.RAW - - -def test_tensor_desc(): - tensor_desc = get_input_info().tensor_desc - assert isinstance(tensor_desc, TensorDesc) - assert tensor_desc.layout == "NCHW" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_NGraph.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_NGraph.py deleted file mode 100644 index 2096909f6c6..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_NGraph.py +++ /dev/null @@ -1,68 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -from openvino.inference_engine import IECore, IENetwork -import ngraph as ng -from ngraph.impl import Function - -from tests_compatibility.conftest import model_path, create_relu - - -test_net_xml, test_net_bin = model_path() - - -def test_create_IENetwork_from_nGraph(): - func = create_relu([1, 3, 22, 22]) - caps = Function.to_capsule(func) - cnnNetwork = IENetwork(caps) - assert cnnNetwork != None - func2 = ng.function_from_cnn(cnnNetwork) - assert func2 != None - assert len(func2.get_ops()) == 3 - - -def test_get_IENetwork_from_nGraph(): - func = create_relu([1, 3, 22, 22]) - caps = Function.to_capsule(func) - cnnNetwork = IENetwork(caps) - assert cnnNetwork != None - assert ng.function_from_cnn(cnnNetwork) != None - func2 = ng.function_from_cnn(cnnNetwork) - assert func2 != None - - -def test_get_ops_from_IENetwork(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - func = ng.function_from_cnn(net) - ops = func.get_ordered_ops() - ops_names = [op.friendly_name for op in ops] - assert len(ops_names) != 0 - assert 'data' in ops_names - - -def test_get_type_name(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - func = ng.function_from_cnn(net) - ops = func.get_ordered_ops() - assert ops[2].get_type_name() == "Convolution" - - -def test_getting_shapes(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - func = ng.function_from_cnn(net) - ops = func.get_ordered_ops() - shapes = [sh for sh in ops[2].shape] - assert shapes == [1, 16, 32, 32] - - -def test_get_set_rt_info(): - ie = IECore() - net = ie.read_network(model=test_net_xml, weights=test_net_bin) - func = ng.function_from_cnn(net) - ops = func.get_ordered_ops() - rt_info = ops[14].get_rt_info() - rt_info["affinity"] = "test_affinity" - assert ops[14].get_rt_info()["affinity"] == "test_affinity" diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_PreProcessInfo.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_PreProcessInfo.py deleted file mode 100644 index 32b30e8cdf0..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_PreProcessInfo.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import PreProcessInfo, IECore, TensorDesc, Blob, PreProcessChannel,\ - MeanVariant, ResizeAlgorithm, ColorFormat -from tests_compatibility.conftest import model_path - - -test_net_xml, test_net_bin = model_path() - - -def test_preprocess_info(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - assert isinstance(net.input_info["data"].preprocess_info, PreProcessInfo) - - -def test_color_format(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - assert preprocess_info.color_format == ColorFormat.RAW - - -def test_color_format_setter(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.color_format = ColorFormat.BGR - assert preprocess_info.color_format == ColorFormat.BGR - - -def test_resize_algorithm(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - assert preprocess_info.resize_algorithm == ResizeAlgorithm.NO_RESIZE - - -def test_resize_algorithm_setter(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.resize_algorithm = ResizeAlgorithm.RESIZE_BILINEAR - assert preprocess_info.resize_algorithm == ResizeAlgorithm.RESIZE_BILINEAR - - -def test_mean_variant(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - assert preprocess_info.mean_variant == MeanVariant.NONE - - -def test_mean_variant_setter(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.mean_variant = MeanVariant.MEAN_IMAGE - assert preprocess_info.mean_variant == MeanVariant.MEAN_IMAGE - - -def test_get_number_of_channels(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - assert net.input_info["data"].preprocess_info.get_number_of_channels() == 0 - - -def test_init(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - net.input_info['data'].preprocess_info.init(5) - assert net.input_info["data"].preprocess_info.get_number_of_channels() == 5 - - -def test_set_mean_image(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - tensor_desc = TensorDesc("FP32", [0, 127, 127], "CHW") - mean_image_blob = Blob(tensor_desc) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.set_mean_image(mean_image_blob) - assert preprocess_info.mean_variant == MeanVariant.MEAN_IMAGE - - -def test_get_pre_process_channel(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.init(1) - pre_process_channel = preprocess_info[0] - assert isinstance(pre_process_channel, PreProcessChannel) - - -def test_set_mean_image_for_channel(): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - tensor_desc = TensorDesc("FP32", [127, 127], "HW") - mean_image_blob = Blob(tensor_desc) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.init(1) - preprocess_info.set_mean_image_for_channel(mean_image_blob, 0) - pre_process_channel = preprocess_info[0] - assert isinstance(pre_process_channel.mean_data, Blob) - assert pre_process_channel.mean_data.tensor_desc.dims == [127, 127] - assert preprocess_info.mean_variant == MeanVariant.MEAN_IMAGE - - -def test_resize_algorithm_set(device): - ie_core = IECore() - net = ie_core.read_network(model=test_net_xml, weights=test_net_bin) - preprocess_info = net.input_info["data"].preprocess_info - preprocess_info.resize_algorithm = ResizeAlgorithm.RESIZE_BILINEAR - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - pp = request.preprocess_info["data"] - assert pp.resize_algorithm == ResizeAlgorithm.RESIZE_BILINEAR - - -def test_set_mean_variant_to_read_only_preprocess(device): - ie_core = IECore() - net = ie_core.read_network(test_net_xml) - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - preprocess_info = request.preprocess_info["data"] - assert isinstance(preprocess_info, PreProcessInfo) - with pytest.raises(TypeError) as e: - preprocess_info.mean_variant = MeanVariant.MEAN_IMAGE - assert "Cannot set mean image when called from constant" in str(e.value) - - -def test_set_resize_algorithm_to_read_only_preprocess(device): - ie_core = IECore() - net = ie_core.read_network(test_net_xml) - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - preprocess_info = request.preprocess_info["data"] - assert isinstance(preprocess_info, PreProcessInfo) - with pytest.raises(TypeError) as e: - preprocess_info.resize_algorithm = ResizeAlgorithm.RESIZE_BILINEAR - assert "Cannot set resize algorithm when called from constant" in str(e.value) - - -def test_set_color_format_to_read_only_preprocess(device): - ie_core = IECore() - net = ie_core.read_network(test_net_xml) - exec_net = ie_core.load_network(network=net, device_name=device, num_requests=1) - request = exec_net.requests[0] - preprocess_info = request.preprocess_info["data"] - assert isinstance(preprocess_info, PreProcessInfo) - with pytest.raises(TypeError) as e: - preprocess_info.color_format = ColorFormat.BGR - assert "Cannot set color format when called from constant" in str(e.value) diff --git a/src/bindings/python/tests_compatibility/test_inference_engine/test_TensorDesc.py b/src/bindings/python/tests_compatibility/test_inference_engine/test_TensorDesc.py deleted file mode 100644 index 76ba71c5398..00000000000 --- a/src/bindings/python/tests_compatibility/test_inference_engine/test_TensorDesc.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import pytest - -from openvino.inference_engine import TensorDesc - - -def test_init(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - assert isinstance(tensor_desc, TensorDesc) - - -def test_precision(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - assert tensor_desc.precision == "FP32" - - -def test_layout(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - assert tensor_desc.layout == "NHWC" - - -def test_dims(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - assert tensor_desc.dims == [1, 127, 127, 3] - - -def test_incorrect_precision_setter(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - with pytest.raises(ValueError) as e: - tensor_desc.precision = "123" - assert "Unsupported precision 123! List of supported precisions:" in str(e.value) - - -def test_incorrect_layout_setter(): - tensor_desc = TensorDesc("FP32", [1, 127, 127, 3], "NHWC") - with pytest.raises(ValueError) as e: - tensor_desc.layout = "123" - assert "Unsupported layout 123! List of supported layouts: " in str(e.value) - - -def test_init_incorrect_precision(): - with pytest.raises(ValueError) as e: - TensorDesc("123", [1, 127, 127, 3], "NHWC") - assert "Unsupported precision 123! List of supported precisions: " in str(e.value) - - -def test_eq_operator(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - tensor_desc_2 = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - assert tensor_desc == tensor_desc_2 - - -def test_ne_operator(): - tensor_desc = TensorDesc("FP32", [1, 3, 127, 127], "NHWC") - tensor_desc_2 = TensorDesc("FP32", [1, 3, 127, 127], "NCHW") - assert tensor_desc != tensor_desc_2 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/__init__.py b/src/bindings/python/tests_compatibility/test_ngraph/__init__.py deleted file mode 100644 index 83f1374cd29..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# openvino.dll directory path visibility is needed to use _pyngraph module -# import below causes adding this path to os.environ["PATH"] -import ngraph # noqa: F401 'imported but unused' diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_adaptive_pool.py b/src/bindings/python/tests_compatibility/test_ngraph/test_adaptive_pool.py deleted file mode 100644 index 8543fe55a51..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_adaptive_pool.py +++ /dev/null @@ -1,30 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np - -from ngraph.impl import Type - -def test_adaptive_avg_pool(): - input_parameter = ng.parameter((2, 3, 7), name="input_data", dtype=np.float32) - output_shape = ng.constant(np.array([3], dtype=np.int32)) - - adaptive_pool_node = ng.adaptive_avg_pool(input_parameter, output_shape) - assert adaptive_pool_node.get_type_name() == "AdaptiveAvgPool" - assert adaptive_pool_node.get_output_size() == 1 - assert adaptive_pool_node.get_output_element_type(0) == Type.f32 - assert list(adaptive_pool_node.get_output_shape(0)) == [2, 3, 3] - - -def test_adaptive_max_pool(): - input_parameter = ng.parameter((2, 3, 7), name="input_data", dtype=np.float32) - output_shape = ng.constant(np.array([3], dtype=np.int32)) - - adaptive_pool_node = ng.adaptive_max_pool(input_parameter, output_shape) - assert adaptive_pool_node.get_type_name() == "AdaptiveMaxPool" - assert adaptive_pool_node.get_output_size() == 2 - assert adaptive_pool_node.get_output_element_type(0) == Type.f32 - assert adaptive_pool_node.get_output_element_type(1) == Type.i64 - assert list(adaptive_pool_node.get_output_shape(0)) == [2, 3, 3] - assert list(adaptive_pool_node.get_output_shape(1)) == [2, 3, 3] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_basic.py b/src/bindings/python/tests_compatibility/test_ngraph/test_basic.py deleted file mode 100644 index 5acc1a29fd2..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_basic.py +++ /dev/null @@ -1,416 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Function, PartialShape, Shape, Type -from ngraph.impl.op import Parameter -from ngraph.utils.types import get_element_type - - -def test_ngraph_function_api(): - shape = [2, 2] - parameter_a = ng.parameter(shape, dtype=np.float32, name="A") - parameter_b = ng.parameter(shape, dtype=np.float32, name="B") - parameter_c = ng.parameter(shape, dtype=np.float32, name="C") - model = (parameter_a + parameter_b) * parameter_c - function = Function(model, [parameter_a, parameter_b, parameter_c], "TestFunction") - - function.get_parameters()[1].set_partial_shape(PartialShape([3, 4, 5])) - - ordered_ops = function.get_ordered_ops() - op_types = [op.get_type_name() for op in ordered_ops] - assert op_types == ["Parameter", "Parameter", "Parameter", "Add", "Multiply", "Result"] - assert len(function.get_ops()) == 6 - assert function.get_output_size() == 1 - assert function.get_output_op(0).get_type_name() == "Result" - assert function.get_output_element_type(0) == parameter_a.get_element_type() - assert list(function.get_output_shape(0)) == [2, 2] - assert (function.get_parameters()[1].get_partial_shape()) == PartialShape([3, 4, 5]) - assert len(function.get_parameters()) == 3 - assert len(function.get_results()) == 1 - assert function.get_friendly_name() == "TestFunction" - - -@pytest.mark.parametrize( - "dtype", - [ - np.float32, - np.float64, - np.int8, - np.int16, - np.int32, - np.int64, - np.uint8, - np.uint16, - np.uint32, - np.uint64, - ], -) -def test_simple_computation_on_ndarrays(dtype): - shape = [2, 2] - parameter_a = ng.parameter(shape, dtype=dtype, name="A") - parameter_b = ng.parameter(shape, dtype=dtype, name="B") - parameter_c = ng.parameter(shape, dtype=dtype, name="C") - model = (parameter_a + parameter_b) * parameter_c - assert model.get_type_name() == "Multiply" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == get_element_type(dtype) - assert list(model.get_output_shape(0)) == [2, 2] - - -def test_broadcast_1(): - input_data = np.array([1, 2, 3], dtype=np.int32) - - new_shape = [3, 3] - node = ng.broadcast(input_data, new_shape) - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i32 - assert list(node.get_output_shape(0)) == [3, 3] - - -def test_broadcast_2(): - input_data = np.arange(4, dtype=np.int32) - new_shape = [3, 4, 2, 4] - node = ng.broadcast(input_data, new_shape) - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i32 - assert list(node.get_output_shape(0)) == [3, 4, 2, 4] - - -def test_broadcast_3(): - input_data = np.array([1, 2, 3], dtype=np.int32) - new_shape = [3, 3] - axis_mapping = [0] - - node = ng.broadcast(input_data, new_shape, axis_mapping, "EXPLICIT") - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i32 - assert list(node.get_output_shape(0)) == [3, 3] - - -@pytest.mark.parametrize( - "destination_type, input_data", - [(bool, np.zeros((2, 2), dtype=np.int32)), ("boolean", np.zeros((2, 2), dtype=np.int32))], -) -def test_convert_to_bool(destination_type, input_data): - node = ng.convert(input_data, destination_type) - assert node.get_type_name() == "Convert" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.boolean - assert list(node.get_output_shape(0)) == [2, 2] - - -@pytest.mark.parametrize( - "destination_type, rand_range, in_dtype, expected_type", - [ - pytest.param(np.float32, (-8, 8), np.int32, np.float32), - pytest.param(np.float64, (-16383, 16383), np.int64, np.float64), - pytest.param("f32", (-8, 8), np.int32, np.float32), - pytest.param("f64", (-16383, 16383), np.int64, np.float64), - ], -) -def test_convert_to_float(destination_type, rand_range, in_dtype, expected_type): - np.random.seed(133391) - input_data = np.random.randint(*rand_range, size=(2, 2), dtype=in_dtype) - node = ng.convert(input_data, destination_type) - assert node.get_type_name() == "Convert" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(expected_type) - assert list(node.get_output_shape(0)) == [2, 2] - - -@pytest.mark.parametrize( - "destination_type, expected_type", - [ - (np.int8, np.int8), - (np.int16, np.int16), - (np.int32, np.int32), - (np.int64, np.int64), - ("i8", np.int8), - ("i16", np.int16), - ("i32", np.int32), - ("i64", np.int64), - ], -) -def test_convert_to_int(destination_type, expected_type): - np.random.seed(133391) - input_data = (np.ceil(-8 + np.random.rand(2, 3, 4) * 16)).astype(np.float32) - node = ng.convert(input_data, destination_type) - assert node.get_type_name() == "Convert" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(expected_type) - assert list(node.get_output_shape(0)) == [2, 3, 4] - - -@pytest.mark.parametrize( - "destination_type, expected_type", - [ - (np.uint8, np.uint8), - (np.uint16, np.uint16), - (np.uint32, np.uint32), - (np.uint64, np.uint64), - ("u8", np.uint8), - ("u16", np.uint16), - ("u32", np.uint32), - ("u64", np.uint64), - ], -) -def test_convert_to_uint(destination_type, expected_type): - np.random.seed(133391) - input_data = np.ceil(np.random.rand(2, 3, 4) * 16).astype(np.float32) - node = ng.convert(input_data, destination_type) - assert node.get_type_name() == "Convert" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(expected_type) - assert list(node.get_output_shape(0)) == [2, 3, 4] - - -def test_constant_get_data_bool(): - input_data = np.array([True, False, False, True]) - node = ng.constant(input_data, dtype=bool) - retrieved_data = node.get_data() - assert np.allclose(input_data, retrieved_data) - - -@pytest.mark.parametrize("data_type", [np.float32, np.float64]) -def test_constant_get_data_floating_point(data_type): - np.random.seed(133391) - input_data = np.random.randn(2, 3, 4).astype(data_type) - min_value = -1.0e20 - max_value = 1.0e20 - input_data = min_value + input_data * max_value * data_type(2) - node = ng.constant(input_data, dtype=data_type) - retrieved_data = node.get_data() - assert np.allclose(input_data, retrieved_data) - - -@pytest.mark.parametrize("data_type", [np.int64, np.int32, np.int16, np.int8]) -def test_constant_get_data_signed_integer(data_type): - np.random.seed(133391) - input_data = np.random.randint( - np.iinfo(data_type).min, np.iinfo(data_type).max, size=[2, 3, 4], dtype=data_type - ) - node = ng.constant(input_data, dtype=data_type) - retrieved_data = node.get_data() - assert np.allclose(input_data, retrieved_data) - - -@pytest.mark.parametrize("data_type", [np.uint64, np.uint32, np.uint16, np.uint8]) -def test_constant_get_data_unsigned_integer(data_type): - np.random.seed(133391) - input_data = np.random.randn(2, 3, 4).astype(data_type) - input_data = ( - np.iinfo(data_type).min + input_data * np.iinfo(data_type).max + input_data * np.iinfo(data_type).max - ) - node = ng.constant(input_data, dtype=data_type) - retrieved_data = node.get_data() - assert np.allclose(input_data, retrieved_data) - - -def test_set_argument(): - data1 = np.array([1, 2, 3]) - data2 = np.array([4, 5, 6]) - data3 = np.array([7, 8, 9]) - - node1 = ng.constant(data1, dtype=np.float32) - node2 = ng.constant(data2, dtype=np.float32) - node3 = ng.constant(data3, dtype=np.float64) - node4 = ng.constant(data3, dtype=np.float64) - node_add = ng.add(node1, node2) - - # Original arguments - node_inputs = node_add.inputs() - assert node_inputs[0].get_element_type() == Type.f32 - assert node_inputs[1].get_element_type() == Type.f32 - - # Arguments changed by set_argument - node_add.set_argument(0, node3.output(0)) - node_add.set_argument(1, node4.output(0)) - node_inputs = node_add.inputs() - assert node_inputs[0].get_element_type() == Type.f64 - assert node_inputs[1].get_element_type() == Type.f64 - - # Arguments changed by set_argument - node_add.set_argument(0, node1.output(0)) - node_add.set_argument(1, node2.output(0)) - assert node_inputs[0].get_element_type() == Type.f32 - assert node_inputs[1].get_element_type() == Type.f32 - - # Arguments changed by set_argument(OutputVector) - node_add.set_arguments([node3.output(0), node4.output(0)]) - assert node_inputs[0].get_element_type() == Type.f64 - assert node_inputs[1].get_element_type() == Type.f64 - - # Arguments changed by set_arguments(NodeVector) - node_add.set_arguments([node1, node2]) - assert node_inputs[0].get_element_type() == Type.f32 - assert node_inputs[1].get_element_type() == Type.f32 - - -def test_result(): - input_data = np.array([[11, 10], [1, 8], [3, 4]], dtype=np.float32) - node = ng.result(input_data) - assert node.get_type_name() == "Result" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [3, 2] - - -def test_node_friendly_name(): - dummy_node = ng.parameter(shape=[1], name="dummy_name") - - assert(dummy_node.friendly_name == "dummy_name") - - dummy_node.set_friendly_name("changed_name") - - assert(dummy_node.get_friendly_name() == "changed_name") - - dummy_node.friendly_name = "new_name" - - assert(dummy_node.get_friendly_name() == "new_name") - - -def test_node_output(): - input_array = np.array([0, 1, 2, 3, 4, 5]) - splits = 3 - expected_shape = len(input_array) // splits - - input_tensor = ng.constant(input_array, dtype=np.int32) - axis = ng.constant(0, dtype=np.int64) - split_node = ng.split(input_tensor, axis, splits) - - split_node_outputs = split_node.outputs() - - assert len(split_node_outputs) == splits - assert [output_node.get_index() for output_node in split_node_outputs] == [0, 1, 2] - assert np.equal( - [output_node.get_element_type() for output_node in split_node_outputs], - input_tensor.get_element_type(), - ).all() - assert np.equal( - [output_node.get_shape() for output_node in split_node_outputs], - Shape([expected_shape]), - ).all() - assert np.equal( - [output_node.get_partial_shape() for output_node in split_node_outputs], - PartialShape([expected_shape]), - ).all() - - output0 = split_node.output(0) - output1 = split_node.output(1) - output2 = split_node.output(2) - - assert [output0.get_index(), output1.get_index(), output2.get_index()] == [0, 1, 2] - - -def test_node_input(): - shape = [2, 2] - parameter_a = ng.parameter(shape, dtype=np.float32, name="A") - parameter_b = ng.parameter(shape, dtype=np.float32, name="B") - - model = parameter_a + parameter_b - - model_inputs = model.inputs() - - assert len(model_inputs) == 2 - assert [input_node.get_index() for input_node in model_inputs] == [0, 1] - assert np.equal( - [input_node.get_element_type() for input_node in model_inputs], - model.get_element_type(), - ).all() - assert np.equal( - [input_node.get_shape() for input_node in model_inputs], Shape(shape) - ).all() - assert np.equal( - [input_node.get_partial_shape() for input_node in model_inputs], - PartialShape(shape), - ).all() - - input0 = model.input(0) - input1 = model.input(1) - - assert [input0.get_index(), input1.get_index()] == [0, 1] - - -def test_node_target_inputs_soruce_output(): - shape = [2, 2] - parameter_a = ng.parameter(shape, dtype=np.float32, name="A") - parameter_b = ng.parameter(shape, dtype=np.float32, name="B") - - model = parameter_a + parameter_b - - out_a = list(parameter_a.output(0).get_target_inputs())[0] - out_b = list(parameter_b.output(0).get_target_inputs())[0] - - assert out_a.get_node().name == model.name - assert out_b.get_node().name == model.name - assert np.equal([out_a.get_shape()], [model.get_output_shape(0)]).all() - assert np.equal([out_b.get_shape()], [model.get_output_shape(0)]).all() - - in_model0 = model.input(0).get_source_output() - in_model1 = model.input(1).get_source_output() - - assert in_model0.get_node().name == parameter_a.name - assert in_model1.get_node().name == parameter_b.name - assert np.equal([in_model0.get_shape()], [model.get_output_shape(0)]).all() - assert np.equal([in_model1.get_shape()], [model.get_output_shape(0)]).all() - - -def test_runtime_info(): - test_shape = PartialShape([1, 1, 1, 1]) - test_type = Type.f32 - test_param = Parameter(test_type, test_shape) - relu_node = ng.relu(test_param) - runtime_info = relu_node.get_rt_info() - runtime_info["affinity"] = "test_affinity" - relu_node.set_friendly_name("testReLU") - runtime_info_after = relu_node.get_rt_info() - - assert runtime_info_after["affinity"] == "test_affinity" - - -def test_mutiple_outputs(): - input_shape = [4, 4] - input_data = np.arange(-8, 8).reshape(input_shape) - - expected_output = np.split(input_data, 2, axis=1)[0] - expected_output[expected_output < 0] = 0 - - test_param = ng.parameter(input_shape, dtype=np.float32, name="A") - split = ng.split(test_param, axis=1, num_splits=2) - split_first_output = split.output(0) - relu = ng.relu(split_first_output) - - assert relu.get_type_name() == "Relu" - assert relu.get_output_size() == 1 - assert relu.get_output_element_type(0) == Type.f32 - assert list(relu.get_output_shape(0)) == [4, 2] - - -def test_sink_function_ctor(): - input_data = ng.parameter([2, 2], name="input_data", dtype=np.float32) - rv = ng.read_value(input_data, "var_id_667") - add = ng.add(rv, input_data, name="MemoryAdd") - node = ng.assign(add, "var_id_667") - res = ng.result(add, "res") - function = Function(results=[res], sinks=[node], parameters=[input_data], name="TestFunction") - - ordered_ops = function.get_ordered_ops() - op_types = [op.get_type_name() for op in ordered_ops] - assert op_types == ["Parameter", "ReadValue", "Add", "Assign", "Result"] - assert len(function.get_ops()) == 5 - assert function.get_output_size() == 1 - assert function.get_output_op(0).get_type_name() == "Result" - assert function.get_output_element_type(0) == input_data.get_element_type() - assert list(function.get_output_shape(0)) == [2, 2] - assert (function.get_parameters()[0].get_partial_shape()) == PartialShape([2, 2]) - assert len(function.get_parameters()) == 1 - assert len(function.get_results()) == 1 - assert function.get_friendly_name() == "TestFunction" - diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_convolution.py b/src/bindings/python/tests_compatibility/test_ngraph/test_convolution.py deleted file mode 100644 index 5c4873364e6..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_convolution.py +++ /dev/null @@ -1,70 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type - - -@pytest.mark.parametrize(("strides", "pads_begin", "pads_end", "dilations", "expected_shape"), [ - (np.array([1, 1]), np.array([1, 1]), np.array([1, 1]), np.array([1, 1]), [1, 1, 9, 9]), - (np.array([1, 1]), np.array([0, 0]), np.array([0, 0]), np.array([1, 1]), [1, 1, 7, 7]), - (np.array([2, 2]), np.array([0, 0]), np.array([0, 0]), np.array([1, 1]), [1, 1, 4, 4]), - (np.array([1, 1]), np.array([0, 0]), np.array([0, 0]), np.array([2, 2]), [1, 1, 5, 5]), -]) -def test_convolution_2d(strides, pads_begin, pads_end, dilations, expected_shape): - - # input_x should have shape N(batch) x C x H x W - input_x = ng.parameter((1, 1, 9, 9), name="input_data", dtype=np.float32) - - # filter weights should have shape M x C x kH x kW - input_filter = np.array([[1.0, 0.0, -1.0], [2.0, 0.0, -2.0], [1.0, 0.0, -1.0]], dtype=np.float32).reshape( - 1, 1, 3, 3 - ) - - node = ng.convolution(input_x, input_filter, strides, pads_begin, pads_end, dilations) - - assert node.get_type_name() == "Convolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -def test_convolution_backprop_data(): - output_spatial_shape = [9, 9] - filter_shape = [1, 1, 3, 3] - data_shape = [1, 1, 7, 7] - strides = [1, 1] - - data_node = ng.parameter(shape=data_shape) - filter_node = ng.parameter(shape=filter_shape) - output_shape_node = ng.constant(np.array(output_spatial_shape, dtype=np.int64)) - - deconvolution = ng.convolution_backprop_data(data_node, filter_node, strides, output_shape_node) - assert deconvolution.get_type_name() == "ConvolutionBackpropData" - assert deconvolution.get_output_size() == 1 - assert list(deconvolution.get_output_shape(0)) == [1, 1, 9, 9] - assert deconvolution.get_output_element_type(0) == Type.f32 - - -def test_convolution_v1(): - input_tensor = np.arange(-128, 128, 1, dtype=np.float32).reshape(1, 1, 16, 16) - filters = np.ones(9, dtype=np.float32).reshape(1, 1, 3, 3) - filters[0, 0, 0, 0] = -1 - filters[0, 0, 1, 1] = -1 - filters[0, 0, 2, 2] = -1 - filters[0, 0, 0, 2] = -1 - filters[0, 0, 2, 0] = -1 - strides = np.array([1, 1]) - pads_begin = np.array([0, 0]) - pads_end = np.array([0, 0]) - dilations = np.array([1, 1]) - - node = ng.convolution(input_tensor, filters, strides, pads_begin, pads_end, dilations) - - assert node.get_type_name() == "Convolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 1, 14, 14] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_core.py b/src/bindings/python/tests_compatibility/test_ngraph/test_core.py deleted file mode 100644 index 949946ef842..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_core.py +++ /dev/null @@ -1,262 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Dimension, Function, PartialShape, Shape - - -def test_dimension(): - dim = Dimension() - assert dim.is_dynamic - assert not dim.is_static - assert repr(dim) == "" - - dim = Dimension.dynamic() - assert dim.is_dynamic - assert not dim.is_static - assert repr(dim) == "" - - dim = Dimension(10) - assert dim.is_static - assert len(dim) == 10 - assert dim.get_length() == 10 - assert dim.get_min_length() == 10 - assert dim.get_max_length() == 10 - assert repr(dim) == "" - - dim = Dimension(5, 15) - assert dim.is_dynamic - assert dim.get_min_length() == 5 - assert dim.get_max_length() == 15 - assert repr(dim) == "" - - -def test_dimension_comparisons(): - d1 = Dimension.dynamic() - d2 = Dimension.dynamic() - assert d1 == d2 - assert d1 == -1 - assert d1.refines(d2) - assert d1.relaxes(d2) - assert d2.refines(d1) - assert d2.relaxes(d1) - assert d2.compatible(d1) - assert d2.same_scheme(d1) - - d1 = Dimension.dynamic() - d2 = Dimension(3) - assert d1 != d2 - assert d2 == 3 - assert not d1.refines(d2) - assert d1.relaxes(d2) - assert d2.refines(d1) - assert not d2.relaxes(d1) - assert d2.compatible(d1) - assert not d2.same_scheme(d1) - - d1 = Dimension(3) - d2 = Dimension(3) - assert d1 == d2 - assert d1.refines(d2) - assert d1.relaxes(d2) - assert d2.refines(d1) - assert d2.relaxes(d1) - assert d2.compatible(d1) - assert d2.same_scheme(d1) - - d1 = Dimension(4) - d2 = Dimension(3) - assert d1 != d2 - assert not d1.refines(d2) - assert not d1.relaxes(d2) - assert not d2.refines(d1) - assert not d2.relaxes(d1) - assert not d2.compatible(d1) - assert not d2.same_scheme(d1) - - -def test_partial_shape(): - ps = PartialShape([1, 2, 3, 4]) - assert ps.is_static - assert not ps.is_dynamic - assert ps.rank == 4 - assert repr(ps) == "" - assert ps.get_dimension(0) == Dimension(1) - assert ps.get_dimension(1) == Dimension(2) - assert ps.get_dimension(2) == Dimension(3) - assert ps.get_dimension(3) == Dimension(4) - - shape = Shape([1, 2, 3]) - ps = PartialShape(shape) - assert ps.is_static - assert not ps.is_dynamic - assert ps.all_non_negative - assert ps.rank == 3 - assert list(ps.get_shape()) == [1, 2, 3] - assert list(ps.get_max_shape()) == [1, 2, 3] - assert list(ps.get_min_shape()) == [1, 2, 3] - assert list(ps.to_shape()) == [1, 2, 3] - assert repr(shape) == "" - assert repr(ps) == "" - - ps = PartialShape([Dimension(1), Dimension(2), Dimension(3), Dimension.dynamic()]) - assert not ps.is_static - assert ps.is_dynamic - assert ps.all_non_negative - assert ps.rank == 4 - assert list(ps.get_min_shape()) == [1, 2, 3, 0] - assert list(ps.get_max_shape())[3] > 1000000000 - assert repr(ps) == "" - assert ps.get_dimension(0) == Dimension(1) - assert ps.get_dimension(1) == Dimension(2) - assert ps.get_dimension(2) == Dimension(3) - assert ps.get_dimension(3) == Dimension.dynamic() - - ps = PartialShape([1, 2, 3, -1]) - assert not ps.is_static - assert ps.is_dynamic - assert ps.all_non_negative - assert ps.rank == 4 - assert list(ps.get_min_shape()) == [1, 2, 3, 0] - assert list(ps.get_max_shape())[3] > 1000000000 - assert repr(ps) == "" - - ps = PartialShape.dynamic() - assert not ps.is_static - assert ps.is_dynamic - assert ps.rank == Dimension.dynamic() - assert list(ps.get_min_shape()) == [] - assert list(ps.get_max_shape()) == [] - assert repr(ps) == "" - - ps = PartialShape.dynamic(r=Dimension(2)) - assert not ps.is_static - assert ps.is_dynamic - assert ps.rank == 2 - assert 2 == ps.rank - assert list(ps.get_min_shape()) == [0, 0] - assert list(ps.get_max_shape())[0] > 1000000000 - assert repr(ps) == "" - - -def test_partial_shape_compatible(): - ps1 = PartialShape.dynamic() - ps2 = PartialShape.dynamic() - assert ps1.compatible(ps2) - - ps1 = PartialShape([3]) - ps2 = PartialShape.dynamic() - assert ps1.compatible(ps2) - - ps1 = PartialShape.dynamic() - ps2 = PartialShape([4]) - assert ps1.compatible(ps2) - - ps1 = PartialShape([2, -1, 3, -1, 5]) - ps2 = PartialShape([2, -1, -1, 4, 5]) - assert ps1.compatible(ps2) - - ps1 = PartialShape([2, -1, 3, -1, 5]) - ps2 = PartialShape([1, -1, -1, 4, 5]) - assert not ps1.compatible(ps2) - - -def test_partial_shape_same_scheme(): - ps1 = PartialShape([1, 2, -1]) - ps2 = PartialShape([1, 3, -1]) - assert not ps1.same_scheme(ps2) - - ps1 = PartialShape([1, 2, -1]) - ps2 = PartialShape([1, 2, -1]) - assert ps1.same_scheme(ps2) - - ps1 = PartialShape([1, 2, 3]) - ps2 = PartialShape([1, 2, 3]) - assert ps1.same_scheme(ps2) - - ps1 = PartialShape([-1, 2, 3]) - ps2 = PartialShape([1, -1, 3]) - assert not ps1.same_scheme(ps2) - - ps1 = PartialShape.dynamic() - ps2 = PartialShape.dynamic() - assert ps1.same_scheme(ps2) - - -def test_partial_shape_refinement(): - ps1 = PartialShape.dynamic() - ps2 = PartialShape.dynamic() - assert ps1.refines(ps2) - assert ps1.relaxes(ps2) - assert ps2.refines(ps1) - assert ps2.relaxes(ps1) - - ps1 = PartialShape.dynamic() - ps2 = PartialShape([3, -1, 7, 9]) - assert not ps1.refines(ps2) - assert ps1.relaxes(ps2) - assert ps2.refines(ps1) - assert not ps2.relaxes(ps1) - - ps1 = PartialShape.dynamic() - ps2 = PartialShape([3, 5, 7, 9]) - assert not ps1.refines(ps2) - assert ps1.relaxes(ps2) - assert ps2.refines(ps1) - assert not ps2.relaxes(ps1) - - -def test_partial_shape_equals(): - ps1 = PartialShape.dynamic() - ps2 = PartialShape.dynamic() - assert ps1 == ps2 - - ps1 = PartialShape([1, 2, 3]) - ps2 = PartialShape([1, 2, 3]) - assert ps1 == ps2 - - shape = Shape([1, 2, 3]) - ps = PartialShape([1, 2, 3]) - assert shape == ps - - -def test_repr_dynamic_shape(): - shape = PartialShape([-1, 2]) - parameter_a = ng.parameter(shape, dtype=np.float32, name="A") - parameter_b = ng.parameter(shape, dtype=np.float32, name="B") - model = parameter_a + parameter_b - function = Function(model, [parameter_a, parameter_b], "simple_dyn_shapes_graph") - - assert repr(function) == "" - - ops = function.get_ordered_ops() - for op in ops: - assert "[?,2]" in repr(op) - - -def test_discrete_type_info(): - data_shape = [6, 12, 10, 24] - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - k = np.int32(3) - axis = np.int32(1) - n1 = ng.topk(data_parameter, k, axis, "max", "value") - n2 = ng.topk(data_parameter, k, axis, "max", "value") - n3 = ng.sin(0.2) - - assert n1.type_info.name == "TopK" - assert n3.type_info.name == "Sin" - assert n1.get_type_info().name == "TopK" - assert n3.get_type_info().name == "Sin" - assert n1.type_info.name == n2.type_info.name - assert n1.type_info.version_id == n2.type_info.version_id - assert n1.type_info.parent == n2.type_info.parent - assert n1.get_type_info().name == n2.get_type_info().name - assert n1.get_type_info().version_id == n2.get_type_info().version_id - assert n1.get_type_info().parent == n2.get_type_info().parent - assert n1.get_type_info().name != n3.get_type_info().name - assert n1.get_type_info().name > n3.get_type_info().name - assert n1.get_type_info().name >= n3.get_type_info().name - assert n3.get_type_info().name < n1.get_type_info().name - assert n3.get_type_info().name <= n1.get_type_info().name diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_create_op.py b/src/bindings/python/tests_compatibility/test_ngraph/test_create_op.py deleted file mode 100644 index 7ec5a26109a..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_create_op.py +++ /dev/null @@ -1,2427 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import pytest - -from _pyngraph import PartialShape, Dimension - -import ngraph as ng -import ngraph.opset1 as ng_opset1 -import ngraph.opset5 as ng_opset5 -import ngraph.opset10 as ng_opset10 -import ngraph.opset11 as ng_opset11 -from ngraph.utils.types import make_constant_node -from ngraph.exceptions import UserInputError -from ngraph.impl import Type - -np_types = [np.float32, np.int32] -integral_np_types = [ - np.int8, - np.int16, - np.int32, - np.int64, - np.uint8, - np.uint16, - np.uint32, - np.uint64, -] - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_adaptive_avg_pool(dtype): - data = ng.parameter([2, 24, 34, 62], name="input", dtype=dtype) - output_shape = ng.constant(np.array([16, 16], dtype=np.int32)) - - node = ng.adaptive_avg_pool(data, output_shape) - - assert node.get_type_name() == "AdaptiveAvgPool" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 24, 16, 16] - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -@pytest.mark.parametrize("ind_type", ["i32", "i64"]) -def test_adaptive_max_pool(dtype, ind_type): - data = ng.parameter([2, 24, 34, 62], name="input", dtype=dtype) - output_shape = ng.constant(np.array([16, 16], dtype=np.int32)) - - node = ng.adaptive_max_pool(data, output_shape, ind_type) - - assert node.get_type_name() == "AdaptiveMaxPool" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [2, 24, 16, 16] - assert list(node.get_output_shape(1)) == [2, 24, 16, 16] - assert node.get_output_element_type(1) == Type.i32 if ind_type == "i32" else Type.i64 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_binary_convolution(dtype): - strides = np.array([1, 1]) - pads_begin = np.array([0, 0]) - pads_end = np.array([0, 0]) - dilations = np.array([1, 1]) - mode = "xnor-popcount" - pad_value = 0.0 - - input0_shape = [1, 1, 9, 9] - input1_shape = [1, 1, 3, 3] - expected_shape = [1, 1, 7, 7] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - - node = ng.binary_convolution( - parameter_input0, parameter_input1, strides, pads_begin, pads_end, dilations, mode, pad_value, - ) - - assert node.get_type_name() == "BinaryConvolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_ctc_greedy_decoder(dtype): - input0_shape = [20, 8, 128] - input1_shape = [20, 8] - expected_shape = [8, 20, 1, 1] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - - node = ng.ctc_greedy_decoder(parameter_input0, parameter_input1) - - assert node.get_type_name() == "CTCGreedyDecoder" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("fp_dtype, int_dtype, int_ci, int_sl, merge_repeated, blank_index", - [ - (np.float32, np.int32, "i32", "i32", True, True), - (np.float32, np.int32, "i64", "i32", True, True), - (np.float32, np.int32, "i32", "i64", True, True), - (np.float32, np.int32, "i64", "i64", True, True), - (np.float64, np.int64, "i32", "i32", False, True), - (np.float64, np.int64, "i64", "i32", False, True), - (np.float64, np.int64, "i32", "i64", False, True), - (np.float64, np.int64, "i64", "i64", False, True), - (np.float32, np.int32, "i32", "i32", True, False), - (np.float32, np.int32, "i64", "i32", True, False), - (np.float32, np.int32, "i32", "i64", True, False), - (np.float32, np.int32, "i64", "i64", True, False), - (np.float64, np.int64, "i32", "i32", False, False), - (np.float64, np.int64, "i64", "i32", False, False), - (np.float64, np.int64, "i32", "i64", False, False), - (np.float64, np.int64, "i64", "i64", False, False) - ], ) -def test_ctc_greedy_decoder_seq_len(fp_dtype, int_dtype, int_ci, int_sl, merge_repeated, blank_index): - input0_shape = [8, 20, 128] - input1_shape = [8] - input2_shape = [1] - expected_shape = [8, 20] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=fp_dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=int_dtype) - parameter_input2 = None - if blank_index: - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=int_dtype) - - node = ng.ctc_greedy_decoder_seq_len( - parameter_input0, parameter_input1, parameter_input2, merge_repeated, int_ci, int_sl - ) - - assert node.get_type_name() == "CTCGreedyDecoderSeqLen" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_deformable_convolution_opset1(dtype): - strides = np.array([1, 1]) - pads_begin = np.array([0, 0]) - pads_end = np.array([0, 0]) - dilations = np.array([1, 1]) - - input0_shape = [1, 1, 9, 9] - input1_shape = [1, 18, 7, 7] - input2_shape = [1, 1, 3, 3] - expected_shape = [1, 1, 7, 7] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=dtype) - - node = ng_opset1.deformable_convolution( - parameter_input0, parameter_input1, parameter_input2, strides, pads_begin, pads_end, dilations, - ) - - assert node.get_type_name() == "DeformableConvolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_deformable_convolution(dtype): - strides = np.array([1, 1]) - pads_begin = np.array([0, 0]) - pads_end = np.array([0, 0]) - dilations = np.array([1, 1]) - - input0_shape = [1, 1, 9, 9] - input1_shape = [1, 18, 7, 7] - input2_shape = [1, 1, 3, 3] - expected_shape = [1, 1, 7, 7] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=dtype) - - node = ng.deformable_convolution( - parameter_input0, parameter_input1, parameter_input2, strides, pads_begin, pads_end, dilations, - ) - - assert node.get_type_name() == "DeformableConvolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_deformable_convolution_mask(dtype): - strides = np.array([1, 1]) - pads_begin = np.array([0, 0]) - pads_end = np.array([0, 0]) - dilations = np.array([1, 1]) - - input0_shape = [1, 1, 9, 9] - input1_shape = [1, 18, 7, 7] - input2_shape = [1, 1, 3, 3] - input3_shape = [1, 9, 7, 7] - expected_shape = [1, 1, 7, 7] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=dtype) - parameter_input3 = ng.parameter(input3_shape, name="Input3", dtype=dtype) - - node = ng.deformable_convolution( - parameter_input0, parameter_input1, parameter_input2, strides, - pads_begin, pads_end, dilations, parameter_input3 - ) - - assert node.get_type_name() == "DeformableConvolution" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_deformable_psroi_pooling(dtype): - output_dim = 8 - spatial_scale = 0.0625 - group_size = 7 - mode = "bilinear_deformable" - spatial_bins_x = 4 - spatial_bins_y = 4 - trans_std = 0.1 - part_size = 7 - - input0_shape = [1, 392, 38, 63] - input1_shape = [300, 5] - input2_shape = [300, 2, 7, 7] - expected_shape = [300, 8, 7, 7] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=dtype) - - node = ng.deformable_psroi_pooling( - parameter_input0, - parameter_input1, - output_dim, - spatial_scale, - group_size, - mode, - spatial_bins_x, - spatial_bins_y, - trans_std, - part_size, - offsets=parameter_input2, - ) - - assert node.get_type_name() == "DeformablePSROIPooling" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize( - ("data_shape", "rois", "batch_indices", "pooled_h", "pooled_w", "sampling_ratio", "spatial_scale", "mode", "aligned_mode", "expected_shape"), - [ - ([2, 3, 5, 6], [7, 4], [7], 2, 2, 1, 1.0, "avg", "asymmetric", [7, 3, 2, 2]), - ([10, 3, 5, 5], [7, 4], [7], 3, 4, 1, 1.0, "avg", "half_pixel_for_nn", [7, 3, 3, 4]), - ([10, 3, 5, 5], [3, 4], [3], 3, 4, 1, 1.0, "avg", "half_pixel", [3, 3, 3, 4]), - ([10, 3, 5, 5], [3, 4], [3], 3, 4, 1, np.float32(1), "avg", "half_pixel", [3, 3, 3, 4]), - ], -) -def test_roi_align(data_shape, rois, batch_indices, pooled_h, pooled_w, sampling_ratio, spatial_scale, mode, aligned_mode, expected_shape): - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - rois_parameter = ng.parameter(rois, name="Rois", dtype=np.float32) - batch_indices_parameter = ng.parameter(batch_indices, name="Batch_indices", dtype=np.int32) - - node = ng.roi_align( - data_parameter, - rois_parameter, - batch_indices_parameter, - pooled_h, - pooled_w, - sampling_ratio, - np.float32(spatial_scale), - mode, - aligned_mode, - ) - - assert node.get_type_name() == "ROIAlign" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_floor_mod(dtype): - input0_shape = [8, 1, 6, 1] - input1_shape = [7, 1, 5] - expected_shape = [8, 7, 6, 5] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - - node = ng.floor_mod(parameter_input0, parameter_input1) - - assert node.get_type_name() == "FloorMod" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", np_types) -def test_gather_tree(dtype): - input0_shape = [100, 1, 10] - input1_shape = [100, 1, 10] - input2_shape = [1] - input3_shape = [] - expected_shape = [100, 1, 10] - - parameter_input0 = ng.parameter(input0_shape, name="Input0", dtype=dtype) - parameter_input1 = ng.parameter(input1_shape, name="Input1", dtype=dtype) - parameter_input2 = ng.parameter(input2_shape, name="Input2", dtype=dtype) - parameter_input3 = ng.parameter(input3_shape, name="Input3", dtype=dtype) - - node = ng.gather_tree(parameter_input0, parameter_input1, parameter_input2, parameter_input3) - - assert node.get_type_name() == "GatherTree" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_cell_operator(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - - X_shape = [batch_size, input_size] - H_t_shape = [batch_size, hidden_size] - C_t_shape = [batch_size, hidden_size] - W_shape = [4 * hidden_size, input_size] - R_shape = [4 * hidden_size, hidden_size] - B_shape = [4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - expected_shape = [1, 128] - - node_default = ng.lstm_cell( - parameter_X, parameter_H_t, parameter_C_t, parameter_W, parameter_R, parameter_B, hidden_size, - ) - - assert node_default.get_type_name() == "LSTMCell" - assert node_default.get_output_size() == 2 - assert list(node_default.get_output_shape(0)) == expected_shape - assert list(node_default.get_output_shape(1)) == expected_shape - - activations = ["tanh", "Sigmoid", "RELU"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 0.5 - - node_param = ng.lstm_cell( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMCell" - assert node_param.get_output_size() == 2 - assert list(node_param.get_output_shape(0)) == expected_shape - assert list(node_param.get_output_shape(1)) == expected_shape - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_cell_operator_opset1(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - - X_shape = [batch_size, input_size] - H_t_shape = [batch_size, hidden_size] - C_t_shape = [batch_size, hidden_size] - W_shape = [4 * hidden_size, input_size] - R_shape = [4 * hidden_size, hidden_size] - B_shape = [4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - expected_shape = [1, 128] - - node_default = ng_opset1.lstm_cell( - parameter_X, parameter_H_t, parameter_C_t, parameter_W, parameter_R, parameter_B, hidden_size, - ) - - assert node_default.get_type_name() == "LSTMCell" - assert node_default.get_output_size() == 2 - assert list(node_default.get_output_shape(0)) == expected_shape - assert list(node_default.get_output_shape(1)) == expected_shape - - activations = ["tanh", "Sigmoid", "RELU"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 0.5 - - node_param = ng_opset1.lstm_cell( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMCell" - assert node_param.get_output_size() == 2 - assert list(node_param.get_output_shape(0)) == expected_shape - assert list(node_param.get_output_shape(1)) == expected_shape - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_bidirectional_opset1(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - num_directions = 2 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "BIDIRECTIONAL" - node = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node.get_type_name() == "LSTMSequence" - assert node.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMSequence" - assert node_param.get_output_size() == 3 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_reverse_opset1(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "REVERSE" - - node_default = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "LSTMSequence" - assert node_default.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMSequence" - assert node_param.get_output_size() == 3 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_forward_opset1(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "forward" - - node_default = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "LSTMSequence" - assert node_default.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [2.0] - activation_beta = [1.0] - clip = 0.5 - - node = ng_opset1.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node.get_type_name() == "LSTMSequence" - assert node.get_output_size() == 3 - - -def test_gru_cell_operator(): - batch_size = 1 - input_size = 16 - hidden_size = 128 - - X_shape = [batch_size, input_size] - H_t_shape = [batch_size, hidden_size] - W_shape = [3 * hidden_size, input_size] - R_shape = [3 * hidden_size, hidden_size] - B_shape = [3 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32) - parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32) - parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32) - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - expected_shape = [1, 128] - - node_default = ng.gru_cell(parameter_X, parameter_H_t, parameter_W, parameter_R, parameter_B, hidden_size) - - assert node_default.get_type_name() == "GRUCell" - assert node_default.get_output_size() == 1 - assert list(node_default.get_output_shape(0)) == expected_shape - - activations = ["tanh", "relu"] - activations_alpha = [1.0, 2.0] - activations_beta = [1.0, 2.0] - clip = 0.5 - linear_before_reset = True - - # If *linear_before_reset* is set True, then B tensor shape must be [4 * hidden_size] - B_shape = [4 * hidden_size] - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - node_param = ng.gru_cell( - parameter_X, - parameter_H_t, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - activations, - activations_alpha, - activations_beta, - clip, - linear_before_reset, - ) - - assert node_param.get_type_name() == "GRUCell" - assert node_param.get_output_size() == 1 - assert list(node_param.get_output_shape(0)) == expected_shape - - -def test_gru_sequence(): - batch_size = 2 - input_size = 16 - hidden_size = 32 - seq_len = 8 - seq_lengths = [seq_len] * batch_size - num_directions = 1 - direction = "FORWARD" - - X_shape = [batch_size, seq_len, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - W_shape = [num_directions, 3 * hidden_size, input_size] - R_shape = [num_directions, 3 * hidden_size, hidden_size] - B_shape = [num_directions, 3 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32) - parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32) - parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32) - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - expected_shape_y = [batch_size, num_directions, seq_len, hidden_size] - expected_shape_h = [batch_size, num_directions, hidden_size] - - node_default = ng.gru_sequence( - parameter_X, - parameter_H_t, - seq_lengths, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "GRUSequence" - assert node_default.get_output_size() == 2 - assert list(node_default.get_output_shape(0)) == expected_shape_y - assert list(node_default.get_output_shape(1)) == expected_shape_h - - activations = ["tanh", "relu"] - activations_alpha = [1.0, 2.0] - activations_beta = [1.0, 2.0] - clip = 0.5 - linear_before_reset = True - - # If *linear_before_reset* is set True, then B tensor shape must be [4 * hidden_size] - B_shape = [num_directions, 4 * hidden_size] - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - node_param = ng.gru_sequence( - parameter_X, - parameter_H_t, - seq_lengths, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activations_alpha, - activations_beta, - clip, - linear_before_reset, - ) - - assert node_param.get_type_name() == "GRUSequence" - assert node_param.get_output_size() == 2 - assert list(node_param.get_output_shape(0)) == expected_shape_y - assert list(node_param.get_output_shape(1)) == expected_shape_h - - -def test_rnn_sequence(): - batch_size = 2 - input_size = 16 - hidden_size = 32 - seq_len = 8 - seq_lengths = [seq_len] * batch_size - num_directions = 1 - direction = "FORWARD" - - X_shape = [batch_size, seq_len, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - W_shape = [num_directions, hidden_size, input_size] - R_shape = [num_directions, hidden_size, hidden_size] - B_shape = [num_directions, hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32) - parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32) - parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32) - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - expected_shape_y = [batch_size, num_directions, seq_len, hidden_size] - expected_shape_h = [batch_size, num_directions, hidden_size] - - node_default = ng.rnn_sequence( - parameter_X, - parameter_H_t, - seq_lengths, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "RNNSequence" - assert node_default.get_output_size() == 2 - assert list(node_default.get_output_shape(0)) == expected_shape_y - assert list(node_default.get_output_shape(1)) == expected_shape_h - - activations = ["relu"] - activations_alpha = [2.0] - activations_beta = [1.0] - clip = 0.5 - - node_param = ng.rnn_sequence( - parameter_X, - parameter_H_t, - seq_lengths, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activations_alpha, - activations_beta, - clip, - ) - - assert node_param.get_type_name() == "RNNSequence" - assert node_param.get_output_size() == 2 - assert list(node_param.get_output_shape(0)) == expected_shape_y - assert list(node_param.get_output_shape(1)) == expected_shape_h - - -def test_loop(): - from ngraph.utils.tensor_iterator_types import ( - GraphBody, - TensorIteratorSliceInputDesc, - TensorIteratorMergedInputDesc, - TensorIteratorInvariantInputDesc, - TensorIteratorBodyOutputDesc, - TensorIteratorConcatOutputDesc, - ) - - condition = ng.constant(True, dtype=bool) - trip_count = ng.constant(16, dtype=np.int32) - # Body parameters - body_timestep = ng.parameter([], np.int32, "timestep") - body_data_in = ng.parameter([1, 2, 2], np.float32, "body_in") - body_prev_cma = ng.parameter([2, 2], np.float32, "body_prev_cma") - body_const_one = ng.parameter([], np.int32, "body_const_one") - - # CMA = cumulative moving average - prev_cum_sum = ng.multiply(ng.convert(body_timestep, "f32"), body_prev_cma) - curr_cum_sum = ng.add(prev_cum_sum, ng.squeeze(body_data_in, [0])) - elem_cnt = ng.add(body_const_one, body_timestep) - curr_cma = ng.divide(curr_cum_sum, ng.convert(elem_cnt, "f32")) - cma_hist = ng.unsqueeze(curr_cma, [0]) - - # TI inputs - data = ng.parameter([16, 2, 2], np.float32, "data") - # Iterations count - zero = ng.constant(0, dtype=np.int32) - one = ng.constant(1, dtype=np.int32) - initial_cma = ng.constant(np.zeros([2, 2], dtype=np.float32), dtype=np.float32) - iter_cnt = ng.range(zero, np.int32(16), np.int32(1)) - ti_inputs = [iter_cnt, data, initial_cma, one] - body_const_condition = ng.constant(True, dtype=bool) - - graph_body = GraphBody([body_timestep, body_data_in, body_prev_cma, body_const_one], - [curr_cma, cma_hist, body_const_condition]) - ti_slice_input_desc = [ - # timestep - # input_idx, body_param_idx, start, stride, part_size, end, axis - TensorIteratorSliceInputDesc(2, 0, 0, 1, 1, -1, 0), - # data - TensorIteratorSliceInputDesc(3, 1, 0, 1, 1, -1, 0), - ] - ti_merged_input_desc = [ - # body prev/curr_cma - TensorIteratorMergedInputDesc(4, 2, 0), - ] - ti_invariant_input_desc = [ - # body const one - TensorIteratorInvariantInputDesc(5, 3), - ] - - # TI outputs - ti_body_output_desc = [ - # final average - TensorIteratorBodyOutputDesc(0, 0, -1), - ] - ti_concat_output_desc = [ - # history of cma - TensorIteratorConcatOutputDesc(1, 1, 0, 1, 1, -1, 0), - ] - - node = ng.loop( - trip_count, - condition, - ti_inputs, - graph_body, - ti_slice_input_desc, - ti_merged_input_desc, - ti_invariant_input_desc, - ti_body_output_desc, - ti_concat_output_desc, - 2, - -1, - ) - - assert node.get_type_name() == "Loop" - assert node.get_output_size() == 2 - # final average - assert list(node.get_output_shape(0)) == [2, 2] - # cma history - assert list(node.get_output_shape(1)) == [16, 2, 2] - - -def test_roi_pooling(): - inputs = ng.parameter([2, 3, 4, 5], dtype=np.float32) - coords = ng.parameter([150, 5], dtype=np.float32) - node = ng.roi_pooling(inputs, coords, [6, 6], 0.0625, "Max") - - assert node.get_type_name() == "ROIPooling" - assert node.get_output_size() == [6, 6] - assert list(node.get_output_shape(0)) == [150, 3, 6, 6] - assert node.get_output_element_type(0) == Type.f32 - - -def test_psroi_pooling(): - inputs = ng.parameter([1, 72, 4, 5], dtype=np.float32) - coords = ng.parameter([150, 5], dtype=np.float32) - node = ng.psroi_pooling(inputs, coords, 2, 6, 0.0625, 0, 0, "average") - - assert node.get_type_name() == "PSROIPooling" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [150, 2, 6, 6] - assert node.get_output_element_type(0) == Type.f32 - - -def test_convert_like(): - parameter_data = ng.parameter([1, 2, 3, 4], name="data", dtype=np.float32) - like = ng.constant(1, dtype=np.int8) - - node = ng.convert_like(parameter_data, like) - - assert node.get_type_name() == "ConvertLike" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 2, 3, 4] - assert node.get_output_element_type(0) == Type.i8 - - -def test_bucketize(): - data = ng.parameter([4, 3, 2, 1], name="data", dtype=np.float32) - buckets = ng.parameter([5], name="buckets", dtype=np.int64) - - node = ng.bucketize(data, buckets, "i32") - - assert node.get_type_name() == "Bucketize" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [4, 3, 2, 1] - assert node.get_output_element_type(0) == Type.i32 - - -def test_region_yolo(): - data = ng.parameter([1, 125, 13, 13], name="input", dtype=np.float32) - num_coords = 4 - num_classes = 80 - num_regions = 1 - mask = [6, 7, 8] - axis = 0 - end_axis = 3 - do_softmax = False - - node = ng.region_yolo(data, num_coords, num_classes, num_regions, do_softmax, mask, axis, end_axis) - - assert node.get_type_name() == "RegionYolo" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, (80 + 4 + 1) * 3, 13, 13] - assert node.get_output_element_type(0) == Type.f32 - - -def test_reorg_yolo(): - data = ng.parameter([2, 24, 34, 62], name="input", dtype=np.int32) - stride = [2] - - node = ng.reorg_yolo(data, stride) - - assert node.get_type_name() == "ReorgYolo" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 96, 17, 31] - assert node.get_output_element_type(0) == Type.i32 - - -def test_embedding_bag_offsets_sum_1(): - emb_table = ng.parameter([5, 2], name="emb_table", dtype=np.float32) - indices = ng.parameter([4], name="indices", dtype=np.int64) - offsets = ng.parameter([3], name="offsets", dtype=np.int64) - default_index = ng.parameter([], name="default_index", dtype=np.int64) - - node = ng.embedding_bag_offsets_sum(emb_table, indices, offsets, default_index) - - assert node.get_type_name() == "EmbeddingBagOffsetsSum" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 2] - assert node.get_output_element_type(0) == Type.f32 - - -def test_embedding_segments_sum_all_inputs(): - emb_table = ng.parameter([5, 2], name="emb_table", dtype=np.float32) - indices = ng.parameter([4], name="indices", dtype=np.int64) - segment_ids = ng.parameter([4], name="segment_ids", dtype=np.int64) - num_segments = ng.parameter([], name="num_segments", dtype=np.int64) - default_index = ng.parameter([], name="default_index", dtype=np.int64) - per_sample_weights = ng.parameter([4], name="per_sample_weights", dtype=np.float32) - - node = ng.embedding_segments_sum( - emb_table, indices, segment_ids, num_segments, default_index, per_sample_weights - ) - - assert node.get_type_name() == "EmbeddingSegmentsSum" - assert node.get_output_size() == 1 - assert node.get_output_partial_shape(0).same_scheme(PartialShape([-1, 2])) - assert node.get_output_element_type(0) == Type.f32 - - -def test_embedding_segments_sum_with_some_opt_inputs(): - emb_table = ng.parameter([5, 2], name="emb_table", dtype=np.float32) - indices = ng.parameter([4], name="indices", dtype=np.int64) - segment_ids = ng.parameter([4], name="segment_ids", dtype=np.int64) - num_segments = ng.parameter([], name="num_segments", dtype=np.int64) - - # only 1 out of 3 optional inputs - node = ng.embedding_segments_sum(emb_table, indices, segment_ids, num_segments) - - assert node.get_type_name() == "EmbeddingSegmentsSum" - assert node.get_output_size() == 1 - assert node.get_output_partial_shape(0).same_scheme(PartialShape([-1, 2])) - assert node.get_output_element_type(0) == Type.f32 - - -def test_embedding_bag_packed_sum(): - emb_table = ng.parameter([5, 2], name="emb_table", dtype=np.float32) - indices = ng.parameter([3, 3], name="indices", dtype=np.int64) - per_sample_weights = ng.parameter([3, 3], name="per_sample_weights", dtype=np.float32) - - # only 1 out of 3 optional inputs - node = ng.embedding_bag_packed_sum(emb_table, indices, per_sample_weights) - - assert node.get_type_name() == "EmbeddingBagPackedSum" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 2] - assert node.get_output_element_type(0) == Type.f32 - - -@pytest.mark.parametrize("dtype", integral_np_types) -def test_interpolate_opset1(dtype): - image_shape = [1, 3, 1024, 1024] - output_shape = [64, 64] - attributes = { - "axes": [2, 3], - "mode": "cubic", - "pads_begin": np.array([2, 2], dtype=dtype), - } - - image_node = ng.parameter(image_shape, dtype, name="Image") - - node = ng_opset1.interpolate(image_node, output_shape, attributes) - expected_shape = [1, 3, 64, 64] - - assert node.get_type_name() == "Interpolate" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.int8, np.float32), - (np.int16, np.float32), - (np.int32, np.float32), - (np.int64, np.float32), - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.int32, np.float16), - (np.int32, np.float64), - ], -) -def test_prior_box(int_dtype, fp_dtype): - image_shape = np.array([64, 64], dtype=int_dtype) - attributes = { - "offset": fp_dtype(0), - "min_size": np.array([2, 3], dtype=fp_dtype), - "aspect_ratio": np.array([1.5, 2.0, 2.5], dtype=fp_dtype), - "scale_all_sizes": False - } - - layer_shape = ng.constant(np.array([32, 32], dtype=int_dtype), int_dtype) - - node = ng.prior_box(layer_shape, image_shape, attributes) - - assert node.get_type_name() == "PriorBox" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 20480] - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.int8, np.float32), - (np.int16, np.float32), - (np.int32, np.float32), - (np.int64, np.float32), - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.int32, np.float16), - (np.int32, np.float64), - ], -) -def test_prior_box_clustered(int_dtype, fp_dtype): - image_size = np.array([64, 64], dtype=int_dtype) - attributes = { - "offset": fp_dtype(0.5), - "width": np.array([4.0, 2.0, 3.2], dtype=fp_dtype), - "height": np.array([1.0, 2.0, 1.0], dtype=fp_dtype), - } - - output_size = ng.constant(np.array([19, 19], dtype=int_dtype), int_dtype) - - node = ng.prior_box_clustered(output_size, image_size, attributes) - - assert node.get_type_name() == "PriorBoxClustered" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 4332] - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.uint32, np.float16), - (np.uint32, np.float64), - ], -) -def test_proposal(int_dtype, fp_dtype): - attributes = { - "base_size": int_dtype(1), - "pre_nms_topn": int_dtype(20), - "post_nms_topn": int_dtype(64), - "nms_thresh": fp_dtype(0.34), - "feat_stride": int_dtype(16), - "min_size": int_dtype(32), - "ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=fp_dtype), - "scale": np.array([2, 3, 3, 4], dtype=fp_dtype), - } - batch_size = 7 - - class_probs = ng.parameter([batch_size, 12, 34, 62], fp_dtype, "class_probs") - bbox_deltas = ng.parameter([batch_size, 24, 34, 62], fp_dtype, "bbox_deltas") - image_shape = ng.parameter([3], fp_dtype, "image_shape") - node = ng.proposal(class_probs, bbox_deltas, image_shape, attributes) - - assert node.get_type_name() == "Proposal" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [batch_size * attributes["post_nms_topn"], 5] - - -def test_tensor_iterator(): - from ngraph.utils.tensor_iterator_types import ( - GraphBody, - TensorIteratorSliceInputDesc, - TensorIteratorMergedInputDesc, - TensorIteratorInvariantInputDesc, - TensorIteratorBodyOutputDesc, - TensorIteratorConcatOutputDesc, - ) - - # Body parameters - body_timestep = ng.parameter([], np.int32, "timestep") - body_data_in = ng.parameter([1, 2, 2], np.float32, "body_in") - body_prev_cma = ng.parameter([2, 2], np.float32, "body_prev_cma") - body_const_one = ng.parameter([], np.int32, "body_const_one") - - # CMA = cumulative moving average - prev_cum_sum = ng.multiply(ng.convert(body_timestep, "f32"), body_prev_cma) - curr_cum_sum = ng.add(prev_cum_sum, ng.squeeze(body_data_in, [0])) - elem_cnt = ng.add(body_const_one, body_timestep) - curr_cma = ng.divide(curr_cum_sum, ng.convert(elem_cnt, "f32")) - cma_hist = ng.unsqueeze(curr_cma, [0]) - - # TI inputs - data = ng.parameter([16, 2, 2], np.float32, "data") - # Iterations count - zero = ng.constant(0, dtype=np.int32) - one = ng.constant(1, dtype=np.int32) - initial_cma = ng.constant(np.zeros([2, 2], dtype=np.float32), dtype=np.float32) - iter_cnt = ng.range(zero, np.int32(16), np.int32(1)) - ti_inputs = [iter_cnt, data, initial_cma, one] - - graph_body = GraphBody([body_timestep, body_data_in, body_prev_cma, body_const_one], [curr_cma, cma_hist]) - ti_slice_input_desc = [ - # timestep - # input_idx, body_param_idx, start, stride, part_size, end, axis - TensorIteratorSliceInputDesc(0, 0, 0, 1, 1, -1, 0), - # data - TensorIteratorSliceInputDesc(1, 1, 0, 1, 1, -1, 0), - ] - ti_merged_input_desc = [ - # body prev/curr_cma - TensorIteratorMergedInputDesc(2, 2, 0), - ] - ti_invariant_input_desc = [ - # body const one - TensorIteratorInvariantInputDesc(3, 3), - ] - - # TI outputs - ti_body_output_desc = [ - # final average - TensorIteratorBodyOutputDesc(0, 0, -1), - ] - ti_concat_output_desc = [ - # history of cma - TensorIteratorConcatOutputDesc(1, 1, 0, 1, 1, -1, 0), - ] - - node = ng.tensor_iterator( - ti_inputs, - graph_body, - ti_slice_input_desc, - ti_merged_input_desc, - ti_invariant_input_desc, - ti_body_output_desc, - ti_concat_output_desc, - ) - - assert node.get_type_name() == "TensorIterator" - assert node.get_output_size() == 2 - # final average - assert list(node.get_output_shape(0)) == [2, 2] - # cma history - assert list(node.get_output_shape(1)) == [16, 2, 2] - - -def test_read_value_opset5(): - init_value = ng_opset5.parameter([2, 2], name="init_value", dtype=np.int32) - - node = ng_opset5.read_value(init_value, "var_id_667") - - assert node.get_type_name() == "ReadValue" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - assert node.get_output_element_type(0) == Type.i32 - - -def test_assign_opset5(): - input_data = ng_opset5.parameter([5, 7], name="input_data", dtype=np.int32) - rv = ng_opset5.read_value(input_data, "var_id_667") - node = ng_opset5.assign(rv, "var_id_667") - - assert node.get_type_name() == "Assign" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [5, 7] - assert node.get_output_element_type(0) == Type.i32 - - -def test_read_value(): - init_value = ng.parameter([2, 2], name="init_value", dtype=np.int32) - - node = ng.read_value(init_value, "var_id_667") - - assert node.get_type_name() == "ReadValue" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - assert node.get_output_element_type(0) == Type.i32 - - -def test_assign(): - input_data = ng.parameter([5, 7], name="input_data", dtype=np.int32) - rv = ng.read_value(input_data, "var_id_667") - node = ng.assign(rv, "var_id_667") - - assert node.get_type_name() == "Assign" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [5, 7] - assert node.get_output_element_type(0) == Type.i32 - - -def test_extract_image_patches(): - image = ng.parameter([64, 3, 10, 10], name="image", dtype=np.int32) - sizes = [3, 3] - strides = [5, 5] - rates = [1, 1] - padding = "VALID" - node = ng.extract_image_patches(image, sizes, strides, rates, padding) - - assert node.get_type_name() == "ExtractImagePatches" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [64, 27, 2, 2] - assert node.get_output_element_type(0) == Type.i32 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_bidirectional(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - num_directions = 2 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "BIDIRECTIONAL" - node = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node.get_type_name() == "LSTMSequence" - assert node.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMSequence" - assert node_param.get_output_size() == 3 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_reverse(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "REVERSE" - - node_default = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "LSTMSequence" - assert node_default.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "LSTMSequence" - assert node_param.get_output_size() == 3 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_lstm_sequence_operator_forward(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - C_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 4 * hidden_size, input_size] - R_shape = [num_directions, 4 * hidden_size, hidden_size] - B_shape = [num_directions, 4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_C_t = ng.parameter(C_t_shape, name="C_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "forward" - - node_default = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "LSTMSequence" - assert node_default.get_output_size() == 3 - - activations = ["RELU", "tanh", "Sigmoid"] - activation_alpha = [2.0] - activation_beta = [1.0] - clip = 0.5 - - node = ng.lstm_sequence( - parameter_X, - parameter_H_t, - parameter_C_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node.get_type_name() == "LSTMSequence" - assert node.get_output_size() == 3 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_gru_sequence_operator_bidirectional(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - num_directions = 2 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 3 * hidden_size, input_size] - R_shape = [num_directions, 3 * hidden_size, hidden_size] - B_shape = [num_directions, 3 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "BIDIRECTIONAL" - node = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node.get_type_name() == "GRUSequence" - assert node.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - linear_before_reset = True - B_shape = [num_directions, 4 * hidden_size] - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - node_param = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - linear_before_reset - ) - - assert node_param.get_type_name() == "GRUSequence" - assert node_param.get_output_size() == 2 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_gru_sequence_operator_reverse(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 3 * hidden_size, input_size] - R_shape = [num_directions, 3 * hidden_size, hidden_size] - B_shape = [num_directions, 3 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "REVERSE" - - node_default = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "GRUSequence" - assert node_default.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - linear_before_reset = True - B_shape = [num_directions, 4 * hidden_size] - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - node_param = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - linear_before_reset - ) - - assert node_param.get_type_name() == "GRUSequence" - assert node_param.get_output_size() == 2 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_gru_sequence_operator_forward(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, 3 * hidden_size, input_size] - R_shape = [num_directions, 3 * hidden_size, hidden_size] - B_shape = [num_directions, 3 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "forward" - - node_default = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "GRUSequence" - assert node_default.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [2.0] - activation_beta = [1.0] - clip = 0.5 - linear_before_reset = True - B_shape = [num_directions, 4 * hidden_size] - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - node = ng.gru_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - linear_before_reset - ) - - assert node.get_type_name() == "GRUSequence" - assert node.get_output_size() == 2 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_rnn_sequence_operator_bidirectional(dtype): - batch_size = 1 - input_size = 16 - hidden_size = 128 - num_directions = 2 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, hidden_size, input_size] - R_shape = [num_directions, hidden_size, hidden_size] - B_shape = [num_directions, hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "BIDIRECTIONAL" - node = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node.get_type_name() == "RNNSequence" - assert node.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "RNNSequence" - assert node_param.get_output_size() == 2 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_rnn_sequence_operator_reverse(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, hidden_size, input_size] - R_shape = [num_directions, hidden_size, hidden_size] - B_shape = [num_directions, hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "REVERSE" - - node_default = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "RNNSequence" - assert node_default.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [1.0, 2.0, 3.0] - activation_beta = [3.0, 2.0, 1.0] - clip = 1.22 - - node_param = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node_param.get_type_name() == "RNNSequence" - assert node_param.get_output_size() == 2 - - -@pytest.mark.parametrize("dtype", [np.float32, np.float64]) -def test_rnn_sequence_operator_forward(dtype): - batch_size = 2 - input_size = 4 - hidden_size = 3 - num_directions = 1 - seq_length = 2 - - X_shape = [batch_size, seq_length, input_size] - H_t_shape = [batch_size, num_directions, hidden_size] - seq_len_shape = [batch_size] - W_shape = [num_directions, hidden_size, input_size] - R_shape = [num_directions, hidden_size, hidden_size] - B_shape = [num_directions, hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=dtype) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=dtype) - parameter_seq_len = ng.parameter(seq_len_shape, name="seq_len", dtype=np.int32) - parameter_W = ng.parameter(W_shape, name="W", dtype=dtype) - parameter_R = ng.parameter(R_shape, name="R", dtype=dtype) - parameter_B = ng.parameter(B_shape, name="B", dtype=dtype) - - direction = "forward" - - node_default = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - ) - - assert node_default.get_type_name() == "RNNSequence" - assert node_default.get_output_size() == 2 - - activations = ["RELU", "tanh"] - activation_alpha = [2.0] - activation_beta = [1.0] - clip = 0.5 - - node = ng.rnn_sequence( - parameter_X, - parameter_H_t, - parameter_seq_len, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - direction, - activations, - activation_alpha, - activation_beta, - clip, - ) - - assert node.get_type_name() == "RNNSequence" - assert node.get_output_size() == 2 - - -def test_multiclass_nms(): - boxes_data = np.array([0.0, 0.0, 1.0, 1.0, 0.0, 0.1, 1.0, 1.1, - 0.0, -0.1, 1.0, 0.9, 0.0, 10.0, 1.0, 11.0, - 0.0, 10.1, 1.0, 11.1, 0.0, 100.0, 1.0, 101.0], dtype="float32") - boxes_data = boxes_data.reshape([1, 6, 4]) - box = ng.constant(boxes_data, dtype=np.float32) - scores_data = np.array([0.9, 0.75, 0.6, 0.95, 0.5, 0.3, - 0.95, 0.75, 0.6, 0.80, 0.5, 0.3], dtype="float32") - scores_data = scores_data.reshape([1, 2, 6]) - score = ng.constant(scores_data, dtype=np.float32) - - nms_node = ng.multiclass_nms(box, score, None, output_type="i32", nms_top_k=3, - iou_threshold=0.5, score_threshold=0.0, sort_result_type="classid", - nms_eta=1.0) - - assert nms_node.get_type_name() == "MulticlassNms" - assert nms_node.get_output_size() == 3 - assert nms_node.outputs()[0].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(6)]) - assert nms_node.outputs()[1].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(1)]) - assert list(nms_node.outputs()[2].get_shape()) == [1, ] - assert nms_node.get_output_element_type(0) == Type.f32 - assert nms_node.get_output_element_type(1) == Type.i32 - assert nms_node.get_output_element_type(2) == Type.i32 - - boxes_data = np.array([[[7.55, 1.10, 18.28, 14.47], - [7.25, 0.47, 12.28, 17.77]], - [[4.06, 5.15, 16.11, 18.40], - [9.66, 3.36, 18.57, 13.26]], - [[6.50, 7.00, 13.33, 17.63], - [0.73, 5.34, 19.97, 19.97]]]).astype("float32") - box = ng.constant(boxes_data, dtype=np.float32) - scores_data = np.array([[0.34, 0.66], - [0.45, 0.61], - [0.39, 0.59]]).astype("float32") - score = ng.constant(scores_data, dtype=np.float32) - rois_num_data = np.array([3]).astype("int32") - roisnum = ng.constant(rois_num_data, dtype=np.int32) - nms_node = ng.multiclass_nms(box, score, roisnum, output_type="i32", nms_top_k=3, - iou_threshold=0.5, score_threshold=0.0, sort_result_type="classid", - nms_eta=1.0) - - assert nms_node.get_type_name() == "MulticlassNms" - assert nms_node.get_output_size() == 3 - assert nms_node.outputs()[0].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(6)]) - assert nms_node.outputs()[1].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(1)]) - assert list(nms_node.outputs()[2].get_shape()) == [1, ] - assert nms_node.get_output_element_type(0) == Type.f32 - assert nms_node.get_output_element_type(1) == Type.i32 - assert nms_node.get_output_element_type(2) == Type.i32 - - -def test_matrix_nms(): - boxes_data = np.array([0.0, 0.0, 1.0, 1.0, 0.0, 0.1, 1.0, 1.1, - 0.0, -0.1, 1.0, 0.9, 0.0, 10.0, 1.0, 11.0, - 0.0, 10.1, 1.0, 11.1, 0.0, 100.0, 1.0, 101.0], dtype="float32") - boxes_data = boxes_data.reshape([1, 6, 4]) - box = ng.constant(boxes_data, dtype=np.float32) - scores_data = np.array([0.9, 0.75, 0.6, 0.95, 0.5, 0.3, - 0.95, 0.75, 0.6, 0.80, 0.5, 0.3], dtype="float32") - scores_data = scores_data.reshape([1, 2, 6]) - score = ng.constant(scores_data, dtype=np.float32) - - nms_node = ng.matrix_nms(box, score, output_type="i32", nms_top_k=3, - score_threshold=0.0, sort_result_type="score", background_class=0, - decay_function="linear", gaussian_sigma=2.0, post_threshold=0.0) - - assert nms_node.get_type_name() == "MatrixNms" - assert nms_node.get_output_size() == 3 - assert nms_node.outputs()[0].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(6)]) - assert nms_node.outputs()[1].get_partial_shape() == PartialShape([Dimension(0, 6), Dimension(1)]) - assert list(nms_node.outputs()[2].get_shape()) == [1, ] - assert nms_node.get_output_element_type(0) == Type.f32 - assert nms_node.get_output_element_type(1) == Type.i32 - assert nms_node.get_output_element_type(2) == Type.i32 - - -@pytest.mark.parametrize( - ("boxes_shape", "scores_shape", "max_output_boxes", "expected_shape"), - [ - ([1, 1000, 4], [1, 1, 1000], [1000], [PartialShape([Dimension(0, 1000), Dimension(3)]), PartialShape([Dimension(0, 1000), Dimension(3)])]), - ([1, 700, 4], [1, 1, 700], [600], [PartialShape([Dimension(0, 600), Dimension(3)]), PartialShape([Dimension(0, 600), Dimension(3)])]), - ([1, 300, 4], [1, 1, 300], [300], [PartialShape([Dimension(0, 300), Dimension(3)]), PartialShape([Dimension(0, 300), Dimension(3)])]), - ], -) -def test_non_max_suppression(boxes_shape, scores_shape, max_output_boxes, expected_shape): - boxes_parameter = ng.parameter(boxes_shape, name="Boxes", dtype=np.float32) - scores_parameter = ng.parameter(scores_shape, name="Scores", dtype=np.float32) - - node = ng.non_max_suppression(boxes_parameter, scores_parameter, make_constant_node(max_output_boxes, np.int64)) - assert node.get_type_name() == "NonMaxSuppression" - assert node.get_output_size() == 3 - assert node.get_output_partial_shape(0) == expected_shape[0] - assert node.get_output_partial_shape(1) == expected_shape[1] - assert list(node.get_output_shape(2)) == [1] - - -@pytest.mark.parametrize( - ("boxes_shape", "scores_shape", "max_output_boxes", "iou_threshold", "score_threshold", "soft_nms_sigma", "expected_shape"), - [ - ([1, 100, 4], [1, 1, 100], [100], 0.1, 0.4, 0.5, [PartialShape([Dimension(0, 100), Dimension(3)]), PartialShape([Dimension(0, 100), Dimension(3)])]), - ([1, 700, 4], [1, 1, 700], [600], 0.1, 0.4, 0.5, [PartialShape([Dimension(0, 600), Dimension(3)]), PartialShape([Dimension(0, 600), Dimension(3)])]), - ([1, 300, 4], [1, 1, 300], [300], 0.1, 0.4, 0.5, [PartialShape([Dimension(0, 300), Dimension(3)]), PartialShape([Dimension(0, 300), Dimension(3)])]), - ], -) -def test_non_max_suppression_non_default_args(boxes_shape, scores_shape, max_output_boxes, iou_threshold, score_threshold, soft_nms_sigma, expected_shape): - boxes_parameter = ng.parameter(boxes_shape, name="Boxes", dtype=np.float32) - scores_parameter = ng.parameter(scores_shape, name="Scores", dtype=np.float32) - - max_output_boxes = make_constant_node(max_output_boxes, np.int64) - iou_threshold = make_constant_node(iou_threshold, np.float32) - score_threshold = make_constant_node(score_threshold, np.float32) - soft_nms_sigma = make_constant_node(soft_nms_sigma, np.float32) - - node = ng.non_max_suppression(boxes_parameter, scores_parameter, max_output_boxes, iou_threshold, score_threshold, soft_nms_sigma) - assert node.get_type_name() == "NonMaxSuppression" - assert node.get_output_size() == 3 - assert node.get_output_partial_shape(0) == expected_shape[0] - assert node.get_output_partial_shape(1) == expected_shape[1] - assert list(node.get_output_shape(2)) == [1] - - -def test_slice(): - data_shape = [10, 7, 2, 13] - data = ng.parameter(data_shape, name="input", dtype=np.float32) - - start = ng.constant(np.array([2, 0, 0], dtype=np.int32)) - stop = ng.constant(np.array([9, 7, 2], dtype=np.int32)) - step = ng.constant(np.array([2, 1, 1], dtype=np.int32)) - - node_default_axes = ng.slice(data, start, stop, step) - - assert node_default_axes.get_type_name() == "Slice" - assert node_default_axes.get_output_size() == 1 - assert node_default_axes.get_output_element_type(0) == Type.f32 - assert tuple(node_default_axes.get_output_shape(0)) == np.zeros(data_shape)[2:9:2, ::, 0:2:1].shape - - start = ng.constant(np.array([0, 2], dtype=np.int32)) - stop = ng.constant(np.array([2, 9], dtype=np.int32)) - step = ng.constant(np.array([1, 2], dtype=np.int32)) - axes = ng.constant(np.array([-2, 0], dtype=np.int32)) - - node = ng.slice(data, start, stop, step, axes) - - assert node.get_type_name() == "Slice" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert tuple(node.get_output_shape(0)) == np.zeros(data_shape)[2:9:2, ::, 0:2:1].shape - - -def test_i420_to_bgr(): - expected_output_shape = [1, 480, 640, 3] - - # # Single plane (one arg) - arg_single_plane = ng.parameter([1, 720, 640, 1], name="input", dtype=np.float32) - node_single_plane = ng.i420_to_bgr(arg_single_plane) - - assert node_single_plane.get_type_name() == "I420toBGR" - assert node_single_plane.get_output_size() == 1 - assert node_single_plane.get_output_element_type(0) == Type.f32 - assert list(node_single_plane.get_output_shape(0)) == expected_output_shape - - # Separate planes (three args) - arg_y = ng.parameter([1, 480, 640, 1], name="input_y", dtype=np.float32) - arg_u = ng.parameter([1, 240, 320, 1], name="input_u", dtype=np.float32) - arg_v = ng.parameter([1, 240, 320, 1], name="input_v", dtype=np.float32) - - node_separate_planes = ng.i420_to_bgr(arg_y, arg_u, arg_v) - - assert node_separate_planes.get_type_name() == "I420toBGR" - assert node_separate_planes.get_output_size() == 1 - assert node_separate_planes.get_output_element_type(0) == Type.f32 - assert list(node_separate_planes.get_output_shape(0)) == expected_output_shape - - # Incorrect inputs number - with pytest.raises(UserInputError, match=r".*Operation I420toBGR*."): - node_separate_planes = ng.i420_to_bgr(arg_y, arg_v) - - with pytest.raises(UserInputError, match=r".*Operation I420toBGR*."): - node_separate_planes = ng.i420_to_bgr(arg_single_plane, None, arg_v) - - -def test_i420_to_rgb(): - expected_output_shape = [1, 480, 640, 3] - - # # Single plane (one arg) - arg_single_plane = ng.parameter([1, 720, 640, 1], name="input", dtype=np.float32) - node_single_plane = ng.i420_to_rgb(arg_single_plane) - - assert node_single_plane.get_type_name() == "I420toRGB" - assert node_single_plane.get_output_size() == 1 - assert node_single_plane.get_output_element_type(0) == Type.f32 - assert list(node_single_plane.get_output_shape(0)) == expected_output_shape - - # Separate planes (three args) - arg_y = ng.parameter([1, 480, 640, 1], name="input_y", dtype=np.float32) - arg_u = ng.parameter([1, 240, 320, 1], name="input_u", dtype=np.float32) - arg_v = ng.parameter([1, 240, 320, 1], name="input_v", dtype=np.float32) - - node_separate_planes = ng.i420_to_rgb(arg_y, arg_u, arg_v) - - assert node_separate_planes.get_type_name() == "I420toRGB" - assert node_separate_planes.get_output_size() == 1 - assert node_separate_planes.get_output_element_type(0) == Type.f32 - assert list(node_separate_planes.get_output_shape(0)) == expected_output_shape - - with pytest.raises(UserInputError, match=r".*Operation I420toRGB*."): - node_separate_planes = ng.i420_to_rgb(arg_y, arg_v) - - with pytest.raises(UserInputError, match=r".*Operation I420toRGB*."): - node_separate_planes = ng.i420_to_rgb(arg_single_plane, None, arg_v) - - -def test_nv12_to_bgr(): - expected_output_shape = [1, 480, 640, 3] - - # # Single plane (one arg) - arg_single_plane = ng.parameter([1, 720, 640, 1], name="input", dtype=np.float32) - node_single_plane = ng.nv12_to_bgr(arg_single_plane) - - assert node_single_plane.get_type_name() == "NV12toBGR" - assert node_single_plane.get_output_size() == 1 - assert node_single_plane.get_output_element_type(0) == Type.f32 - assert list(node_single_plane.get_output_shape(0)) == expected_output_shape - - # Separate planes (two args) - arg_y = ng.parameter([1, 480, 640, 1], name="input_y", dtype=np.float32) - arg_uv = ng.parameter([1, 240, 320, 2], name="input_uv", dtype=np.float32) - - node_separate_planes = ng.nv12_to_bgr(arg_y, arg_uv) - - assert node_separate_planes.get_type_name() == "NV12toBGR" - assert node_separate_planes.get_output_size() == 1 - assert node_separate_planes.get_output_element_type(0) == Type.f32 - assert list(node_separate_planes.get_output_shape(0)) == expected_output_shape - - -def test_nv12_to_rgb(): - expected_output_shape = [1, 480, 640, 3] - - # # Single plane (one arg) - arg_single_plane = ng.parameter([1, 720, 640, 1], name="input", dtype=np.float32) - node_single_plane = ng.nv12_to_rgb(arg_single_plane) - - assert node_single_plane.get_type_name() == "NV12toRGB" - assert node_single_plane.get_output_size() == 1 - assert node_single_plane.get_output_element_type(0) == Type.f32 - assert list(node_single_plane.get_output_shape(0)) == expected_output_shape - - # Separate planes (two args) - arg_y = ng.parameter([1, 480, 640, 1], name="input_y", dtype=np.float32) - arg_uv = ng.parameter([1, 240, 320, 2], name="input_uv", dtype=np.float32) - - node_separate_planes = ng.nv12_to_rgb(arg_y, arg_uv) - - assert node_separate_planes.get_type_name() == "NV12toRGB" - assert node_separate_planes.get_output_size() == 1 - assert node_separate_planes.get_output_element_type(0) == Type.f32 - assert list(node_separate_planes.get_output_shape(0)) == expected_output_shape - - -def test_softsign(): - input_shape = [2, 4, 8, 16] - - param = ng.parameter(input_shape, name="input") - node = ng.softsign(param, input_shape) - - assert node.get_type_name() == "SoftSign" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - assert node.get_output_element_type(0) == Type.f32 - - -def test_rdft(): - param = ng.parameter([5, 3, 4], name="input") - axes = ng.constant(np.array([0, 1])) - signal_size = ng.constant(np.array([1, 2])) - node = ng.rdft(param, axes, signal_size) - - assert node.get_type_name() == "RDFT" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 2, 4, 2] - assert node.get_output_element_type(0) == Type.f32 - - -def test_irdft(): - param = ng.parameter([5, 3, 4, 2], name="input") - axes = ng.constant(np.array([0, 1])) - signal_size = ng.constant(np.array([1, 2])) - node = ng.irdft(param, axes, signal_size) - - assert node.get_type_name() == "IRDFT" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 2, 4] - assert node.get_output_element_type(0) == Type.f32 - - -def test_generate_proposals(): - im_info_shape = [1, 3] - anchors_shape = [4, 4, 3, 4] - deltas_shape = [1, 12, 4, 4] - scores_shape = [1, 3, 4, 4] - - im_info_param = ng.parameter(im_info_shape, name="im_info") - anchors_param = ng.parameter(anchors_shape, name="anchors") - deltas_param = ng.parameter(deltas_shape, name="deltas") - scores_param = ng.parameter(scores_shape, name="scores") - - node = ng.generate_proposals(im_info_param, - anchors_param, - deltas_param, - scores_param, - min_size=1.0, - nms_threshold=0.5, - pre_nms_count=200, - post_nms_count=100, - normalized=False, - nms_eta=1.0, - roi_num_type="i32") - - assert node.get_type_name() == "GenerateProposals" - assert node.get_output_size() == 3 - assert node.get_output_partial_shape(0).same_scheme(PartialShape([-1, 4])) - assert node.get_output_partial_shape(1).same_scheme(PartialShape([-1])) - assert node.get_output_partial_shape(2).same_scheme(PartialShape([1])) - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.f32 - assert node.get_output_element_type(2) == Type.i32 - - -def test_grid_sample_default(): - img = ng.parameter([1, 3, 100, 100], dtype=np.int32, name="image") - grid = ng.parameter([1, 10, 10, 2], dtype=np.float32, name="grid") - - node = ng.grid_sample(img, grid, {}) - - assert node.get_type_name() == "GridSample" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 3, 10, 10] - assert node.get_output_element_type(0) == Type.i32 - - -def test_grid_sample_custom_attributes(): - img = ng.parameter([1, 3, 100, 100], dtype=np.int32, name="image") - grid = ng.parameter([1, 5, 6, 2], dtype=np.float32, name="grid") - - attributes = { - "align_corners": True, - "mode": "nearest", - "padding_mode": "reflection" - } - - node = ng.grid_sample(img, grid, attributes) - - assert node.get_type_name() == "GridSample" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 3, 5, 6] - assert node.get_output_element_type(0) == Type.i32 - - node_attributes = node.get_attributes() - assert node_attributes["align_corners"] is True - assert node_attributes["mode"] == "nearest" - assert node_attributes["padding_mode"] == "reflection" - - -@pytest.mark.parametrize( - ("expected_shape", "shape_calculation_mode"), - [ - ([1, 3, 64, 64], "scales"), - ([1, 3, 256, 256], "sizes"), - ], -) -@pytest.mark.parametrize("dtype", np_types) -def test_interpolate_opset10(dtype, expected_shape, shape_calculation_mode): - - image_shape = [1, 3, 1024, 1024] - image_node = ng.parameter(image_shape, dtype, name="Image") - output_shape = [256, 256] - scales = np.array([1 / 16, 1 / 16], dtype=np.float32) - axes = [2, 3] - mode = "cubic" - - node = ng_opset10.interpolate(image=image_node, output_shape=output_shape, scales=scales, - axes=axes,mode=mode, shape_calculation_mode=shape_calculation_mode) - assert node.get_type_name() == "Interpolate" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - - -@pytest.mark.parametrize( - ("expected_shape", "shape_calculation_mode", "input_value"), - [ - ([1, 3, 64, 64], "scales", np.array([1 / 16, 1 / 16], dtype=np.float32)), - ([1, 3, 256, 256], "sizes", np.array([256, 256], dtype=np.int32)), - ], -) -@pytest.mark.parametrize("dtype", np_types) -def test_interpolate_opset11(dtype, expected_shape, shape_calculation_mode, input_value): - - image_shape = [1, 3, 1024, 1024] - image_node = ng.parameter(image_shape, dtype, name="Image") - axes = [2, 3] - mode = "bilinear_pillow" - - node = ng_opset11.interpolate(image=image_node, scales_or_sizes=input_value, axes=axes, mode=mode, - shape_calculation_mode=shape_calculation_mode) - assert node.get_type_name() == "Interpolate" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - -def test_is_finite_opset10(): - input_shape = [1, 2, 3, 4] - input_node = ng.parameter(input_shape, np.float32, name="InputData") - node = ng_opset10.is_finite(input_node) - - assert node.get_type_name() == "IsFinite" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - - -def test_is_inf_opset10_default(): - input_shape = [2, 2, 2, 2] - input_node = ng.parameter(input_shape, dtype=np.float32, name="InputData") - node = ng_opset10.is_inf(input_node) - - assert node.get_type_name() == "IsInf" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - - node_attributes = node.get_attributes() - assert node_attributes["detect_positive"] is True - assert node_attributes["detect_negative"] is True - - -def test_is_inf_opset10_custom_attribute(): - input_shape = [2, 2, 2] - input_node = ng.parameter(input_shape, dtype=np.float32, name="InputData") - attributes = { - "detect_positive": False, - } - node = ng_opset10.is_inf(input_node, attributes) - - assert node.get_type_name() == "IsInf" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - - node_attributes = node.get_attributes() - assert node_attributes["detect_positive"] is False - assert node_attributes["detect_negative"] is True - - -def test_is_inf_opset10_custom_all_attributes(): - input_shape = [2, 2, 2] - input_node = ng.parameter(input_shape, dtype=np.float32, name="InputData") - attributes = { - "detect_negative": False, - "detect_positive": True, - } - node = ng_opset10.is_inf(input_node, attributes) - - assert node.get_type_name() == "IsInf" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - - node_attributes = node.get_attributes() - assert node_attributes["detect_positive"] is True - assert node_attributes["detect_negative"] is False - - -def test_is_nan_opset10(): - input_shape = [1, 2, 3, 4] - input_node = ng.parameter(input_shape, np.float32, name="InputData") - node = ng_opset10.is_nan(input_node) - - assert node.get_type_name() == "IsNaN" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == input_shape - assert node.get_output_element_type(0) == Type.boolean - - -def test_unique_opset10(): - input_shape = [1, 2, 3, 4] - input_node = ng.parameter(input_shape, np.float32, name="input_data") - axis = ng.constant([1], np.int32, [1]) - - node = ng_opset10.unique(input_node, axis, False, "i32") - - assert node.get_type_name() == "Unique" - assert node.get_sorted() is False - assert node.get_output_size() == 4 - - assert node.get_output_partial_shape(0) == PartialShape([Dimension(1), Dimension(1, 2), - Dimension(3), Dimension(4)]) - assert node.get_output_partial_shape(1) == PartialShape([Dimension(1, 24)]) - assert node.get_output_partial_shape(2) == PartialShape([2]) - assert node.get_output_partial_shape(3) == PartialShape([Dimension(1, 24)]) - - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.i32 - assert node.get_output_element_type(2) == Type.i32 - assert node.get_output_element_type(3) == Type.i64 - - # Axis default, means flattened result - node = ng_opset10.unique(input_node, None, False, "i32", "i32") - - assert node.get_type_name() == "Unique" - assert node.get_sorted() is False - assert node.get_output_size() == 4 - - assert node.get_output_partial_shape(0) == PartialShape([Dimension(1, 24)]) - assert node.get_output_partial_shape(1) == PartialShape([Dimension(1, 24)]) - assert node.get_output_partial_shape(2) == PartialShape([24]) - assert node.get_output_partial_shape(3) == PartialShape([Dimension(1, 24)]) - - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.i32 - assert node.get_output_element_type(2) == Type.i32 - assert node.get_output_element_type(3) == Type.i32 - - # All arguments default - node = ng_opset10.unique(input_node) - - assert node.get_type_name() == "Unique" - assert node.get_output_size() == 4 - assert node.get_sorted() is True - - assert node.get_output_partial_shape(0) == PartialShape([Dimension(1, 24)]) - assert node.get_output_partial_shape(1) == PartialShape([Dimension(1, 24)]) - assert node.get_output_partial_shape(2) == PartialShape([24]) - assert node.get_output_partial_shape(3) == PartialShape([Dimension(1, 24)]) - - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.i64 - assert node.get_output_element_type(2) == Type.i64 - assert node.get_output_element_type(3) == Type.i64 - - -def test_topk_opset11(): - data_shape = [1, 3, 256] - data = ng.parameter(data_shape, dtype=np.int32, name="Data") - k_val = np.int32(3) - axis = np.int32(-1) - node = ng_opset11.topk(data, k_val, axis, "min", "value", stable=True) - - assert node.get_type_name() == "TopK" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [1, 3, 3] - assert list(node.get_output_shape(1)) == [1, 3, 3] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ctc_loss.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ctc_loss.py deleted file mode 100644 index f179cff1318..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ctc_loss.py +++ /dev/null @@ -1,27 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_ctc_loss_props(): - ind_dtype = np.int32 - float_dtype = np.float32 - logits = ng.parameter([2, 100, 80], dtype=float_dtype, name="logits") - logit_length = ng.parameter([2], dtype=ind_dtype, name="logit_length") - labels = ng.parameter([2, 100], dtype=ind_dtype, name="labels") - label_length = ng.parameter([2], dtype=ind_dtype, name="label_length") - blank_index = ng.parameter([], dtype=ind_dtype, name="blank_index") - preprocess_collapse_repeated = False - ctc_merge_repeated = True - unique = False - - node = ng.ctc_loss(logits, logit_length, labels, label_length, blank_index, - preprocess_collapse_repeated, ctc_merge_repeated, unique) - assert node.get_type_name() == "CTCLoss" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_data_movement.py b/src/bindings/python/tests_compatibility/test_ngraph/test_data_movement.py deleted file mode 100644 index b6bfecbc3c0..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_data_movement.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type, Shape - - -def test_reverse_sequence(): - input_data = ng.parameter((2, 3, 4, 2), name="input_data", dtype=np.int32) - seq_lengths = np.array([1, 2, 1, 2], dtype=np.int32) - batch_axis = 2 - sequence_axis = 1 - - input_param = ng.parameter(input_data.shape, name="input", dtype=np.int32) - seq_lengths_param = ng.parameter(seq_lengths.shape, name="sequence lengths", dtype=np.int32) - model = ng.reverse_sequence(input_param, seq_lengths_param, batch_axis, sequence_axis) - - assert model.get_type_name() == "ReverseSequence" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 3, 4, 2] - assert model.get_output_element_type(0) == Type.i32 - - -def test_pad_edge(): - input_data = np.arange(1, 13).reshape([3, 4]) - pads_begin = np.array([0, 1], dtype=np.int32) - pads_end = np.array([2, 3], dtype=np.int32) - - input_param = ng.parameter(input_data.shape, name="input", dtype=np.int32) - model = ng.pad(input_param, pads_begin, pads_end, "edge") - - assert model.get_type_name() == "Pad" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [5, 8] - assert model.get_output_element_type(0) == Type.i32 - - -def test_pad_constant(): - input_data = np.arange(1, 13).reshape([3, 4]) - pads_begin = np.array([0, 1], dtype=np.int32) - pads_end = np.array([2, 3], dtype=np.int32) - - input_param = ng.parameter(input_data.shape, name="input", dtype=np.int32) - model = ng.pad(input_param, pads_begin, pads_end, "constant", arg_pad_value=np.array(100, dtype=np.int32)) - - assert model.get_type_name() == "Pad" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [5, 8] - assert model.get_output_element_type(0) == Type.i32 - - -def test_select(): - cond = np.array([[False, False], [True, False], [True, True]]) - then_node = np.array([[-1, 0], [1, 2], [3, 4]], dtype=np.int32) - else_node = np.array([[11, 10], [9, 8], [7, 6]], dtype=np.int32) - - node = ng.select(cond, then_node, else_node) - assert node.get_type_name() == "Select" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 2] - assert node.get_output_element_type(0) == Type.i32 - - -def test_gather_nd(): - indices_type = np.int32 - data_dtype = np.float32 - data = ng.parameter([2, 10, 80, 30, 50], dtype=data_dtype, name="data") - indices = ng.parameter([2, 10, 30, 40, 2], dtype=indices_type, name="indices") - batch_dims = 2 - expected_shape = [20, 30, 40, 50] - - node = ng.opset5.gather_nd(data, indices, batch_dims) - assert node.get_type_name() == "GatherND" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -def test_gather_v8_nd(): - indices_type = np.int32 - data_dtype = np.float32 - data = ng.parameter([2, 10, 80, 30, 50], dtype=data_dtype, name="data") - indices = ng.parameter([2, 10, 30, 40, 2], dtype=indices_type, name="indices") - batch_dims = 2 - expected_shape = [2, 10, 30, 40, 50] - - node = ng.gather_nd(data, indices, batch_dims) - assert node.get_type_name() == "GatherND" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -def test_gather_elements(): - indices_type = np.int32 - data_dtype = np.float32 - data = ng.parameter(Shape([2, 5]), dtype=data_dtype, name="data") - indices = ng.parameter(Shape([2, 100]), dtype=indices_type, name="indices") - axis = 1 - expected_shape = [2, 100] - - node = ng.gather_elements(data, indices, axis) - assert node.get_type_name() == "GatherElements" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_detection_output.py b/src/bindings/python/tests_compatibility/test_ngraph/test_detection_output.py deleted file mode 100644 index b5874a5acab..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_detection_output.py +++ /dev/null @@ -1,111 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np -import pytest - -np_types = [np.float32, np.int32] -integral_np_types = [ - np.int8, - np.int16, - np.int32, - np.int64, - np.uint8, - np.uint16, - np.uint32, - np.uint64, -] - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.int8, np.float32), - (np.int16, np.float32), - (np.int32, np.float32), - (np.int64, np.float32), - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.int32, np.float16), - (np.int32, np.float64), - ], -) -def test_detection_output(int_dtype, fp_dtype): - attributes = { - "keep_top_k": np.array([64], dtype=int_dtype), - "nms_threshold": fp_dtype(0.645), - } - - box_logits = ng.parameter([4, 8], fp_dtype, "box_logits") - class_preds = ng.parameter([4, 170], fp_dtype, "class_preds") - proposals = ng.parameter([4, 2, 10], fp_dtype, "proposals") - aux_class_preds = ng.parameter([4, 4], fp_dtype, "aux_class_preds") - aux_box_preds = ng.parameter([4, 8], fp_dtype, "aux_box_preds") - - node = ng.detection_output(box_logits, class_preds, proposals, attributes, aux_class_preds, aux_box_preds) - - assert node.get_type_name() == "DetectionOutput" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 1, 256, 7] - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.int8, np.float32), - (np.int16, np.float32), - (np.int32, np.float32), - (np.int64, np.float32), - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.int32, np.float16), - (np.int32, np.float64), - ], -) -def test_dynamic_get_attribute_value(int_dtype, fp_dtype): - attributes = { - "background_label_id": int_dtype(13), - "top_k": int_dtype(16), - "variance_encoded_in_target": True, - "keep_top_k": np.array([64, 32, 16, 8], dtype=int_dtype), - "code_type": "caffe.PriorBoxParameter.CENTER_SIZE", - "share_location": False, - "nms_threshold": fp_dtype(0.645), - "confidence_threshold": fp_dtype(0.111), - "clip_after_nms": True, - "clip_before_nms": False, - "decrease_label_id": True, - "normalized": True, - "input_height": int_dtype(86), - "input_width": int_dtype(79), - "objectness_score": fp_dtype(0.77), - } - - box_logits = ng.parameter([4, 680], fp_dtype, "box_logits") - class_preds = ng.parameter([4, 170], fp_dtype, "class_preds") - proposals = ng.parameter([4, 1, 8], fp_dtype, "proposals") - aux_class_preds = ng.parameter([4, 4], fp_dtype, "aux_class_preds") - aux_box_preds = ng.parameter([4, 680], fp_dtype, "aux_box_preds") - - node = ng.detection_output(box_logits, class_preds, proposals, attributes, aux_class_preds, aux_box_preds) - - assert node.get_background_label_id() == int_dtype(13) - assert node.get_top_k() == int_dtype(16) - assert node.get_variance_encoded_in_target() - assert np.all(np.equal(node.get_keep_top_k(), np.array([64, 32, 16, 8], dtype=int_dtype))) - assert node.get_code_type() == "caffe.PriorBoxParameter.CENTER_SIZE" - assert not node.get_share_location() - assert np.isclose(node.get_nms_threshold(), fp_dtype(0.645)) - assert np.isclose(node.get_confidence_threshold(), fp_dtype(0.111)) - assert node.get_clip_after_nms() - assert not node.get_clip_before_nms() - assert node.get_decrease_label_id() - assert node.get_normalized() - assert node.get_input_height() == int_dtype(86) - assert node.get_input_width() == int_dtype(79) - assert np.isclose(node.get_objectness_score(), fp_dtype(0.77)) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_dft.py b/src/bindings/python/tests_compatibility/test_ngraph/test_dft.py deleted file mode 100644 index 56223e92d11..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_dft.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -from ngraph.impl import Type -import ngraph as ng -import numpy as np - - -def build_fft_input_data(): - np.random.seed(202104) - return np.random.uniform(0, 1, (2, 10, 10, 2)).astype(np.float32) - - -def test_dft_1d(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([2], dtype=np.int64)) - np_results = np.fft.fft(np.squeeze(input_data.view(dtype=np.complex64), axis=-1), - axis=2).astype(np.complex64) - - dft_node = ng.dft(input_tensor, input_axes) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(np.stack((np_results.real, np_results.imag), axis=-1).shape) - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_2d(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([1, 2], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [2, 10, 10, 2] - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_3d(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 1, 2], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [2, 10, 10, 2] - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_1d_signal_size(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([-2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([20], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes, input_signal_size) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [2, 20, 10, 2] - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_2d_signal_size_1(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes, input_signal_size) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [4, 10, 5, 2] - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_2d_signal_size_2(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([1, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes, input_signal_size) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [2, 4, 5, 2] - assert dft_node.get_output_element_type(0) == Type.f32 - - -def test_dft_3d_signal_size(): - input_data = build_fft_input_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 1, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5, 16], dtype=np.int64)) - - dft_node = ng.dft(input_tensor, input_axes, input_signal_size) - assert dft_node.get_type_name() == "DFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == [4, 5, 16, 2] - assert dft_node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_dyn_attributes.py b/src/bindings/python/tests_compatibility/test_ngraph/test_dyn_attributes.py deleted file mode 100644 index 9cfee2b7760..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_dyn_attributes.py +++ /dev/null @@ -1,164 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np -import pytest - - -@pytest.fixture() -def _proposal_node(): - attributes = { - "base_size": np.uint16(1), - "pre_nms_topn": np.uint16(20), - "post_nms_topn": np.uint16(64), - "nms_thresh": np.float64(0.34), - "feat_stride": np.uint16(16), - "min_size": np.uint16(32), - "ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=np.float64), - "scale": np.array([2, 3, 3, 4], dtype=np.float64), - } - batch_size = 7 - - class_probs = ng.parameter([batch_size, 12, 34, 62], np.float64, "class_probs") - bbox_deltas = ng.parameter([batch_size, 24, 34, 62], np.float64, "bbox_deltas") - image_shape = ng.parameter([3], np.float64, "image_shape") - return ng.proposal(class_probs, bbox_deltas, image_shape, attributes) - - -def test_dynamic_attributes_softmax(): - axis = 2 - data = ng.parameter([1, 2, 3, 4], np.float32, "data_in") - node = ng.softmax(data, axis) - - assert node.get_axis() == axis - node.set_axis(3) - assert node.get_axis() == 3 - - -@pytest.mark.parametrize( - "int_dtype, fp_dtype", - [ - (np.uint8, np.float32), - (np.uint16, np.float32), - (np.uint32, np.float32), - (np.uint64, np.float32), - (np.uint32, np.float16), - (np.uint32, np.float64), - ], -) -def test_dynamic_set_attribute_value(int_dtype, fp_dtype): - attributes = { - "base_size": int_dtype(1), - "pre_nms_topn": int_dtype(20), - "post_nms_topn": int_dtype(64), - "nms_thresh": fp_dtype(0.34), - "feat_stride": int_dtype(16), - "min_size": int_dtype(32), - "ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=fp_dtype), - "scale": np.array([2, 3, 3, 4], dtype=fp_dtype), - } - batch_size = 7 - - class_probs = ng.parameter([batch_size, 12, 34, 62], fp_dtype, "class_probs") - bbox_deltas = ng.parameter([batch_size, 24, 34, 62], fp_dtype, "bbox_deltas") - image_shape = ng.parameter([3], fp_dtype, "image_shape") - node = ng.proposal(class_probs, bbox_deltas, image_shape, attributes) - - node.set_base_size(int_dtype(15)) - node.set_pre_nms_topn(int_dtype(7)) - node.set_post_nms_topn(int_dtype(33)) - node.set_nms_thresh(fp_dtype(1.55)) - node.set_feat_stride(int_dtype(8)) - node.set_min_size(int_dtype(123)) - node.set_ratio(np.array([1.1, 2.5, 3.0, 4.5], dtype=fp_dtype)) - node.set_scale(np.array([2.1, 3.2, 3.3, 4.4], dtype=fp_dtype)) - node.set_clip_before_nms(True) - node.set_clip_after_nms(True) - node.set_normalize(True) - node.set_box_size_scale(fp_dtype(1.34)) - node.set_box_coordinate_scale(fp_dtype(0.88)) - node.set_framework("OpenVINO") - - assert node.get_base_size() == int_dtype(15) - assert node.get_pre_nms_topn() == int_dtype(7) - assert node.get_post_nms_topn() == int_dtype(33) - assert np.isclose(node.get_nms_thresh(), fp_dtype(1.55)) - assert node.get_feat_stride() == int_dtype(8) - assert node.get_min_size() == int_dtype(123) - assert np.allclose(node.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=fp_dtype)) - assert np.allclose(node.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=fp_dtype)) - assert node.get_clip_before_nms() - assert node.get_clip_after_nms() - assert node.get_normalize() - assert np.isclose(node.get_box_size_scale(), fp_dtype(1.34)) - assert np.isclose(node.get_box_coordinate_scale(), fp_dtype(0.88)) - assert node.get_framework() == "OpenVINO" - - -def test_dynamic_attr_cache(_proposal_node): - node = _proposal_node - - assert not node._attr_cache_valid - node.set_nms_thresh(1.3453678102) - assert not node._attr_cache_valid - assert np.isclose(node.get_nms_thresh(), np.float64(1.3453678102)) - assert node._attr_cache_valid - - -def test_dynamic_attr_transitivity(_proposal_node): - node = _proposal_node - node2 = node - - node.set_ratio(np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64)) - assert np.allclose(node.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64)) - assert np.allclose(node2.get_ratio(), np.array([1.1, 2.5, 3.0, 4.5], dtype=np.float64)) - - node2.set_scale(np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64)) - assert np.allclose(node2.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64)) - assert np.allclose(node.get_scale(), np.array([2.1, 3.2, 3.3, 4.4], dtype=np.float64)) - - -def test_dynamic_attributes_simple(): - batch_size = 1 - input_size = 16 - hidden_size = 128 - - X_shape = [batch_size, input_size] - H_t_shape = [batch_size, hidden_size] - W_shape = [3 * hidden_size, input_size] - R_shape = [3 * hidden_size, hidden_size] - B_shape = [4 * hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32) - parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32) - parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32) - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - activations = ["tanh", "relu"] - activations_alpha = [1.0, 2.0] - activations_beta = [1.0, 2.0] - clip = 0.5 - linear_before_reset = True - - node = ng.gru_cell( - parameter_X, - parameter_H_t, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - activations, - activations_alpha, - activations_beta, - clip, - linear_before_reset, - ) - - assert node.get_hidden_size() == hidden_size - assert all(map(lambda x, y: x == y, node.get_activations(), activations)) - assert all(np.equal(node.get_activations_alpha(), activations_alpha)) - assert all(np.equal(node.get_activations_beta(), activations_beta)) - assert node.get_linear_before_reset() == linear_before_reset - assert np.isclose(node.get_clip(), clip) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_einsum.py b/src/bindings/python/tests_compatibility/test_ngraph/test_einsum.py deleted file mode 100644 index 2427d60f64d..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_einsum.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np -import pytest - -from ngraph.utils.types import get_element_type -from tests_compatibility import xfail_issue_58033 - - -def einsum_op_exec(input_shapes: list, equation: str, data_type: np.dtype, - seed=202104): - """Test Einsum operation for given input shapes, equation, and data type. - - It generates input data of given shapes and type, receives reference results using numpy, - and tests IE implementation by matching with reference numpy results. - :param input_shapes: a list of tuples with shapes - :param equation: Einsum equation - :param data_type: a type of input data - :param seed: a seed for random generation of input data - """ - np.random.seed(seed) - num_inputs = len(input_shapes) - - # generate input tensors - ng_inputs = [] - np_inputs = [] - for i in range(num_inputs): - input_i = np.random.randint(1, 10 + 1, size=input_shapes[i]).astype(data_type) - np_inputs.append(input_i) - ng_inputs.append(ng.parameter(input_i.shape, dtype=data_type)) - - expected_result = np.einsum(equation, *np_inputs) - einsum_model = ng.einsum(ng_inputs, equation) - - # check the output shape and type - assert einsum_model.get_type_name() == "Einsum" - assert einsum_model.get_output_size() == 1 - assert list(einsum_model.get_output_shape(0)) == list(expected_result.shape) - assert einsum_model.get_output_element_type(0) == get_element_type(data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_dot_product(data_type): - einsum_op_exec([5, 5], "i,i->", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_matrix_multiplication(data_type): - einsum_op_exec([(2, 3), (3, 4)], "ab,bc->ac", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_batch_trace(data_type): - einsum_op_exec([(2, 3, 3)], "kii->k", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_diagonal_extraction(data_type): - einsum_op_exec([(6, 5, 5)], "kii->ki", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_transpose(data_type): - einsum_op_exec([(1, 2, 3)], "ijk->kij", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_multiple_multiplication(data_type): - einsum_op_exec([(2, 5), (5, 3, 6), (5, 3)], "ab,bcd,bc->ca", data_type) - - -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_simple_ellipsis(data_type): - einsum_op_exec([(5, 3, 4)], "a...->...", data_type) - - -@xfail_issue_58033 -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_multiple_ellipsis(data_type): - einsum_op_exec([(3, 5), 1], "a...,...->a...", data_type, with_value=True) - - -@xfail_issue_58033 -@pytest.mark.parametrize("data_type", [np.float32, np.int32]) -def test_broadcasting_ellipsis(data_type): - einsum_op_exec([(9, 1, 4, 3), (3, 11, 7, 1)], "a...b,b...->a...", data_type, with_value=True) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_eye.py b/src/bindings/python/tests_compatibility/test_ngraph/test_eye.py deleted file mode 100644 index c14b4ebf9bb..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_eye.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np -import pytest - -from ngraph.utils.types import get_element_type -from ngraph.utils.types import get_element_type_str - - -@pytest.mark.parametrize( - "num_rows, num_columns, diagonal_index, out_type", - [ - pytest.param(2, 5, 0, np.float32), - pytest.param(5, 3, 2, np.int64), - pytest.param(3, 3, -1, np.float16), - pytest.param(5, 5, -10, np.float32), - ], -) -def test_eye_rectangle(num_rows, num_columns, diagonal_index, out_type): - num_rows_array = np.array([num_rows], np.int32) - num_columns_array = np.array([num_columns], np.int32) - diagonal_index_array = np.array([diagonal_index], np.int32) - num_rows_tensor = ng.constant(num_rows_array) - num_columns_tensor = ng.constant(num_columns_array) - diagonal_index_tensor = ng.constant(diagonal_index_array) - - # Create with param names - eye_node = ng.eye(num_rows=num_rows_tensor, - num_columns=num_columns_tensor, - diagonal_index=diagonal_index_tensor, - output_type=get_element_type_str(out_type)) - - # Create with default orded - eye_node = ng.eye(num_rows_tensor, - num_columns_tensor, - diagonal_index_tensor, - get_element_type_str(out_type)) - - expected_results = np.eye(num_rows, M=num_columns, k=diagonal_index, dtype=np.float32) - - assert eye_node.get_type_name() == "Eye" - assert eye_node.get_output_size() == 1 - assert eye_node.get_output_element_type(0) == get_element_type(out_type) - assert tuple(eye_node.get_output_shape(0)) == expected_results.shape - - -@pytest.mark.parametrize( - "num_rows, num_columns, diagonal_index, batch_shape, out_type", - [ - pytest.param(2, 5, 0, [1], np.float32), - pytest.param(5, 3, 2, [2, 2], np.int64), - pytest.param(3, 3, -1, [1, 3, 2], np.float16), - pytest.param(5, 5, -10, [1, 1], np.float32), - ], -) -def test_eye_batch_shape(num_rows, num_columns, diagonal_index, batch_shape, out_type): - num_rows_array = np.array([num_rows], np.int32) - num_columns_array = np.array([num_columns], np.int32) - diagonal_index_array = np.array([diagonal_index], np.int32) - batch_shape_array = np.array(batch_shape, np.int32) - num_rows_tensor = ng.constant(num_rows_array) - num_columns_tensor = ng.constant(num_columns_array) - diagonal_index_tensor = ng.constant(diagonal_index_array) - batch_shape_tensor = ng.constant(batch_shape_array) - - # Create with param names - eye_node = ng.eye(num_rows=num_rows_tensor, - num_columns=num_columns_tensor, - diagonal_index=diagonal_index_tensor, - batch_shape=batch_shape_tensor, - output_type=get_element_type_str(out_type)) - - # Create with default orded - eye_node = ng.eye(num_rows_tensor, - num_columns_tensor, - diagonal_index_tensor, - get_element_type_str(out_type), - batch_shape_tensor) - - output_shape = [*batch_shape, 1, 1] - one_matrix = np.eye(num_rows, M=num_columns, k=diagonal_index, dtype=np.float32) - expected_results = np.tile(one_matrix, output_shape) - - assert eye_node.get_type_name() == "Eye" - assert eye_node.get_output_size() == 1 - assert eye_node.get_output_element_type(0) == get_element_type(out_type) - assert tuple(eye_node.get_output_shape(0)) == expected_results.shape diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_gather.py b/src/bindings/python/tests_compatibility/test_ngraph/test_gather.py deleted file mode 100644 index 903b82d1a91..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_gather.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np - - -def test_gather(): - input_data = ng.parameter((3, 3), name="input_data", dtype=np.float32) - input_indices = ng.parameter((1, 2), name="input_indices", dtype=np.int32) - input_axis = np.array([1], np.int32) - - node = ng.gather(input_data, input_indices, input_axis) - assert node.get_type_name() == "Gather" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 1, 2] - - -def test_gather_with_scalar_axis(): - input_data = ng.parameter((3, 3), name="input_data", dtype=np.float32) - input_indices = ng.parameter((1, 2), name="input_indices", dtype=np.int32) - input_axis = np.array(1, np.int32) - - node = ng.gather(input_data, input_indices, input_axis) - assert node.get_type_name() == "Gather" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 1, 2] - - -def test_gather_batch_dims_1(): - input_data = ng.parameter((2, 5), name="input_data", dtype=np.float32) - input_indices = ng.parameter((2, 3), name="input_indices", dtype=np.int32) - input_axis = np.array([1], np.int32) - batch_dims = 1 - - node = ng.gather(input_data, input_indices, input_axis, batch_dims) - assert node.get_type_name() == "Gather" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 3] - - -def test_gather_negative_indices(): - input_data = ng.parameter((3, 3), name="input_data", dtype=np.float32) - input_indices = ng.parameter((1, 2), name="input_indices", dtype=np.int32) - input_axis = np.array([1], np.int32) - - node = ng.gather(input_data, input_indices, input_axis) - assert node.get_type_name() == "Gather" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 1, 2] - - -def test_gather_batch_dims_1_negative_indices(): - input_data = ng.parameter((2, 5), name="input_data", dtype=np.float32) - input_indices = ng.parameter((2, 3), name="input_indices", dtype=np.int32) - input_axis = np.array([1], np.int32) - batch_dims = 1 - - node = ng.gather(input_data, input_indices, input_axis, batch_dims) - assert node.get_type_name() == "Gather" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 3] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_idft.py b/src/bindings/python/tests_compatibility/test_ngraph/test_idft.py deleted file mode 100644 index a700eff23f4..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_idft.py +++ /dev/null @@ -1,112 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import numpy as np - - -def get_data(): - np.random.seed(202104) - return np.random.uniform(0, 1, (2, 10, 10, 2)).astype(np.float32) - - -def test_idft_1d(): - expected_results = get_data() - complex_input_data = np.fft.fft(np.squeeze(expected_results.view(dtype=np.complex64), - axis=-1), axis=2).astype(np.complex64) - input_data = np.stack((complex_input_data.real, complex_input_data.imag), axis=-1) - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([2], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_2d(): - expected_results = get_data() - complex_input_data = np.fft.fft2(np.squeeze(expected_results.view(dtype=np.complex64), axis=-1), - axes=[1, 2]).astype(np.complex64) - input_data = np.stack((complex_input_data.real, complex_input_data.imag), axis=-1) - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([1, 2], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_3d(): - expected_results = get_data() - complex_input_data = np.fft.fft2(np.squeeze(expected_results.view(dtype=np.complex64), axis=-1), - axes=[0, 1, 2]).astype(np.complex64) - input_data = np.stack((complex_input_data.real, complex_input_data.imag), axis=-1) - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 1, 2], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_1d_signal_size(): - input_data = get_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([-2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([20], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes, input_signal_size) - np_results = np.fft.ifft(np.squeeze(input_data.view(dtype=np.complex64), axis=-1), n=20, - axis=-2).astype(np.complex64) - expected_results = np.stack((np_results.real, np_results.imag), axis=-1) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_2d_signal_size_1(): - input_data = get_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes, input_signal_size) - np_results = np.fft.ifft2(np.squeeze(input_data.view(dtype=np.complex64), axis=-1), s=[4, 5], - axes=[0, 2]).astype(np.complex64) - expected_results = np.stack((np_results.real, np_results.imag), axis=-1) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_2d_signal_size_2(): - input_data = get_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([1, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes, input_signal_size) - np_results = np.fft.ifft2(np.squeeze(input_data.view(dtype=np.complex64), axis=-1), s=[4, 5], - axes=[1, 2]).astype(np.complex64) - expected_results = np.stack((np_results.real, np_results.imag), axis=-1) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) - - -def test_idft_3d_signal_size(): - input_data = get_data() - input_tensor = ng.constant(input_data) - input_axes = ng.constant(np.array([0, 1, 2], dtype=np.int64)) - input_signal_size = ng.constant(np.array([4, 5, 16], dtype=np.int64)) - - dft_node = ng.idft(input_tensor, input_axes, input_signal_size) - np_results = np.fft.ifftn(np.squeeze(input_data.view(dtype=np.complex64), axis=-1), - s=[4, 5, 16], axes=[0, 1, 2]).astype(np.complex64) - expected_results = np.stack((np_results.real, np_results.imag), axis=-1) - assert dft_node.get_type_name() == "IDFT" - assert dft_node.get_output_size() == 1 - assert list(dft_node.get_output_shape(0)) == list(expected_results.shape) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_if.py b/src/bindings/python/tests_compatibility/test_ngraph/test_if.py deleted file mode 100644 index 5da6e8ec2c5..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_if.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -import pytest -import numpy as np -from ngraph.utils.tensor_iterator_types import ( - GraphBody, - TensorIteratorInvariantInputDesc, - TensorIteratorBodyOutputDesc, -) - - -def create_simple_if_with_two_outputs(condition_val): - condition = ng.constant(condition_val, dtype=bool) - - # then_body - X_t = ng.parameter([], np.float32, "X") - Y_t = ng.parameter([], np.float32, "Y") - Z_t = ng.parameter([], np.float32, "Z") - - add_t = ng.add(X_t, Y_t) - mul_t = ng.multiply(Y_t, Z_t) - then_body_res_1 = ng.result(add_t) - then_body_res_2 = ng.result(mul_t) - then_body = GraphBody([X_t, Y_t, Z_t], [then_body_res_1, then_body_res_2]) - then_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(2, 1), - TensorIteratorInvariantInputDesc(3, 2)] - then_body_outputs = [TensorIteratorBodyOutputDesc(0, 0), TensorIteratorBodyOutputDesc(1, 1)] - - # else_body - X_e = ng.parameter([], np.float32, "X") - Z_e = ng.parameter([], np.float32, "Z") - W_e = ng.parameter([], np.float32, "W") - - add_e = ng.add(X_e, W_e) - pow_e = ng.power(W_e, Z_e) - else_body_res_1 = ng.result(add_e) - else_body_res_2 = ng.result(pow_e) - else_body = GraphBody([X_e, Z_e, W_e], [else_body_res_1, else_body_res_2]) - else_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(3, 1), - TensorIteratorInvariantInputDesc(4, 2)] - else_body_outputs = [TensorIteratorBodyOutputDesc(0, 0), TensorIteratorBodyOutputDesc(1, 1)] - - X = ng.constant(15.0, dtype=np.float32) - Y = ng.constant(-5.0, dtype=np.float32) - Z = ng.constant(4.0, dtype=np.float32) - W = ng.constant(2.0, dtype=np.float32) - if_node = ng.if_op(condition, [X, Y, Z, W], (then_body, else_body), (then_body_inputs, else_body_inputs), - (then_body_outputs, else_body_outputs)) - return if_node - - -def create_diff_if_with_two_outputs(condition_val): - condition = ng.constant(condition_val, dtype=bool) - - # then_body - X_t = ng.parameter([2], np.float32, "X") - Y_t = ng.parameter([2], np.float32, "Y") - mmul_t = ng.matmul(X_t, Y_t, False, False) - mul_t = ng.multiply(Y_t, X_t) - then_body_res_1 = ng.result(mmul_t) - then_body_res_2 = ng.result(mul_t) - then_body = GraphBody([X_t, Y_t], [then_body_res_1, then_body_res_2]) - then_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(2, 1)] - then_body_outputs = [TensorIteratorBodyOutputDesc(0, 0), TensorIteratorBodyOutputDesc(1, 1)] - - # else_body - X_e = ng.parameter([2], np.float32, "X") - Z_e = ng.parameter([], np.float32, "Z") - mul_e = ng.multiply(X_e, Z_e) - else_body_res_1 = ng.result(Z_e) - else_body_res_2 = ng.result(mul_e) - else_body = GraphBody([X_e, Z_e], [else_body_res_1, else_body_res_2]) - else_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(3, 1)] - else_body_outputs = [TensorIteratorBodyOutputDesc(0, 0), TensorIteratorBodyOutputDesc(1, 1)] - - X = ng.constant([3, 4], dtype=np.float32) - Y = ng.constant([2, 1], dtype=np.float32) - Z = ng.constant(4.0, dtype=np.float32) - if_node = ng.if_op(condition, [X, Y, Z], (then_body, else_body), (then_body_inputs, else_body_inputs), - (then_body_outputs, else_body_outputs)) - return if_node - - -def simple_if(condition_val): - condition = ng.constant(condition_val, dtype=bool) - # then_body - X_t = ng.parameter([2], np.float32, "X") - Y_t = ng.parameter([2], np.float32, "Y") - - then_mul = ng.multiply(X_t, Y_t) - then_body_res_1 = ng.result(then_mul) - then_body = GraphBody([X_t, Y_t], [then_body_res_1]) - then_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(2, 1)] - then_body_outputs = [TensorIteratorBodyOutputDesc(0, 0)] - - # else_body - X_e = ng.parameter([2], np.float32, "X") - Y_e = ng.parameter([2], np.float32, "Y") - add_e = ng.add(X_e, Y_e) - else_body_res_1 = ng.result(add_e) - else_body = GraphBody([X_e, Y_e], [else_body_res_1]) - else_body_inputs = [TensorIteratorInvariantInputDesc(1, 0), TensorIteratorInvariantInputDesc(2, 1)] - else_body_outputs = [TensorIteratorBodyOutputDesc(0, 0)] - - X = ng.constant([3, 4], dtype=np.float32) - Y = ng.constant([2, 1], dtype=np.float32) - if_node = ng.if_op(condition, [X, Y], (then_body, else_body), (then_body_inputs, else_body_inputs), - (then_body_outputs, else_body_outputs)) - relu = ng.relu(if_node) - return relu - - -def simple_if_without_parameters(condition_val): - condition = ng.constant(condition_val, dtype=bool) - - # then_body - then_constant = ng.constant(0.7, dtype=np.float32) - then_body_res_1 = ng.result(then_constant) - then_body = GraphBody([], [then_body_res_1]) - then_body_inputs = [] - then_body_outputs = [TensorIteratorBodyOutputDesc(0, 0)] - - # else_body - else_const = ng.constant(9.0, dtype=np.float32) - else_body_res_1 = ng.result(else_const) - else_body = GraphBody([], [else_body_res_1]) - else_body_inputs = [] - else_body_outputs = [TensorIteratorBodyOutputDesc(0, 0)] - - if_node = ng.if_op(condition, [], (then_body, else_body), (then_body_inputs, else_body_inputs), - (then_body_outputs, else_body_outputs)) - relu = ng.relu(if_node) - return relu - - -def check_results(results, expected_results): - assert len(results) == len(expected_results) - for id_result, res in enumerate(results): - assert np.allclose(res, expected_results[id_result]) - - -def check_if(if_model, cond_val, exp_results): - last_node = if_model(cond_val) - assert last_node.get_type_name() == exp_results[0] - assert last_node.get_output_size() == exp_results[1] - assert list(last_node.get_output_shape(0)) == exp_results[2] - - -def test_if_with_two_outputs(): - check_if(create_simple_if_with_two_outputs, True, - ["If", 2, []]) - check_if(create_simple_if_with_two_outputs, False, - ["If", 2, []]) - - -def test_diff_if_with_two_outputs(): - check_if(create_diff_if_with_two_outputs, True, - ["If", 2, []]) - check_if(create_diff_if_with_two_outputs, False, - ["If", 2, []]) - - -@pytest.mark.xfail(reason="ngraph.exceptions.NgraphTypeError: ('Unidentified data type %s', dtype('O'))") -def test_simple_if(): - check_if(simple_if, True, ["Relu", 1, [2]]) - check_if(simple_if, False, ["Relu", 1, [2]]) - - -@pytest.mark.xfail(reason="ngraph.exceptions.NgraphTypeError: ('Unidentified data type %s', dtype('O'))") -def test_simple_if_without_body_parameters(): - check_if(simple_if_without_parameters, True, ["Relu", 1, []]) - check_if(simple_if_without_parameters, False, ["Relu", 1, []]) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_input_validation.py b/src/bindings/python/tests_compatibility/test_ngraph/test_input_validation.py deleted file mode 100644 index 43081b5b965..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_input_validation.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -from ngraph.exceptions import UserInputError -from ngraph.utils.input_validation import ( - _check_value, - check_valid_attribute, - check_valid_attributes, - is_non_negative_value, - is_positive_value, -) - - -@pytest.mark.parametrize("dtype", [np.int8, np.int16, np.int32, np.int64, np.float32, np.float64]) -def test_is_positive_value_signed_type(dtype): - assert is_positive_value(dtype(16)) - assert not is_positive_value(dtype(-16)) - - -@pytest.mark.parametrize("dtype", [np.uint8, np.uint16, np.uint32, np.uint64]) -def test_is_positive_value_unsigned_type(dtype): - assert is_positive_value(dtype(16)) - - -@pytest.mark.parametrize("dtype", [np.int8, np.int16, np.int32, np.int64, np.float32, np.float64]) -def test_is_non_negative_value_signed_type(dtype): - assert is_non_negative_value(dtype(16)) - assert is_non_negative_value(dtype(0)) - assert not is_non_negative_value(dtype(-1)) - assert not is_non_negative_value(dtype(-16)) - - -@pytest.mark.parametrize("dtype", [np.uint8, np.uint16, np.uint32, np.uint64]) -def test_is_non_negative_value_unsigned_type(dtype): - assert is_non_negative_value(dtype(16)) - assert is_non_negative_value(dtype(0)) - - -@pytest.mark.parametrize( - "value, val_type", - [ - (np.int8(64), np.integer), - (np.int16(64), np.integer), - (np.int32(64), np.integer), - (np.int64(64), np.integer), - (np.uint8(64), np.unsignedinteger), - (np.uint16(64), np.unsignedinteger), - (np.uint32(64), np.unsignedinteger), - (np.uint64(64), np.unsignedinteger), - (np.float32(64), np.floating), - (np.float64(64), np.floating), - ], -) -def test_check_value(value, val_type): - def is_even(x): - return x % 2 == 0 - - assert _check_value("TestOp", "test_attr", value, val_type, is_even) - - -@pytest.mark.parametrize( - "value, val_type", - [ - (np.int8(64), np.floating), - (np.int16(64), np.floating), - (np.int32(64), np.floating), - (np.int64(64), np.floating), - (np.uint8(64), np.floating), - (np.uint16(64), np.floating), - (np.uint32(64), np.floating), - (np.uint64(64), np.floating), - (np.float32(64), np.integer), - (np.float64(64), np.integer), - ], -) -def test_check_value_fail_type(value, val_type): - try: - _check_value("TestOp", "test_attr", value, val_type, None) - except UserInputError: - pass - else: - raise AssertionError("Type validation has unexpectedly passed.") - - -@pytest.mark.parametrize( - "value, val_type", - [ - (np.int8(61), np.integer), - (np.int16(61), np.integer), - (np.int32(61), np.integer), - (np.int64(61), np.integer), - (np.uint8(61), np.unsignedinteger), - (np.uint16(61), np.unsignedinteger), - (np.uint32(61), np.unsignedinteger), - (np.uint64(61), np.unsignedinteger), - (np.float32(61), np.floating), - (np.float64(61), np.floating), - ], -) -def test_check_value_fail_cond(value, val_type): - def is_even(x): - return x % 2 == 0 - - try: - _check_value("TestOp", "test_attr", value, val_type, is_even) - except UserInputError: - pass - else: - raise AssertionError("Condition validation has unexpectedly passed.") - - -def test_check_valid_attribute(): - attr_dict = { - "mode": "bilinear", - "coefficients": [1, 2, 3, 4, 5], - } - - assert check_valid_attribute("TestOp", attr_dict, "width", np.unsignedinteger, required=False) - assert check_valid_attribute("TestOp", attr_dict, "mode", np.str_, required=True) - assert check_valid_attribute("TestOp", attr_dict, "coefficients", np.integer, required=True) - - try: - check_valid_attribute("TestOp", attr_dict, "alpha", np.floating, required=True) - except UserInputError: - pass - else: - raise AssertionError("Validation of missing required attribute has unexpectedly passed.") - - -def test_check_valid_attributes(): - attr_dict = { - "mode": "bilinear", - "coefficients": [1, 2, 3, 4, 5], - } - - def _is_supported_mode(x): - return x in ["linear", "area", "cubic", "bilinear"] - - requirements = [ - ("width", False, np.unsignedinteger, None), - ("mode", True, np.str_, _is_supported_mode), - ("coefficients", True, np.integer, lambda x: x > 0), - ("alpha", False, np.float64, None), - ] - - assert check_valid_attributes("TestOp", attr_dict, requirements) - - requirements[3] = ("alpha", True, np.float64, None) - try: - check_valid_attributes("TestOp", attr_dict, requirements) - except UserInputError: - pass - else: - raise AssertionError("Validation of missing required attribute has unexpectedly passed.") diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_log_softmax.py b/src/bindings/python/tests_compatibility/test_ngraph/test_log_softmax.py deleted file mode 100644 index 13da8ec95d7..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_log_softmax.py +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import ngraph as ng -from ngraph.impl import Shape, Type - - -def test_log_softmax(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - - node = ng.log_softmax(data, 1) - assert node.get_type_name() == "LogSoftmax" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_manager.py b/src/bindings/python/tests_compatibility/test_ngraph/test_manager.py deleted file mode 100644 index d9c0010d5e9..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_manager.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# flake8: noqa - - -import numpy as np - -import ngraph as ng -from ngraph.impl import Function -from ngraph.impl.passes import Manager -from tests_compatibility.test_ngraph.util import count_ops_of_type - - -def test_constant_folding(): - node_constant = ng.constant(np.array([[0.0, 0.1, -0.1], [-2.5, 2.5, 3.0]], dtype=np.float32)) - node_ceil = ng.ceiling(node_constant) - func = Function(node_ceil, [], "TestFunction") - - assert count_ops_of_type(func, node_ceil) == 1 - assert count_ops_of_type(func, node_constant) == 1 - - pass_manager = Manager() - pass_manager.register_pass("ConstantFolding") - pass_manager.run_passes(func) - - assert count_ops_of_type(func, node_ceil) == 0 - assert count_ops_of_type(func, node_constant) == 1 - - new_const = func.get_results()[0].input(0).get_source_output().get_node() - - values_out = new_const.get_vector() - values_expected = [0.0, 1.0, 0.0, -2.0, 3.0, 3.0] - - assert np.allclose(values_out, values_expected) diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_node_factory.py b/src/bindings/python/tests_compatibility/test_ngraph/test_node_factory.py deleted file mode 100644 index c4b0c54e051..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_node_factory.py +++ /dev/null @@ -1,94 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import ngraph as ng -from ngraph.exceptions import UserInputError -from ngraph.utils.node_factory import NodeFactory -from _pyngraph import NodeFactory as _NodeFactory - - -def test_node_factory_add(): - shape = [2, 2] - dtype = np.int8 - parameter_a = ng.parameter(shape, dtype=dtype, name="A") - parameter_b = ng.parameter(shape, dtype=dtype, name="B") - - factory = _NodeFactory("opset1") - arguments = NodeFactory._arguments_as_outputs([parameter_a, parameter_b]) - node = factory.create("Add", arguments, {}) - - assert node.get_type_name() == "Add" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - - -def test_node_factory_wrapper_add(): - shape = [2, 2] - dtype = np.int8 - parameter_a = ng.parameter(shape, dtype=dtype, name="A") - parameter_b = ng.parameter(shape, dtype=dtype, name="B") - - node = ng.add(parameter_a, parameter_b, name="TestNode") - - assert node.get_type_name() == "Add" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - assert node.friendly_name == "TestNode" - - -def test_node_factory_topk(): - dtype = np.int32 - data = ng.parameter([2, 10], dtype=dtype, name="A") - k = ng.constant(3, dtype=dtype, name="B") - factory = _NodeFactory("opset1") - arguments = NodeFactory._arguments_as_outputs([data, k]) - node = factory.create( - "TopK", arguments, {"axis": 1, "mode": "max", "sort": "value"} - ) - attributes = node.get_attributes() - - assert node.get_type_name() == "TopK" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [2, 3] - assert attributes["axis"] == 1 - assert attributes["mode"] == "max" - assert attributes["sort"] == "value" - - -def test_node_factory_empty_topk(): - factory = NodeFactory("opset1") - node = factory.create("TopK") - - assert node.get_type_name() == "TopK" - - -def test_node_factory_empty_topk_with_args_and_attrs(): - dtype = np.int32 - data = ng.parameter([2, 10], dtype=dtype, name="A") - k = ng.constant(3, dtype=dtype, name="B") - factory = NodeFactory("opset1") - arguments = NodeFactory._arguments_as_outputs([data, k]) - node = factory.create("TopK", None, None) - node.set_arguments(arguments) - node.set_attribute("axis", 1) - node.set_attribute("mode", "max") - node.set_attribute("sort", "value") - node.validate() - - assert node.get_type_name() == "TopK" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [2, 3] - - -def test_node_factory_validate_missing_arguments(): - factory = NodeFactory("opset1") - - try: - factory.create( - "TopK", None, {"axis": 1, "mode": "max", "sort": "value"} - ) - except UserInputError: - pass - else: - raise AssertionError("Validation of missing arguments has unexpectedly passed.") diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_normalization.py b/src/bindings/python/tests_compatibility/test_ngraph/test_normalization.py deleted file mode 100644 index c231a1592d8..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_normalization.py +++ /dev/null @@ -1,71 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_lrn(): - input_image_shape = (2, 3, 2, 1) - input_image = np.arange(int(np.prod(input_image_shape))).reshape(input_image_shape).astype("f") - axes = np.array([1], dtype=np.int64) - model = ng.lrn(ng.constant(input_image), ng.constant(axes), alpha=1.0, beta=2.0, bias=1.0, size=3) - assert model.get_type_name() == "LRN" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 3, 2, 1] - assert model.get_output_element_type(0) == Type.f32 - - # Test LRN default parameter values - model = ng.lrn(ng.constant(input_image), ng.constant(axes)) - assert model.get_type_name() == "LRN" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 3, 2, 1] - assert model.get_output_element_type(0) == Type.f32 - - -def test_lrn_factory(): - alpha = 0.0002 - beta = 0.5 - bias = 2.0 - nsize = 3 - axis = np.array([1], dtype=np.int32) - inputs = ng.parameter((1, 2, 3, 4), name="inputs", dtype=np.float32) - node = ng.lrn(inputs, axis, alpha, beta, bias, nsize) - - assert node.get_type_name() == "LRN" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 2, 3, 4] - assert node.get_output_element_type(0) == Type.f32 - - -def test_batch_norm_inference(): - data = ng.parameter((2, 3), name="data", dtype=np.float32) - gamma = ng.parameter((3,), name="gamma", dtype=np.float32) - beta = ng.parameter((3,), name="beta", dtype=np.float32) - mean = ng.parameter((3,), name="mean", dtype=np.float32) - variance = ng.parameter((3,), name="variance", dtype=np.float32) - epsilon = 9.99e-06 - - node = ng.batch_norm_inference(data, gamma, beta, mean, variance, epsilon) - - assert node.get_type_name() == "BatchNormInference" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 3] - assert node.get_output_element_type(0) == Type.f32 - - -def test_mvn(): - data = ng.parameter((1, 3, 3, 3), name="data", dtype=np.float32) - axes = np.array([2, 3], dtype=np.int64) - epsilon = 1e-9 - normalize_variance = True - eps_mode = "outside_sqrt" - - node = ng.mvn(data, axes, normalize_variance, epsilon, eps_mode) - - assert node.get_type_name() == "MVN" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 3, 3, 3] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops.py deleted file mode 100644 index 0a470d87306..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops.py +++ /dev/null @@ -1,775 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -# flake8: noqa - -import numpy as np - -import ngraph as ng -from ngraph.impl import AxisSet, Shape, Type -from ngraph.impl.op import Constant, Parameter - - -def binary_op(op_str, a, b): - - if op_str == "+": - return a + b - elif op_str == "Add": - return ng.add(a, b) - elif op_str == "-": - return a - b - elif op_str == "Sub": - return ng.subtract(a, b) - elif op_str == "*": - return a * b - elif op_str == "Mul": - return ng.multiply(a, b) - elif op_str == "/": - return a / b - elif op_str == "Div": - return ng.divide(a, b) - elif op_str == "Equal": - return ng.equal(a, b) - elif op_str == "Greater": - return ng.greater(a, b) - elif op_str == "GreaterEq": - return ng.greater_equal(a, b) - elif op_str == "Less": - return ng.less(a, b) - elif op_str == "LessEq": - return ng.less_equal(a, b) - elif op_str == "Maximum": - return ng.maximum(a, b) - elif op_str == "Minimum": - return ng.minimum(a, b) - elif op_str == "NotEqual": - return ng.not_equal(a, b) - elif op_str == "Power": - return ng.power(a, b) - - -def binary_op_ref(op_str, a, b): - - if op_str == "+" or op_str == "Add": - return a + b - elif op_str == "-" or op_str == "Sub": - return a - b - elif op_str == "*" or op_str == "Mul": - return a * b - elif op_str == "/" or op_str == "Div": - return a / b - elif op_str == "Dot": - return np.dot(a, b) - elif op_str == "Equal": - return np.equal(a, b) - elif op_str == "Greater": - return np.greater(a, b) - elif op_str == "GreaterEq": - return np.greater_equal(a, b) - elif op_str == "Less": - return np.less(a, b) - elif op_str == "LessEq": - return np.less_equal(a, b) - elif op_str == "Maximum": - return np.maximum(a, b) - elif op_str == "Minimum": - return np.minimum(a, b) - elif op_str == "NotEqual": - return np.not_equal(a, b) - elif op_str == "Power": - return np.power(a, b) - - -def binary_op_exec(op_str, expected_ov_str=None): - if not expected_ov_str: - expected_ov_str = op_str - - element_type = Type.f32 - shape = Shape([2, 2]) - A = Parameter(element_type, shape) - B = Parameter(element_type, shape) - - node = binary_op(op_str, A, B) - - assert node.get_type_name() == expected_ov_str - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - assert node.get_output_element_type(0) == Type.f32 - - -def binary_op_comparison(op_str, expected_ov_str=None): - if not expected_ov_str: - expected_ov_str = op_str - - element_type = Type.f32 - shape = Shape([2, 2]) - A = Parameter(element_type, shape) - B = Parameter(element_type, shape) - - node = binary_op(op_str, A, B) - - assert node.get_type_name() == expected_ov_str - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 2] - assert node.get_output_element_type(0) == Type.boolean - - -def test_add(): - binary_op_exec("+", "Add") - - -def test_add_op(): - binary_op_exec("Add") - - -def test_sub(): - binary_op_exec("-", "Subtract") - - -def test_sub_op(): - binary_op_exec("Sub", "Subtract") - - -def test_mul(): - binary_op_exec("*", "Multiply") - - -def test_mul_op(): - binary_op_exec("Mul", "Multiply") - - -def test_div(): - binary_op_exec("/", "Divide") - - -def test_div_op(): - binary_op_exec("Div", "Divide") - - -def test_maximum(): - binary_op_exec("Maximum") - - -def test_minimum(): - binary_op_exec("Minimum") - - -def test_power(): - binary_op_exec("Power") - - -def test_greater(): - binary_op_comparison("Greater") - - -def test_greater_eq(): - binary_op_comparison("GreaterEq", "GreaterEqual") - - -def test_less(): - binary_op_comparison("Less") - - -def test_less_eq(): - binary_op_comparison("LessEq", "LessEqual") - - -def test_not_equal(): - binary_op_comparison("NotEqual") - - -def test_add_with_mul(): - - element_type = Type.f32 - shape = Shape([4]) - A = Parameter(element_type, shape) - B = Parameter(element_type, shape) - C = Parameter(element_type, shape) - node = ng.multiply(ng.add(A, B), C) - - assert node.get_type_name() == "Multiply" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [4] - assert node.get_output_element_type(0) == Type.f32 - - -def unary_op(op_str, a): - if op_str == "Abs": - return ng.abs(a) - elif op_str == "Acos": - return ng.acos(a) - elif op_str == "Acosh": - return ng.acosh(a) - elif op_str == "Asin": - return ng.asin(a) - elif op_str == "Asinh": - return ng.asinh(a) - elif op_str == "Atan": - return ng.atan(a) - elif op_str == "Atanh": - return ng.atanh(a) - elif op_str == "Ceiling": - return ng.ceiling(a) - elif op_str == "Cos": - return ng.cos(a) - elif op_str == "Cosh": - return ng.cosh(a) - elif op_str == "Floor": - return ng.floor(a) - elif op_str == "log": - return ng.log(a) - elif op_str == "exp": - return ng.exp(a) - elif op_str == "negative": - return ng.negative(a) - elif op_str == "Sign": - return ng.sign(a) - elif op_str == "Sin": - return ng.sin(a) - elif op_str == "Sinh": - return ng.sinh(a) - elif op_str == "Sqrt": - return ng.sqrt(a) - elif op_str == "Tan": - return ng.tan(a) - elif op_str == "Tanh": - return ng.tanh(a) - - -def unary_op_ref(op_str, a): - if op_str == "Abs": - return np.abs(a) - elif op_str == "Acos": - return np.arccos(a) - elif op_str == "Acosh": - return np.arccosh(a) - elif op_str == "Asin": - return np.arcsin(a) - elif op_str == "Asinh": - return np.arcsinh(a) - elif op_str == "Atan": - return np.arctan(a) - elif op_str == "Atanh": - return np.arctanh(a) - elif op_str == "Ceiling": - return np.ceil(a) - elif op_str == "Cos": - return np.cos(a) - elif op_str == "Cosh": - return np.cosh(a) - elif op_str == "Floor": - return np.floor(a) - elif op_str == "log": - return np.log(a) - elif op_str == "exp": - return np.exp(a) - elif op_str == "negative": - return np.negative(a) - elif op_str == "Reverse": - return np.fliplr(a) - elif op_str == "Sign": - return np.sign(a) - elif op_str == "Sin": - return np.sin(a) - elif op_str == "Sinh": - return np.sinh(a) - elif op_str == "Sqrt": - return np.sqrt(a) - elif op_str == "Tan": - return np.tan(a) - elif op_str == "Tanh": - return np.tanh(a) - - -def unary_op_exec(op_str, input_list, expected_ov_str=None): - """ - input_list needs to have deep length of 4 - """ - if not expected_ov_str: - expected_ov_str = op_str - element_type = Type.f32 - shape = Shape(np.array(input_list).shape) - A = Parameter(element_type, shape) - node = unary_op(op_str, A) - - assert node.get_type_name() == expected_ov_str - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == list(shape) - assert node.get_output_element_type(0) == Type.f32 - - -def test_abs(): - input_list = [-1, 0, 1, 2] - op_str = "Abs" - unary_op_exec(op_str, input_list) - - -def test_acos(): - input_list = [-1, 0, 0.5, 1] - op_str = "Acos" - unary_op_exec(op_str, input_list) - - -def test_acosh(): - input_list = [2., 3., 1.5, 1.0] - op_str = "Acosh" - unary_op_exec(op_str, input_list) - - -def test_asin(): - input_list = [-1, 0, 0.5, 1] - op_str = "Asin" - unary_op_exec(op_str, input_list) - - -def test_asinh(): - input_list = [-1, 0, 0.5, 1] - op_str = "Asinh" - unary_op_exec(op_str, input_list) - - -def test_atan(): - input_list = [-1, 0, 0.5, 1] - op_str = "Atan" - unary_op_exec(op_str, input_list) - - -def test_atanh(): - input_list = [-1, 0, 0.5, 1] - op_str = "Atanh" - unary_op_exec(op_str, input_list) - - -def test_ceiling(): - input_list = [0.5, 0, 0.4, 0.5] - op_str = "Ceiling" - unary_op_exec(op_str, input_list) - - -def test_cos(): - input_list = [0, 0.7, 1.7, 3.4] - op_str = "Cos" - unary_op_exec(op_str, input_list) - - -def test_cosh(): - input_list = [-1, 0.0, 0.5, 1] - op_str = "Cosh" - unary_op_exec(op_str, input_list) - - -def test_floor(): - input_list = [-0.5, 0, 0.4, 0.5] - op_str = "Floor" - unary_op_exec(op_str, input_list) - - -def test_log(): - input_list = [1, 2, 3, 4] - op_str = "log" - unary_op_exec(op_str, input_list, "Log") - - -def test_exp(): - input_list = [-1, 0, 1, 2] - op_str = "exp" - unary_op_exec(op_str, input_list, "Exp") - - -def test_negative(): - input_list = [-1, 0, 1, 2] - op_str = "negative" - unary_op_exec(op_str, input_list, "Negative") - - -def test_sign(): - input_list = [-1, 0, 0.5, 1] - op_str = "Sign" - unary_op_exec(op_str, input_list) - - -def test_sin(): - input_list = [0, 0.7, 1.7, 3.4] - op_str = "Sin" - unary_op_exec(op_str, input_list) - - -def test_sinh(): - input_list = [-1, 0.0, 0.5, 1] - op_str = "Sinh" - unary_op_exec(op_str, input_list) - - -def test_sqrt(): - input_list = [0.0, 0.5, 1, 2] - op_str = "Sqrt" - unary_op_exec(op_str, input_list) - - -def test_tan(): - input_list = [-np.pi / 4, 0, np.pi / 8, np.pi / 8] - op_str = "Tan" - unary_op_exec(op_str, input_list) - - -def test_tanh(): - input_list = [-1, 0, 0.5, 1] - op_str = "Tanh" - unary_op_exec(op_str, input_list) - - -def test_reshape(): - - element_type = Type.f32 - shape = Shape([2, 3]) - A = Parameter(element_type, shape) - node = ng.reshape(A, Shape([3, 2]), special_zero=False) - - assert node.get_type_name() == "Reshape" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 2] - assert node.get_output_element_type(0) == element_type - - -def test_broadcast(): - - element_type = Type.f32 - A = Parameter(element_type, Shape([3])) - node = ng.broadcast(A, [3, 3]) - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 3] - assert node.get_output_element_type(0) == element_type - - -def test_constant(): - element_type = Type.f32 - node = Constant(element_type, Shape([3, 3]), list(range(9))) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 3] - assert node.get_output_element_type(0) == element_type - - -def test_concat(): - - element_type = Type.f32 - node = Constant(element_type, Shape([3, 3]), list(range(9))) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 3] - assert node.get_output_element_type(0) == element_type - - -def test_axisset(): - - set_axisset = AxisSet({1, 2, 3}) - list_axisset = AxisSet([1, 2, 3]) - tuple_axisset = AxisSet((1, 2, 3)) - - assert len(set_axisset) == 3 - assert set(set_axisset) == {1, 2, 3} - - assert len(list_axisset) == 3 - assert set(list_axisset) == set(set_axisset) - - assert len(tuple_axisset) == 3 - assert set(tuple_axisset) == set(set_axisset) - - -def test_select(): - element_type = Type.f32 - A = Parameter(Type.boolean, Shape([1, 2])) - B = Parameter(element_type, Shape([1, 2])) - C = Parameter(element_type, Shape([1, 2])) - node = ng.select(A, B, C) - assert node.get_type_name() == "Select" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [1, 2] - assert node.get_output_element_type(0) == element_type - - -def test_max_pool_1d(): - element_type = Type.f32 - shape = Shape([1, 1, 10]) - window_shape = [3] - A = Parameter(element_type, shape) - - strides = [1] * len(window_shape) - dilations = [1] * len(window_shape) - pads_begin = [0] * len(window_shape) - pads_end = [0] * len(window_shape) - rounding_type = "floor" - auto_pad = "explicit" - idx_elem_type = "i32" - - model = ng.max_pool( - A, - strides, - dilations, - pads_begin, - pads_end, - window_shape, - rounding_type, - auto_pad, - idx_elem_type, - ) - assert model.get_type_name() == "MaxPool" - assert model.get_output_size() == 2 - assert list(model.get_output_shape(0)) == [1, 1, 8] - assert list(model.get_output_shape(1)) == [1, 1, 8] - assert model.get_output_element_type(0) == element_type - assert model.get_output_element_type(1) == Type.i32 - - -def test_max_pool_1d_with_strides(): - element_type = Type.f32 - shape = Shape([1, 1, 10]) - A = Parameter(element_type, shape) - window_shape = [3] - strides = [2] - pads_begin = [0] * len(window_shape) - dilations = [1] * len(window_shape) - pads_end = [0] * len(window_shape) - rounding_type = "floor" - auto_pad = "explicit" - idx_elem_type = "i32" - - model = ng.max_pool( - A, - strides, - dilations, - pads_begin, - pads_end, - window_shape, - rounding_type, - auto_pad, - idx_elem_type, - ) - assert model.get_type_name() == "MaxPool" - assert model.get_output_size() == 2 - assert list(model.get_output_shape(0)) == [1, 1, 4] - assert list(model.get_output_shape(1)) == [1, 1, 4] - assert model.get_output_element_type(0) == element_type - assert model.get_output_element_type(1) == Type.i32 - - -def test_max_pool_2d(): - element_type = Type.f32 - shape = Shape([1, 1, 10, 10]) - A = Parameter(element_type, shape) - parameter_list = [A] - - input_arr = np.arange(100, dtype=np.float32).reshape(1, 1, 10, 10) - window_shape = [3, 3] - rounding_type = "floor" - auto_pad = "explicit" - idx_elem_type = "i32" - - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - - model = ng.max_pool( - A, - strides, - dilations, - pads_begin, - pads_end, - window_shape, - rounding_type, - auto_pad, - idx_elem_type, - ) - assert model.get_type_name() == "MaxPool" - assert model.get_output_size() == 2 - assert list(model.get_output_shape(0)) == [1, 1, 8, 8] - assert list(model.get_output_shape(1)) == [1, 1, 8, 8] - assert model.get_output_element_type(0) == element_type - assert model.get_output_element_type(1) == Type.i32 - - -def test_max_pool_2d_with_strides(): - element_type = Type.f32 - shape = Shape([1, 1, 10, 10]) - A = Parameter(element_type, shape) - strides = [2, 2] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - window_shape = [3, 3] - rounding_type = "floor" - auto_pad = "explicit" - idx_elem_type = "i32" - - model = ng.max_pool( - A, - strides, - dilations, - pads_begin, - pads_end, - window_shape, - rounding_type, - auto_pad, - idx_elem_type, - ) - assert model.get_type_name() == "MaxPool" - assert model.get_output_size() == 2 - assert list(model.get_output_shape(0)) == [1, 1, 4, 4] - assert list(model.get_output_shape(1)) == [1, 1, 4, 4] - assert model.get_output_element_type(0) == element_type - assert model.get_output_element_type(1) == Type.i32 - - -def convolution2d( - image, - filterit, - strides=(1, 1), - dilation=(1, 1), - padding_below=(0, 0), - padding_above=(0, 0), - data_dilation=(1, 1), -): - def dilate(arr, dil=(1, 1)): - m, n = arr.shape - new_m, new_n = (m - 1) * dil[0] + 1, (n - 1) * dil[1] + 1 - new_arr = np.zeros(new_m * new_n, dtype=np.float32).reshape(new_m, new_n) - for i in range(m): - for j in range(n): - new_arr[dil[0] * i][dil[1] * j] = arr[i][j] - return new_arr - - i_m, i_n = image.shape - new_image = np.zeros( - (i_m + padding_below[0] + padding_above[0]) * (i_n + padding_below[1] + padding_above[1]), - dtype=np.float32, - ).reshape(i_m + padding_below[0] + padding_above[0], i_n + padding_below[1] + padding_above[1]) - new_image[padding_below[0] : padding_below[0] + i_m, padding_below[1] : padding_below[1] + i_n] = image - image = new_image - image = image if data_dilation[0] == data_dilation[1] == 1 else dilate(image, data_dilation) - i_m, i_n = image.shape - - filterit = filterit if dilation[0] == dilation[1] == 1 else dilate(filterit, dilation) - f_m, f_n = filterit.shape - - # result_shape - r_m = i_m - f_m + 1 - r_n = i_n - f_n + 1 - r_m //= strides[0] - r_n //= strides[1] - - result = np.zeros(r_m * r_n, dtype=np.float32).reshape(r_m, r_n) - - for i in range(r_m): - for j in range(r_n): - sub_m = image[i * strides[0] : i * strides[0] + f_m, j * strides[1] : j * strides[1] + f_n] - result[i][j] = np.sum(sub_m * filterit) - return result - - -def test_convolution_simple(): - - element_type = Type.f32 - image_shape = Shape([1, 1, 16, 16]) - filter_shape = Shape([1, 1, 3, 3]) - data = Parameter(element_type, image_shape) - filters = Parameter(element_type, filter_shape) - filter_arr = np.ones(9, dtype=np.float32).reshape(1, 1, 3, 3) - filter_arr[0][0][0][0] = -1 - filter_arr[0][0][1][1] = -1 - filter_arr[0][0][2][2] = -1 - filter_arr[0][0][0][2] = -1 - filter_arr[0][0][2][0] = -1 - - strides = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - dilations = [1, 1] - - model = ng.convolution(data, filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "Convolution" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 14, 14] - assert model.get_output_element_type(0) == element_type - - -def test_convolution_with_strides(): - - element_type = Type.f32 - image_shape = Shape([1, 1, 10, 10]) - filter_shape = Shape([1, 1, 3, 3]) - data = Parameter(element_type, image_shape) - filters = Parameter(element_type, filter_shape) - filter_arr = np.zeros(9, dtype=np.float32).reshape([1, 1, 3, 3]) - filter_arr[0][0][1][1] = 1 - strides = [2, 2] - pads_begin = [0, 0] - pads_end = [0, 0] - dilations = [1, 1] - - model = ng.convolution(data, filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "Convolution" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 4, 4] - assert model.get_output_element_type(0) == element_type - - -def test_convolution_with_filter_dilation(): - - element_type = Type.f32 - image_shape = Shape([1, 1, 10, 10]) - filter_shape = Shape([1, 1, 3, 3]) - data = Parameter(element_type, image_shape) - filters = Parameter(element_type, filter_shape) - strides = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - dilations = [2, 2] - - model = ng.convolution(data, filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "Convolution" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 6, 6] - assert model.get_output_element_type(0) == element_type - - -def test_convolution_with_padding(): - - element_type = Type.f32 - image_shape = Shape([1, 1, 10, 10]) - filter_shape = Shape([1, 1, 3, 3]) - data = Parameter(element_type, image_shape) - filters = Parameter(element_type, filter_shape) - filter_arr = np.zeros(9, dtype=np.float32).reshape(1, 1, 3, 3) - filter_arr[0][0][1][1] = 1 - strides = [1, 1] - dilations = [2, 2] - pads_begin = [0, 0] - pads_end = [0, 0] - - model = ng.convolution(data, filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "Convolution" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 6, 6] - assert model.get_output_element_type(0) == element_type - - -def test_convolution_with_non_zero_padding(): - element_type = Type.f32 - image_shape = Shape([1, 1, 10, 10]) - filter_shape = Shape([1, 1, 3, 3]) - data = Parameter(element_type, image_shape) - filters = Parameter(element_type, filter_shape) - filter_arr = (np.ones(9, dtype=np.float32).reshape(1, 1, 3, 3)) * -1 - filter_arr[0][0][1][1] = 1 - strides = [1, 1] - dilations = [2, 2] - pads_begin = [2, 1] - pads_end = [1, 2] - - model = ng.convolution(data, filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "Convolution" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 9, 9] - assert model.get_output_element_type(0) == element_type diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_binary.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_binary.py deleted file mode 100644 index d18376ddc61..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_binary.py +++ /dev/null @@ -1,179 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import operator - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type - - -@pytest.mark.parametrize( - ("ng_api_helper", "expected_type"), - [ - (ng.add, Type.f32), - (ng.divide, Type.f32), - (ng.multiply, Type.f32), - (ng.subtract, Type.f32), - (ng.minimum, Type.f32), - (ng.maximum, Type.f32), - (ng.mod, Type.f32), - (ng.equal, Type.boolean), - (ng.not_equal, Type.boolean), - (ng.greater, Type.boolean), - (ng.greater_equal, Type.boolean), - (ng.less, Type.boolean), - (ng.less_equal, Type.boolean), - ], -) -def test_binary_op(ng_api_helper, expected_type): - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=np.float32) - parameter_b = ng.parameter(shape, name="B", dtype=np.float32) - - model = ng_api_helper(parameter_a, parameter_b) - - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == expected_type - - -@pytest.mark.parametrize( - ("ng_api_helper", "expected_type"), - [ - (ng.add, Type.f32), - (ng.divide, Type.f32), - (ng.multiply, Type.f32), - (ng.subtract, Type.f32), - (ng.minimum, Type.f32), - (ng.maximum, Type.f32), - (ng.mod, Type.f32), - (ng.equal, Type.boolean), - (ng.not_equal, Type.boolean), - (ng.greater, Type.boolean), - (ng.greater_equal, Type.boolean), - (ng.less, Type.boolean), - (ng.less_equal, Type.boolean), - ], -) -def test_binary_op(ng_api_helper, expected_type): - value_b = np.array([[5, 6], [7, 8]], dtype=np.float32) - - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=np.float32) - - model = ng_api_helper(parameter_a, value_b) - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == expected_type - - -@pytest.mark.parametrize( - "ng_api_helper", - [ng.logical_and, ng.logical_or, ng.logical_xor], -) -def test_binary_logical_op_parameter_inputs(ng_api_helper): - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=bool) - parameter_b = ng.parameter(shape, name="B", dtype=bool) - - model = ng_api_helper(parameter_a, parameter_b) - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.boolean - - -@pytest.mark.parametrize( - "ng_api_helper", - [ng.logical_and, ng.logical_or, ng.logical_xor], -) -def test_binary_logical_numpy_input(ng_api_helper): - value_b = np.array([[False, True], [False, True]], dtype=bool) - - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=bool) - - model = ng_api_helper(parameter_a, value_b) - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.boolean - - -@pytest.mark.parametrize( - ("operator", "expected_type"), - [ - (operator.add, Type.f32), - (operator.sub, Type.f32), - (operator.mul, Type.f32), - (operator.truediv, Type.f32), - (operator.eq, Type.boolean), - (operator.ne, Type.boolean), - (operator.gt, Type.boolean), - (operator.ge, Type.boolean), - (operator.lt, Type.boolean), - (operator.le, Type.boolean), - ], -) -def test_binary_operators(operator, expected_type): - value_b = np.array([[4, 5], [1, 7]], dtype=np.float32) - - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=np.float32) - - model = operator(parameter_a, value_b) - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == expected_type - - -@pytest.mark.parametrize( - ("operator", "expected_type"), - [ - (operator.add, Type.f32), - (operator.sub, Type.f32), - (operator.mul, Type.f32), - (operator.truediv, Type.f32), - (operator.eq, Type.boolean), - (operator.ne, Type.boolean), - (operator.gt, Type.boolean), - (operator.ge, Type.boolean), - (operator.lt, Type.boolean), - (operator.le, Type.boolean), - ], -) -def test_binary_operators_with_scalar(operator, expected_type): - value_b = np.array(3, dtype=np.float32) - - shape = [2, 2] - parameter_a = ng.parameter(shape, name="A", dtype=np.float32) - - model = operator(parameter_a, value_b) - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == expected_type - - -def test_multiply(): - A = np.arange(48, dtype=np.int32).reshape((8, 1, 6, 1)) - B = np.arange(35, dtype=np.int32).reshape((7, 1, 5)) - - node = ng.multiply(A, B) - - assert node.get_type_name() == "Multiply" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [8, 7, 6, 5] - assert node.get_output_element_type(0) == Type.i32 - - -def test_power_v1(): - A = np.arange(48, dtype=np.float32).reshape((8, 1, 6, 1)) - B = np.arange(20, dtype=np.float32).reshape((4, 1, 5)) - - node = ng.power(A, B) - - assert node.get_type_name() == "Power" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [8, 4, 6, 5] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_fused.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_fused.py deleted file mode 100644 index 4cd2bbcba2f..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_fused.py +++ /dev/null @@ -1,362 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_elu_operator_with_scalar_and_array(): - data_value = ng.parameter((2, 2), name="data_value", dtype=np.float32) - alpha_value = np.float32(3) - - model = ng.elu(data_value, alpha_value) - assert model.get_type_name() == "Elu" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.f32 - - -def test_elu_operator_with_scalar(): - parameter_data = ng.parameter([2, 2], name="Data", dtype=np.float32) - alpha_value = np.float32(3) - - data_shape = [2, 2] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.elu(parameter_data, alpha_value) - assert model.get_type_name() == "Elu" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.f32 - - -def test_fake_quantize(): - levels = np.int32(4) - - data_shape = [1, 2, 3, 4] - bound_shape = [] - parameter_data = ng.parameter(data_shape, name="data", dtype=np.float32) - parameter_input_low = ng.parameter(bound_shape, name="input_low", dtype=np.float32) - parameter_input_high = ng.parameter(bound_shape, name="input_high", dtype=np.float32) - parameter_output_low = ng.parameter(bound_shape, name="output_low", dtype=np.float32) - parameter_output_high = ng.parameter(bound_shape, name="output_high", dtype=np.float32) - - model = ng.fake_quantize( - parameter_data, - parameter_input_low, - parameter_input_high, - parameter_output_low, - parameter_output_high, - levels, - ) - assert model.get_type_name() == "FakeQuantize" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 2, 3, 4] - assert model.get_output_element_type(0) == Type.f32 - - -def test_depth_to_space(): - data_shape = [1, 4, 2, 3] - mode = "blocks_first" - block_size = np.int32(2) - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.depth_to_space(parameter_data, mode, block_size) - assert model.get_type_name() == "DepthToSpace" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 1, 4, 6] - assert model.get_output_element_type(0) == Type.f32 - - -def test_space_to_batch(): - data_value = np.array([[[[0, 1, 2], [3, 4, 5]], [[6, 7, 8], [9, 10, 11]]]], dtype=np.float32) - data_shape = [1, 2, 2, 3] - data_shape = data_value.shape - - block_shape = np.array([1, 2, 3, 2], dtype=np.int64) - pads_begin = np.array([0, 0, 1, 0], dtype=np.int64) - pads_end = np.array([0, 0, 0, 1], dtype=np.int64) - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.space_to_batch(parameter_data, block_shape, pads_begin, pads_end) - assert model.get_type_name() == "SpaceToBatch" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [12, 1, 1, 2] - assert model.get_output_element_type(0) == Type.f32 - - -def test_batch_to_space(): - data_shape = [12, 1, 1, 2] - - block_shape = np.array([1, 2, 3, 2], dtype=np.int64) - crops_begin = np.array([0, 0, 1, 0], dtype=np.int64) - crops_end = np.array([0, 0, 0, 1], dtype=np.int64) - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.batch_to_space(parameter_data, block_shape, crops_begin, crops_end) - assert model.get_type_name() == "BatchToSpace" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 2, 2, 3] - assert model.get_output_element_type(0) == Type.f32 - - -def test_clamp_operator(): - data_shape = [2, 2] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - min_value = np.float32(3) - max_value = np.float32(12) - - model = ng.clamp(parameter_data, min_value, max_value) - assert model.get_type_name() == "Clamp" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.f32 - - -def test_clamp_operator_with_array(): - data_value = np.array([[-5, 9], [45, 3]], dtype=np.float32) - min_value = np.float32(3) - max_value = np.float32(12) - - model = ng.clamp(data_value, min_value, max_value) - assert model.get_type_name() == "Clamp" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [2, 2] - assert model.get_output_element_type(0) == Type.f32 - - -def test_squeeze_operator(): - data_shape = [1, 2, 1, 3, 1, 1] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - axes = [2, 4] - model = ng.squeeze(parameter_data, axes) - assert model.get_type_name() == "Squeeze" - assert model.get_output_size() == 1 - assert list(model.get_output_shape(0)) == [1, 2, 3, 1] - assert model.get_output_element_type(0) == Type.f32 - - -def test_squared_difference_operator(): - x1_shape = [1, 2, 3, 4] - x2_shape = [2, 3, 4] - - parameter_x1 = ng.parameter(x1_shape, name="x1", dtype=np.float32) - parameter_x2 = ng.parameter(x2_shape, name="x2", dtype=np.float32) - - model = ng.squared_difference(parameter_x1, parameter_x2) - assert model.get_type_name() == "SquaredDifference" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 2, 3, 4] - - -def test_shuffle_channels_operator(): - data_shape = [1, 15, 2, 2] - axis = 1 - groups = 5 - - parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.shuffle_channels(parameter, axis, groups) - assert model.get_type_name() == "ShuffleChannels" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 15, 2, 2] - - -def test_unsqueeze(): - - data_shape = [3, 4, 5] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - axes = [0, 4] - model = ng.unsqueeze(parameter_data, axes) - assert model.get_type_name() == "Unsqueeze" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 3, 4, 5, 1] - - -def test_grn_operator(): - bias = np.float32(1e-6) - - data_shape = [1, 2, 3, 4] - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.grn(parameter_data, bias) - assert model.get_type_name() == "GRN" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == data_shape - - -def test_prelu_operator(): - data_shape = [1, 2, 3, 4] - slope_shape = [2, 3, 1] - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - parameter_slope = ng.parameter(slope_shape, name="Slope", dtype=np.float32) - - model = ng.prelu(parameter_data, parameter_slope) - assert model.get_type_name() == "PRelu" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 2, 3, 4] - - -def test_selu_operator(): - data_shape = [4, 2, 3, 1] - - alpha = np.array(1.6733, dtype=np.float32) - lambda_value = np.array(1.0507, dtype=np.float32) - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - model = ng.selu(parameter_data, alpha, lambda_value) - assert model.get_type_name() == "Selu" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [4, 2, 3, 1] - - -def test_hard_sigmoid_operator(): - data_shape = [3] - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - parameter_alpha = ng.parameter([], name="Alpha", dtype=np.float32) - parameter_beta = ng.parameter([], name="Beta", dtype=np.float32) - - model = ng.hard_sigmoid(parameter_data, parameter_alpha, parameter_beta) - assert model.get_type_name() == "HardSigmoid" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [3] - - -def test_mvn_operator(): - data_shape = [3, 3, 3, 1] - axes = [0, 2, 3] - normalize_variance = True - eps = np.float32(1e-9) - eps_mode = "outside_sqrt" - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.mvn(parameter_data, axes, normalize_variance, eps, eps_mode) - assert model.get_type_name() == "MVN" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == data_shape - - -def test_space_to_depth_operator(): - data_shape = [1, 2, 4, 4] - mode = "blocks_first" - block_size = 2 - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.space_to_depth(parameter_data, mode, block_size) - assert model.get_type_name() == "SpaceToDepth" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 8, 2, 2] - - batch_size = 2 - input_size = 3 - hidden_size = 3 - - X_shape = [batch_size, input_size] - H_t_shape = [batch_size, hidden_size] - W_shape = [hidden_size, input_size] - R_shape = [hidden_size, hidden_size] - B_shape = [hidden_size] - - parameter_X = ng.parameter(X_shape, name="X", dtype=np.float32) - parameter_H_t = ng.parameter(H_t_shape, name="H_t", dtype=np.float32) - parameter_W = ng.parameter(W_shape, name="W", dtype=np.float32) - parameter_R = ng.parameter(R_shape, name="R", dtype=np.float32) - parameter_B = ng.parameter(B_shape, name="B", dtype=np.float32) - - activations = ["sigmoid"] - activation_alpha = [] - activation_beta = [] - clip = 2.88 - - model = ng.rnn_cell( - parameter_X, - parameter_H_t, - parameter_W, - parameter_R, - parameter_B, - hidden_size, - activations, - activation_alpha, - activation_beta, - clip, - ) - assert model.get_type_name() == "RNNCell" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [batch_size, hidden_size] - - -def test_group_convolution_operator(): - data_shape = [1, 4, 2, 2] - filters_shape = [2, 1, 2, 1, 1] - - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - parameter_filters = ng.parameter(filters_shape, name="Filters", dtype=np.float32) - - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - - model = ng.group_convolution(parameter_data, parameter_filters, strides, pads_begin, pads_end, dilations) - assert model.get_type_name() == "GroupConvolution" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 2, 2, 2] - - -def test_group_convolution_backprop_data(): - data_shape = [1, 1, 3, 3] - filters_shape = [1, 1, 1, 3, 3] - strides = [2, 2] - output_padding = [1, 1] - pads_begin = [1, 1] - pads_end = [1, 1] - - data_node = ng.parameter(data_shape, name="Data", dtype=np.float32) - filters_node = ng.parameter(filters_shape, name="Filters", dtype=np.float32) - model = ng.group_convolution_backprop_data( - data_node, filters_node, strides, None, pads_begin, pads_end, output_padding=output_padding - ) - - assert model.get_type_name() == "GroupConvolutionBackpropData" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 1, 6, 6] - - -def test_group_convolution_backprop_data_output_shape(): - data_shape = [1, 1, 1, 10] - filters_shape = [1, 1, 1, 1, 5] - strides = [1, 1] - - data_node = ng.parameter(data_shape, name="Data", dtype=np.float32) - filters_node = ng.parameter(filters_shape, name="Filters", dtype=np.float32) - output_shape_node = ng.constant(np.array([1, 14], dtype=np.int64)) - - model = ng.group_convolution_backprop_data( - data_node, filters_node, strides, output_shape_node, auto_pad="same_upper" - ) - assert model.get_type_name() == "GroupConvolutionBackpropData" - assert model.get_output_size() == 1 - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [1, 1, 1, 14] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_matmul.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_matmul.py deleted file mode 100644 index 1d9ce2b5837..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_matmul.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type - - -@pytest.mark.parametrize( - ("shape_a", "shape_b", "transpose_a", "transpose_b", "expected_shape"), - [ - # matrix, vector - ([2, 4], [4], False, False, [2]), - ([4], [4, 2], False, False, [2]), - # matrix, matrix - ([2, 4], [4, 2], False, False, [2, 2]), - # tensor, vector - ([2, 4, 5], [5], False, False, [2, 4]), - # # tensor, matrix - ([2, 4, 5], [5, 4], False, False, [2, 4, 4]), - # # tensor, tensor - ([2, 2, 4], [2, 4, 2], False, False, [2, 2, 2]), - ], -) -def test_matmul(shape_a, shape_b, transpose_a, transpose_b, expected_shape): - np.random.seed(133391) - left_input = np.random.rand(*shape_a).astype(np.float32) - right_input = np.random.rand(*shape_b).astype(np.float32) - - node = ng.matmul(left_input, right_input, transpose_a, transpose_b) - - assert node.get_output_size() == 1 - assert node.get_type_name() == "MatMul" - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_multioutput.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_multioutput.py deleted file mode 100644 index 82aeed43d35..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_multioutput.py +++ /dev/null @@ -1,37 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_split(): - input_tensor = ng.constant(np.array([0, 1, 2, 3, 4, 5], dtype=np.int32)) - axis = ng.constant(0, dtype=np.int64) - splits = 3 - - split_node = ng.split(input_tensor, axis, splits) - assert split_node.get_type_name() == "Split" - assert split_node.get_output_size() == 3 - assert list(split_node.get_output_shape(0)) == [2] - assert list(split_node.get_output_shape(1)) == [2] - assert list(split_node.get_output_shape(2)) == [2] - assert split_node.get_output_element_type(0) == Type.i32 - assert split_node.get_output_element_type(1) == Type.i32 - assert split_node.get_output_element_type(2) == Type.i32 - - -def test_variadic_split(): - input_tensor = ng.constant(np.array([[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11]], dtype=np.int32)) - axis = ng.constant(1, dtype=np.int64) - splits = ng.constant(np.array([2, 4], dtype=np.int64)) - - v_split_node = ng.variadic_split(input_tensor, axis, splits) - assert v_split_node.get_type_name() == "VariadicSplit" - assert v_split_node.get_output_size() == 2 - assert list(v_split_node.get_output_shape(0)) == [2, 2] - assert list(v_split_node.get_output_shape(1)) == [2, 4] - assert v_split_node.get_output_element_type(0) == Type.i32 - assert v_split_node.get_output_element_type(1) == Type.i32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_reshape.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_reshape.py deleted file mode 100644 index 5ae83cc47d3..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_reshape.py +++ /dev/null @@ -1,205 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type -from ngraph.utils.types import get_element_type - - -def test_concat(): - a = np.array([[1, 2], [3, 4]]) - b = np.array([[5, 6]]) - axis = 0 - - parameter_a = ng.parameter(list(a.shape), name="A", dtype=np.float32) - parameter_b = ng.parameter(list(b.shape), name="B", dtype=np.float32) - node = ng.concat([parameter_a, parameter_b], axis) - assert node.get_type_name() == "Concat" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 2] - assert node.get_output_element_type(0) == Type.f32 - - -@pytest.mark.parametrize( - ("val_type", "value", "output_shape"), [(bool, False, []), (bool, np.empty((2, 2), dtype=bool), [2, 2])] -) -def test_constant_from_bool(val_type, value, output_shape): - node = ng.constant(value, val_type) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.boolean - assert list(node.get_output_shape(0)) == output_shape - - -@pytest.mark.parametrize( - "val_type, value", - [ - pytest.param(np.int16, np.int16(-12345)), - pytest.param(np.int64, np.int64(-1234567)), - pytest.param(np.uint16, np.uint16(12345)), - pytest.param(np.uint32, np.uint32(123456)), - pytest.param(np.uint64, np.uint64(1234567)), - pytest.param(np.float64, np.float64(0.1234)), - pytest.param(np.float32, np.float32(0.1234)), - pytest.param(np.int8, np.int8(-63)), - pytest.param(np.int32, np.int32(-123456)), - pytest.param(np.uint8, np.uint8(63)), - ], -) -def test_constant_from_scalar(val_type, value): - node = ng.constant(value, val_type) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(val_type) - assert list(node.get_output_shape(0)) == [] - - -@pytest.mark.parametrize( - "val_type", - [ - pytest.param(np.float64), - pytest.param(np.float32), - ], -) -def test_constant_from_float_array(val_type): - np.random.seed(133391) - input_data = np.array(-1 + np.random.rand(2, 3, 4) * 2, dtype=val_type) - node = ng.constant(input_data, val_type) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(val_type) - assert list(node.get_output_shape(0)) == [2, 3, 4] - - -@pytest.mark.parametrize( - "val_type, range_start, range_end", - [ - pytest.param(np.int16, -64, 64), - pytest.param(np.int64, -16383, 16383), - pytest.param(np.uint16, 0, 64), - pytest.param(np.uint32, 0, 1024), - pytest.param(np.uint64, 0, 16383), - pytest.param(np.int8, -8, 8), - pytest.param(np.int32, -1024, 1024), - pytest.param(np.uint8, 0, 8), - ], -) -def test_constant_from_integer_array(val_type, range_start, range_end): - np.random.seed(133391) - input_data = np.array( - np.random.randint(range_start, range_end, size=(2, 2)), dtype=val_type - ) - node = ng.constant(input_data, val_type) - assert node.get_type_name() == "Constant" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == get_element_type(val_type) - assert list(node.get_output_shape(0)) == [2, 2] - - -def test_broadcast_numpy(): - data_shape = [16, 1, 1] - target_shape_shape = [4] - - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - target_shape_parameter = ng.parameter( - target_shape_shape, name="Target_shape", dtype=np.int64 - ) - - node = ng.broadcast(data_parameter, target_shape_parameter) - - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - - -def test_broadcast_bidirectional(): - data_shape = [16, 1, 1] - target_shape_shape = [4] - - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - target_shape_parameter = ng.parameter( - target_shape_shape, name="Target_shape", dtype=np.int64 - ) - - node = ng.broadcast(data_parameter, target_shape_parameter, "BIDIRECTIONAL") - - assert node.get_type_name() == "Broadcast" - assert node.get_output_size() == 1 - - -def test_transpose(): - input_tensor = np.arange(3 * 3 * 224 * 224, dtype=np.int32).reshape( - (3, 3, 224, 224) - ) - input_order = np.array([0, 2, 3, 1], dtype=np.int32) - - node = ng.transpose(input_tensor, input_order) - assert node.get_type_name() == "Transpose" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i32 - assert list(node.get_output_shape(0)) == [3, 224, 224, 3] - - -def test_tile(): - input_tensor = np.arange(6, dtype=np.int32).reshape((2, 1, 3)) - repeats = np.array([2, 1], dtype=np.int32) - - node = ng.tile(input_tensor, repeats) - - assert node.get_type_name() == "Tile" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i32 - assert list(node.get_output_shape(0)) == [2, 2, 3] - - -def test_strided_slice(): - input_tensor = np.arange(2 * 3 * 4, dtype=np.float32).reshape((2, 3, 4)) - begin = np.array([1, 0], dtype=np.int32) - end = np.array([0, 0], dtype=np.int32) - strides = np.array([1, 1], dtype=np.int32) - begin_mask = np.array([0, 0, 0], dtype=np.int32) - end_mask = np.array([0, 0, 0], dtype=np.int32) - new_axis_mask = np.array([0, 1, 0], dtype=np.int32) - shrink_axis_mask = np.array([1, 0, 0], dtype=np.int32) - ellipsis_mask = np.array([0, 0, 0], dtype=np.int32) - - node = ng.strided_slice( - input_tensor, - begin, - end, - strides, - begin_mask, - end_mask, - new_axis_mask, - shrink_axis_mask, - ellipsis_mask, - ) - - assert node.get_type_name() == "StridedSlice" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [1, 3, 4] - - -def test_reshape_v1(): - A = np.arange(1200, dtype=np.float32).reshape((2, 5, 5, 24)) - shape = np.array([0, -1, 4], dtype=np.int32) - special_zero = True - - node = ng.reshape(A, shape, special_zero) - assert node.get_type_name() == "Reshape" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [2, 150, 4] - - -def test_shape_of(): - input_tensor = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]], dtype=np.float32) - - node = ng.shape_of(input_tensor) - assert node.get_type_name() == "ShapeOf" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i64 - assert list(node.get_output_shape(0)) == [2] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_scatter.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_scatter.py deleted file mode 100644 index 0faba0b6558..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_scatter.py +++ /dev/null @@ -1,35 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_scatter_update_props(): - dtype = np.int8 - parameter_r = ng.parameter([2, 3, 4], dtype=dtype, name="data") - parameter_i = ng.parameter([2, 1], dtype=dtype, name="indices") - parameter_u = ng.parameter([2, 2, 1, 4], dtype=dtype, name="updates") - axis = np.array([1], dtype=np.int8) - - node = ng.scatter_update(parameter_r, parameter_i, parameter_u, axis) - assert node.get_type_name() == "ScatterUpdate" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 3, 4] - assert node.get_output_element_type(0) == Type.i8 - - -def test_scatter_update_elements_props(): - dtype = np.int8 - parameter_r = ng.parameter([2, 4, 5, 7], dtype=dtype, name="data") - parameter_i = ng.parameter([2, 2, 2, 2], dtype=dtype, name="indices") - parameter_u = ng.parameter([2, 2, 2, 2], dtype=dtype, name="updates") - axis = np.array([1], dtype=np.int8) - - node = ng.scatter_elements_update(parameter_r, parameter_i, parameter_u, axis) - assert node.get_type_name() == "ScatterElementsUpdate" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [2, 4, 5, 7] - assert node.get_output_element_type(0) == Type.i8 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_unary.py b/src/bindings/python/tests_compatibility/test_ngraph/test_ops_unary.py deleted file mode 100644 index aafbd97af8d..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_ops_unary.py +++ /dev/null @@ -1,195 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Shape, Type - -R_TOLERANCE = 1e-6 # global relative tolerance - - -@pytest.mark.parametrize( - ("graph_api_fn", "type_name"), - [ - (ng.absolute, "Abs"), - (ng.abs, "Abs"), - (ng.acos, "Acos"), - (ng.acosh, "Acosh"), - (ng.asin, "Asin"), - (ng.asinh, "Asinh"), - (ng.atan, "Atan"), - (ng.atanh, "Atanh"), - (ng.ceiling, "Ceiling"), - (ng.ceil, "Ceiling"), - (ng.cos, "Cos"), - (ng.cosh, "Cosh"), - (ng.exp, "Exp"), - (ng.floor, "Floor"), - (ng.log, "Log"), - (ng.relu, "Relu"), - (ng.sign, "Sign"), - (ng.sin, "Sin"), - (ng.sinh, "Sinh"), - (ng.sqrt, "Sqrt"), - (ng.tan, "Tan"), - (ng.tanh, "Tanh"), - ], -) -def test_unary_op_array(graph_api_fn, type_name): - np.random.seed(133391) - input_data = np.random.rand(2, 3, 4).astype(np.float32) - node = graph_api_fn(input_data) - assert node.get_output_size() == 1 - assert node.get_type_name() == type_name - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [2, 3, 4] - - -@pytest.mark.parametrize( - ("graph_api_fn", "input_data"), - [ - pytest.param(ng.absolute, np.float32(-3)), - pytest.param(ng.abs, np.float32(-3)), - pytest.param(ng.acos, np.float32(-0.5)), - pytest.param(ng.asin, np.float32(-0.5)), - pytest.param(ng.atan, np.float32(-0.5)), - pytest.param(ng.ceiling, np.float32(1.5)), - pytest.param(ng.ceil, np.float32(1.5)), - pytest.param(ng.cos, np.float32(np.pi / 4.0)), - pytest.param(ng.cosh, np.float32(np.pi / 4.0)), - pytest.param(ng.exp, np.float32(1.5)), - pytest.param(ng.floor, np.float32(1.5)), - pytest.param(ng.log, np.float32(1.5)), - pytest.param(ng.relu, np.float32(-0.125)), - pytest.param(ng.sign, np.float32(0.0)), - pytest.param(ng.sin, np.float32(np.pi / 4.0)), - pytest.param(ng.sinh, np.float32(0.0)), - pytest.param(ng.sqrt, np.float32(3.5)), - pytest.param(ng.tan, np.float32(np.pi / 4.0)), - pytest.param(ng.tanh, np.float32(0.1234)), - ], -) -def test_unary_op_scalar(graph_api_fn, input_data): - node = graph_api_fn(input_data) - - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [] - - -@pytest.mark.parametrize( - "input_data", [(np.array([True, False, True, False])), (np.array([True])), (np.array([False]))] -) -def test_logical_not(input_data): - node = ng.logical_not(input_data) - assert node.get_output_size() == 1 - assert node.get_type_name() == "LogicalNot" - assert node.get_output_element_type(0) == Type.boolean - assert list(node.get_output_shape(0)) == list(input_data.shape) - - -def test_sigmoid(): - input_data = np.array([-3.14, -1.0, 0.0, 2.71001, 1000.0], dtype=np.float32) - node = ng.sigmoid(input_data) - - assert node.get_output_size() == 1 - assert node.get_type_name() == "Sigmoid" - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [5] - - -def test_softmax(): - axis = 1 - input_tensor = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32) - - node = ng.softmax(input_tensor, axis) - assert node.get_output_size() == 1 - assert node.get_type_name() == "Softmax" - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [2, 3] - - -def test_erf(): - input_tensor = np.array([-1.0, 0.0, 1.0, 2.5, 3.14, 4.0], dtype=np.float32) - node = ng.erf(input_tensor) - assert node.get_output_size() == 1 - assert node.get_type_name() == "Erf" - assert node.get_output_element_type(0) == Type.f32 - assert list(node.get_output_shape(0)) == [6] - - -def test_hswish(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - - node = ng.hswish(data) - assert node.get_type_name() == "HSwish" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 - - -def test_round_even(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - - node = ng.round(data, "HALF_TO_EVEN") - assert node.get_type_name() == "Round" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 - - -def test_hsigmoid(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - - node = ng.hsigmoid(data) - assert node.get_type_name() == "HSigmoid" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 - - -def test_gelu_operator_with_parameters(): - data_shape = [2, 2] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.gelu(parameter_data, "erf") - assert model.get_output_size() == 1 - assert model.get_type_name() == "Gelu" - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [2, 2] - - -def test_gelu_operator_with_array(): - data_value = np.array([[-5, 1], [-2, 3]], dtype=np.float32) - - model = ng.gelu(data_value, "erf") - assert model.get_output_size() == 1 - assert model.get_type_name() == "Gelu" - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [2, 2] - - -def test_gelu_tanh_operator_with_parameters(): - data_shape = [2, 2] - parameter_data = ng.parameter(data_shape, name="Data", dtype=np.float32) - - model = ng.gelu(parameter_data, "tanh") - assert model.get_output_size() == 1 - assert model.get_type_name() == "Gelu" - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [2, 2] - - -def test_gelu_tanh_operator_with_array(): - data_value = np.array([[-5, 1], [-2, 3]], dtype=np.float32) - - model = ng.gelu(data_value, "tanh") - assert model.get_output_size() == 1 - assert model.get_type_name() == "Gelu" - assert model.get_output_element_type(0) == Type.f32 - assert list(model.get_output_shape(0)) == [2, 2] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_pooling.py b/src/bindings/python/tests_compatibility/test_ngraph/test_pooling.py deleted file mode 100644 index bec88064ce9..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_pooling.py +++ /dev/null @@ -1,266 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type - - -@pytest.fixture -def _ndarray_1x1x4x4(): - return np.arange(11, 27, dtype=np.float32).reshape(1, 1, 4, 4) - - -def test_avg_pool_2d(_ndarray_1x1x4x4): - input_data = _ndarray_1x1x4x4 - param = ng.parameter(input_data.shape, name="A", dtype=np.float32) - - kernel_shape = [2, 2] - spatial_dim_count = len(kernel_shape) - pads_begin = [0] * spatial_dim_count - pads_end = [0] * spatial_dim_count - strides = [2, 2] - exclude_pad = True - - avg_pool_node = ng.avg_pool(param, strides, pads_begin, pads_end, kernel_shape, exclude_pad) - assert avg_pool_node.get_type_name() == "AvgPool" - assert avg_pool_node.get_output_size() == 1 - assert list(avg_pool_node.get_output_shape(0)) == [1, 1, 2, 2] - assert avg_pool_node.get_output_element_type(0) == Type.f32 - - -def test_avg_pooling_3d(_ndarray_1x1x4x4): - data = _ndarray_1x1x4x4 - data = np.broadcast_to(data, (1, 1, 4, 4, 4)) - param = ng.parameter(list(data.shape)) - kernel_shape = [2, 2, 2] - strides = [2, 2, 2] - spatial_dim_count = len(kernel_shape) - pads_begin = [0] * spatial_dim_count - pads_end = [0] * spatial_dim_count - exclude_pad = True - - avgpool = ng.avg_pool(param, strides, pads_begin, pads_end, kernel_shape, exclude_pad) - assert avgpool.get_type_name() == "AvgPool" - assert avgpool.get_output_size() == 1 - assert list(avgpool.get_output_shape(0)) == [1, 1, 2, 2, 2] - assert avgpool.get_output_element_type(0) == Type.f32 - - -def test_max_pool_basic(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [2, 2] - rounding_type = "floor" - auto_pad = None - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 3, 3] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 3, 3] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_strides(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [2, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [2, 2] - rounding_type = "floor" - auto_pad = None - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 2, 3] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 2, 3] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_kernel_shape1x1(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [1, 1] - rounding_type = "floor" - auto_pad = None - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 4, 4] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 4, 4] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_kernel_shape3x3(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [3, 3] - rounding_type = "floor" - auto_pad = None - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 2, 2] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 2, 2] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_non_zero_pads(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [1, 1] - pads_end = [1, 1] - kernel_shape = [2, 2] - rounding_type = "floor" - auto_pad = None - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 5, 5] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 5, 5] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_same_upper_auto_pads(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [2, 2] - auto_pad = "same_upper" - rounding_type = "floor" - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 4, 4] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 4, 4] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 - - -def test_max_pool_same_lower_auto_pads(): - data = np.arange(0.5, 16, dtype=np.float32).reshape((1, 1, 4, 4)) - strides = [1, 1] - dilations = [1, 1] - pads_begin = [0, 0] - pads_end = [0, 0] - kernel_shape = [2, 2] - auto_pad = "same_lower" - rounding_type = "floor" - index_et = "i32" - - data_node = ng.parameter(data.shape, name="A", dtype=np.float32) - maxpool_node = ng.max_pool( - data_node, - strides, - dilations, - pads_begin, - pads_end, - kernel_shape, - rounding_type, - auto_pad, - index_et, - ) - assert maxpool_node.get_type_name() == "MaxPool" - assert maxpool_node.get_output_size() == 2 - assert list(maxpool_node.get_output_shape(0)) == [1, 1, 4, 4] - assert list(maxpool_node.get_output_shape(1)) == [1, 1, 4, 4] - assert maxpool_node.get_output_element_type(0) == Type.f32 - assert maxpool_node.get_output_element_type(1) == Type.i32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_proposal.py b/src/bindings/python/tests_compatibility/test_ngraph/test_proposal.py deleted file mode 100644 index 81c3159ae6e..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_proposal.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import ngraph as ng -from ngraph.impl import Shape, Type - - -def test_proposal_props(): - float_dtype = np.float32 - batch_size = 1 - post_nms_topn = 20 - probs = ng.parameter(Shape([batch_size, 8, 255, 255]), dtype=float_dtype, name="probs") - deltas = ng.parameter(Shape([batch_size, 16, 255, 255]), dtype=float_dtype, name="bbox_deltas") - im_info = ng.parameter(Shape([4]), dtype=float_dtype, name="im_info") - - attrs = { - "base_size": np.uint32(85), - "pre_nms_topn": np.uint32(10), - "post_nms_topn": np.uint32(post_nms_topn), - "nms_thresh": np.float32(0.34), - "feat_stride": np.uint32(16), - "min_size": np.uint32(32), - "ratio": np.array([0.1, 1.5, 2.0, 2.5], dtype=np.float32), - "scale": np.array([2, 3, 3, 4], dtype=np.float32), - } - - node = ng.proposal(probs, deltas, im_info, attrs) - - assert node.get_type_name() == "Proposal" - assert node.get_output_size() == 2 - - assert list(node.get_output_shape(0)) == [batch_size * post_nms_topn, 5] - assert list(node.get_output_shape(1)) == [batch_size * post_nms_topn] - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_random_uniform.py b/src/bindings/python/tests_compatibility/test_ngraph/test_random_uniform.py deleted file mode 100644 index c9da0afe153..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_random_uniform.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -from ngraph.impl import Type - -import numpy as np - - -def test_random_uniform(): - input_tensor = ng.constant(np.array([2, 4, 3], dtype=np.int32)) - min_val = ng.constant(np.array([-2.7], dtype=np.float32)) - max_val = ng.constant(np.array([3.5], dtype=np.float32)) - - random_uniform_node = ng.random_uniform(input_tensor, min_val, max_val, - output_type="f32", global_seed=7461, - op_seed=1546) - random_uniform_node = ng.random_uniform(input_tensor, min_val, max_val, - output_type="f32", global_seed=7461, - op_seed=1546) - assert random_uniform_node.get_output_size() == 1 - assert random_uniform_node.get_type_name() == "RandomUniform" - assert random_uniform_node.get_output_element_type(0) == Type.f32 - assert list(random_uniform_node.get_output_shape(0)) == [2, 4, 3] diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_reduction.py b/src/bindings/python/tests_compatibility/test_ngraph/test_reduction.py deleted file mode 100644 index e1bac52b738..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_reduction.py +++ /dev/null @@ -1,166 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import pytest - -import ngraph as ng -from ngraph.impl import Type - - -@pytest.mark.parametrize( - ("ng_api_helper", "reduction_axes", "expected_shape"), - [ - (ng.reduce_max, np.array([0, 1, 2, 3]), []), - (ng.reduce_min, np.array([0, 1, 2, 3]), []), - (ng.reduce_sum, np.array([0, 1, 2, 3]), []), - (ng.reduce_prod, np.array([0, 1, 2, 3]), []), - (ng.reduce_max, np.array([0]), [4, 3, 2]), - (ng.reduce_min, np.array([0]), [4, 3, 2]), - (ng.reduce_sum, np.array([0]), [4, 3, 2]), - (ng.reduce_prod, np.array([0]), [4, 3, 2]), - (ng.reduce_max, np.array([0, 2]), [4, 2]), - (ng.reduce_min, np.array([0, 2]), [4, 2]), - (ng.reduce_sum, np.array([0, 2]), [4, 2]), - (ng.reduce_prod, np.array([0, 2]), [4, 2]), - ], -) -def test_reduction_ops(ng_api_helper, reduction_axes, expected_shape): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.randn(*shape).astype(np.float32) - - node = ng_api_helper(input_data, reduction_axes) - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -@pytest.mark.parametrize( - ("ng_api_helper", "reduction_axes", "expected_shape"), - [ - (ng.reduce_logical_and, np.array([0]), [4, 3, 2]), - (ng.reduce_logical_or, np.array([0]), [4, 3, 2]), - (ng.reduce_logical_and, np.array([0, 2]), [4, 2]), - (ng.reduce_logical_or, np.array([0, 2]), [4, 2]), - (ng.reduce_logical_and, np.array([0, 1, 2, 3]), []), - (ng.reduce_logical_or, np.array([0, 1, 2, 3]), []), - ], -) -def test_reduction_logical_ops(ng_api_helper, reduction_axes, expected_shape): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.randn(*shape).astype(bool) - - node = ng_api_helper(input_data, reduction_axes) - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.boolean - - -def test_topk(): - data_shape = [6, 12, 10, 24] - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - K = np.int32(3) - axis = np.int32(1) - node = ng.topk(data_parameter, K, axis, "max", "value") - assert node.get_type_name() == "TopK" - assert node.get_output_size() == 2 - assert list(node.get_output_shape(0)) == [6, 3, 10, 24] - assert list(node.get_output_shape(1)) == [6, 3, 10, 24] - assert node.get_output_element_type(0) == Type.f32 - assert node.get_output_element_type(1) == Type.i32 - - -@pytest.mark.parametrize( - ("ng_api_helper", "reduction_axes", "expected_shape"), - [ - (ng.reduce_mean, np.array([0, 1, 2, 3]), []), - (ng.reduce_mean, np.array([0]), [4, 3, 2]), - (ng.reduce_mean, np.array([0, 2]), [4, 2]), - ], -) -def test_reduce_mean_op(ng_api_helper, reduction_axes, expected_shape): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.randn(*shape).astype(np.float32) - - node = ng_api_helper(input_data, reduction_axes) - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -def test_non_zero(): - - data_shape = [3, 10, 100, 200] - - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - - node = ng.non_zero(data_parameter) - - assert node.get_type_name() == "NonZero" - assert node.get_output_size() == 1 - assert node.get_output_element_type(0) == Type.i64 - - -def test_roi_align(): - - data_shape = [7, 256, 200, 200] - rois = [1000, 4] - batch_indices = [1000] - expected_shape = [1000, 256, 6, 6] - - data_parameter = ng.parameter(data_shape, name="Data", dtype=np.float32) - rois_parameter = ng.parameter(rois, name="Rois", dtype=np.float32) - batch_indices_parameter = ng.parameter(batch_indices, name="Batch_indices", dtype=np.int32) - pooled_h = 6 - pooled_w = 6 - sampling_ratio = 2 - spatial_scale = np.float32(16) - mode = "avg" - - node = ng.roi_align( - data_parameter, - rois_parameter, - batch_indices_parameter, - pooled_h, - pooled_w, - sampling_ratio, - spatial_scale, - mode, - ) - - assert node.get_type_name() == "ROIAlign" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == expected_shape - assert node.get_output_element_type(0) == Type.f32 - - -@pytest.mark.parametrize( - "input_shape, cumsum_axis, reverse", - [([5, 2], 0, False), ([5, 2], 1, False), ([5, 2, 6], 2, False), ([5, 2], 0, True)], -) -def test_cum_sum(input_shape, cumsum_axis, reverse): - input_data = np.arange(np.prod(input_shape), dtype=np.int64).reshape(input_shape) - - node = ng.cum_sum(input_data, cumsum_axis, reverse=reverse) - assert node.get_output_size() == 1 - assert node.get_type_name() == "CumSum" - assert list(node.get_output_shape(0)) == input_shape - assert node.get_output_element_type(0) == Type.i64 - - -def test_normalize_l2(): - input_shape = [1, 2, 3, 4] - input_data = np.arange(np.prod(input_shape)).reshape(input_shape).astype(np.float32) - input_data += 1 - axes = np.array([1, 2, 3]).astype(np.int64) - eps = 1e-6 - eps_mode = "add" - - node = ng.normalize_l2(input_data, axes, eps, eps_mode) - assert node.get_output_size() == 1 - assert node.get_type_name() == "NormalizeL2" - assert list(node.get_output_shape(0)) == input_shape - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_roll.py b/src/bindings/python/tests_compatibility/test_ngraph/test_roll.py deleted file mode 100644 index b912eb5ebc3..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_roll.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import ngraph as ng -from ngraph.impl import Type - -import numpy as np - - -def test_roll(): - input = np.reshape(np.arange(10, dtype=np.int64), (2, 5)) - input_tensor = ng.constant(input) - input_shift = ng.constant(np.array([-10, 7], dtype=np.int32)) - input_axes = ng.constant(np.array([-1, 0], dtype=np.int32)) - - roll_node = ng.roll(input_tensor, input_shift, input_axes) - assert roll_node.get_output_size() == 1 - assert roll_node.get_type_name() == "Roll" - assert list(roll_node.get_output_shape(0)) == [2, 5] - assert roll_node.get_output_element_type(0) == Type.i64 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_sequence_processing.py b/src/bindings/python/tests_compatibility/test_ngraph/test_sequence_processing.py deleted file mode 100644 index e5e85480060..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_sequence_processing.py +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np - -import ngraph as ng -from ngraph.impl import Type - - -def test_onehot(): - param = ng.parameter([3], dtype=np.int32) - # output type is derived from 'on_value' and 'off_value' element types - # Need to set explicitly 'on_value' and 'off_value' types. - # If we don't do it explicitly, depending on OS/packages versions types can be unpredictably either int32 or int64 - on_value = np.array(1, dtype=np.int64) - off_value = np.array(0, dtype=np.int64) - depth = 3 - axis = 0 - model = ng.one_hot(param, depth, on_value, off_value, axis) - assert model.get_output_size() == 1 - assert model.get_type_name() == "OneHot" - assert list(model.get_output_shape(0)) == [3, 3] - assert model.get_output_element_type(0) == Type.i64 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_swish.py b/src/bindings/python/tests_compatibility/test_ngraph/test_swish.py deleted file mode 100644 index 87e5b1d5eae..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_swish.py +++ /dev/null @@ -1,29 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import ngraph as ng -from ngraph.impl import Shape, Type - - -def test_swish_props_with_beta(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - beta = ng.parameter(Shape([]), dtype=float_dtype, name="beta") - - node = ng.swish(data, beta) - assert node.get_type_name() == "Swish" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 - - -def test_swish_props_without_beta(): - float_dtype = np.float32 - data = ng.parameter(Shape([3, 10]), dtype=float_dtype, name="data") - - node = ng.swish(data) - assert node.get_type_name() == "Swish" - assert node.get_output_size() == 1 - assert list(node.get_output_shape(0)) == [3, 10] - assert node.get_output_element_type(0) == Type.f32 diff --git a/src/bindings/python/tests_compatibility/test_ngraph/test_utils.py b/src/bindings/python/tests_compatibility/test_ngraph/test_utils.py deleted file mode 100644 index c67ab867742..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/test_utils.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import ngraph as ng -from ngraph.impl import Shape - - -def test_get_constant_from_source_success(): - dtype = np.int32 - input1 = ng.parameter(Shape([5, 5]), dtype=dtype, name="input_1") - input2 = ng.parameter(Shape([25]), dtype=dtype, name="input_2") - shape_of = ng.shape_of(input2, name="shape_of") - reshape = ng.reshape(input1, shape_of, special_zero=True) - folded_const = ng.impl.util.get_constant_from_source(reshape.input(1).get_source_output()) - - assert folded_const is not None - assert folded_const.get_vector() == [25] - - -def test_get_constant_from_source_failed(): - dtype = np.int32 - input1 = ng.parameter(Shape([5, 5]), dtype=dtype, name="input_1") - input2 = ng.parameter(Shape([1]), dtype=dtype, name="input_2") - reshape = ng.reshape(input1, input2, special_zero=True) - folded_const = ng.impl.util.get_constant_from_source(reshape.input(1).get_source_output()) - - assert folded_const is None diff --git a/src/bindings/python/tests_compatibility/test_ngraph/util.py b/src/bindings/python/tests_compatibility/test_ngraph/util.py deleted file mode 100644 index 8008ce1a3d9..00000000000 --- a/src/bindings/python/tests_compatibility/test_ngraph/util.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - - -def count_ops_of_type(func, op_type): - count = 0 - for op in func.get_ops(): - if (type(op) is type(op_type)): - count += 1 - return count diff --git a/src/bindings/python/tests_compatibility/test_onnx/__init__.py b/src/bindings/python/tests_compatibility/test_onnx/__init__.py deleted file mode 100644 index cddd115d397..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 diff --git a/src/bindings/python/tests_compatibility/test_onnx/model_zoo_preprocess.sh b/src/bindings/python/tests_compatibility/test_onnx/model_zoo_preprocess.sh deleted file mode 100755 index 064798dfe70..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/model_zoo_preprocess.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash - -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -set -e - -# default ONNX Model Zoo commit hash ID: -ONNX_SHA=d58213534f2a4d1c4b19ba62b3bb5f544353256e - -MODELS_DIR="$HOME/.onnx/model_zoo" -ENABLE_ONNX_MODELS_ZOO=false -ENABLE_MSFT_MODELS=false -FORCE_MODE=false - -function print_help { - echo "Model preprocessing options:" - echo " -h display this help message" - echo " -d set location of the models (for onnx model ZOO and MSFT models)" - echo " By default the models location is: $HOME/.onnx/model_zoo" - echo " -o update Onnx Model Zoo models" - echo " -s Onnx Model Zoo commit SHA" - echo " -m update MSFT models" - echo " -f force update of a chosen model" - echo "" - echo "Note: This script requires wget, GNU tar (not bsdtar) and git with LFS support." -} - -while getopts "homfd:s:" opt; do - case ${opt} in - h ) - print_help - ;; - \? ) - print_help - ;; - : ) - print_help - ;; - d ) - MODELS_DIR="$OPTARG" - ;; - o ) - ENABLE_ONNX_MODELS_ZOO=true - ;; - s ) - ONNX_SHA="$OPTARG" - ;; - m ) - ENABLE_MSFT_MODELS=true - ;; - f ) - FORCE_MODE=true - ;; - esac -done -shift $((OPTIND -1)) - -MODEL_ZOO_DIR="$MODELS_DIR/model_zoo" -ONNX_MODELS_DIR="$MODEL_ZOO_DIR/onnx_model_zoo_$ONNX_SHA" -MSFT_MODELS_DIR="$MODEL_ZOO_DIR/MSFT" - -function pull_and_postprocess_onnx_model_zoo() { - git fetch - git reset HEAD --hard - - git checkout -f "$ONNX_SHA" - - echo "Pulling models data via Git LFS for onnx model zoo repository" - git lfs pull --include="*" --exclude="*.onnx" - find "$ONNX_MODELS_DIR" -name "*.onnx" | while read -r filename; do rm "$filename"; done; - - printf "Extracting tar.gz archives into %s\n" "$ONNX_MODELS_DIR" - find "$ONNX_MODELS_DIR" -name '*.tar.gz' \ - -execdir sh -c 'BASEDIR=$(basename "$1" .tar.gz) && rm -rf $BASEDIR && mkdir -p $BASEDIR' shell {} \; \ - -execdir sh -c 'BASEDIR=$(basename "$1" .tar.gz) && tar --warning=no-unknown-keyword -xvzf "$1" -C $BASEDIR' shell {} \; - - echo "Postprocessing of ONNX Model Zoo models:" - - echo "Fix roberta model" - cd "$ONNX_MODELS_DIR/text/machine_comprehension/roberta/model/roberta-sequence-classification-9/roberta-sequence-classification-9" - mkdir -p test_data_set_0 - mv ./*.pb test_data_set_0/ - - rm -f "$MODEL_ZOO_DIR/executing_$ONNX_SHA" -} - -function update_onnx_models() { - if test "$(find "$MODEL_ZOO_DIR/executing_$ONNX_SHA" -mmin +60 2>/dev/null)" ; then - rm -rf "$ONNX_MODELS_DIR" - rm -f "$MODEL_ZOO_DIR/executing_$ONNX_SHA" - fi - - while [[ -f $MODEL_ZOO_DIR/executing_$ONNX_SHA ]]; - do - echo "Onnx Models update are currently executing - sleeping 5 minutes" - sleep 300 - done - - if [[ ! -d $ONNX_MODELS_DIR ]] ; then - touch "$MODEL_ZOO_DIR/executing_$ONNX_SHA" - trap 'rm -f "$MODEL_ZOO_DIR/executing_$ONNX_SHA"' EXIT INT TERM - echo "The ONNX Model Zoo repository doesn't exist on your filesystem then will be cloned" - git clone https://github.com/onnx/models.git "$ONNX_MODELS_DIR" - cd "$ONNX_MODELS_DIR" - pull_and_postprocess_onnx_model_zoo - else - # Check if ONNX Model Zoo directory consists of proper git repo - git_remote_url=$(git -C "$ONNX_MODELS_DIR" config --local remote.origin.url 2> /dev/null 2>&1) - printf "ONNX Model Zoo repository exists: %s\n" "$ONNX_MODELS_DIR" - if [[ $git_remote_url = "https://github.com/onnx/models.git" ]]; then - printf "The proper github repository detected: %s\n" "$git_remote_url" - else - echo "The ONNX Model Zoo repository doesn't exist then will be cloned" - git clone https://github.com/onnx/models.git "$ONNX_MODELS_DIR" - fi - fi -} - -function update_msft_models() { - wget https://onnxruntimetestdata.blob.core.windows.net/models/20191107.zip -O "$MSFT_MODELS_DIR.zip" - unzip "$MSFT_MODELS_DIR.zip" -d "$MSFT_MODELS_DIR" && rm "$MSFT_MODELS_DIR.zip" - -} - -function postprocess_msft_models() { - echo "Postprocessing of MSFT models:" - - echo "Fix LSTM_Seq_lens_unpacked" - mv "$MSFT_MODELS_DIR"/opset9/LSTM_Seq_lens_unpacked/seq_lens_sorted "$MSFT_MODELS_DIR"/opset9/LSTM_Seq_lens_unpacked/test_data_set_0 - mv "$MSFT_MODELS_DIR"/opset9/LSTM_Seq_lens_unpacked/seq_lens_unsorted "$MSFT_MODELS_DIR"/opset9/LSTM_Seq_lens_unpacked/test_data_set_1 -} - -if [[ $ENABLE_ONNX_MODELS_ZOO = false ]] && [[ $ENABLE_MSFT_MODELS = false ]] ; then - echo "Please choose an option to update chosen model: - -o to update ONNX Model ZOO - -m to update MSFT models" - exit 170 -fi - -if [[ $MODELS_DIR = false ]] ; then - printf "Unknown location of the general models directory (onnx model ZOO and MSFT models) - Please specify the location using -d flag" - exit 170 -fi - - -# check if general model zoo directory exists (directory to store ONNX model zoo and MSFT models) -if [[ ! -d $MODEL_ZOO_DIR ]] ; then - printf "The general model directory: %s doesn't exist on your filesystem, it will be created \n" "$MODEL_ZOO_DIR" - mkdir -p "$MODEL_ZOO_DIR" -else - printf "The general model directory: %s found\n" "$MODEL_ZOO_DIR" -fi - -if [[ $ENABLE_ONNX_MODELS_ZOO = true ]] ; then - if [[ $FORCE_MODE = true ]]; then - rm -rf "$ONNX_MODELS_DIR" - fi - update_onnx_models -fi - -if [[ $ENABLE_MSFT_MODELS = true ]] ; then - if [[ $FORCE_MODE = true ]]; then - rm -rf "$MSFT_MODELS_DIR" - fi - update_msft_models - postprocess_msft_models -fi diff --git a/src/bindings/python/tests_compatibility/test_onnx/models/add_abc.onnx b/src/bindings/python/tests_compatibility/test_onnx/models/add_abc.onnx deleted file mode 100644 index 5c2da5dcc0b..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/models/add_abc.onnx +++ /dev/null @@ -1,24 +0,0 @@ -ngraph ONNXImporter:† - -A -BX add_node1"Add - -X -CY add_node2"Add -test_graphZ -A - - -Z -B - - -Z -C - - -b -Y - - -B \ No newline at end of file diff --git a/src/bindings/python/tests_compatibility/test_onnx/models/data/tensor.data b/src/bindings/python/tests_compatibility/test_onnx/models/data/tensor.data deleted file mode 100644 index 5116510eebcfbd3a254c8e0e661dbb88acd086a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12 TcmZQzSm40G&|uHN;NSoN4Tl0C diff --git a/src/bindings/python/tests_compatibility/test_onnx/models/external_data.onnx b/src/bindings/python/tests_compatibility/test_onnx/models/external_data.onnx deleted file mode 100644 index 9cd1ae3bb10..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/models/external_data.onnx +++ /dev/null @@ -1,22 +0,0 @@ -nGraph ONNX Importer:Á -& -data_a -data_b -data_cresult"Meantest_mean_example*,Bdata_cj -locationdata/tensor.datapZ -data_a - - -Z -data_b - - -Z -data_c - - -b -result - - -B \ No newline at end of file diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_backend.py b/src/bindings/python/tests_compatibility/test_onnx/test_backend.py deleted file mode 100644 index e8ff2196d4f..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_backend.py +++ /dev/null @@ -1,935 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import logging - -import onnx.backend.test -from tests_compatibility import ( - BACKEND_NAME, - skip_rng_tests, - xfail_unsupported_by_legacy_api, - xfail_issue_33488, - xfail_issue_33581, - xfail_issue_33595, - xfail_issue_33596, - xfail_issue_33606, - xfail_issue_33651, - xfail_issue_38091, - xfail_issue_38699, - xfail_issue_38701, - xfail_issue_38706, - xfail_issue_38710, - xfail_issue_38713, - xfail_issue_38724, - xfail_issue_38734, - xfail_issue_38735, - xfail_issue_39658, - xfail_issue_44858, - xfail_issue_44965, - xfail_issue_45180, - xfail_issue_47323, - xfail_issue_73538, - xfail_issue_48052, - xfail_issue_52463, - xfail_issue_58033, - xfail_issue_63033, - xfail_issue_63036, - xfail_issue_63043, - xfail_issue_63137, - xfail_issue_63138, - xfail_issue_69444, - xfail_issue_78741, - xfail_issue_81976, - skip_segfault, - xfail_issue_82038, - xfail_issue_82039, - xfail_issue_90649, - skip_issue_91151, - xfail_issue_91490, - xfail_issue_101965, - skip_bitwise_ui64, - xfail_issue_99949, - xfail_issue_99950, - xfail_issue_99952, - xfail_issue_99954, - xfail_issue_99955, - xfail_issue_99957, - xfail_issue_99958, - xfail_issue_99959, - xfail_issue_99960, - xfail_issue_99961, - xfail_issue_99968, - xfail_issue_99969, - xfail_issue_99970, - xfail_issue_99972, - xfail_issue_99973, - xfail_issue_113506, - skip_dynamic_model, - xfail_issue_119896, - xfail_issue_119900, - xfail_issue_119903, - xfail_issue_119906, - xfail_issue_119919, - xfail_issue_119922, - xfail_issue_119925, - xfail_issue_119926, - xfail_issue_125485, - xfail_issue_125486, - xfail_issue_125488, - xfail_issue_125487, - skip_issue_125489, - xfail_issue_125491, - xfail_issue_125492, - xfail_issue_125493, - xfail_issue_125495, - xfail_issue_127812, - skip_misalignment, -) -from tests_compatibility.test_onnx.utils.onnx_backend import OpenVinoTestBackend - - -def expect_fail(test_case_path, xfail): # type: (str) -> None - """Mark the test as expected to fail.""" - module_name, test_name = test_case_path.split(".") - module = globals().get(module_name) - if hasattr(module, test_name): - xfail(getattr(module, test_name)) - else: - logging.getLogger().warning( - "Could not mark test as XFAIL, not found: %s", test_case_path - ) - - -OpenVinoTestBackend.backend_name = BACKEND_NAME - -# This is a pytest magic variable to load extra plugins -# Uncomment the line below to enable the ONNX compatibility report -# pytest_plugins = "onnx.backend.test.report", - -# import all test cases at global scope to make them visible to python.unittest -backend_test = onnx.backend.test.BackendTest(OpenVinoTestBackend, __name__) - -skip_tests_general = [ - # Big model tests (see test_zoo_models.py): - "test_bvlc_alexnet", - "test_densenet121", - "test_inception_v1", - "test_inception_v2", - "test_resnet50", - "test_shufflenet", - "test_squeezenet", - "test_vgg19", - "test_zfnet512", -] - -for test in skip_tests_general: - backend_test.exclude(test) - -# NOTE: ALL backend_test.exclude CALLS MUST BE PERFORMED BEFORE THE CALL TO globals().update - -OnnxBackendNodeModelTest = None -OnnxBackendSimpleModelTest = None -OnnxBackendPyTorchOperatorModelTest = None -OnnxBackendPyTorchConvertedModelTest = None -globals().update(backend_test.enable_report().test_cases) - -tests_expected_to_fail = [ - ( - xfail_issue_39658, - "OnnxBackendNodeModelTest.test_tile_cpu", - ), - ( - xfail_issue_38091, - "OnnxBackendNodeModelTest.test_dynamicquantizelinear_cpu", - "OnnxBackendNodeModelTest.test_dynamicquantizelinear_expanded_cpu", - ), - ( - xfail_issue_52463, - "OnnxBackendPyTorchOperatorModelTest.test_operator_add_size1_singleton_broadcast_cpu", - ), - ( - xfail_issue_47323, - "OnnxBackendPyTorchOperatorModelTest.test_operator_add_broadcast_cpu", - "OnnxBackendPyTorchOperatorModelTest.test_operator_addconstant_cpu", - "OnnxBackendPyTorchOperatorModelTest.test_operator_add_size1_right_broadcast_cpu", - ), - ( - xfail_issue_38699, - "OnnxBackendSimpleModelTest.test_gradient_of_add_and_mul_cpu", - "OnnxBackendSimpleModelTest.test_gradient_of_add_cpu", - ), - ( - xfail_issue_33596, - "OnnxBackendSimpleModelTest.test_sequence_model5_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model7_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model1_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model3_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model6_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model8_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model4_cpu", - "OnnxBackendSimpleModelTest.test_sequence_model2_cpu", - "OnnxBackendNodeModelTest.test_identity_sequence_cpu", - "OnnxBackendNodeModelTest.test_if_seq_cpu", - "OnnxBackendNodeModelTest.test_if_opt_cpu", # Optional, SequenceConstruct - "OnnxBackendNodeModelTest.test_split_to_sequence_1_cpu", - "OnnxBackendNodeModelTest.test_split_to_sequence_2_cpu", - "OnnxBackendNodeModelTest.test_split_to_sequence_nokeepdims_cpu", - ), - ( - xfail_issue_38701, - "OnnxBackendSimpleModelTest.test_strnorm_model_monday_casesensintive_nochangecase_cpu", - "OnnxBackendSimpleModelTest.test_strnorm_model_nostopwords_nochangecase_cpu", - "OnnxBackendSimpleModelTest.test_strnorm_model_monday_empty_output_cpu", - "OnnxBackendSimpleModelTest.test_strnorm_model_monday_insensintive_upper_twodim_cpu", - "OnnxBackendSimpleModelTest.test_strnorm_model_monday_casesensintive_lower_cpu", - "OnnxBackendSimpleModelTest.test_strnorm_model_monday_casesensintive_upper_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_nostopwords_nochangecase_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_export_monday_casesensintive_nochangecase_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_export_monday_insensintive_upper_twodim_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_export_monday_casesensintive_lower_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_export_monday_empty_output_cpu", - "OnnxBackendNodeModelTest.test_strnormalizer_export_monday_casesensintive_upper_cpu", - "OnnxBackendNodeModelTest.test_cast_STRING_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT_to_STRING_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_STRING_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_STRING_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_STRING_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_STRING_to_FLOAT_expanded_cpu", - "OnnxBackendNodeModelTest.test_equal_string_broadcast_cpu", - "OnnxBackendNodeModelTest.test_equal_string_cpu", - "OnnxBackendNodeModelTest.test_regex_full_match_basic_cpu", - "OnnxBackendNodeModelTest.test_regex_full_match_email_domain_cpu", - "OnnxBackendNodeModelTest.test_regex_full_match_empty_cpu", - "OnnxBackendNodeModelTest.test_string_concat_broadcasting_cpu", - "OnnxBackendNodeModelTest.test_string_concat_cpu", - "OnnxBackendNodeModelTest.test_string_concat_empty_string_cpu", - "OnnxBackendNodeModelTest.test_string_concat_utf8_cpu", - "OnnxBackendNodeModelTest.test_string_concat_zero_dimensional_cpu", - "OnnxBackendNodeModelTest.test_string_split_basic_cpu", - "OnnxBackendNodeModelTest.test_string_split_consecutive_delimiters_cpu", - "OnnxBackendNodeModelTest.test_string_split_empty_string_delimiter_cpu", - "OnnxBackendNodeModelTest.test_string_split_empty_tensor_cpu", - "OnnxBackendNodeModelTest.test_string_split_maxsplit_cpu", - "OnnxBackendNodeModelTest.test_string_split_no_delimiter_cpu", - ), - ( - xfail_issue_33595, - "OnnxBackendNodeModelTest.test_unique_not_sorted_without_axis_cpu", - "OnnxBackendNodeModelTest.test_unique_sorted_with_negative_axis_cpu", - "OnnxBackendNodeModelTest.test_unique_sorted_with_axis_cpu", - "OnnxBackendNodeModelTest.test_unique_sorted_with_axis_3d_cpu", - "OnnxBackendNodeModelTest.test_unique_sorted_without_axis_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_add_1_sequence_1_tensor_expanded_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_add_2_sequences_expanded_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_extract_shapes_expanded_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_1_sequence_1_tensor_expanded_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_1_sequence_expanded_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_2_sequences_expanded_cpu", - ), - ( - xfail_issue_33651, - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_batch_onlybigrams_skip5_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_onlybigrams_levelempty_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_batch_onlybigrams_skip0_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_uniandbigrams_skip5_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_only_bigrams_skip0_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_batch_uniandbigrams_skip5_cpu", - "OnnxBackendNodeModelTest.test_tfidfvectorizer_tf_onlybigrams_skip5_cpu", - ), - ( - xfail_issue_38706, - "OnnxBackendNodeModelTest.test_split_zero_size_splits_cpu", - ), - ( - xfail_issue_33581, - "OnnxBackendNodeModelTest.test_gather_elements_negative_indices_cpu", - ), - ( - xfail_issue_38713, - "OnnxBackendNodeModelTest.test_momentum_cpu", - "OnnxBackendNodeModelTest.test_nesterov_momentum_cpu", - "OnnxBackendNodeModelTest.test_momentum_multiple_cpu", - ), - ( - xfail_issue_73538, - "OnnxBackendNodeModelTest.test_onehot_negative_indices_cpu", - ), - ( - xfail_issue_33488, - "OnnxBackendNodeModelTest.test_maxunpool_export_with_output_shape_cpu", - "OnnxBackendNodeModelTest.test_maxunpool_export_without_output_shape_cpu", - ), - (xfail_issue_38724, "OnnxBackendNodeModelTest.test_resize_tf_crop_and_resize_cpu"), - ( - xfail_issue_33606, - "OnnxBackendNodeModelTest.test_det_2d_cpu", - "OnnxBackendNodeModelTest.test_det_nd_cpu", - ), - ( - xfail_issue_38734, - "OnnxBackendNodeModelTest.test_adam_multiple_cpu", - "OnnxBackendNodeModelTest.test_adam_cpu", - ), - ( - xfail_issue_38735, - "OnnxBackendNodeModelTest.test_adagrad_multiple_cpu", - "OnnxBackendNodeModelTest.test_adagrad_cpu", - ), - ( - xfail_issue_48052, - "OnnxBackendNodeModelTest.test_training_dropout_cpu", - "OnnxBackendNodeModelTest.test_training_dropout_mask_cpu", - "OnnxBackendNodeModelTest.test_training_dropout_default_cpu", - "OnnxBackendNodeModelTest.test_training_dropout_zero_ratio_cpu", - "OnnxBackendNodeModelTest.test_training_dropout_default_mask_cpu", - "OnnxBackendNodeModelTest.test_training_dropout_zero_ratio_mask_cpu", - ), - ( - xfail_issue_45180, - "OnnxBackendNodeModelTest.test_reduce_sum_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_do_not_keepdims_random_cpu", - ), - ( - xfail_issue_44858, - "OnnxBackendNodeModelTest.test_unsqueeze_axis_0_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_axis_1_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_axis_2_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_negative_axes_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_three_axes_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_two_axes_cpu", - "OnnxBackendNodeModelTest.test_unsqueeze_unsorted_axes_cpu", - ), - ( - xfail_issue_44965, - "OnnxBackendNodeModelTest.test_loop13_seq_cpu", - "OnnxBackendNodeModelTest.test_sequence_insert_at_back_cpu", - "OnnxBackendNodeModelTest.test_sequence_insert_at_front_cpu", - ), - (xfail_issue_58033, "OnnxBackendNodeModelTest.test_einsum_batch_diagonal_cpu"), - ( - xfail_issue_63033, - "OnnxBackendNodeModelTest.test_batchnorm_epsilon_training_mode_cpu", - "OnnxBackendNodeModelTest.test_batchnorm_example_training_mode_cpu", - ), - (xfail_issue_63036, "OnnxBackendNodeModelTest.test_convtranspose_autopad_same_cpu"), - ( - xfail_issue_63043, - "OnnxBackendNodeModelTest.test_gru_batchwise_cpu", - "OnnxBackendNodeModelTest.test_lstm_batchwise_cpu", - "OnnxBackendNodeModelTest.test_simple_rnn_batchwise_cpu", - ), - ( - xfail_issue_38710, - "OnnxBackendNodeModelTest.test_reshape_allowzero_reordered_cpu", - ), - ( - xfail_issue_91490, - "OnnxBackendNodeModelTest.test_tril_zero_cpu", - "OnnxBackendNodeModelTest.test_triu_zero_cpu", - ), - ( - skip_dynamic_model, - "OnnxBackendNodeModelTest.test_triu_one_row_cpu", - "OnnxBackendNodeModelTest.test_squeeze_cpu", - "OnnxBackendNodeModelTest.test_squeeze_negative_axes_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_negative_axes_hwc_expanded_cpu", - "OnnxBackendNodeModelTest.test_constant_pad_negative_axes_cpu", - ), - ( - skip_rng_tests, - "OnnxBackendNodeModelTest.test_bernoulli_cpu", - "OnnxBackendNodeModelTest.test_bernoulli_double_cpu", - "OnnxBackendNodeModelTest.test_bernoulli_double_expanded_cpu", - "OnnxBackendNodeModelTest.test_bernoulli_expanded_cpu", - "OnnxBackendNodeModelTest.test_bernoulli_seed_cpu", - "OnnxBackendNodeModelTest.test_bernoulli_seed_expanded_cpu", - ), - ( - xfail_issue_63137, - "OnnxBackendNodeModelTest.test_optional_get_element_cpu", - "OnnxBackendNodeModelTest.test_optional_get_element_sequence_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_cpu", - "OnnxBackendNodeModelTest.test_loop16_seq_none_cpu", # OptionalHasElement, SequenceInsert - ), - ( - xfail_issue_63138, - "OnnxBackendNodeModelTest.test_shape_end_1_cpu", - "OnnxBackendNodeModelTest.test_shape_end_negative_1_cpu", - "OnnxBackendNodeModelTest.test_shape_start_1_cpu", - "OnnxBackendNodeModelTest.test_shape_start_1_end_2_cpu", - "OnnxBackendNodeModelTest.test_shape_start_1_end_negative_1_cpu", - "OnnxBackendNodeModelTest.test_shape_start_negative_1_cpu", - ), - ( - xfail_issue_69444, - "OnnxBackendNodeModelTest.test_resize_downsample_scales_linear_align_corners_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_cubic_align_corners_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_cubic_A_n0p5_exclude_outside_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_cubic_A_n0p5_exclude_outside_cpu", - ), - ( - xfail_issue_78741, - "OnnxBackendNodeModelTest.test_compress_0_cpu", - "OnnxBackendNodeModelTest.test_compress_1_cpu", - "OnnxBackendNodeModelTest.test_compress_default_axis_cpu", - "OnnxBackendNodeModelTest.test_compress_negative_axis_cpu", - "OnnxBackendNodeModelTest.test_constant_pad_cpu", - "OnnxBackendNodeModelTest.test_constantofshape_float_ones_cpu", - "OnnxBackendNodeModelTest.test_constantofshape_int_shape_zero_cpu", - "OnnxBackendNodeModelTest.test_constantofshape_int_zeros_cpu", - "OnnxBackendNodeModelTest.test_edge_pad_cpu", - "OnnxBackendNodeModelTest.test_expand_dim_changed_cpu", - "OnnxBackendNodeModelTest.test_expand_dim_unchanged_cpu", - "OnnxBackendNodeModelTest.test_loop11_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_center_point_box_format_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_flipped_coordinates_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_identical_boxes_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_limit_output_size_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_single_box_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_suppress_by_IOU_and_scores_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_suppress_by_IOU_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_two_batches_cpu", - "OnnxBackendNodeModelTest.test_nonmaxsuppression_two_classes_cpu", - "OnnxBackendNodeModelTest.test_nonzero_example_cpu", - "OnnxBackendNodeModelTest.test_onehot_with_axis_cpu", - "OnnxBackendNodeModelTest.test_onehot_with_negative_axis_cpu", - "OnnxBackendNodeModelTest.test_onehot_without_axis_cpu", - "OnnxBackendNodeModelTest.test_range_float_type_positive_delta_cpu", - "OnnxBackendNodeModelTest.test_range_float_type_positive_delta_expanded_cpu", - "OnnxBackendNodeModelTest.test_range_int32_type_negative_delta_cpu", - "OnnxBackendNodeModelTest.test_range_int32_type_negative_delta_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reflect_pad_cpu", - "OnnxBackendNodeModelTest.test_reshape_extended_dims_cpu", - "OnnxBackendNodeModelTest.test_reshape_negative_dim_cpu", - "OnnxBackendNodeModelTest.test_reshape_negative_extended_dims_cpu", - "OnnxBackendNodeModelTest.test_reshape_one_dim_cpu", - "OnnxBackendNodeModelTest.test_reshape_reduced_dims_cpu", - "OnnxBackendNodeModelTest.test_reshape_reordered_all_dims_cpu", - "OnnxBackendNodeModelTest.test_reshape_reordered_last_dims_cpu", - "OnnxBackendNodeModelTest.test_reshape_zero_and_negative_dim_cpu", - "OnnxBackendNodeModelTest.test_reshape_zero_dim_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_cubic_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_linear_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_nearest_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_cubic_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_linear_pytorch_half_pixel_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_nearest_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_nearest_tf_half_pixel_for_nn_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_cubic_align_corners_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_cubic_asymmetric_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_cubic_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_linear_align_corners_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_linear_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_nearest_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_cubic_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_ceil_half_pixel_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_floor_align_corners_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_round_prefer_ceil_asymmetric_cpu", - "OnnxBackendNodeModelTest.test_slice_cpu", - "OnnxBackendNodeModelTest.test_slice_default_axes_cpu", - "OnnxBackendNodeModelTest.test_slice_default_steps_cpu", - "OnnxBackendNodeModelTest.test_slice_end_out_of_bounds_cpu", - "OnnxBackendNodeModelTest.test_slice_neg_cpu", - "OnnxBackendNodeModelTest.test_slice_neg_steps_cpu", - "OnnxBackendNodeModelTest.test_slice_negative_axes_cpu", - "OnnxBackendNodeModelTest.test_slice_start_out_of_bounds_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_1d_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_2d_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_default_axis_cpu", - "OnnxBackendNodeModelTest.test_tile_precomputed_cpu", - "OnnxBackendNodeModelTest.test_top_k_cpu", - "OnnxBackendNodeModelTest.test_top_k_negative_axis_cpu", - "OnnxBackendNodeModelTest.test_top_k_smallest_cpu", - "OnnxBackendNodeModelTest.test_upsample_nearest_cpu", - "OnnxBackendSimpleModelTest.test_expand_shape_model1_cpu", - "OnnxBackendSimpleModelTest.test_expand_shape_model2_cpu", - "OnnxBackendSimpleModelTest.test_expand_shape_model3_cpu", - "OnnxBackendSimpleModelTest.test_expand_shape_model4_cpu", - ), - ( - skip_segfault, - "OnnxBackendNodeModelTest.test_sce_NCd1d2d3d4d5_mean_weight_cpu", # ticket: 81976 - "OnnxBackendNodeModelTest.test_sce_NCd1d2d3d4d5_mean_weight_log_prob_cpu", # ticket: 81976 - "OnnxBackendNodeModelTest.test_sce_NCd1d2d3d4d5_none_no_weight_cpu", # ticket: 81976 - "OnnxBackendNodeModelTest.test_sce_NCd1d2d3d4d5_none_no_weight_log_prob_cpu", # ticket: 81976 - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis0_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis1_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis_negative_1_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis_negative_2_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis0_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis1_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis2_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis_negative_1_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis_negative_2_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis_negative_3_epsilon_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis0_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis1_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis2_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis3_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_1_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_2_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_3_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_4_cpu", # ticket: 90649 - "OnnxBackendNodeModelTest.test_layer_normalization_default_axis_cpu", # ticket: 90649 - ), - ( - xfail_issue_81976, # SoftmaxCrossEntropyLoss operator - "OnnxBackendNodeModelTest.test_sce_mean_3d_cpu", - "OnnxBackendNodeModelTest.test_sce_mean_3d_log_prob_cpu", - ), - ( - xfail_issue_82038, - "OnnxBackendNodeModelTest.test_scatternd_add_cpu", - "OnnxBackendNodeModelTest.test_scatternd_multiply_cpu", - ), - ( - xfail_issue_82039, - "OnnxBackendNodeModelTest.test_identity_opt_cpu", - ), - ( - xfail_issue_90649, - "OnnxBackendNodeModelTest.test_blackmanwindow_cpu", - "OnnxBackendNodeModelTest.test_blackmanwindow_symmetric_cpu", - "OnnxBackendNodeModelTest.test_hammingwindow_cpu", - "OnnxBackendNodeModelTest.test_hammingwindow_symmetric_cpu", - "OnnxBackendNodeModelTest.test_hannwindow_cpu", - "OnnxBackendNodeModelTest.test_hannwindow_symmetric_cpu", - "OnnxBackendNodeModelTest.test_melweightmatrix_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_add_1_sequence_1_tensor_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_add_2_sequences_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_extract_shapes_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_1_sequence_1_tensor_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_1_sequence_cpu", - "OnnxBackendNodeModelTest.test_sequence_map_identity_2_sequences_cpu", - "OnnxBackendNodeModelTest.test_stft_cpu", - "OnnxBackendNodeModelTest.test_stft_with_window_cpu", - ), - ( - skip_issue_91151, - "OnnxBackendNodeModelTest.test_castlike_BFLOAT16_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_BFLOAT16_cpu", - ), - ( - xfail_issue_101965, - "OnnxBackendNodeModelTest.test_dft_axis_cpu", - "OnnxBackendNodeModelTest.test_dft_cpu", - "OnnxBackendNodeModelTest.test_dft_inverse_cpu", - ), - ( - xfail_unsupported_by_legacy_api, - "OnnxBackendNodeModelTest.test_blackmanwindow_expanded_cpu", - "OnnxBackendNodeModelTest.test_blackmanwindow_symmetric_expanded_cpu", - "OnnxBackendNodeModelTest.test_hammingwindow_expanded_cpu", - "OnnxBackendNodeModelTest.test_hammingwindow_symmetric_expanded_cpu", - "OnnxBackendNodeModelTest.test_hannwindow_expanded_cpu", - "OnnxBackendNodeModelTest.test_hannwindow_symmetric_expanded_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_and_pad_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_keep_dims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_keep_dims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_expanded_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_pad_expanded_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_1d_opset13_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_1d_opset18_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_2d_opset13_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_2d_opset18_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_default_axis_opset13_cpu", - "OnnxBackendNodeModelTest.test_split_variable_parts_default_axis_opset18_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_keep_dims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_keep_dims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_negative_axes_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_random_expanded_cpu", - ), - ( - skip_bitwise_ui64, - "OnnxBackendNodeModelTest.test_bitwise_and_ui64_bcast_3v1d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_or_ui64_bcast_3v1d_cpu", - ), - ( - xfail_issue_99949, - "OnnxBackendNodeModelTest.test_bitwise_not_2d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_not_3d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_not_4d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_xor_ui8_bcast_4v3d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_xor_i16_3d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_xor_i32_2d_cpu", - "OnnxBackendNodeModelTest.test_bitwise_xor_ui64_bcast_3v1d_cpu", - ), - ( - xfail_issue_99950, - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_and_pad_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_axes_chw_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_axes_chw_expanded_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_axes_hwc_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_axes_hwc_expanded_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_pad_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_negative_axes_hwc_cpu", - "OnnxBackendNodeModelTest.test_center_crop_pad_crop_negative_axes_hwc_expanded_cpu", - ), - ( - xfail_issue_99952, - "OnnxBackendNodeModelTest.test_col2im_5d_cpu", - "OnnxBackendNodeModelTest.test_col2im_cpu", - "OnnxBackendNodeModelTest.test_col2im_dilations_cpu", - "OnnxBackendNodeModelTest.test_col2im_pads_cpu", - "OnnxBackendNodeModelTest.test_col2im_strides_cpu", - ), - ( - xfail_issue_99954, - "OnnxBackendNodeModelTest.test_constant_pad_axes_cpu", - ), - ( - xfail_issue_99955, - "OnnxBackendNodeModelTest.test_group_normalization_epsilon_expanded_cpu", - "OnnxBackendNodeModelTest.test_group_normalization_example_expanded_cpu", - ), - ( - xfail_issue_99957, - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis1_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_2d_axis_negative_1_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis1_epsilon_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis2_epsilon_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis_negative_1_epsilon_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_3d_axis_negative_2_epsilon_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis1_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis2_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis3_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_1_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_2_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_4d_axis_negative_3_expanded_ver18_cpu", - "OnnxBackendNodeModelTest.test_layer_normalization_default_axis_expanded_ver18_cpu", - ), - ( - xfail_issue_99958, - "OnnxBackendNodeModelTest.test_logsoftmax_large_number_expanded_ver18_cpu", - ), - ( - xfail_issue_99959, - "OnnxBackendNodeModelTest.test_mish_cpu", - ), - ( - xfail_issue_99960, - "OnnxBackendNodeModelTest.test_mvn_expanded_ver18_cpu", - ), - ( - xfail_issue_99961, - "OnnxBackendNodeModelTest.test_optional_get_element_optional_sequence_cpu", - "OnnxBackendNodeModelTest.test_optional_get_element_optional_tensor_cpu", - "OnnxBackendNodeModelTest.test_optional_get_element_tensor_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_no_input_name_optional_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_no_input_name_tensor_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_no_input_optional_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_no_input_tensor_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_empty_optional_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_optional_input_cpu", - "OnnxBackendNodeModelTest.test_optional_has_element_tensor_input_cpu", - ), - ( - xfail_issue_99968, - "OnnxBackendNodeModelTest.test_reduce_l1_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_do_not_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_do_not_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_keep_dims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_keep_dims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_negative_axes_keep_dims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_negative_axes_keep_dims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_do_not_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_do_not_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_keep_dims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_keep_dims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_negative_axes_keep_dims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_negative_axes_keep_dims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_asc_axes_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_asc_axes_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_desc_axes_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_desc_axes_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_do_not_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_do_not_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_negative_axes_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_max_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_mean_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_do_not_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_example_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_random_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_negative_axes_keep_dims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l1_negative_axes_keep_dims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_negative_axes_keep_dims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_negative_axes_keep_dims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_negative_axes_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_negative_axes_keepdims_random_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_example_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_negative_axes_keepdims_random_expanded_cpu", - ), - ( - xfail_issue_99969, - "OnnxBackendNodeModelTest.test_resize_downsample_scales_cubic_antialias_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_scales_linear_antialias_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_cubic_antialias_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_linear_antialias_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_nearest_not_smaller_cpu", - "OnnxBackendNodeModelTest.test_resize_downsample_sizes_nearest_not_larger_cpu", - "OnnxBackendNodeModelTest.test_resize_tf_crop_and_resize_axes_2_3_cpu", - "OnnxBackendNodeModelTest.test_resize_tf_crop_and_resize_axes_3_2_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_nearest_axes_2_3_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_nearest_axes_3_2_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_axes_2_3_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_axes_3_2_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_sizes_nearest_not_larger_cpu", - ), - ( - xfail_issue_99970, - "OnnxBackendNodeModelTest.test_scatternd_max_cpu", - "OnnxBackendNodeModelTest.test_scatternd_min_cpu", - ), - ( - xfail_issue_99972, - "OnnxBackendNodeModelTest.test_softmax_large_number_expanded_ver18_cpu", - ), - ( - xfail_issue_99973, - "OnnxBackendNodeModelTest.test_split_1d_uneven_split_opset18_cpu", - "OnnxBackendNodeModelTest.test_split_2d_uneven_split_opset18_cpu", - "OnnxBackendNodeModelTest.test_split_zero_size_splits_opset13_cpu", - "OnnxBackendNodeModelTest.test_split_zero_size_splits_opset18_cpu", - ), - ( - xfail_issue_113506, - "OnnxBackendNodeModelTest.test_lstm_with_peepholes_cpu", - ), - ( - xfail_issue_119896, - "OnnxBackendNodeModelTest.test_cast_FLOAT16_to_FLOAT8E4M3FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT16_to_FLOAT8E4M3FN_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT16_to_FLOAT8E5M2FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT16_to_FLOAT8E5M2_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E4M3FNUZ_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E4M3FNUZ_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E4M3FN_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E4M3FN_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E5M2FNUZ_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E5M2FNUZ_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E5M2_to_FLOAT16_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT8E5M2_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT_to_FLOAT8E4M3FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT_to_FLOAT8E4M3FN_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT_to_FLOAT8E5M2FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_FLOAT_to_FLOAT8E5M2_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT16_to_FLOAT8E4M3FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT16_to_FLOAT8E4M3FN_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT16_to_FLOAT8E5M2FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT16_to_FLOAT8E5M2_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT_to_FLOAT8E4M3FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT_to_FLOAT8E4M3FN_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT_to_FLOAT8E5M2FNUZ_cpu", - "OnnxBackendNodeModelTest.test_cast_no_saturate_FLOAT_to_FLOAT8E5M2_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E4M3FNUZ_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E4M3FNUZ_to_FLOAT_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E4M3FN_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E4M3FN_to_FLOAT_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E5M2FNUZ_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E5M2FNUZ_to_FLOAT_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E5M2_to_FLOAT_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT8E5M2_to_FLOAT_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E4M3FNUZ_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E4M3FNUZ_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E4M3FN_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E4M3FN_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E5M2FNUZ_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E5M2FNUZ_expanded_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E5M2_cpu", - "OnnxBackendNodeModelTest.test_castlike_FLOAT_to_FLOAT8E5M2_expanded_cpu", - "OnnxBackendNodeModelTest.test_dequantizelinear_e4m3fn_cpu", - "OnnxBackendNodeModelTest.test_dequantizelinear_e5m2_cpu", - "OnnxBackendNodeModelTest.test_quantizelinear_e4m3fn_cpu", - "OnnxBackendNodeModelTest.test_quantizelinear_e5m2_cpu", - "OnnxBackendNodeModelTest.test_dequantizelinear_e4m3fn_float16_cpu", - "OnnxBackendNodeModelTest.test_dequantizelinear_e4m3fn_zero_point_cpu", - ), - ( - xfail_issue_119900, - "OnnxBackendNodeModelTest.test_resize_downsample_scales_linear_half_pixel_symmetric_cpu", - "OnnxBackendNodeModelTest.test_resize_upsample_scales_linear_half_pixel_symmetric_cpu", - ), - ( - xfail_issue_119903, - "OnnxBackendNodeModelTest.test_basic_deform_conv_with_padding_cpu", - "OnnxBackendNodeModelTest.test_basic_deform_conv_without_padding_cpu", - "OnnxBackendNodeModelTest.test_deform_conv_with_mask_bias_cpu", - "OnnxBackendNodeModelTest.test_deform_conv_with_multiple_offset_groups_cpu", - ), - ( - xfail_issue_119906, - "OnnxBackendNodeModelTest.test_lppool_1d_default_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_default_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_dilations_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_pads_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_same_lower_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_same_upper_cpu", - "OnnxBackendNodeModelTest.test_lppool_2d_strides_cpu", - "OnnxBackendNodeModelTest.test_lppool_3d_default_cpu", - ), - ( - xfail_issue_119919, - "OnnxBackendNodeModelTest.test_wrap_pad_cpu", - ), - ( - xfail_issue_119922, - "OnnxBackendNodeModelTest.test_ai_onnx_ml_array_feature_extractor_cpu", - "OnnxBackendNodeModelTest.test_ai_onnx_ml_binarizer_cpu", - "OnnxBackendNodeModelTest.test_ai_onnx_ml_label_encoder_string_int_cpu", - "OnnxBackendNodeModelTest.test_ai_onnx_ml_label_encoder_string_int_no_default_cpu", - "OnnxBackendNodeModelTest.test_ai_onnx_ml_label_encoder_tensor_mapping_cpu", - "OnnxBackendNodeModelTest.test_ai_onnx_ml_label_encoder_tensor_value_only_mapping_cpu", - ), - ( - xfail_issue_119925, - "OnnxBackendNodeModelTest.test_averagepool_2d_dilations_cpu", - ), - ( - xfail_issue_119926, - "OnnxBackendNodeModelTest.test_roialign_mode_max_cpu", - ), - ( - xfail_issue_125485, - "OnnxBackendNodeModelTest.test_affine_grid_2d_align_corners_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_2d_align_corners_expanded_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_2d_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_2d_expanded_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_3d_align_corners_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_3d_align_corners_expanded_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_3d_cpu", - "OnnxBackendNodeModelTest.test_affine_grid_3d_expanded_cpu", - ), - ( - xfail_issue_125486, - "OnnxBackendNodeModelTest.test_gelu_default_1_cpu", - "OnnxBackendNodeModelTest.test_gelu_default_2_cpu", - "OnnxBackendNodeModelTest.test_gelu_tanh_1_cpu", - "OnnxBackendNodeModelTest.test_gelu_tanh_2_cpu", - ), - ( - xfail_issue_125488, - "OnnxBackendNodeModelTest.test_image_decoder_decode_bmp_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_jpeg2k_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_jpeg_bgr_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_jpeg_grayscale_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_jpeg_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_png_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_pnm_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_tiff_rgb_cpu", - "OnnxBackendNodeModelTest.test_image_decoder_decode_webp_rgb_cpu", - ), - ( - xfail_issue_125487, - "OnnxBackendNodeModelTest.test_gridsample_aligncorners_true_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bicubic_align_corners_0_additional_1_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bicubic_align_corners_1_additional_1_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bicubic_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bilinear_align_corners_0_additional_1_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bilinear_align_corners_1_additional_1_cpu", - "OnnxBackendNodeModelTest.test_gridsample_bilinear_cpu", - "OnnxBackendNodeModelTest.test_gridsample_cpu", - "OnnxBackendNodeModelTest.test_gridsample_volumetric_bilinear_align_corners_0_cpu", - "OnnxBackendNodeModelTest.test_gridsample_volumetric_bilinear_align_corners_1_cpu", - "OnnxBackendNodeModelTest.test_gridsample_volumetric_nearest_align_corners_0_cpu", - "OnnxBackendNodeModelTest.test_gridsample_volumetric_nearest_align_corners_1_cpu", - ), - ( - skip_issue_125489, - "OnnxBackendNodeModelTest.test_isinf_float16_cpu", - ), - ( - xfail_issue_125491, - "OnnxBackendNodeModelTest.test_averagepool_3d_dilations_large_count_include_pad_is_0_ceil_mode_is_False_cpu", - "OnnxBackendNodeModelTest.test_averagepool_3d_dilations_large_count_include_pad_is_0_ceil_mode_is_True_cpu", - "OnnxBackendNodeModelTest.test_averagepool_3d_dilations_large_count_include_pad_is_1_ceil_mode_is_False_cpu", - "OnnxBackendNodeModelTest.test_averagepool_3d_dilations_large_count_include_pad_is_1_ceil_mode_is_True_cpu", - "OnnxBackendNodeModelTest.test_averagepool_3d_dilations_small_cpu", - ), - ( - xfail_issue_125492, - "OnnxBackendNodeModelTest.test_dft_axis_opset19_cpu", - "OnnxBackendNodeModelTest.test_dft_inverse_opset19_cpu", - "OnnxBackendNodeModelTest.test_dft_opset19_cpu", - ), - ( - xfail_issue_125493, - "OnnxBackendNodeModelTest.test_reduce_l1_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_prod_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_empty_set_cpu", - ), - ( - xfail_issue_125495, - "OnnxBackendNodeModelTest.test_reduce_max_bool_inputs_cpu", - "OnnxBackendNodeModelTest.test_reduce_min_bool_inputs_cpu", - ), - ( - xfail_issue_127812, - "OnnxBackendNodeModelTest.test_reduce_l1_empty_set_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_l2_empty_set_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_empty_set_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_empty_set_non_reduced_axis_zero_cpu", - "OnnxBackendNodeModelTest.test_reduce_sum_square_empty_set_expanded_cpu", - ), - ( - skip_misalignment, - "OnnxBackendNodeModelTest.test_gelu_default_2_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_empty_set_expanded_cpu", - "OnnxBackendNodeModelTest.test_reduce_log_sum_exp_empty_set_expanded_cpu", - ), -] - -for test_group in tests_expected_to_fail: - for test_case in test_group[1:]: - expect_fail("{}".format(test_case), test_group[0]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_onnx_external_data.py b/src/bindings/python/tests_compatibility/test_onnx/test_onnx_external_data.py deleted file mode 100644 index 025c438fedf..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_onnx_external_data.py +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import platform -import os - -import numpy as np -import ngraph as ng -import pytest -from openvino.inference_engine import IECore - -from tests_compatibility.runtime import get_runtime - - -@pytest.mark.xfail(condition=platform.system() == 'Darwin' and platform.machine() == 'arm64', - reason='Ticket - 122712') -def test_import_onnx_with_external_data(): - model_path = os.path.join(os.path.dirname(__file__), "models/external_data.onnx") - ie = IECore() - ie_network = ie.read_network(model=model_path) - - ng_function = ng.function_from_cnn(ie_network) - - dtype = np.float32 - value_a = np.array([1.0, 3.0, 5.0], dtype=dtype) - value_b = np.array([3.0, 5.0, 1.0], dtype=dtype) - # third input [5.0, 1.0, 3.0] read from external file - - runtime = get_runtime() - computation = runtime.computation(ng_function) - result = computation(value_a, value_b) - assert np.allclose(result, np.array([3.0, 3.0, 3.0], dtype=dtype)) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_onnx_import.py b/src/bindings/python/tests_compatibility/test_onnx/test_onnx_import.py deleted file mode 100644 index 7fe63152a70..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_onnx_import.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import os - -import numpy as np -import ngraph as ng -import onnx -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info -from openvino.inference_engine import IECore - -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils.onnx_helpers import import_onnx_model - - -def test_import_onnx_function(): - model_path = os.path.join(os.path.dirname(__file__), "models/add_abc.onnx") - ie = IECore() - ie_network = ie.read_network(model=model_path) - - ng_function = ng.function_from_cnn(ie_network) - - dtype = np.float32 - value_a = np.array([1.0], dtype=dtype) - value_b = np.array([2.0], dtype=dtype) - value_c = np.array([3.0], dtype=dtype) - - runtime = get_runtime() - computation = runtime.computation(ng_function) - result = computation(value_a, value_b, value_c) - assert np.allclose(result, np.array([6], dtype=dtype)) - - -def test_simple_graph(): - node1 = make_node("Add", ["A", "B"], ["X"], name="add_node1") - node2 = make_node("Add", ["X", "C"], ["Y"], name="add_node2") - graph = make_graph( - [node1, node2], - "test_graph", - [ - make_tensor_value_info("A", onnx.TensorProto.FLOAT, [1]), - make_tensor_value_info("B", onnx.TensorProto.FLOAT, [1]), - make_tensor_value_info("C", onnx.TensorProto.FLOAT, [1]), - ], - [make_tensor_value_info("Y", onnx.TensorProto.FLOAT, [1])], - ) - model = make_model(graph, producer_name="ngraph ONNX Importer") - - ng_model_function = import_onnx_model(model) - - runtime = get_runtime() - computation = runtime.computation(ng_model_function) - assert np.array_equal(computation(1, 2, 3)[0], np.array([6.0], dtype=np.float32)) - assert np.array_equal(computation(4, 5, 6)[0], np.array([15.0], dtype=np.float32)) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_batchnorm.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_batchnorm.py deleted file mode 100644 index e9e610c8eac..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_batchnorm.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx - -from tests_compatibility.test_onnx.utils import run_node - - -def make_batch_norm_node(**node_attributes): - return onnx.helper.make_node( - "BatchNormalization", inputs=["X", "scale", "B", "mean", "var"], outputs=["Y"], **node_attributes - ) - - -def test_batch_norm_test_node(): - data = np.arange(48).reshape((1, 3, 4, 4)).astype(np.float32) - scale = np.ones((3,)).astype(np.float32) # Gamma - bias = np.zeros((3,)).astype(np.float32) # Beta - mean = np.mean(data, axis=(0, 2, 3)) - var = np.var(data, axis=(0, 2, 3)) - - expected_output = np.array( - [ - [ - [ - [-1.62694025, -1.41001487, -1.19308949, -0.97616416], - [-0.75923878, -0.54231346, -0.32538807, -0.10846269], - [0.10846269, 0.32538807, 0.54231334, 0.75923872], - [0.9761641, 1.19308949, 1.41001487, 1.62694025], - ], - [ - [-1.62694049, -1.41001511, -1.19308972, -0.97616434], - [-0.7592392, -0.54231358, -0.32538843, -0.10846281], - [0.10846233, 0.32538795, 0.5423131, 0.75923872], - [0.97616386, 1.19308949, 1.41001463, 1.62694025], - ], - [ - [-1.62694025, -1.41001511, -1.19308949, -0.97616434], - [-0.75923872, -0.54231358, -0.32538795, -0.10846233], - [0.10846233, 0.32538795, 0.54231358, 0.7592392], - [0.97616386, 1.19308949, 1.41001511, 1.62694073], - ], - ] - ], - dtype=np.float32, - ) - - node = make_batch_norm_node() - result = run_node(node, [data, scale, bias, mean, var])[0] - assert np.allclose(result, expected_output, rtol=1e-04, atol=1e-08) - - scale = np.broadcast_to(0.1, (3,)).astype(np.float32) # Gamma - bias = np.broadcast_to(1, (3,)).astype(np.float32) # Beta - - expected_output = np.array( - [ - [ - [ - [0.83730596, 0.85899848, 0.88069105, 0.90238357], - [0.92407608, 0.94576865, 0.96746117, 0.98915374], - [1.01084626, 1.03253877, 1.05423129, 1.07592392], - [1.09761643, 1.11930895, 1.14100146, 1.16269398], - ], - [ - [0.83730596, 0.85899854, 0.88069105, 0.90238357], - [0.92407608, 0.94576865, 0.96746117, 0.98915374], - [1.01084626, 1.03253877, 1.05423141, 1.07592392], - [1.09761643, 1.11930895, 1.14100146, 1.16269398], - ], - [ - [0.83730596, 0.85899848, 0.88069105, 0.90238357], - [0.92407614, 0.94576865, 0.96746117, 0.98915374], - [1.01084626, 1.03253877, 1.05423141, 1.07592392], - [1.09761643, 1.11930895, 1.14100146, 1.16269398], - ], - ] - ], - dtype=np.float32, - ) - - node = make_batch_norm_node() - result = run_node(node, [data, scale, bias, mean, var])[0] - assert np.allclose(result, expected_output, rtol=1e-04, atol=1e-08) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_binary.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_binary.py deleted file mode 100644 index 437a2ac44a1..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_binary.py +++ /dev/null @@ -1,136 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import pytest -from onnx.helper import make_graph, make_model, make_tensor_value_info - -from tests_compatibility.test_onnx.utils import run_model - - -def import_and_compute(op_type, input_data_left, input_data_right, opset=7, **node_attributes): - inputs = [np.array(input_data_left), np.array(input_data_right)] - onnx_node = onnx.helper.make_node(op_type, inputs=["x", "y"], outputs=["z"], **node_attributes) - - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, value.shape) - for name, value in zip(onnx_node.input, inputs) - ] - output_tensors = [make_tensor_value_info(name, onnx.TensorProto.FLOAT, ()) for name in onnx_node.output] - - graph = make_graph([onnx_node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="ngraph ONNX Importer") - model.opset_import[0].version = opset - return run_model(model, inputs)[0] - - -def test_add_opset4(): - assert np.array_equal(import_and_compute("Add", 1, 2, opset=4), np.array(3, dtype=np.float32)) - - assert np.array_equal(import_and_compute("Add", [1], [2], opset=4), np.array([3], dtype=np.float32)) - - assert np.array_equal( - import_and_compute("Add", [1, 2], [3, 4], opset=4), np.array([4, 6], dtype=np.float32) - ) - - assert np.array_equal( - import_and_compute("Add", [1, 2, 3], [4, 5, 6], opset=4), np.array([5, 7, 9], dtype=np.float32) - ) - - assert np.array_equal( - import_and_compute("Add", [[1, 2, 3], [4, 5, 6]], [7, 8, 9], broadcast=1, opset=4), - np.array([[8, 10, 12], [11, 13, 15]], dtype=np.float32), - ) - - # shape(A) = (2, 3, 4, 5), shape(B) = (,), i.e. B is a scalar - left_operand = np.ones((2, 3, 4, 5)).astype(np.float32) - assert np.array_equal(import_and_compute("Add", left_operand, 8, broadcast=1, opset=4), left_operand + 8) - - # shape(A) = (2, 3, 4, 5), shape(B) = (5,) - left_operand = np.ones((2, 3, 4, 5), dtype=np.float32) - right_operand = np.random.rand(5).astype(np.float32) - import_and_compute("Add", left_operand, right_operand, broadcast=1, opset=4) - - # shape(A) = (2, 3, 4, 5), shape(B) = (4, 5) - left_operand = np.ones((2, 3, 4, 5), dtype=np.float32) - right_operand = np.random.rand(4, 5).astype(np.float32) - assert np.array_equal( - import_and_compute("Add", left_operand, right_operand, broadcast=1, opset=4), - left_operand + right_operand, - ) - - # shape(A) = (2, 3, 4, 5), shape(B) = (3, 4), with axis=1 - left_operand = np.ones((2, 3, 4, 5), dtype=np.float32) - right_operand = np.random.rand(3, 4).astype(np.float32) - assert np.array_equal( - import_and_compute("Add", left_operand, right_operand, broadcast=1, axis=1, opset=4), - left_operand + right_operand.reshape(1, 3, 4, 1), - ) - - # shape(A) = (2, 3, 4, 5), shape(B) = (2), with axis=0 - left_operand = np.ones((2, 3, 4, 5), dtype=np.float32) - right_operand = np.random.rand(2).astype(np.float32) - assert np.array_equal( - import_and_compute("Add", left_operand, right_operand, broadcast=1, axis=0, opset=4), - left_operand + right_operand.reshape(2, 1, 1, 1), - ) - - -@pytest.mark.parametrize( - "left_shape,right_shape", - [ - ((1,), (1,)), - ((256, 256, 3), (3,)), - ((5, 4), (1,)), - ((5, 4), (4,)), - ((15, 3, 5), (3, 5)), - ((15, 3, 5), (15, 1, 5)), - ((15, 3, 5), (3, 1)), - ((8, 1, 6, 1), (7, 1, 5)), - ], -) -def test_add_opset7(left_shape, right_shape): - """Test Add-7 operator, which uses numpy-style broadcasting.""" - left_input = np.ones(left_shape) - right_input = np.ones(right_shape) - assert np.array_equal(import_and_compute("Add", left_input, right_input), left_input + right_input) - - -def test_sub(): - assert np.array_equal(import_and_compute("Sub", 20, 1), np.array(19, dtype=np.float32)) - - assert np.array_equal(import_and_compute("Sub", [20], [1]), np.array([19], dtype=np.float32)) - - assert np.array_equal(import_and_compute("Sub", [20, 19], [1, 2]), np.array([19, 17], dtype=np.float32)) - - assert np.array_equal( - import_and_compute("Sub", [[1, 2, 3], [4, 5, 6]], [7, 8, 9], opset=6, broadcast=1), - np.array([[-6, -6, -6], [-3, -3, -3]], dtype=np.float32), - ) - - -def test_mul(): - assert np.array_equal(import_and_compute("Mul", 2, 3), np.array(6, dtype=np.float32)) - - assert np.array_equal(import_and_compute("Mul", [2], [3]), np.array([6], dtype=np.float32)) - - assert np.array_equal(import_and_compute("Mul", [2, 3], [4, 5]), np.array([8, 15], dtype=np.float32)) - - assert np.array_equal( - import_and_compute("Mul", [[1, 2, 3], [4, 5, 6]], [7, 8, 9], opset=6, broadcast=1), - np.array([[7, 16, 27], [28, 40, 54]], dtype=np.float32), - ) - - -def test_div(): - assert np.array_equal(import_and_compute("Div", 6, 3), np.array(2, dtype=np.float32)) - - assert np.array_equal(import_and_compute("Div", [6], [3]), np.array([2], dtype=np.float32)) - - assert np.array_equal(import_and_compute("Div", [6, 8], [3, 2]), np.array([2, 4], dtype=np.float32)) - - assert np.array_equal( - import_and_compute("Div", [[10, 20, 30], [40, 50, 60]], [2, 5, 6], opset=6, broadcast=1), - np.array([[5, 4, 5], [20, 10, 10]], dtype=np.float32), - ) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_convpool.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_convpool.py deleted file mode 100644 index 5e43a10a152..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_convpool.py +++ /dev/null @@ -1,402 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import pytest -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info -from onnx.onnx_cpp2py_export.checker import ValidationError - -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils import get_node_model, import_onnx_model, run_model, run_node - - -@pytest.fixture -def ndarray_1x1x4x4(): - return np.array( - [[11, 12, 13, 14], [15, 16, 17, 18], [19, 20, 21, 22], [23, 24, 25, 26]], dtype=np.float32 - ).reshape([1, 1, 4, 4]) - - -def make_onnx_model_for_conv_op(x_shape, weights_shape, transpose=False, **attributes): - output_shape = () # We don't need output shape to be accurate for these tests - - if transpose: - node_op = "ConvTranspose" - else: - node_op = "Conv" - - node = make_node(node_op, ["X", "weight"], ["Y"], name="test_node", **attributes) - graph = make_graph( - [node], - "test_graph", - [ - make_tensor_value_info("X", onnx.TensorProto.FLOAT, x_shape), - make_tensor_value_info("weight", onnx.TensorProto.FLOAT, weights_shape), - ], - [make_tensor_value_info("Y", onnx.TensorProto.FLOAT, output_shape)], - ) - model = make_model(graph, producer_name="ngraph ONNXImporter") - return model - - -def import_and_compute_conv(x, weights, transpose=False, **attributes): - x, weights = np.array(x), np.array(weights) - onnx_model = make_onnx_model_for_conv_op(x.shape, weights.shape, transpose=transpose, **attributes) - ng_model_function = import_onnx_model(onnx_model) - computation = get_runtime().computation(ng_model_function) - return computation(x, weights)[0] - - -def test_2d_conv(): - # x should have shape N(batch) x C x H x W - input_x = np.array( - [ - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - ], - dtype=np.float32, - ).reshape(1, 1, 9, 9) - - # filter weights should have shape M x C x kH x kW - input_filter = np.array([[1.0, 0.0, -1.0], [2.0, 0.0, -2.0], [1.0, 0.0, -1.0]], dtype=np.float32).reshape( - [1, 1, 3, 3] - ) - - # convolution with padding=1 should produce 9 x 9 output: - result = import_and_compute_conv(input_x, input_filter, pads=(1, 1, 1, 1), strides=(1, 1)) - assert np.array_equal( - result, - np.array( - [ - [ - [ - [0.0, -15.0, -15.0, 15.0, 15.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -15.0, -15.0, 15.0, 15.0, 0.0, 0.0, 0.0, 0.0], - ] - ] - ], - dtype=np.float32, - ), - ) - - # convolution with padding=0 should produce 7 x 7 output: - result = import_and_compute_conv(input_x, input_filter, pads=(0, 0, 0, 0), strides=(1, 1)) - assert np.array_equal( - result, - np.array( - [ - [ - [ - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - [-20, -20, 20, 20, 0, 0, 0], - ] - ] - ], - dtype=np.float32, - ), - ) - - # convolution with strides=2 should produce 4 x 4 output: - result = import_and_compute_conv(input_x, input_filter, pads=(0, 0, 0, 0), strides=(2, 2)) - assert np.array_equal( - result, - np.array( - [ - [ - [ - [-20.0, 20.0, 0.0, 0.0], - [-20.0, 20.0, 0.0, 0.0], - [-20.0, 20.0, 0.0, 0.0], - [-20.0, 20.0, 0.0, 0.0], - ] - ] - ], - dtype=np.float32, - ), - ) - - # convolution with dilations=2 should produce 5 x 5 output: - result = import_and_compute_conv(input_x, input_filter, dilations=(2, 2)) - assert np.array_equal( - result, - np.array( - [ - [ - [ - [0, 0, 20, 20, 0], - [0, 0, 20, 20, 0], - [0, 0, 20, 20, 0], - [0, 0, 20, 20, 0], - [0, 0, 20, 20, 0], - ] - ] - ], - dtype=np.float32, - ), - ) - - -def test_3d_conv(): - # x should have shape N(batch) x C x H x W x D - input_x = np.array( - [ - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - [0.0, 0.0, 5.0, 5.0, 0.0, 0.0, 0.0, 0.0, 0.0], - ], - dtype=np.float32, - ).reshape([1, 1, 9, 9, 1]) - input_x = np.broadcast_to(input_x, (1, 1, 9, 9, 4)) - - # filter weights should have shape M x C x kH x kW x kD - input_filter = np.array([[1.0, 0.0, -1.0], [2.0, 0.0, -2.0], [1.0, 0.0, -1.0]], dtype=np.float32).reshape( - [1, 1, 3, 3, 1] - ) - input_filter = np.broadcast_to(input_filter, (1, 1, 3, 3, 3)) - - # convolution with padding=0 should produce 7 x 7 x 2 output: - result = import_and_compute_conv( - input_x, input_filter, dilations=(1, 1, 1), pads=(0, 0, 0, 0, 0, 0), strides=(1, 1, 1) - ) - - assert np.array_equal( - np.moveaxis(result.squeeze(), (0, 1, 2), (1, 2, 0)), - np.array( - [ - [ - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - ], - [ - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - [-60.0, -60.0, 60.0, 60.0, 0.0, 0.0, 0.0], - ], - ], - dtype=np.float32, - ), - ) - - -def test_2d_conv_transpose(): - # x should have shape N(batch) x C x H x W - input_x = np.array( - [ - [0.0, -15.0, -15.0, 15.0, 15.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -20.0, -20.0, 20.0, 20.0, 0.0, 0.0, 0.0, 0.0], - [0.0, -15.0, -15.0, 15.0, 15.0, 0.0, 0.0, 0.0, 0.0], - ], - dtype=np.float32, - ).reshape([1, 1, 9, 9]) - - # filter weights should have shape M x C x kH x kW - input_filter = np.array([[1.0, 0.0, -1.0], [2.0, 0.0, -2.0], [1.0, 0.0, -1.0]], dtype=np.float32).reshape( - [1, 1, 3, 3] - ) - - # deconvolution with padding=1 should produce 9 x 9 output: - result = import_and_compute_conv(input_x, input_filter, transpose=True, pads=(1, 1, 1, 1), strides=(1, 1)) - - assert np.array_equal( - result.reshape([9, 9]), - np.array( - [ - [-50.0, -50.0, 100.0, 100.0, -50.0, -50.0, 0.0, 0.0, 0.0], - [-75.0, -75.0, 150.0, 150.0, -75.0, -75.0, 0.0, 0.0, 0.0], - [-80.0, -80.0, 160.0, 160.0, -80.0, -80.0, 0.0, 0.0, 0.0], - [-80.0, -80.0, 160.0, 160.0, -80.0, -80.0, 0.0, 0.0, 0.0], - [-80.0, -80.0, 160.0, 160.0, -80.0, -80.0, 0.0, 0.0, 0.0], - [-80.0, -80.0, 160.0, 160.0, -80.0, -80.0, 0.0, 0.0, 0.0], - [-80.0, -80.0, 160.0, 160.0, -80.0, -80.0, 0.0, 0.0, 0.0], - [-75.0, -75.0, 150.0, 150.0, -75.0, -75.0, 0.0, 0.0, 0.0], - [-50.0, -50.0, 100.0, 100.0, -50.0, -50.0, 0.0, 0.0, 0.0], - ], - dtype=np.float32, - ), - ) - - -def test_pad_opset_1(): - x = np.ones((2, 2), dtype=np.float32) - y = np.pad(x, pad_width=1, mode="constant") - - model = get_node_model("Pad", x, paddings=[1, 1, 1, 1]) - ng_results = run_model(model, [x]) - assert np.array_equal(ng_results, [y]) - - x = np.random.randn(1, 3, 4, 5).astype(np.float32) - y = np.pad(x, pad_width=((0, 0), (0, 0), (1, 2), (3, 4)), mode="constant") - - model = get_node_model("Pad", x, mode="constant", paddings=[0, 0, 1, 3, 0, 0, 2, 4]) - ng_results = run_model(model, [x]) - assert np.array_equal(ng_results, [y]) - - # incorrect paddings rank - x = np.ones((2, 2), dtype=np.float32) - model = get_node_model("Pad", x, paddings=[0, 1, 1, 3, 1, 2]) - with pytest.raises(RuntimeError): - run_model(model, [x]) - - # no paddings arttribute - model = get_node_model("Pad", x) - with pytest.raises(ValidationError): - import_onnx_model(model) - - -def test_pad_opset_2(): - x = np.ones((2, 2), dtype=np.float32) - y = np.pad(x, pad_width=1, mode="constant") - - model = get_node_model("Pad", x, opset=2, pads=[1, 1, 1, 1]) - ng_results = run_model(model, [x]) - assert np.array_equal(ng_results, [y]) - - x = np.random.randn(1, 3, 4, 5).astype(np.float32) - y = np.pad(x, pad_width=((0, 0), (0, 0), (1, 2), (3, 4)), mode="constant") - - model = get_node_model("Pad", x, opset=2, mode="constant", pads=[0, 0, 1, 3, 0, 0, 2, 4]) - ng_results = run_model(model, [x]) - assert np.array_equal(ng_results, [y]) - - # incorrect pads rank - x = np.ones((2, 2), dtype=np.float32) - model = get_node_model("Pad", x, opset=2, pads=[0, 1, 1, 3, 1, 2]) - with pytest.raises(RuntimeError): - run_model(model, [x]) - - -def test_pad_negative_values_begin(): - x = np.ones((2, 2), dtype=np.float32) - - # Axis 1 begin - model = get_node_model("Pad", x, opset=2, pads=[-1, 0, 0, 0]) - ng_result = run_model(model, [x])[0] - assert np.array_equal(ng_result, np.array([[1, 1]])) - - # Axis 2 begin - model = get_node_model("Pad", x, opset=2, pads=[0, -1, 0, 0]) - ng_result = run_model(model, [x])[0] - assert np.array_equal(ng_result, np.array([[1], [1]])) - - -def test_pad_negative_values_end(): - x = np.ones((2, 2), dtype=np.float32) - - # Axis 1 end - model = get_node_model("Pad", x, opset=2, pads=[0, 0, -1, 0]) - ng_result = run_model(model, [x])[0] - assert np.array_equal(ng_result, np.array([[1.0, 1.0]])) - - # Axis 2 end - model = get_node_model("Pad", x, opset=2, pads=[0, 0, 0, -1]) - ng_result = run_model(model, [x])[0] - assert np.array_equal(ng_result, np.array([[1], [1]])) - - -def test_pool_average(ndarray_1x1x4x4): - x = ndarray_1x1x4x4 - node = onnx.helper.make_node( - "AveragePool", inputs=["x"], outputs=["y"], kernel_shape=(2, 2), strides=(2, 2) - ) - y = np.array([[13.5, 15.5], [21.5, 23.5]], dtype=np.float32).reshape([1, 1, 2, 2]) - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - node = onnx.helper.make_node( - "AveragePool", inputs=["x"], outputs=["y"], kernel_shape=(2, 2), strides=(2, 2), pads=(1, 1, 1, 1) - ) - y = np.array([[11, 12.5, 14], [17, 18.5, 20], [23, 24.5, 26]], dtype=np.float32).reshape([1, 1, 3, 3]) - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - -def test_pool_average_3d(ndarray_1x1x4x4): - x = np.broadcast_to(ndarray_1x1x4x4, (1, 1, 4, 4, 4)) - node = onnx.helper.make_node( - "AveragePool", inputs=["x"], outputs=["y"], kernel_shape=(2, 2, 2), strides=(2, 2, 2) - ) - y = np.array([[[13.5, 15.5], [21.5, 23.5]], [[13.5, 15.5], [21.5, 23.5]]], dtype=np.float32).reshape( - [1, 1, 2, 2, 2] - ) - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - -def test_pool_max(ndarray_1x1x4x4): - node = onnx.helper.make_node("MaxPool", inputs=["x"], outputs=["y"], kernel_shape=(2, 2), strides=(2, 2)) - - x = ndarray_1x1x4x4 - y = np.array([[16, 18], [24, 26]], dtype=np.float32).reshape([1, 1, 2, 2]) - - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - -def test_pool_global_max(ndarray_1x1x4x4): - node = onnx.helper.make_node("GlobalMaxPool", inputs=["x"], outputs=["y"]) - - x = ndarray_1x1x4x4 - y = np.array([26], dtype=np.float32).reshape([1, 1, 1, 1]) - - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - -def test_pool_global_average(ndarray_1x1x4x4): - node = onnx.helper.make_node("GlobalAveragePool", inputs=["x"], outputs=["y"]) - - x = ndarray_1x1x4x4 - y = np.array([18.5], dtype=np.float32).reshape([1, 1, 1, 1]) - - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) - - -def test_pool_global_average_3d(ndarray_1x1x4x4): - x = np.broadcast_to(ndarray_1x1x4x4, (1, 1, 4, 4, 4)) - - node = onnx.helper.make_node("GlobalAveragePool", inputs=["x"], outputs=["y"]) - y = np.array([18.5], dtype=np.float32).reshape([1, 1, 1, 1, 1]) - ng_results = run_node(node, [x]) - assert np.array_equal(ng_results, [y]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_logical.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_logical.py deleted file mode 100644 index 4e98600a605..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_logical.py +++ /dev/null @@ -1,44 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import pytest - -from tests_compatibility.test_onnx.utils import run_node - - -@pytest.mark.parametrize( - "onnx_op, numpy_func, data_type", - [ - pytest.param("And", np.logical_and, bool), - pytest.param("Or", np.logical_or, bool), - pytest.param("Xor", np.logical_xor, bool), - pytest.param("Equal", np.equal, np.int32), - pytest.param("Greater", np.greater, np.int32), - pytest.param("Less", np.less, np.int32), - ], -) -def test_logical(onnx_op, numpy_func, data_type): - node = onnx.helper.make_node(onnx_op, inputs=["A", "B"], outputs=["C"], broadcast=1) - - input_a = np.array([[0, 1, -1], [0, 1, -1], [0, 1, -1]]).astype(data_type) - input_b = np.array([[0, 0, 0], [1, 1, 1], [-1, -1, -1]]).astype(data_type) - expected_output = numpy_func(input_a, input_b) - ng_results = run_node(node, [input_a, input_b], opset_version=4) - assert np.array_equal(ng_results, [expected_output]) - - input_a = np.array([[0, 1, -1], [0, 1, -1], [0, 1, -1]]).astype(data_type) - input_b = np.array(1).astype(data_type) - expected_output = numpy_func(input_a, input_b) - ng_results = run_node(node, [input_a, input_b], opset_version=4) - assert np.array_equal(ng_results, [expected_output]) - - -def test_logical_not(): - input_data = np.array([[False, True, True], [False, True, False], [False, False, True]]) - expected_output = np.logical_not(input_data) - - node = onnx.helper.make_node("Not", inputs=["X"], outputs=["Y"]) - ng_results = run_node(node, [input_data]) - assert np.array_equal(ng_results, [expected_output]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_matmul.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_matmul.py deleted file mode 100644 index 5f1ed8a5952..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_matmul.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info -import pytest - -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils import import_onnx_model - - -def make_onnx_model_for_matmul_op(input_left, input_right): - output_shape = np.matmul(input_left, input_right).shape - node = make_node("MatMul", ["X", "Y"], ["Z"], name="test_node") - graph = make_graph( - [node], - "test_graph", - [ - make_tensor_value_info("X", onnx.TensorProto.FLOAT, input_left.shape), - make_tensor_value_info("Y", onnx.TensorProto.FLOAT, input_right.shape), - ], - [make_tensor_value_info("Z", onnx.TensorProto.FLOAT, output_shape)], - ) - model = make_model(graph, producer_name="ngraph ONNXImporter") - return model - - -def import_and_compute_matmul(input_left, input_right): - input_data_left = np.array(input_left) - input_data_right = np.array(input_right) - onnx_model = make_onnx_model_for_matmul_op(input_data_left, input_data_right) - transformer = get_runtime() - ng_model_function = import_onnx_model(onnx_model) - computation = transformer.computation(ng_model_function) - return computation(input_data_left, input_data_right)[0] - - -def numpy_gemm(input_a, input_b, input_c, alpha=1, beta=1, trans_a=False, trans_b=False, broadcast=False): - input_a, input_b, input_c = np.array(input_a), np.array(input_b), np.array(input_c) - if trans_a: - input_a = input_a.T - if trans_b: - input_b = input_b.T - - return (alpha * np.dot(input_a, input_b)) + (beta * input_c) - - -def make_onnx_model_for_gemm_op(input_a, input_b, input_c, **kwargs): - input_a_for_output = input_a - input_b_for_output = input_b - if kwargs.get("transA"): - input_a_for_output = input_a.T - if kwargs.get("transB"): - input_b_for_output = input_b.T - - output_shape = np.dot(input_a_for_output, input_b_for_output).shape - node = make_node("Gemm", ["A", "B", "C"], ["Y"], name="test_node", **kwargs) - graph = make_graph( - [node], - "test_graph", - [ - make_tensor_value_info("A", onnx.TensorProto.FLOAT, input_a.shape), - make_tensor_value_info("B", onnx.TensorProto.FLOAT, input_b.shape), - make_tensor_value_info("C", onnx.TensorProto.FLOAT, input_c.shape), - ], - [make_tensor_value_info("Y", onnx.TensorProto.FLOAT, output_shape)], - ) - model = make_model(graph, producer_name="ngraph ONNXImporter") - return model - - -def import_and_compute_gemm(input_a, input_b, input_c, **kwargs): - input_a, input_b, input_c = np.array(input_a), np.array(input_b), np.array(input_c) - - if kwargs.get("trans_a"): - kwargs["transA"] = kwargs["trans_a"] - del kwargs["trans_a"] - - if kwargs.get("trans_b"): - kwargs["transB"] = kwargs["trans_b"] - del kwargs["trans_b"] - - onnx_model = make_onnx_model_for_gemm_op(input_a, input_b, input_c, **kwargs) - transformer = get_runtime() - ng_model_function = import_onnx_model(onnx_model) - computation = transformer.computation(ng_model_function) - return computation(input_a, input_b, input_c)[0] - - -@pytest.mark.parametrize( - "data, description", - [ - pytest.param(([1, 2], [1, 3]), "vector and vector 1"), - (([1, 2, 3], [[4], [5], [6]]), "vector and vector 2"), - (([[1, 2, 3]], [1, 2, 3]), "vector and vector 3"), - (([1, 2, 3], [[4, 5], [6, 7], [8, 9]]), "vector and matrix"), - (([[1, 2, 3], [4, 5, 6]], [[7], [8], [9]]), "matrix and vector"), - (([[1, 2], [3, 4]], [[5, 6], [7, 8]]), "matrix and matrix 1"), - (([[1, 2, 3], [4, 5, 6]], [[7, 8], [9, 10], [11, 12]]), "matrix and matrix 2"), - (([[1, 2], [3, 4], [5, 6]], [[7, 8, 9], [10, 11, 12]]), "matrix and matrix 3") - ], -) -def test_op_matmul(data, description): - assert np.allclose(import_and_compute_matmul(*data), np.matmul(*data)) - - -def test_op_matmul_3d(): - # 3d tensor @ 3d tensor - data = ([[[1, 2], [3, 4]], [[1, 2], [3, 4]]], [[[5, 6], [7, 8]], [[5, 6], [7, 8]]]) - assert np.array_equal(import_and_compute_matmul(*data), np.matmul(*data)) - - data = (np.ones((5, 2, 3)), (np.ones((5, 3, 2)) + 2)) - assert np.array_equal(import_and_compute_matmul(*data), np.matmul(*data)) - - -@pytest.mark.parametrize( - "data, kwargs, description", - [ - pytest.param(([1, 2], [1, 3], [1, 4]), {}, "vectors"), - pytest.param(([1, 2], [1, 3], 1), {}, "vectors and scalar"), - pytest.param(([1, 2], [1, 3], [1]), {}, "vectors and identity vector"), - pytest.param(([1, 2], [1, 3], [1, 4]), {"alpha": 7.0, "beta": 9.0}, - "vectors with alpha and beta"), - pytest.param(([1, 2, 3, 4], [1, 3, 5, 7], [1, 4]), {"alpha": 7.0, "beta": 9.0}, - "longer vectors with alpha and beta") - ], -) -def test_gemm(data, kwargs, description): - assert np.allclose(import_and_compute_gemm(*data, **kwargs), numpy_gemm(*data, **kwargs)) - - -@pytest.mark.parametrize( - "data, kwargs, description", - [ - pytest.param(([1, 2], [1, 3], [1, 4]), {"trans_a": True, "trans_b": True}, - "vectors with trans_a/trans_b"), - pytest.param(([[1, 2], [1, 2]], [[1, 3], [1, 3]], [4, 1]), - {"trans_a": True, "trans_b": True, "alpha": 7.0, "beta": 9.0}, - "matrices and vector with trans_b and alpha/beta"), - pytest.param(([[1, 2]], [[1, 3]], 1), {"trans_b": True, "alpha": 7.0, "beta": 9.0}, - "matrices and scalar with trans_b and alpha/beta"), - pytest.param(([[1], [2]], [[1], [3]], 1), {"trans_a": True, "alpha": 7.0, "beta": 9.0}, - "matrices and scalar with trans_a and alpha/beta"), - ], -) -def test_gemm_transpositions(data, kwargs, description): - assert np.array_equal(import_and_compute_gemm(*data, **kwargs), numpy_gemm(*data, **kwargs)) - - -def test_gemm_flatten(): - # input_a.shape is (4,1) - data = ([[1], [2], [3], [4]], [1, 3, 5, 7], [1, 4]) - kwargs = {"alpha": 7.0, "beta": 9.0, "trans_a": True} - assert np.array_equal(import_and_compute_gemm(*data, **kwargs), numpy_gemm(*data, **kwargs)) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_nonlinear.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_nonlinear.py deleted file mode 100644 index 7b1ebc7295c..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_nonlinear.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import platform - -import numpy as np -import onnx -import pytest - -from tests_compatibility.test_onnx.utils import run_node - - -def import_and_compute(op_type, input_data, **node_attrs): - data_inputs = [np.array(input_data)] - node = onnx.helper.make_node(op_type, inputs=["x"], outputs=["y"], **node_attrs) - return run_node(node, data_inputs).pop() - - -def assert_onnx_import_equals_callable(onnx_op_type, python_function, data, **kwargs): - data = np.array(data, dtype=np.float32) - assert np.allclose(import_and_compute(onnx_op_type, data, **kwargs), python_function(data, **kwargs)) - - -def test_sigmoid(): - def sigmoid(x): - return 1 / (1 + np.exp(-x)) - - assert_onnx_import_equals_callable("Sigmoid", sigmoid, [-2, -1.0, 0.0, 1.0, 2.0]) - assert_onnx_import_equals_callable("Sigmoid", sigmoid, [0.0]) - assert_onnx_import_equals_callable("Sigmoid", sigmoid, [-2, -1.0, 0.0, 1.0, 2.0]) - - -def test_tanh(): - assert_onnx_import_equals_callable("Tanh", np.tanh, [-2, -1.0, 0.0, 1.0, 2.0]) - assert_onnx_import_equals_callable("Tanh", np.tanh, [0.0]) - assert_onnx_import_equals_callable("Tanh", np.tanh, [-2, -1.0, 0.0, 1.0, 2.0]) - - -def test_relu(): - def relu(x): - return np.maximum(x, 0) - - assert_onnx_import_equals_callable("Relu", relu, [-2, -1.0, 0.0, 1.0, 2.0]) - assert_onnx_import_equals_callable("Relu", relu, [0.0]) - assert_onnx_import_equals_callable("Relu", relu, [-0.9, -0.8, -0.7, -0.4, -0.3, -0.2, -0.1]) - assert_onnx_import_equals_callable("Relu", relu, [[1, 2, 3], [4, 5, 6]]) - assert_onnx_import_equals_callable("Relu", relu, [[-3, -2, -1], [1, 2, 3]]) - - -@pytest.mark.xfail(condition=platform.system() == 'Darwin' and platform.machine() == 'arm64', - reason='Ticket - 122712') -def test_leaky_relu(): - def leaky_relu(x, alpha=0.01): - return np.maximum(alpha * x, x) - - assert_onnx_import_equals_callable("LeakyRelu", leaky_relu, [-2, -1.0, 0.0, 1.0, 2.0], alpha=0.5) - assert_onnx_import_equals_callable("LeakyRelu", leaky_relu, [0.0]) - assert_onnx_import_equals_callable( - "LeakyRelu", leaky_relu, [-0.9, -0.8, -0.7, -0.4, -0.3, -0.2, -0.1], alpha=1.0 - ) - assert_onnx_import_equals_callable("LeakyRelu", leaky_relu, [[1, 2, 3], [4, 5, 6]], alpha=0.2) - assert_onnx_import_equals_callable("LeakyRelu", leaky_relu, [[-3, -2, -1], [1, 2, 3]]) - - -@pytest.mark.parametrize( - "x, slope", - [ - ([-2, -1.0, 0.0, 1.0, 2.0], 0.5), - ([0.0], 1), - ([-0.9, -0.8, -0.7, -0.4, -0.3, -0.2, -0.1], 1), - ([[1, 2, 3], [4, 5, 6]], 0.5), - ([[-3, -2, -1], [1, 2, 3]], 1), - ] -) -def test_parametric_relu(x, slope): - def parametic_relu(x, slope): - return np.where(x < 0, slope * x, x) - - x, slope = np.array(x).astype(np.float32), np.array(slope).astype(np.float32) - expected_output = parametic_relu(x, slope) - node = onnx.helper.make_node("PRelu", inputs=["x", "slope"], outputs=["y"]) - output = run_node(node, [x, slope]).pop() - assert np.allclose(output, expected_output) - - -@pytest.mark.xfail(condition=platform.system() == 'Darwin' and platform.machine() == 'arm64', - reason='Ticket - 122712') -def test_selu(): - # f(x) = gamma * (alpha * exp(x) - alpha) for x <= 0, y = gamma * x for x > 0 - def selu(x, alpha=1.67326319217681884765625, gamma=1.05070102214813232421875): - return np.where(x <= 0, gamma * (alpha * np.exp(x) - alpha), gamma * x) - - assert_onnx_import_equals_callable("Selu", selu, [-2, -1.0, 0.0, 1.0, 2.0]) - assert_onnx_import_equals_callable("Selu", selu, [0.0]) - assert_onnx_import_equals_callable("Selu", selu, [-0.9, -0.8, -0.7, -0.4, -0.3, -0.2, -0.1]) - assert_onnx_import_equals_callable("Selu", selu, [[1, 2, 3], [4, 5, 6]]) - assert_onnx_import_equals_callable("Selu", selu, [-2, -1.0, 0.0, 1.0, 2.0], gamma=0.5, alpha=0.5) - - -@pytest.mark.parametrize( - "data, alpha_value", - [ - pytest.param([-2, -1.0, 0.0, 1.0, 2.0], 1.0), - pytest.param([0.0], 1.0), - pytest.param([-0.9, -0.8, -0.7, -0.4, -0.3, -0.2, -0.1], 1.0), - pytest.param([[1, 2, 3], [4, 5, 6]], 1.0), - pytest.param([-2, -1.0, 0.0, 1.0, 2.0], 0.5) - ] -) -def test_elu(data, alpha_value): - # f(x) = alpha * (exp(x) - 1) for x < 0, f(x) = x for x >= 0 - def elu(x, alpha): - return np.where(x < 0, alpha * (np.exp(x) - 1), x) - - assert_onnx_import_equals_callable("Elu", elu, data, alpha=alpha_value) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_reduction.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_reduction.py deleted file mode 100644 index 4122d1a3158..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_reduction.py +++ /dev/null @@ -1,376 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import pytest - -from tests_compatibility import xfail_issue_99962 -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils import ( - run_node, - import_onnx_model, -) - -reduce_data = np.array([[[5, 1], [20, 2]], [[30, 1], [40, 2]], [[55, 1], [60, 2]]], dtype=np.float32) -reduce_axis_parameters = [ - (0,), - (1,), - (2,), - (0, 1), - (0, 2), - (1, 2), - (0, 1, 2) -] - -reduce_operation_parameters_as_attr = [ - ("ReduceMax", np.max), - ("ReduceMin", np.min), - ("ReduceMean", np.mean), - ("ReduceProd", np.prod) -] - -reduce_operation_parameters_as_const = [ - ("ReduceSum", np.sum), -] - - -def import_and_compute(op_type, input_data, **node_attrs): - data_inputs = [np.array(input_data)] - node = onnx.helper.make_node(op_type, inputs=["x"], outputs=["y"], **node_attrs) - return run_node(node, data_inputs).pop() - - -def import_and_compute_with_axes_as_const(op_type, data, axes, **node_attrs): - data_input = np.array(data) - axes_input = np.array(axes, dtype=int) - axes_const_node = onnx.helper.make_node( - "Constant", - inputs=[], - outputs=["const_axes"], - value=onnx.helper.make_tensor( - name="const_axes", - data_type=onnx.TensorProto.INT64, - dims=axes_input.shape, - vals=axes_input.flatten(), - ), - ) - node = onnx.helper.make_node( - op_type, inputs=["x", "const_axes"], outputs=["y"], **node_attrs - ) - graph = onnx.helper.make_graph( - [axes_const_node, node], - "test_graph", - [onnx.helper.make_tensor_value_info("x", onnx.TensorProto.FLOAT, data_input.shape)], - [onnx.helper.make_tensor_value_info("y", onnx.TensorProto.FLOAT, ())], - ) - - model = onnx.helper.make_model(graph, producer_name="ngraph ONNX Importer") - model.opset_import[0].version = 13 - ng_model_function = import_onnx_model(model) - runtime = get_runtime() - computation = runtime.computation(ng_model_function) - return computation(data_input)[0] - - -@pytest.mark.parametrize("operation, ref_operation", - reduce_operation_parameters_as_attr + reduce_operation_parameters_as_const) -def test_reduce_operation_keepdims_none_axes(operation, ref_operation): - assert np.array_equal(import_and_compute(operation, reduce_data, keepdims=True), - ref_operation(reduce_data, keepdims=True)) - - -@xfail_issue_99962 -@pytest.mark.parametrize("operation, ref_operation", reduce_operation_parameters_as_attr) -@pytest.mark.parametrize("axes", reduce_axis_parameters) -def test_reduce_operation_keepdims_with_axes_as_attr(operation, ref_operation, axes): - assert np.array_equal(import_and_compute(operation, reduce_data, axes=axes, keepdims=True), - ref_operation(reduce_data, keepdims=True, axis=axes)) - - -@pytest.mark.parametrize("operation, ref_operation", reduce_operation_parameters_as_const) -@pytest.mark.parametrize("axes", reduce_axis_parameters) -def test_reduce_operation_keepdims_with_axes_as_const(operation, ref_operation, axes): - assert np.array_equal(import_and_compute_with_axes_as_const(operation, reduce_data, axes, keepdims=True), - ref_operation(reduce_data, keepdims=True, axis=axes)) - - -@xfail_issue_99962 -@pytest.mark.parametrize("axes", [ - None, - (0,), - (1,), - (2,), - (0, 1), - (0, 2), - (1, 2), - (0, 1, 2)]) -@pytest.mark.parametrize("operation, ref_operation", reduce_operation_parameters_as_attr) -def test_reduce_operation_no_keepdims_axes_as_attr(operation, ref_operation, axes): - if axes: - assert np.array_equal(import_and_compute(operation, reduce_data, axes=axes, keepdims=False), - ref_operation(reduce_data, keepdims=False, axis=axes)) - else: - assert np.array_equal(import_and_compute(operation, reduce_data, keepdims=False), - ref_operation(reduce_data, keepdims=False)) - - -@pytest.mark.parametrize("axes", [ - None, - (0,), - (1,), - (2,), - (0, 1), - (0, 2), - (1, 2), - (0, 1, 2)]) -@pytest.mark.parametrize("operation, ref_operation", reduce_operation_parameters_as_const) -def test_reduce_operation_no_keepdims_axes_as_const(operation, ref_operation, axes): - if axes: - assert np.array_equal(import_and_compute_with_axes_as_const(operation, - reduce_data, - axes, - keepdims=False), - ref_operation(reduce_data, keepdims=False, axis=axes)) - else: - assert np.array_equal(import_and_compute(operation, reduce_data, keepdims=False), - ref_operation(reduce_data, keepdims=False)) - - -@xfail_issue_99962 -@pytest.mark.parametrize("reduction_axes", [(0,), (0, 2), (0, 1, 2)]) -def test_reduce_l1(reduction_axes): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sum(np.abs(input_data), keepdims=True, axis=reduction_axes) - node = onnx.helper.make_node("ReduceL1", inputs=["x"], outputs=["y"], axes=reduction_axes) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.sum(np.abs(input_data), keepdims=False, axis=reduction_axes) - node = onnx.helper.make_node("ReduceL1", inputs=["x"], outputs=["y"], keepdims=0, axes=reduction_axes) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -def test_reduce_l1_default_axes(): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sum(np.abs(input_data), keepdims=True) - node = onnx.helper.make_node("ReduceL1", inputs=["x"], outputs=["y"]) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.array(np.sum(np.abs(input_data), keepdims=False)) - node = onnx.helper.make_node("ReduceL1", inputs=["x"], outputs=["y"], keepdims=0) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -@xfail_issue_99962 -@pytest.mark.parametrize("reduction_axes", [(0,), (0, 2), (0, 1, 2)]) -def test_reduce_l2(reduction_axes): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sqrt(np.sum(np.square(input_data), keepdims=True, axis=reduction_axes)) - node = onnx.helper.make_node("ReduceL2", inputs=["x"], outputs=["y"], axes=reduction_axes) - raw_result = run_node(node, [input_data]) - ng_result = np.array(raw_result.pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.sqrt(np.sum(np.square(input_data), keepdims=False, axis=reduction_axes)) - node = onnx.helper.make_node("ReduceL2", inputs=["x"], outputs=["y"], keepdims=0, axes=reduction_axes) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -def test_reduce_l2_default_axes(): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sqrt(np.sum(np.square(input_data), keepdims=True)) - node = onnx.helper.make_node("ReduceL2", inputs=["x"], outputs=["y"]) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.array(np.sqrt(np.sum(np.square(input_data), keepdims=False))) - node = onnx.helper.make_node("ReduceL2", inputs=["x"], outputs=["y"], keepdims=0) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -@xfail_issue_99962 -@pytest.mark.parametrize("reduction_axes", [(0,), (0, 2), (0, 1, 2)]) -def test_reduce_log_sum(reduction_axes): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(0, 1, shape).astype(np.float32) - - expected = np.log(np.sum(input_data, keepdims=True, axis=reduction_axes)) - node = onnx.helper.make_node("ReduceLogSum", inputs=["x"], outputs=["y"], axes=reduction_axes) - ng_result = run_node(node, [input_data]).pop() - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.log(np.sum(input_data, keepdims=False, axis=reduction_axes)) - node = onnx.helper.make_node("ReduceLogSum", inputs=["x"], outputs=["y"], keepdims=0, axes=reduction_axes) - ng_result = run_node(node, [input_data]).pop() - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -def test_reduce_log_sum_default_axes(): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(0, 1, shape).astype(np.float32) - - expected = np.log(np.sum(input_data, keepdims=True)) - node = onnx.helper.make_node("ReduceLogSum", inputs=["x"], outputs=["y"]) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.log(np.sum(input_data, keepdims=False)) - node = onnx.helper.make_node("ReduceLogSum", inputs=["x"], outputs=["y"], keepdims=0) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -@xfail_issue_99962 -def test_reduce_log_sum_exp(): - def logsumexp(data, axis=None, keepdims=True): - return np.log(np.sum(np.exp(data), axis=axis, keepdims=keepdims)) - - data = np.array([[[5, 1], [20, 2]], [[30, 1], [40, 2]], [[55, 1], [60, 2]]], dtype=np.float32) - - assert np.array_equal(import_and_compute("ReduceLogSumExp", data), logsumexp(data, keepdims=True)) - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, keepdims=0), logsumexp(data, keepdims=False) - ) - - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(1,)), logsumexp(data, keepdims=True, axis=(1,)) - ) - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(1,), keepdims=0), - logsumexp(data, keepdims=False, axis=(1,)), - ) - - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(0, 2)), logsumexp(data, keepdims=True, axis=(0, 2)) - ) - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(0, 2), keepdims=0), - logsumexp(data, keepdims=False, axis=(0, 2)), - ) - - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(0, 1, 2)), - logsumexp(data, keepdims=True, axis=(0, 1, 2)), - ) - assert np.array_equal( - import_and_compute("ReduceLogSumExp", data, axes=(0, 1, 2), keepdims=0), - logsumexp(data, keepdims=False, axis=(0, 1, 2)), - ) - - -@xfail_issue_99962 -@pytest.mark.parametrize("reduction_axes", [(0,), (0, 2), (0, 1, 2)]) -def test_reduce_sum_square(reduction_axes): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sum(np.square(input_data), keepdims=True, axis=reduction_axes) - node = onnx.helper.make_node("ReduceSumSquare", inputs=["x"], outputs=["y"], axes=reduction_axes) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.sum(np.square(input_data), keepdims=False, axis=reduction_axes) - node = onnx.helper.make_node( - "ReduceSumSquare", inputs=["x"], outputs=["y"], keepdims=0, axes=reduction_axes - ) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -def test_reduce_sum_square_default_axes(): - shape = [2, 4, 3, 2] - np.random.seed(133391) - input_data = np.random.uniform(-100, 100, shape).astype(np.float32) - - expected = np.sum(np.square(input_data), keepdims=True) - node = onnx.helper.make_node("ReduceSumSquare", inputs=["x"], outputs=["y"]) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - expected = np.sum(np.square(input_data), keepdims=False) - node = onnx.helper.make_node("ReduceSumSquare", inputs=["x"], outputs=["y"], keepdims=0) - ng_result = np.array(run_node(node, [input_data]).pop()) - assert np.array_equal(expected.shape, ng_result.shape) - assert np.allclose(expected, ng_result) - - -def test_reduce_argmin(): - def argmin(ndarray, axis, keepdims=False): - res = np.argmin(ndarray, axis=axis) - if keepdims: - res = np.expand_dims(res, axis=axis) - return res - - data = np.array([[[5, 1], [20, 2]], [[30, 1], [40, 2]], [[55, 1], [60, 2]]], dtype=np.float32) - - assert np.array_equal(import_and_compute("ArgMin", data, axis=0), argmin(data, keepdims=True, axis=0)) - assert np.array_equal( - import_and_compute("ArgMin", data, axis=0, keepdims=0), argmin(data, keepdims=False, axis=0) - ) - assert np.array_equal(import_and_compute("ArgMin", data, axis=1), argmin(data, keepdims=True, axis=1)) - assert np.array_equal( - import_and_compute("ArgMin", data, axis=1, keepdims=0), argmin(data, keepdims=False, axis=1) - ) - assert np.array_equal(import_and_compute("ArgMin", data, axis=2), argmin(data, keepdims=True, axis=2)) - assert np.array_equal( - import_and_compute("ArgMin", data, axis=2, keepdims=0), argmin(data, keepdims=False, axis=2) - ) - - -def test_reduce_argmax(): - def argmax(ndarray, axis, keepdims=False): - res = np.argmax(ndarray, axis=axis) - if keepdims: - res = np.expand_dims(res, axis=axis) - return res - - data = np.array([[[5, 1], [20, 2]], [[30, 1], [40, 2]], [[55, 1], [60, 2]]], dtype=np.float32) - - assert np.array_equal(import_and_compute("ArgMax", data, axis=0), argmax(data, keepdims=True, axis=0)) - assert np.array_equal( - import_and_compute("ArgMax", data, axis=0, keepdims=0), argmax(data, keepdims=False, axis=0) - ) - assert np.array_equal(import_and_compute("ArgMax", data, axis=1), argmax(data, keepdims=True, axis=1)) - assert np.array_equal( - import_and_compute("ArgMax", data, axis=1, keepdims=0), argmax(data, keepdims=False, axis=1) - ) - assert np.array_equal(import_and_compute("ArgMax", data, axis=2), argmax(data, keepdims=True, axis=2)) - assert np.array_equal( - import_and_compute("ArgMax", data, axis=2, keepdims=0), argmax(data, keepdims=False, axis=2) - ) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_reshape.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_reshape.py deleted file mode 100644 index 6e75b4d2fd4..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_reshape.py +++ /dev/null @@ -1,350 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import pytest -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info - -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils import ( - all_arrays_equal, - get_node_model, - import_onnx_model, - run_model, - run_node, -) -from tests_compatibility import (xfail_issue_35927, - xfail_issue_44858, - skip_dynamic_model) - - -def test_reshape(): - input_data = np.arange(2560, dtype=np.int32).reshape([16, 4, 4, 10]) - reshape_node = onnx.helper.make_node( - "Reshape", inputs=["x"], outputs=["y"], shape=(256, 10) - ) - expected_output = input_data.reshape([256, 10]) - - ng_results = run_node(reshape_node, [input_data], opset_version=4) - assert np.array_equal(ng_results, [expected_output]) - - -def test_reshape_opset5(): - original_shape = [2, 3, 4] - test_cases = { - "reordered_dims": np.array([4, 2, 3], dtype=np.int64), - "reduced_dims": np.array([3, 8], dtype=np.int64), - "extended_dims": np.array([3, 2, 2, 2], dtype=np.int64), - "one_dim": np.array([24], dtype=np.int64), - "negative_dim": np.array([6, -1, 2], dtype=np.int64), - } - input_data = np.random.random_sample(original_shape).astype(np.float32) - - for _, shape in test_cases.items(): - const_node = make_node( - "Constant", - inputs=[], - outputs=["const_shape"], - value=onnx.helper.make_tensor( - name="const_tensor", - data_type=onnx.TensorProto.INT64, - dims=shape.shape, - vals=shape.flatten(), - ), - ) - reshape_node = onnx.helper.make_node( - "Reshape", inputs=["data", "const_shape"], outputs=["reshaped"] - ) - - graph = make_graph( - [const_node, reshape_node], - "test_graph", - [make_tensor_value_info("data", onnx.TensorProto.FLOAT, input_data.shape)], - [make_tensor_value_info("reshaped", onnx.TensorProto.FLOAT, ())], - ) - - model = make_model(graph, producer_name="ngraph ONNX Importer") - model.opset_import[0].version = 5 - ng_model_function = import_onnx_model(model) - runtime = get_runtime() - computation = runtime.computation(ng_model_function) - ng_results = computation(input_data) - expected_output = np.reshape(input_data, shape) - assert np.array_equal(ng_results[0], expected_output) - - -@pytest.mark.xfail(reason="RuntimeError: Reshape z has dynamic second input!") -def test_reshape_opset5_param_err(): - original_shape = [2, 3, 4] - output_shape = np.array([4, 2, 3], dtype=np.int32) - input_data = np.random.random_sample(original_shape).astype(np.float32) - reshape_node = onnx.helper.make_node("Reshape", inputs=["x", "y"], outputs=["z"]) - ng_result = run_node(reshape_node, [input_data, output_shape], opset_version=5) - assert ng_result[0].shape == output_shape - - -@pytest.mark.parametrize( - "axis,expected_output", - [ - (0, np.arange(120).reshape(1, 120)), - (1, np.arange(120).reshape(2, 60)), - (2, np.arange(120).reshape(6, 20)), - (3, np.arange(120).reshape(24, 5)), - (4, np.arange(120).reshape(120, 1)), - ], -) -def test_flatten(axis, expected_output): - data = np.arange(120, dtype=np.int32).reshape([2, 3, 4, 5]) - node = onnx.helper.make_node("Flatten", inputs=["x"], outputs=["y"], axis=axis) - ng_results = run_node(node, [data]) - assert np.array_equal(ng_results, [expected_output]) - - -def test_flatten_exception(): - data = np.arange(120).reshape([2, 3, 4, 5]) - node = onnx.helper.make_node("Flatten", inputs=["x"], outputs=["y"], axis=5) - - with pytest.raises(RuntimeError): - run_node(node, [data]) - - -def test_transpose(): - data = np.arange(120, dtype=np.int32).reshape([2, 3, 4, 5]) - - node = onnx.helper.make_node("Transpose", inputs=["x"], outputs=["y"]) - expected_output = data.T - ng_results = run_node(node, [data]) - assert np.array_equal(ng_results, [expected_output]) - - node = onnx.helper.make_node( - "Transpose", inputs=["x"], outputs=["y"], perm=(3, 1, 0, 2) - ) - expected_output = np.transpose(data, axes=(3, 1, 0, 2)) - ng_results = run_node(node, [data]) - assert np.array_equal(ng_results, [expected_output]) - - -@xfail_issue_35927 -def test_slice_opset1(): - data = np.array([[1, 2, 3, 4], [5, 6, 7, 8]]) - - expected_output = np.array([[5, 6, 7]]) - model = get_node_model("Slice", data, axes=[0, 1], starts=[1, 0], ends=[2, 3]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - expected_output = np.array([[2, 3, 4]]) - model = get_node_model("Slice", data, starts=[0, 1], ends=[-1, 1000]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - data = np.random.randn(20, 10, 5).astype(np.float32) - expected_output = data[0:3, 0:10] - model = get_node_model("Slice", data, axes=[0, 1], starts=[0, 0], ends=[3, 10]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - # default axes - data = np.random.randn(20, 10, 5).astype(np.float32) - expected_output = data[:, :, 3:4] - model = get_node_model("Slice", data, starts=[0, 0, 3], ends=[20, 10, 4]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - # end out of bounds - data = np.random.randn(20, 10, 5).astype(np.float32) - expected_output = data[:, 1:1000] - model = get_node_model("Slice", data, axes=[1], starts=[1], ends=[1000]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - # negative value - data = np.random.randn(20, 10, 5).astype(np.float32) - expected_output = data[:, 0:-1] - model = get_node_model("Slice", data, axes=[1], starts=[0], ends=[-1]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - # start ouf of bounds - data = np.random.randn(20, 10, 5).astype(np.float32) - expected_output = data[:, 1000:1000] - model = get_node_model("Slice", data, axes=[1], starts=[1000], ends=[1000]) - ng_results = run_model(model, [data]) - assert np.array_equal(ng_results, [expected_output]) - - -def test_concat(): - a = np.array([[1, 2], [3, 4]], dtype=np.int32) - b = np.array([[5, 6]], dtype=np.int32) - - node = onnx.helper.make_node("Concat", inputs=["x"], outputs=["z"], axis=0) - ng_results = run_node(node, [a]) - assert np.array_equal(ng_results, [a]) - - expected_output = np.concatenate((a, b), axis=0) - node = onnx.helper.make_node("Concat", inputs=["x", "y"], outputs=["z"], axis=0) - ng_results = run_node(node, [a, b]) - assert np.array_equal(ng_results, [expected_output]) - - a = np.array([[1, 2], [3, 4]], dtype=np.int32) - b = np.array([[5, 6]], dtype=np.int32).T - expected_output = np.concatenate((a, b), axis=1) - node = onnx.helper.make_node("Concat", inputs=["x", "y"], outputs=["z"], axis=1) - ng_results = run_node(node, [a, b]) - assert np.array_equal(ng_results, [expected_output]) - - test_cases = { - "1d": ([1, 2], [3, 4]), - "2d": ([[1, 2], [3, 4]], [[5, 6], [7, 8]]), - "3d": ( - [[[1, 2], [3, 4]], [[5, 6], [7, 8]]], - [[[9, 10], [11, 12]], [[13, 14], [15, 16]]], - ), - } - - for _, values in test_cases.items(): - values = [np.asarray(v) for v in values] - for i in range(len(values[0].shape)): - in_args = ["value" + str(k) for k in range(len(values))] - node = onnx.helper.make_node( - "Concat", - inputs=list(in_args), - outputs=["output"], - axis=i, - ) - expected_output = np.concatenate(values, i) - ng_results = run_node(node, np.array(values, dtype=np.int32)) - assert np.array_equal(ng_results, [expected_output]) - - -@skip_dynamic_model -def test_squeeze(): - data = np.arange(6, dtype=np.int32).reshape([1, 2, 3, 1]) - expected_output = data.reshape([2, 3]) - - axes = np.array([0, 3]).astype(np.int64) - node = onnx.helper.make_node("Squeeze", inputs=["x", "axes"], outputs=["y"]) - ng_results = run_node(node, [data, axes]) - assert np.array_equal(ng_results, [expected_output]) - - data = np.random.randn(1, 3, 4, 5).astype(np.float32) - expected_output = np.squeeze(data, axis=0) - axes = np.array([0]).astype(np.int64) - node = onnx.helper.make_node("Squeeze", inputs=["x", "axes"], outputs=["y"]) - ng_results = run_node(node, [data, axes]) - assert np.array_equal(ng_results, [expected_output]) - - -@xfail_issue_44858 -def test_unsqueeze(): - data = np.random.randn(3, 4, 5).astype(np.float32) - expected_output = np.expand_dims(data, axis=0) - axes = np.array([0]).astype(np.int64) - node = onnx.helper.make_node("Unsqueeze", inputs=["x", "axes"], outputs=["y"]) - ng_results = run_node(node, [data, axes]) - assert np.array_equal(ng_results, [expected_output]) - - expected_output = np.reshape(data, [1, 3, 4, 5, 1]) - axes = np.array([0, 4]).astype(np.int64) - node = onnx.helper.make_node("Unsqueeze", inputs=["x", "axes"], outputs=["y"]) - ng_results = run_node(node, [data, axes]) - assert np.array_equal(ng_results, [expected_output]) - - expected_output = np.reshape(data, [1, 3, 1, 4, 5]) - axes = np.array([0, 2]).astype(np.int64) - node = onnx.helper.make_node("Unsqueeze", inputs=["x", "axes"], outputs=["y"]) - ng_results = run_node(node, [data, axes]) - assert np.array_equal(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "node, expected_output", - [ - # Split into 2 equal parts along axis=0 - ( - onnx.helper.make_node("Split", inputs=["x"], outputs=["y", "z"], axis=0), - [ - np.array([[0, 1, 2, 3]], dtype=np.int32), - np.array([[4, 5, 6, 7]], dtype=np.int32), - ], - ), - # Default, split along axis=0 into 2 equal parts - ( - onnx.helper.make_node("Split", inputs=["x"], outputs=["y", "z"]), - [ - np.array([[0, 1, 2, 3]], dtype=np.int32), - np.array([[4, 5, 6, 7]], dtype=np.int32), - ], - ), - # Split into 2 equal parts along axis=1 - ( - onnx.helper.make_node("Split", inputs=["x"], outputs=["a", "b"], axis=1), - [ - np.array([[0, 1], [4, 5]], dtype=np.int32), - np.array([[2, 3], [6, 7]], dtype=np.int32), - ], - ), - # Split into 4 equal parts along axis=1 - ( - onnx.helper.make_node( - "Split", inputs=["x"], outputs=["a", "b", "c", "d"], axis=1 - ), - [ - np.array([[0], [4]], dtype=np.int32), - np.array([[1], [5]], dtype=np.int32), - np.array([[2], [6]], dtype=np.int32), - np.array([[3], [7]], dtype=np.int32), - ], - ), - ], -) -def test_split_2d(node, expected_output): - data = np.arange(8, dtype=np.int32).reshape(2, 4) - ng_results = run_node(node, [data]) - assert all_arrays_equal(ng_results, expected_output) - - -def test_depth_to_space(): - b, c, h, w = shape = (2, 8, 3, 3) - blocksize = 2 - data = np.random.random_sample(shape).astype(np.float32) - tmp = np.reshape(data, [b, blocksize, blocksize, c // (blocksize ** 2), h, w]) - tmp = np.transpose(tmp, [0, 3, 4, 1, 5, 2]) - expected_output = np.reshape( - tmp, [b, c // (blocksize ** 2), h * blocksize, w * blocksize] - ) - - node = onnx.helper.make_node( - "DepthToSpace", inputs=["x"], outputs=["y"], blocksize=blocksize - ) - ng_results = run_node(node, [data]) - assert np.array_equal(ng_results, [expected_output]) - - # (1, 4, 2, 3) input tensor - data = np.array( - [ - [ - [[0, 1, 2], [3, 4, 5]], - [[6, 7, 8], [9, 10, 11]], - [[12, 13, 14], [15, 16, 17]], - [[18, 19, 20], [21, 22, 23]], - ] - ] - ).astype(np.float32) - # (1, 1, 4, 6) output tensor - expected_output = np.array( - [ - [ - [ - [0, 6, 1, 7, 2, 8], - [12, 18, 13, 19, 14, 20], - [3, 9, 4, 10, 5, 11], - [15, 21, 16, 22, 17, 23], - ] - ] - ] - ).astype(np.float32) - - ng_results = run_node(node, [data]) - assert np.array_equal(ng_results, [expected_output]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_unary.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_unary.py deleted file mode 100644 index ad7b8e8ffba..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_unary.py +++ /dev/null @@ -1,489 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import platform - -import numpy as np -import onnx -import onnx.mapping -import pytest -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info - -from ngraph.exceptions import NgraphTypeError -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils import get_node_model, import_onnx_model, run_model, run_node - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([-4, 0, 5, -10], dtype=np.float32), - np.array([[-4, 0, 5, -10], [-4, 0, 5, -10]], dtype=np.float32), - np.array([[[1, 2], [-3, 4]], [[1, -2], [3, 4]]], dtype=np.float32), - ], -) -def test_abs(input_data): - expected_output = np.abs(input_data) - node = onnx.helper.make_node("Abs", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.array_equal(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([4, 0, 5, 10]), - np.array([[4, 0, 5, 10], [4, 0, 5, 10]]), - np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]]]), - ], -) -def test_sqrt(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.sqrt(input_data) - node = onnx.helper.make_node("Sqrt", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.allclose(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([4, 0, 5, 10]), - np.array([[4, 0, 5, 10], [4, 0, 5, 10]]), - np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]]]), - ], -) -def test_exp(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.exp(input_data) - node = onnx.helper.make_node("Exp", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.allclose(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([4, 2, 5, 10]), - np.array([[4, 1, 5, 10], [4, 2, 5, 10]]), - np.array([[[1, 2], [3, 4]], [[1, 2], [3, 4]]]), - ], -) -def test_log(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.log(input_data) - node = onnx.helper.make_node("Log", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.allclose(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([-4, 0, 5, -10], dtype=np.float32), - np.array([[-4, 0, 5, -10], [-4, 0, 5, -10]], dtype=np.float32), - np.array([[[1, 2], [-3, 4]], [[1, -2], [3, 4]]], dtype=np.float32), - ], -) -def test_neg(input_data): - expected_output = np.negative(input_data) - node = onnx.helper.make_node("Neg", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.array_equal(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([-4.2, 0.43, 5.99, -10.01]), - np.array([[-4.5, 0.99, 5.01, -10.00], [-4.5, 0.5, 5.1, 10.01]]), - np.array([[[1, 2], [-3, 4]], [[1, -2], [3, 4]]]) / 6, - ], -) -def test_floor(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.floor(input_data) - node = onnx.helper.make_node("Floor", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.array_equal(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([-4.2, 0, 5.99, -10.01]), - np.array([[-4.5, 0.99, 5.01, -10.00], [-4.5, 0.5, 5.1, 10.01]]), - np.array([[[1, 2], [-3, 4]], [[1, -2], [3, 4]]]) / 6, - ], -) -def test_ceil(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.ceil(input_data) - node = onnx.helper.make_node("Ceil", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.array_equal(ng_results, [expected_output]) - - -@pytest.mark.parametrize( - "min_value, max_value", - [(np.finfo(np.float32).min, np.finfo(np.float32).max), (-0.5, 0.5), (0.0, np.finfo(np.float32).max)], -) -def test_clip(min_value, max_value): - np.random.seed(133391) - input_data = np.float32(-100.0) + np.random.randn(3, 4, 5).astype(np.float32) * np.float32(200.0) - model = get_node_model("Clip", input_data, opset=10, min=float(min_value), max=float(max_value)) - result = run_model(model, [input_data]) - expected = np.clip(input_data, min_value, max_value) - assert np.allclose(result, [expected]) - - -def test_clip_default(): - np.random.seed(133391) - input_data = -100.0 + np.random.randn(3, 4, 5).astype(np.float32) * 200.0 - - model = get_node_model("Clip", input_data, opset=10, min=0.0) - result = run_model(model, [input_data]) - expected = np.clip(input_data, np.float32(0.0), np.finfo(np.float32).max) - assert np.allclose(result, [expected]) - - model = get_node_model("Clip", input_data, opset=10, max=0.0) - result = run_model(model, [input_data]) - expected = np.clip(input_data, np.finfo(np.float32).min, np.float32(0.0)) - assert np.allclose(result, [expected]) - - -@pytest.mark.parametrize( - "input_data", - [ - np.array([-4.2, 1, 5.99, -10.01]), - np.array([[-4.5, 0.99, 5.01, -10.00], [-4.5, 0.5, 5.1, 10.01]]), - np.array([[[1, 2], [-3, 4]], [[1, -2], [3, 4]]]) / 6, - ], -) -def test_reciprocal(input_data): - input_data = input_data.astype(np.float32) - expected_output = np.reciprocal(input_data) - node = onnx.helper.make_node("Reciprocal", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [input_data]) - assert np.allclose(ng_results, [expected_output]) - - -@pytest.mark.parametrize("axis, dim1, dim2", [(0, 1, 60), (1, 3, 20), (2, 12, 5)]) -def test_hardmax(axis, dim1, dim2): - def hardmax_2d(data): - return np.eye(data.shape[1], dtype=data.dtype)[np.argmax(data, axis=1)] - - np.random.seed(133391) - data = np.random.rand(3, 4, 5).astype(np.float32) - expected = hardmax_2d(data.reshape(dim1, dim2)).reshape(3, 4, 5) - node = onnx.helper.make_node("Hardmax", inputs=["x"], outputs=["y"], axis=axis) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - -def test_hardmax_special_cases(): - def hardmax_2d(data): - return np.eye(data.shape[1], dtype=data.dtype)[np.argmax(data, axis=1)] - - np.random.seed(133391) - data = np.random.rand(3, 4, 5).astype(np.float32) - - # default axis=1 - expected = hardmax_2d(data.reshape(3, 20)).reshape(3, 4, 5) - node = onnx.helper.make_node("Hardmax", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - expected = hardmax_2d(data.reshape(12, 5)).reshape(3, 4, 5) - node = onnx.helper.make_node("Hardmax", inputs=["x"], outputs=["y"], axis=-1) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - with pytest.raises(RuntimeError): - node = onnx.helper.make_node("Hardmax", inputs=["x"], outputs=["y"], axis=3) - ng_results = run_node(node, [data], opset_version=12) - - # For multiple occurrences of the maximal values, the first occurrence is selected - # for one-hot output - data = np.array([[3, 3, 3, 1]]).astype(np.float32) - expected = np.array([[1, 0, 0, 0]]).astype(np.float32) - node = onnx.helper.make_node("Hardmax", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - -@pytest.mark.xfail(condition=platform.system() == 'Darwin' and platform.machine() == 'arm64', - reason='Ticket - 122712') -def test_hardsigmoid(): - def hardsigmoid(data, alpha=0.2, beta=0.5): - return np.clip(alpha * data + beta, 0, 1) - - np.random.seed(133391) - alpha = np.random.rand() - beta = np.random.rand() - data = np.random.rand(3, 4, 5).astype(np.float32) - - expected = hardsigmoid(data, alpha, beta) - node = onnx.helper.make_node("HardSigmoid", inputs=["x"], outputs=["y"], alpha=alpha, beta=beta) - ng_results = run_node(node, [data]) - assert np.allclose(ng_results, [expected]) - - expected = hardsigmoid(data) - node = onnx.helper.make_node("HardSigmoid", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [data]) - assert np.allclose(ng_results, [expected]) - - -def test_logsoftmax(): - def logsoftmax_2d(x): - max_x = np.max(x, axis=1).reshape((-1, 1)) - exp_x = np.exp(x - max_x) - return x - max_x - np.log(np.sum(exp_x, axis=1).reshape((-1, 1))) - - np.random.seed(133391) - data = np.random.randn(3, 4, 5).astype(np.float32) - - node = onnx.helper.make_node("LogSoftmax", inputs=["x"], outputs=["y"], axis=0) - expected = logsoftmax_2d(data.reshape(1, 60)).reshape(3, 4, 5) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - node = onnx.helper.make_node("LogSoftmax", inputs=["x"], outputs=["y"], axis=1) - expected = logsoftmax_2d(data.reshape(3, 20)).reshape(3, 4, 5) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - # default axis is 1 - node = onnx.helper.make_node("LogSoftmax", inputs=["x"], outputs=["y"]) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - node = onnx.helper.make_node("LogSoftmax", inputs=["x"], outputs=["y"], axis=2) - expected = logsoftmax_2d(data.reshape(12, 5)).reshape(3, 4, 5) - ng_results = run_node(node, [data], opset_version=12) - assert np.allclose(ng_results, [expected]) - - with pytest.raises(RuntimeError): - node = onnx.helper.make_node("LogSoftmax", inputs=["x"], outputs=["y"], axis=3) - ng_results = run_node(node, [data], opset_version=12) - - -def test_softplus(): - def softplus(x): - return np.where(x < 20, np.log(np.exp(x) + 1), x) - - np.random.seed(133391) - data = np.random.randn(3, 4, 5).astype(np.float32) - - node = onnx.helper.make_node("Softplus", inputs=["x"], outputs=["y"]) - expected = softplus(data) - ng_results = run_node(node, [data]) - assert np.allclose(ng_results, [expected]) - - -def test_softsign(): - def softsign(x): - return x / (1 + np.abs(x)) - - np.random.seed(133391) - data = np.random.randn(3, 4, 5).astype(np.float32) - - node = onnx.helper.make_node("Softsign", inputs=["x"], outputs=["y"]) - expected = softsign(data) - ng_results = run_node(node, [data]) - assert np.allclose(ng_results, [expected]) - - -def test_identity(): - np.random.seed(133391) - shape = [2, 4] - input_data = np.random.randn(*shape).astype(np.float32) - - identity_node = make_node("Identity", inputs=["x"], outputs=["y"]) - ng_results = run_node(identity_node, [input_data]) - assert np.array_equal(ng_results, [input_data]) - - node1 = make_node("Add", inputs=["A", "B"], outputs=["add1"], name="add_node1") - node2 = make_node("Identity", inputs=["add1"], outputs=["identity1"], name="identity_node1") - node3 = make_node("Abs", inputs=["identity1"], outputs=["Y"], name="abs_node1") - - graph = make_graph( - [node1, node2, node3], - "test_graph", - [ - make_tensor_value_info("A", onnx.TensorProto.FLOAT, shape), - make_tensor_value_info("B", onnx.TensorProto.FLOAT, shape), - ], - [make_tensor_value_info("Y", onnx.TensorProto.FLOAT, shape)], - ) - model = make_model(graph, producer_name="ngraph ONNX Importer") - ng_model_function = import_onnx_model(model) - runtime = get_runtime() - computation = runtime.computation(ng_model_function) - ng_results = computation(input_data, input_data) - expected_result = np.abs(input_data + input_data) - - assert np.array_equal(ng_results[0], expected_result) - - -@pytest.mark.parametrize("val_type, input_data", [(np.dtype(bool), np.zeros((2, 2), dtype=int))]) -def test_cast_to_bool(val_type, input_data): - expected = np.array(input_data, dtype=val_type) - - model = get_node_model("Cast", input_data, opset=6, to=onnx.helper.np_dtype_to_tensor_dtype(val_type)) - result = run_model(model, [input_data]) - assert np.allclose(result, expected) - - -@pytest.mark.parametrize( - "val_type, range_start, range_end, in_dtype", - [ - (np.dtype(np.float32), -8, 8, np.dtype(np.int32)), - (np.dtype(np.float64), -16383, 16383, np.dtype(np.int64)), - ], -) -def test_cast_to_float(val_type, range_start, range_end, in_dtype): - np.random.seed(133391) - input_data = np.random.randint(range_start, range_end, size=(2, 2), dtype=in_dtype) - expected = np.array(input_data, dtype=val_type) - - model = get_node_model("Cast", input_data, opset=6, to=onnx.helper.np_dtype_to_tensor_dtype(val_type)) - result = run_model(model, [input_data]) - assert np.allclose(result, expected) - - -@pytest.mark.parametrize( - "val_type", [np.dtype(np.int8), - np.dtype(np.int16), - np.dtype(np.int32), - np.dtype(np.int64)] -) -def test_cast_to_int(val_type): - np.random.seed(133391) - input_data = np.ceil(-8 + np.random.rand(2, 3, 4) * 16) - expected = np.array(input_data, dtype=val_type) - - model = get_node_model("Cast", input_data, opset=6, to=onnx.helper.np_dtype_to_tensor_dtype(val_type)) - result = run_model(model, [input_data]) - assert np.allclose(result, expected) - - -@pytest.mark.parametrize( - "val_type", [np.dtype(np.uint8), np.dtype(np.uint16), np.dtype(np.uint32), np.dtype(np.uint64)] -) -def test_cast_to_uint(val_type): - np.random.seed(133391) - input_data = np.ceil(np.random.rand(2, 3, 4) * 16) - expected = np.array(input_data, dtype=val_type) - - model = get_node_model("Cast", input_data, opset=6, to=onnx.helper.np_dtype_to_tensor_dtype(val_type)) - result = run_model(model, [input_data]) - assert np.allclose(result, expected) - - -def test_cast_errors(): - from onnx.onnx_cpp2py_export.checker import ValidationError - - np.random.seed(133391) - input_data = np.ceil(np.random.rand(2, 3, 4) * 16) - - # missing 'to' attribute - node = onnx.helper.make_node("Cast", inputs=["A"], outputs=["B"]) - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, value.shape) - for name, value in zip(node.input, [input_data]) - ] - output_tensors = [ - make_tensor_value_info(node.output[0], onnx.TensorProto.FLOAT16, input_data.shape) - ] # type: ignore - - graph = make_graph([node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="NgraphBackend") - with pytest.raises(ValidationError): - import_onnx_model(model) - - # unsupported data type representation - node = onnx.helper.make_node("Cast", inputs=["A"], outputs=["B"], to=1.2345) - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, value.shape) - for name, value in zip(node.input, [input_data]) - ] - output_tensors = [ - make_tensor_value_info(node.output[0], onnx.TensorProto.INT32, input_data.shape) - ] # type: ignore - - graph = make_graph([node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="NgraphBackend") - with pytest.raises(ValidationError): - import_onnx_model(model) - - # unsupported input tensor data type: - node = onnx.helper.make_node("Cast", inputs=["A"], outputs=["B"], to=onnx.TensorProto.INT32) - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.COMPLEX64, value.shape) - for name, value in zip(node.input, [input_data]) - ] - output_tensors = [ - make_tensor_value_info(node.output[0], onnx.TensorProto.INT32, input_data.shape) - ] # type: ignore - - graph = make_graph([node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="NgraphBackend") - with pytest.raises((RuntimeError, NgraphTypeError)): - import_onnx_model(model) - - # unsupported output tensor data type: - node = onnx.helper.make_node("Cast", inputs=["A"], outputs=["B"], to=onnx.TensorProto.COMPLEX128) - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, value.shape) - for name, value in zip(node.input, [input_data]) - ] - output_tensors = [ - make_tensor_value_info(node.output[0], onnx.TensorProto.COMPLEX128, input_data.shape) - ] # type: ignore - - graph = make_graph([node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="NgraphBackend") - with pytest.raises(RuntimeError): - import_onnx_model(model) - - -@pytest.mark.parametrize("value_type", - [pytest.param(np.float64), - pytest.param(np.float32)]) -@pytest.mark.xfail(condition=platform.system() == 'Darwin' and platform.machine() == 'arm64', - reason='Ticket - 122712') -def test_constant(value_type): - values = np.random.randn(5, 5).astype(value_type) - node = onnx.helper.make_node( - "Constant", - inputs=[], - outputs=["values"], - value=onnx.helper.make_tensor( - name="const_tensor", - data_type=onnx.helper.np_dtype_to_tensor_dtype(np.dtype(value_type)), - dims=values.shape, - vals=values.flatten(), - ), - ) - - ng_results = run_node(node, []) - assert np.allclose(ng_results, [values]) - - -def test_constant_err(): - values = np.random.randn(5, 5).astype(np.float16) - node = onnx.helper.make_node( - "Constant", - inputs=[], - outputs=["values"], - value=onnx.helper.make_tensor( - name="const_tensor", - data_type=onnx.helper.np_dtype_to_tensor_dtype(np.dtype(np.float16)), - dims=values.shape, - vals=values.flatten(), - ), - ) - - ng_results = run_node(node, []) - assert np.allclose(ng_results, [values]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_ops_variadic.py b/src/bindings/python/tests_compatibility/test_onnx/test_ops_variadic.py deleted file mode 100644 index b86a8fbf768..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_ops_variadic.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -from functools import reduce - -import numpy as np -import onnx -import pytest - -from tests_compatibility.test_onnx.utils import run_node - - -@pytest.mark.parametrize( - "onnx_op,numpy_func", [("Sum", np.add), ("Min", np.minimum), ("Max", np.maximum)] -) -def test_variadic(onnx_op, numpy_func): - data = [ - np.array([1, 2, 3], dtype=np.int32), - np.array([4, 5, 6], dtype=np.int32), - np.array([7, 8, 9], dtype=np.int32), - ] - node = onnx.helper.make_node( - onnx_op, inputs=["data_0", "data_1", "data_2"], outputs=["y"] - ) - expected_output = reduce(numpy_func, data) - - ng_results = run_node(node, data) - assert np.array_equal(ng_results, [expected_output]) - - -def test_mean(): - data = [ - np.array([1, 2, 3], dtype=np.int32), - np.array([4, 5, 6], dtype=np.int32), - np.array([7, 8, 9], dtype=np.int32), - ] - node = onnx.helper.make_node( - "Mean", inputs=["data_0", "data_1", "data_2"], outputs=["y"] - ) - expected_output = reduce(np.add, data) / len(data) - - ng_results = run_node(node, data) - assert np.array_equal(ng_results, [expected_output]) diff --git a/src/bindings/python/tests_compatibility/test_onnx/test_zoo_models.py b/src/bindings/python/tests_compatibility/test_onnx/test_zoo_models.py deleted file mode 100644 index 49dff95a054..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/test_zoo_models.py +++ /dev/null @@ -1,192 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import tests_compatibility -from operator import itemgetter -from pathlib import Path -from typing import Sequence, Any -import numpy as np - -from tests_compatibility.test_onnx.utils import OpenVinoOnnxBackend -from tests_compatibility.test_onnx.utils.model_importer import ModelImportRunner - -from tests_compatibility import ( - xfail_issue_38701, - xfail_issue_37957, - xfail_issue_38084, - xfail_issue_39669, - xfail_issue_38726, - xfail_issue_37973, - xfail_issue_47430, - xfail_issue_47495, - xfail_issue_48145, - xfail_issue_48190, - xfail_issue_78843, - xfail_issue_onnx_models_140) - -MODELS_ROOT_DIR = tests_compatibility.MODEL_ZOO_DIR - -def yolov3_post_processing(outputs : Sequence[Any]) -> Sequence[Any]: - concat_out_index = 2 - # remove all elements with value -1 from yolonms_layer_1/concat_2:0 output - concat_out = outputs[concat_out_index][outputs[concat_out_index] != -1] - concat_out = np.expand_dims(concat_out, axis=0) - outputs[concat_out_index] = concat_out - return outputs - -def tinyyolov3_post_processing(outputs : Sequence[Any]) -> Sequence[Any]: - concat_out_index = 2 - # remove all elements with value -1 from yolonms_layer_1:1 output - concat_out = outputs[concat_out_index][outputs[concat_out_index] != -1] - concat_out = concat_out.reshape((outputs[concat_out_index].shape[0], -1, 3)) - outputs[concat_out_index] = concat_out - return outputs - -post_processing = { - "yolov3" : {"post_processing" : yolov3_post_processing}, - "tinyyolov3" : {"post_processing" : tinyyolov3_post_processing}, - "tiny-yolov3-11": {"post_processing": tinyyolov3_post_processing}, -} - -tolerance_map = { - "arcface_lresnet100e_opset8": {"atol": 0.001, "rtol": 0.001}, - "fp16_inception_v1": {"atol": 0.001, "rtol": 0.001}, - "mobilenet_opset7": {"atol": 0.001, "rtol": 0.001}, - "resnet50_v2_opset7": {"atol": 0.001, "rtol": 0.001}, - "test_mobilenetv2-1.0": {"atol": 0.001, "rtol": 0.001}, - "test_resnet101v2": {"atol": 0.001, "rtol": 0.001}, - "test_resnet18v2": {"atol": 0.001, "rtol": 0.001}, - "test_resnet34v2": {"atol": 0.001, "rtol": 0.001}, - "test_resnet50v2": {"atol": 0.001, "rtol": 0.001}, - "mosaic": {"atol": 0.001, "rtol": 0.001}, - "pointilism": {"atol": 0.001, "rtol": 0.001}, - "rain_princess": {"atol": 0.001, "rtol": 0.001}, - "udnie": {"atol": 0.001, "rtol": 0.001}, - "candy": {"atol": 0.003, "rtol": 0.003}, - "densenet-3": {"atol": 1e-7, "rtol": 0.0011}, - "arcfaceresnet100-8": {"atol": 0.001, "rtol": 0.001}, - "mobilenetv2-7": {"atol": 0.001, "rtol": 0.001}, - "resnet101-v1-7": {"atol": 0.001, "rtol": 0.001}, - "resnet101-v2-7": {"atol": 0.001, "rtol": 0.001}, - "resnet152-v1-7": {"atol": 1e-7, "rtol": 0.003}, - "resnet152-v2-7": {"atol": 0.001, "rtol": 0.001}, - "resnet18-v1-7": {"atol": 0.001, "rtol": 0.001}, - "resnet18-v2-7": {"atol": 0.001, "rtol": 0.001}, - "resnet34-v2-7": {"atol": 0.001, "rtol": 0.001}, - "vgg16-7": {"atol": 0.001, "rtol": 0.001}, - "vgg19-bn-7": {"atol": 0.001, "rtol": 0.001}, - "tinyyolov2-7": {"atol": 0.001, "rtol": 0.001}, - "tinyyolov2-8": {"atol": 0.001, "rtol": 0.001}, - "candy-8": {"atol": 0.001, "rtol": 0.001}, - "candy-9": {"atol": 0.007, "rtol": 0.001}, - "mosaic-8": {"atol": 0.003, "rtol": 0.001}, - "mosaic-9": {"atol": 0.001, "rtol": 0.001}, - "pointilism-8": {"atol": 0.001, "rtol": 0.001}, - "pointilism-9": {"atol": 0.001, "rtol": 0.001}, - "rain-princess-8": {"atol": 0.001, "rtol": 0.001}, - "rain-princess-9": {"atol": 0.001, "rtol": 0.001}, - "udnie-8": {"atol": 0.001, "rtol": 0.001}, - "udnie-9": {"atol": 0.001, "rtol": 0.001}, - "mxnet_arcface": {"atol": 1.5e-5, "rtol": 0.001}, - "resnet100": {"atol": 1.5e-5, "rtol": 0.001}, - "densenet121": {"atol": 1e-7, "rtol": 0.0011}, - "resnet152v1": {"atol": 1e-7, "rtol": 0.003}, - "test_shufflenetv2": {"atol": 1e-05, "rtol": 0.001}, - "tiny_yolov2": {"atol": 1e-05, "rtol": 0.001}, - "mobilenetv2-1": {"atol": 1e-04, "rtol": 0.001}, - "resnet101v1": {"atol": 1e-04, "rtol": 0.001}, - "resnet101v2": {"atol": 1e-06, "rtol": 0.001}, - "resnet152v2": {"atol": 1e-05, "rtol": 0.001}, - "resnet18v2": {"atol": 1e-05, "rtol": 0.001}, - "resnet34v2": {"atol": 1e-05, "rtol": 0.001}, - "vgg16": {"atol": 1e-05, "rtol": 0.001}, - "vgg19-bn": {"atol": 1e-05, "rtol": 0.001}, - "test_tiny_yolov2": {"atol": 1e-05, "rtol": 0.001}, - "test_resnet152v2": {"atol": 1e-04, "rtol": 0.001}, - "test_mobilenetv2-1": {"atol": 1e-04, "rtol": 0.001}, - "yolov3": {"atol": 0.001, "rtol": 0.001}, - "yolov4": {"atol": 1e-04, "rtol": 0.001}, - "tinyyolov3": {"atol": 1e-04, "rtol": 0.001}, - "tiny-yolov3-11": {"atol": 1e-04, "rtol": 0.001}, - "GPT2": {"atol": 5e-06, "rtol": 0.01}, - "GPT-2-LM-HEAD": {"atol": 4e-06}, - "test_retinanet_resnet101": {"atol": 1.3e-06}, -} - -zoo_models = [] -# rglob doesn't work for symlinks, so models have to be physically somwhere inside "MODELS_ROOT_DIR" -for path in Path(MODELS_ROOT_DIR).rglob("*.onnx"): - mdir = path.parent - file_name = path.name - if path.is_file() and not file_name.startswith("."): - model = {"model_name": path, "model_file": file_name, "dir": mdir} - basedir = mdir.stem - if basedir in tolerance_map: - # updated model looks now: - # {"model_name": path, "model_file": file, "dir": mdir, "atol": ..., "rtol": ...} - model.update(tolerance_map[basedir]) - if basedir in post_processing: - model.update(post_processing[basedir]) - zoo_models.append(model) - -if len(zoo_models) > 0: - zoo_models = sorted(zoo_models, key=itemgetter("model_name")) - - # Set backend device name to be used instead of hardcoded by ONNX BackendTest class ones. - OpenVinoOnnxBackend.backend_name = tests_compatibility.BACKEND_NAME - - # import all test cases at global scope to make them visible to pytest - backend_test = ModelImportRunner(OpenVinoOnnxBackend, zoo_models, __name__, MODELS_ROOT_DIR) - test_cases = backend_test.test_cases["OnnxBackendModelImportTest"] - # flake8: noqa: E501 - if tests_compatibility.MODEL_ZOO_XFAIL: - import_xfail_list = [ - # ONNX Model Zoo - (xfail_issue_38701, "test_onnx_model_zoo_text_machine_comprehension_bidirectional_attention_flow_model_bidaf_9_bidaf_bidaf_cpu"), - (xfail_issue_38726, "test_onnx_model_zoo_text_machine_comprehension_t5_model_t5_decoder_with_lm_head_12_t5_decoder_with_lm_head_cpu"), - - # Model MSFT - (xfail_issue_37957, "test_MSFT_opset10_mask_rcnn_keras_mask_rcnn_keras_cpu"), - ] - for test_case in import_xfail_list: - xfail, test_name = test_case - xfail(getattr(test_cases, test_name)) - - del test_cases - - test_cases = backend_test.test_cases["OnnxBackendModelExecutionTest"] - if tests_compatibility.MODEL_ZOO_XFAIL: - execution_xfail_list = [ - # ONNX Model Zoo - (xfail_issue_39669, "test_onnx_model_zoo_text_machine_comprehension_t5_model_t5_encoder_12_t5_encoder_cpu"), - (xfail_issue_38084, "test_onnx_model_zoo_vision_object_detection_segmentation_mask_rcnn_model_MaskRCNN_10_mask_rcnn_R_50_FPN_1x_cpu"), - (xfail_issue_47430, "test_onnx_model_zoo_vision_object_detection_segmentation_fcn_model_fcn_resnet50_11_fcn_resnet50_11_model_cpu"), - (xfail_issue_47430, "test_onnx_model_zoo_vision_object_detection_segmentation_fcn_model_fcn_resnet101_11_fcn_resnet101_11_model_cpu"), - (xfail_issue_48145, "test_onnx_model_zoo_text_machine_comprehension_bert_squad_model_bertsquad_8_download_sample_8_bertsquad8_cpu"), - (xfail_issue_48190, "test_onnx_model_zoo_text_machine_comprehension_roberta_model_roberta_base_11_roberta_base_11_roberta_base_11_cpu"), - (xfail_issue_onnx_models_140, "test_onnx_model_zoo_vision_object_detection_segmentation_duc_model_ResNet101_DUC_7_ResNet101_DUC_HDC_ResNet101_DUC_HDC_cpu"), - (xfail_issue_78843, "test_onnx_model_zoo_vision_object_detection_segmentation_ssd_mobilenetv1_model_ssd_mobilenet_v1_10_ssd_mobilenet_v1_ssd_mobilenet_v1_cpu"), - - # Model MSFT - (xfail_issue_37973, "test_MSFT_opset7_tf_inception_v2_model_cpu"), - (xfail_issue_37973, "test_MSFT_opset8_tf_inception_v2_model_cpu"), - (xfail_issue_37973, "test_MSFT_opset9_tf_inception_v2_model_cpu"), - (xfail_issue_37973, "test_MSFT_opset11_tf_inception_v2_model_cpu"), - (xfail_issue_37973, "test_MSFT_opset10_tf_inception_v2_model_cpu"), - - (xfail_issue_58676, "test_MSFT_opset7_fp16_tiny_yolov2_onnxzoo_winmlperf_tiny_yolov2_cpu"), - (xfail_issue_58676, "test_MSFT_opset8_fp16_tiny_yolov2_onnxzoo_winmlperf_tiny_yolov2_cpu"), - - (xfail_issue_38084, "test_MSFT_opset10_mask_rcnn_mask_rcnn_R_50_FPN_1x_cpu"), - - (xfail_issue_39669, "test_MSFT_opset9_cgan_cgan_cpu"), - (xfail_issue_47495, "test_MSFT_opset10_BERT_Squad_bertsquad10_cpu"), - (xfail_issue_78843, "test_MSFT_opset10_mlperf_ssd_mobilenet_300_ssd_mobilenet_v1_coco_2018_01_28_cpu"), - ] - for test_case in import_xfail_list + execution_xfail_list: - xfail, test_name = test_case - xfail(getattr(test_cases, test_name)) - - del test_cases - - globals().update(backend_test.enable_report().test_cases) diff --git a/src/bindings/python/tests_compatibility/test_onnx/utils/__init__.py b/src/bindings/python/tests_compatibility/test_onnx/utils/__init__.py deleted file mode 100644 index 500f055a3af..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/utils/__init__.py +++ /dev/null @@ -1,87 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -from string import ascii_uppercase -from typing import Any, Dict, Iterable, List, Optional, Text - -import numpy as np -import onnx -from onnx.helper import make_graph, make_model, make_node, make_tensor_value_info - -import tests_compatibility -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils.onnx_backend import OpenVinoOnnxBackend -from tests_compatibility.test_onnx.utils.onnx_helpers import import_onnx_model - - -def run_node(onnx_node, data_inputs, **kwargs): - # type: (onnx.NodeProto, List[np.ndarray], Dict[Text, Any]) -> List[np.ndarray] - """ - Convert ONNX node to ngraph node and perform computation on input data. - - :param onnx_node: ONNX NodeProto describing a computation node - :param data_inputs: list of numpy ndarrays with input data - :return: list of numpy ndarrays with computed output - """ - OpenVinoOnnxBackend.backend_name = tests_compatibility.BACKEND_NAME - return OpenVinoOnnxBackend.run_node(onnx_node, data_inputs, **kwargs) - - -def run_model(onnx_model, data_inputs): - # type: (onnx.ModelProto, List[np.ndarray]) -> List[np.ndarray] - """ - Convert ONNX model to an ngraph model and perform computation on input data. - - :param onnx_model: ONNX ModelProto describing an ONNX model - :param data_inputs: list of numpy ndarrays with input data - :return: list of numpy ndarrays with computed output - """ - ng_model_function = import_onnx_model(onnx_model) - runtime = get_runtime() - computation = runtime.computation(ng_model_function) - return computation(*data_inputs) - - -def get_node_model(op_type, *input_data, opset=1, num_outputs=1, **node_attributes): - # type: (str, *Any, Optional[int], Optional[int], **Any) -> onnx.ModelProto - """Generate model with single requested node. - - Input and output Tensor data type is the same. - - :param op_type: The ONNX node operation. - :param input_data: Optional list of input arguments for node. - :param opset: The ONNX operation set version to use. Default to 4. - :param num_outputs: The number of node outputs. - :param node_attributes: Optional dictionary of node attributes. - :return: Generated model with single node for requested ONNX operation. - """ - node_inputs = [np.array(data) for data in input_data] - num_inputs = len(node_inputs) - node_input_names = [ascii_uppercase[idx] for idx in range(num_inputs)] - node_output_names = [ascii_uppercase[num_inputs + idx] for idx in range(num_outputs)] - onnx_node = make_node(op_type, node_input_names, node_output_names, **node_attributes) - - input_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, value.shape) - for name, value in zip(onnx_node.input, node_inputs) - ] - output_tensors = [ - make_tensor_value_info(name, onnx.TensorProto.FLOAT, ()) for name in onnx_node.output - ] # type: ignore - - graph = make_graph([onnx_node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="Ngraph ONNX Importer") - model.opset_import[0].version = opset - return model - - -def all_arrays_equal(first_list, second_list): - # type: (Iterable[np.ndarray], Iterable[np.ndarray]) -> bool - """ - Check that all numpy ndarrays in `first_list` are equal to all numpy ndarrays in `second_list`. - - :param first_list: iterable containing numpy ndarray objects - :param second_list: another iterable containing numpy ndarray objects - :return: True if all ndarrays are equal, otherwise False - """ - return all(map(lambda pair: np.array_equal(*pair), zip(first_list, second_list))) diff --git a/src/bindings/python/tests_compatibility/test_onnx/utils/model_importer.py b/src/bindings/python/tests_compatibility/test_onnx/utils/model_importer.py deleted file mode 100644 index c7434cec990..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/utils/model_importer.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import numpy as np -import onnx -import onnx.backend.test -import unittest -import dataclasses - -from collections import defaultdict, namedtuple -from onnx import numpy_helper, NodeProto, ModelProto -from onnx.backend.base import Backend, BackendRep -from onnx.backend.test.case.test_case import TestCase as OnnxTestCase -from onnx.backend.test.runner import TestItem -from pathlib import Path -from tests_compatibility.test_onnx.utils.onnx_helpers import import_onnx_model -from typing import Any, Dict, List, Optional, Pattern, Set, Text, Type, Union, Callable, Sequence - - -# add post-processing function as part of test data -OnnxTestCase_fields = [field.name for field in dataclasses.fields(OnnxTestCase)] -ExtOnnxTestCase = dataclasses.make_dataclass(cls_name="TestCaseExt", - fields=[*OnnxTestCase_fields, "post_processing"]) - - -class ModelImportRunner(onnx.backend.test.BackendTest): - def __init__( - self, - backend: Type[Backend], - models: List[Dict[str, Path]], - parent_module: Optional[str] = None, - data_root: Optional[Path] = "", - ) -> None: - self.backend = backend - self._parent_module = parent_module - self._include_patterns = set() # type: Set[Pattern[Text]] - self._exclude_patterns = set() # type: Set[Pattern[Text]] - self._test_items = defaultdict(dict) # type: Dict[Text, Dict[Text, TestItem]] - self._xfail_patterns = set() # type: Set[Pattern[Text]] - - for model in models: - test_name = "test{}".format(model["model_name"]) \ - .replace(str(data_root), "") \ - .replace(".onnx", "") \ - .replace("/", "_") \ - .replace("\\", "_") \ - .replace("-", "_") - - test_case = ExtOnnxTestCase( - name=test_name, - url=None, - model_name=model["model_name"], - model_dir=model["dir"], - model=model["model_file"], - data_sets=None, - kind="OnnxBackendRealModelTest", - rtol=model.get("rtol", 0.001), - atol=model.get("atol", 1e-07), - __test__=True, - post_processing=model.get("post_processing", None) - ) - self._add_model_import_test(test_case) - self._add_model_execution_test(test_case) - - @staticmethod - def _load_onnx_model(model_dir: Path, filename: Path) -> ModelProto: - if model_dir is None: - raise unittest.SkipTest("Model directory not provided") - - return onnx.load(model_dir / filename) - - def _add_model_import_test(self, model_test: ExtOnnxTestCase) -> None: - # model is loaded at runtime, note sometimes it could even - # never loaded if the test skipped - model_marker = [None] # type: List[Optional[Union[ModelProto, NodeProto]]] - - def run_import(test_self: Any, device: Text) -> None: - model = ModelImportRunner._load_onnx_model(model_test.model_dir, model_test.model) - model_marker[0] = model - assert import_onnx_model(model) - - self._add_test("ModelImport", model_test.name, run_import, model_marker) - - @classmethod - def _execute_npz_data( - cls, model_dir: str, prepared_model: BackendRep, result_rtol: float, result_atol: float, - post_processing: Callable[[Sequence[Any]], Sequence[Any]] = None - ) -> int: - executed_tests = 0 - for test_data_npz in model_dir.glob("test_data_*.npz"): - test_data = np.load(test_data_npz, encoding="bytes") - inputs = list(test_data["inputs"]) - outputs = list(prepared_model.run(inputs)) - ref_outputs = test_data["outputs"] - if post_processing is not None: - outputs = post_processing(outputs) - cls.assert_similar_outputs(ref_outputs, outputs, result_rtol, result_atol) - executed_tests = executed_tests + 1 - return executed_tests - - @classmethod - def _execute_pb_data( - cls, model_dir: str, prepared_model: BackendRep, result_rtol: float, result_atol: float, - post_processing: Callable[[Sequence[Any]], Sequence[Any]] = None - ) -> int: - executed_tests = 0 - for test_data_dir in model_dir.glob("test_data_set*"): - inputs = [] - inputs_num = len(list(test_data_dir.glob("input_*.pb"))) - for i in range(inputs_num): - input_file = Path(test_data_dir) / "input_{}.pb".format(i) - tensor = onnx.TensorProto() - with open(input_file, "rb") as f: - tensor.ParseFromString(f.read()) - inputs.append(numpy_helper.to_array(tensor)) - ref_outputs = [] - ref_outputs_num = len(list(test_data_dir.glob("output_*.pb"))) - for i in range(ref_outputs_num): - output_file = Path(test_data_dir) / "output_{}.pb".format(i) - tensor = onnx.TensorProto() - with open(output_file, "rb") as f: - tensor.ParseFromString(f.read()) - ref_outputs.append(numpy_helper.to_array(tensor)) - if(len(inputs) == 0): - continue - outputs = list(prepared_model.run(inputs)) - if post_processing is not None: - outputs = post_processing(outputs) - cls.assert_similar_outputs(ref_outputs, outputs, result_rtol, result_atol) - executed_tests = executed_tests + 1 - return executed_tests - - def _add_model_execution_test(self, model_test: ExtOnnxTestCase) -> None: - # model is loaded at runtime, note sometimes it could even - # never loaded if the test skipped - model_marker = [None] # type: List[Optional[Union[ModelProto, NodeProto]]] - - def run_execution(test_self: Any, device: Text) -> None: - model = ModelImportRunner._load_onnx_model(model_test.model_dir, model_test.model) - model_marker[0] = model - prepared_model = self.backend.prepare(model, device) - assert prepared_model is not None - executed_tests = ModelImportRunner._execute_npz_data( - model_test.model_dir, prepared_model, model_test.rtol, model_test.atol, - model_test.post_processing - ) - - executed_tests = executed_tests + ModelImportRunner._execute_pb_data( - model_test.model_dir, prepared_model, model_test.rtol, model_test.atol, - model_test.post_processing - ) - assert executed_tests > 0, "This model has no test data" - self._add_test("ModelExecution", model_test.name, run_execution, model_marker) diff --git a/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_backend.py b/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_backend.py deleted file mode 100644 index a3eea6a2ac9..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_backend.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -""" -ONNX Backend implementation. - -See ONNX documentation for details: -https://github.com/onnx/onnx/blob/master/docs/Implementing%20an%20ONNX%20backend.md -""" - -from typing import Any, Dict, List, Optional, Sequence, Text, Tuple - -import numpy -import onnx -from onnx.backend.base import Backend, BackendRep -from onnx.helper import make_graph, make_model, make_tensor_value_info, np_dtype_to_tensor_dtype - -from ngraph.impl import Function -from tests_compatibility.runtime import get_runtime -from tests_compatibility.test_onnx.utils.onnx_helpers import import_onnx_model - - -class OpenVinoOnnxBackendRep(BackendRep): - def __init__(self, ng_model_function, device="CPU"): # type: (List[Function], str) -> None - super().__init__() - self.device = device - self.ng_model_function = ng_model_function - self.runtime = get_runtime() - self.computation = self.runtime.computation(ng_model_function) - - def run(self, inputs, **kwargs): # type: (Any, **Any) -> Tuple[Any, ...] - """Run computation on model.""" - return self.computation(*inputs) - - -class OpenVinoOnnxBackend(Backend): - @classmethod - def is_compatible( - cls, - model, # type: onnx.ModelProto - device="CPU", # type: Text - **kwargs # type: Any - ): # type: (...) -> bool - # Return whether the model is compatible with the backend. - try: - import_onnx_model(model) - return True - except Exception: - return False - - @classmethod - def prepare( - cls, - onnx_model, # type: onnx.ModelProto - device="CPU", # type: Text - **kwargs # type: Any - ): # type: (...) -> OpenVinoOnnxBackendRep - super().prepare(onnx_model, device, **kwargs) - ng_model_function = import_onnx_model(onnx_model) - return OpenVinoOnnxBackendRep(ng_model_function, device) - - @classmethod - def run_model( - cls, - model, # type: onnx.ModelProto - inputs, # type: Any - device="CPU", # type: Text - **kwargs # type: Any - ): # type: (...) -> Tuple[Any, ...] - return cls.prepare(model, device, **kwargs).run(inputs) - - @classmethod - def run_node( - cls, - node, # type: onnx.NodeProto - inputs, # type: Any - device="CPU", # type: Text - outputs_info=None, # type: Optional[Sequence[Tuple[numpy.dtype, Tuple[int, ...]]]] - **kwargs # type: Dict[Text, Any] - ): # type: (...) -> Optional[Tuple[Any, ...]] - """Prepare and run a computation on an ONNX node.""" - # default values for input/output tensors - input_tensor_types = [np_dtype_to_tensor_dtype(node_input.dtype) for node_input in inputs] - output_tensor_types = [onnx.TensorProto.FLOAT for _ in range(len(node.output))] - output_tensor_shapes = [()] # type: List[Tuple[int, ...]] - - if outputs_info is not None: - output_tensor_types = [ - np_dtype_to_tensor_dtype(dtype) for (dtype, _) in outputs_info - ] - output_tensor_shapes = [shape for (_, shape) in outputs_info] - - input_tensors = [ - make_tensor_value_info(name, tensor_type, value.shape) - for name, value, tensor_type in zip(node.input, inputs, input_tensor_types) - ] - output_tensors = [ - make_tensor_value_info(name, tensor_type, shape) - for name, shape, tensor_type in zip( - node.output, output_tensor_shapes, output_tensor_types - ) - ] - - graph = make_graph([node], "compute_graph", input_tensors, output_tensors) - model = make_model(graph, producer_name="OpenVinoOnnxBackend") - if "opset_version" in kwargs: - model.opset_import[0].version = kwargs["opset_version"] - return cls.prepare(model, device).run(inputs) - - @classmethod - def supports_device(cls, device): # type: (Text) -> bool - """Check whether the backend is compiled with particular device support. - - In particular it's used in the testing suite. - """ - return device != "CUDA" and device != "NVIDIA" - - -class OpenVinoTestBackend(OpenVinoOnnxBackend): - @classmethod - def is_compatible( - cls, - model, # type: onnx.ModelProto - device="CPU", # type: Text - **kwargs # type: Any - ): # type: (...) -> bool - # Return whether the model is compatible with the backend. - import_onnx_model(model) - return True - - -prepare = OpenVinoOnnxBackend.prepare -run_model = OpenVinoOnnxBackend.run_model -run_node = OpenVinoOnnxBackend.run_node -supports_device = OpenVinoOnnxBackend.supports_device diff --git a/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_helpers.py b/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_helpers.py deleted file mode 100644 index c5e774da297..00000000000 --- a/src/bindings/python/tests_compatibility/test_onnx/utils/onnx_helpers.py +++ /dev/null @@ -1,19 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import onnx -from openvino.inference_engine import IECore - -import ngraph as ng -from ngraph.impl import Function - - -def import_onnx_model(model: onnx.ModelProto) -> Function: - onnx.checker.check_model(model) - model_byte_string = model.SerializeToString() - - ie = IECore() - ie_network = ie.read_network(model=model_byte_string, weights=b"", init_from_buffer=True) - - ng_function = ng.function_from_cnn(ie_network) - return ng_function diff --git a/src/bindings/python/tests_compatibility/test_utils/test_utils.py b/src/bindings/python/tests_compatibility/test_utils/test_utils.py deleted file mode 100644 index aa03aced982..00000000000 --- a/src/bindings/python/tests_compatibility/test_utils/test_utils.py +++ /dev/null @@ -1,41 +0,0 @@ -# Copyright (C) 2018-2023 Intel Corporation -# SPDX-License-Identifier: Apache-2.0 - -import openvino -import ngraph as ng -from openvino.inference_engine import IECore, IENetwork -from ngraph.impl import Function, Shape, Type -from ngraph.impl.op import Parameter - -from typing import Tuple, Union, List -import numpy as np - - -def get_test_function(): - element_type = Type.f32 - param = Parameter(element_type, Shape([1, 3, 22, 22])) - relu = ng.relu(param) - func = Function([relu], [param], "test") - assert func is not None - return func - - -def generate_image(shape: Tuple = (1, 3, 32, 32), dtype: Union[str, np.dtype] = "float32") -> np.array: - np.random.seed(42) - return np.random.rand(*shape).astype(dtype) - - -def generate_relu_model(input_shape: List[int]) -> openvino.inference_engine.IENetwork: - param = ng.parameter(input_shape, np.float32, name="parameter") - relu = ng.relu(param, name="relu") - func = Function([relu], [param], "test") - func.get_ordered_ops()[2].friendly_name = "friendly" - caps = Function.to_capsule(func) - cnnNetwork = IENetwork(caps) - return cnnNetwork - - -def generate_relu_compiled_model(input_shape: List[int], device = "CPU") -> openvino.inference_engine.ExecutableNetwork: - core = IECore() - cnnNetwork = generate_relu_model(input_shape) - return core.load_network(cnnNetwork, device, {}) diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/plugins.xml b/src/bindings/python/tests_compatibility/test_utils/utils/plugins.xml deleted file mode 100644 index 1b0c122f05b..00000000000 --- a/src/bindings/python/tests_compatibility/test_utils/utils/plugins.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/plugins_apple.xml b/src/bindings/python/tests_compatibility/test_utils/utils/plugins_apple.xml deleted file mode 100644 index 1b0c122f05b..00000000000 --- a/src/bindings/python/tests_compatibility/test_utils/utils/plugins_apple.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/plugins_win.xml b/src/bindings/python/tests_compatibility/test_utils/utils/plugins_win.xml deleted file mode 100644 index 51f871a3a8c..00000000000 --- a/src/bindings/python/tests_compatibility/test_utils/utils/plugins_win.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/test_model.onnx b/src/bindings/python/tests_compatibility/test_utils/utils/test_model.onnx deleted file mode 100644 index 333053b81fed9f5ec346e982b7e70337482bc5b7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356721 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

ZW$i?JStZv258l5yxL;19?puhbS*}Alv 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

P#if=Pskxqg%+^d8&l} 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

&9{Oa82c9`!LlQEwpi|}}^tn&x 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�GYz+Hr@1O#g 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∾JB_#wmV`k9aW*g2# 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

?0a?AR#G&o`XI%A7nHxgs5>{w~1z3w1&1)ff2K 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 NB_|7~Pg12C-#@`3OZ5N% diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp16.bin b/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp16.bin deleted file mode 100644 index 8b86761726ac289869ff38c451e04eff887c5ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168804 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

7Xn@b~Dxt~i+CF3A=c(<4p5D()_f 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 - - - - - - - 1 - 3 - 32 - 32 - - - - - - - - 16 - 3 - 5 - 5 - - - - - - - - 1 - 3 - 32 - 32 - - - 16 - 3 - 5 - 5 - - - - - 1 - 16 - 32 - 32 - - - - - - - - 1 - 16 - 1 - 1 - - - - - - - 1 - 16 - 32 - 32 - - - 1 - 16 - 1 - 1 - - - - - 1 - 16 - 32 - 32 - - - - - - - 1 - 16 - 32 - 32 - - - - - 1 - 16 - 32 - 32 - - - - - - - - 1 - 16 - 32 - 32 - - - - - 1 - 16 - 16 - 16 - - - - - - - - 32 - 16 - 5 - 5 - - - - - - - - 1 - 16 - 16 - 16 - - - 32 - 16 - 5 - 5 - - - - - 1 - 32 - 16 - 16 - - - - - - - - 1 - 32 - 1 - 1 - - - - - - - 1 - 32 - 16 - 16 - - - 1 - 32 - 1 - 1 - - - - - 1 - 32 - 16 - 16 - - - - - - - - 64 - 32 - 3 - 3 - - - - - - - - 1 - 32 - 16 - 16 - - - 64 - 32 - 3 - 3 - - - - - 1 - 64 - 18 - 18 - - - - - - - - 1 - 64 - 1 - 1 - - - - - - - 1 - 64 - 18 - 18 - - - 1 - 64 - 1 - 1 - - - - - 1 - 64 - 18 - 18 - - - - - - - 1 - 64 - 18 - 18 - - - - - 1 - 64 - 18 - 18 - - - - - - - - 1 - 64 - 18 - 18 - - - - - 1 - 64 - 9 - 9 - - - - - - - - 2 - - - - - - - - 1 - 64 - 9 - 9 - - - 2 - - - - - 1 - 5184 - - - - - - - - 10 - 5184 - - - - - - - - 1 - 5184 - - - 10 - 5184 - - - - - 1 - 10 - - - - - - - - 1 - 10 - - - - - - - 1 - 10 - - - 1 - 10 - - - - - 1 - 10 - - - - - - - - 1 - 10 - - - - - 1 - 10 - - - - - - - 1 - 10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.bin b/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.bin deleted file mode 100644 index b5f85e4108314c14a05efa9e4e2e149cf446b87d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337592 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

pg0IZ22vGgPF(b_tKG=Z75mq2ZqCwNJdv2$nhj# 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 diff --git a/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.xml b/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.xml deleted file mode 100644 index dcf0cd74b06..00000000000 --- a/src/bindings/python/tests_compatibility/test_utils/utils/test_model_fp32.xml +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - - - 1 - 3 - 32 - 32 - - - - - - - - 16 - 3 - 5 - 5 - - - - - - - - 1 - 3 - 32 - 32 - - - 16 - 3 - 5 - 5 - - - - - 1 - 16 - 32 - 32 - - - - - - - - 1 - 16 - 1 - 1 - - - - - - - 1 - 16 - 32 - 32 - - - 1 - 16 - 1 - 1 - - - - - 1 - 16 - 32 - 32 - - - - - - - 1 - 16 - 32 - 32 - - - - - 1 - 16 - 32 - 32 - - - - - - - - 1 - 16 - 32 - 32 - - - - - 1 - 16 - 16 - 16 - - - - - - - - 32 - 16 - 5 - 5 - - - - - - - - 1 - 16 - 16 - 16 - - - 32 - 16 - 5 - 5 - - - - - 1 - 32 - 16 - 16 - - - - - - - - 1 - 32 - 1 - 1 - - - - - - - 1 - 32 - 16 - 16 - - - 1 - 32 - 1 - 1 - - - - - 1 - 32 - 16 - 16 - - - - - - - - 64 - 32 - 3 - 3 - - - - - - - - 1 - 32 - 16 - 16 - - - 64 - 32 - 3 - 3 - - - - - 1 - 64 - 18 - 18 - - - - - - - - 1 - 64 - 1 - 1 - - - - - - - 1 - 64 - 18 - 18 - - - 1 - 64 - 1 - 1 - - - - - 1 - 64 - 18 - 18 - - - - - - - 1 - 64 - 18 - 18 - - - - - 1 - 64 - 18 - 18 - - - - - - - - 1 - 64 - 18 - 18 - - - - - 1 - 64 - 9 - 9 - - - - - - - - 2 - - - - - - - - 1 - 64 - 9 - 9 - - - 2 - - - - - 1 - 5184 - - - - - - - - 10 - 5184 - - - - - - - - 1 - 5184 - - - 10 - 5184 - - - - - 1 - 10 - - - - - - - - 1 - 10 - - - - - - - 1 - 10 - - - 1 - 10 - - - - - 1 - 10 - - - - - - - - 1 - 10 - - - - - 1 - 10 - - - - - - - 1 - 10 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -