Add IR frontend tests (#13178)

* Add IR frontend tests

* Fix comments

* Add tests

* Fix comments 1

* Fix comments 2

* fix comments 3

* fix code style

* Fix comments 4

* Fix comments 5

Co-authored-by: Ilya Churaev <ilya.churaev@intel.com>
This commit is contained in:
Oleg PipikinandIlya Churaev authored and GitHub committed 2022-10-12 13:31:58 +04:00
1 parent 07aabf27bc
commit 11579530b7
12 files changed
+1630 -150

No files matched your search

+5
View File
@@ -3,3 +3,8 @@
#
add_subdirectory(src)
if(ENABLE_TESTS)
add_subdirectory(tests)
endif()
+22
View File
@@ -0,0 +1,22 @@
# Copyright (C) 2018-2022 Intel Corporation
# SPDX-License-Identifier: Apache-2.0
#
set(TARGET_NAME ov_ir_frontend_tests)
ov_add_test_target(
NAME ${TARGET_NAME}
ROOT ${CMAKE_CURRENT_SOURCE_DIR}
DEPENDENCIES
openvino_ir_frontend
LINK_LIBRARIES
gtest
gtest_main
openvino::runtime::dev
commonTestUtils
INCLUDES
"${CMAKE_CURRENT_SOURCE_DIR}/../include"
ADD_CLANG_FORMAT
LABELS
IR_FRONTEND
)
+63
View File
@@ -0,0 +1,63 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <gtest/gtest.h>
#include <fstream>
#include "common_test_utils/graph_comparator.hpp"
#include "openvino/frontend/manager.hpp"
#include "openvino/openvino.hpp"
class IRFrontendTestsImpl {
protected:
ov::Core core;
ov::frontend::FrontEndManager manager;
std::string xmlFileName = "IrFrontendTestModel.xml";
std::string binFileName = "IrFrontendTestModel.bin";
void createTemporalModelFile(std::string xmlFileContent,
std::vector<unsigned char> binFileContent = std::vector<unsigned char>()) {
ASSERT_TRUE(xmlFileContent.size() > 0);
{
std::ofstream xmlFile;
xmlFile.open(xmlFileName);
xmlFile << xmlFileContent;
xmlFile.close();
}
if (binFileContent.size() > 0) {
std::ofstream binFile;
binFile.open(binFileName, std::ios::binary);
binFile.write((const char*)binFileContent.data(), binFileContent.size());
binFile.close();
}
}
void RemoveTemporalFiles() {
std::remove(xmlFileName.c_str());
std::remove(binFileName.c_str());
}
std::shared_ptr<ov::Model> getWithIRFrontend(const std::string& model) {
std::istringstream modelStringStream(model);
std::istream& modelStream = modelStringStream;
ov::frontend::FrontEnd::Ptr FE;
ov::frontend::InputModel::Ptr inputModel;
ov::AnyVector params{&modelStream};
FE = manager.load_by_model(params);
if (FE)
inputModel = FE->load(params);
if (inputModel)
return FE->convert(inputModel);
return nullptr;
}
};
@@ -0,0 +1,959 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "frontend_test.hpp"
#include "openvino/opsets/opset1.hpp"
#include "openvino/opsets/opset3.hpp"
class IRFrontendTests : public ::testing::Test, public IRFrontendTestsImpl {
protected:
void SetUp() override {}
void TearDown() override {
RemoveTemporalFiles();
}
};
TEST_F(IRFrontendTests, elementary_model_reading_v11) {
std::string testModelV11 = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ov::RTMap rtInfo;
uint64_t version;
ASSERT_NO_THROW(model = getWithIRFrontend(testModelV11));
ASSERT_TRUE(!!model);
ASSERT_NO_THROW(rtInfo = model->get_rt_info());
ASSERT_NO_THROW(version = rtInfo["version"].as<int64_t>());
ASSERT_EQ(11, version);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 3, 22, 22});
parameter->set_friendly_name("input");
auto result = std::make_shared<ov::opset1::Result>(parameter);
result->set_friendly_name("output");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTests, elementary_model_reading_v10) {
std::string testModelV10 = R"V0G0N(
<net name="Network" version="10">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> modelv10;
ov::RTMap rtInfoV10;
uint64_t version;
ASSERT_NO_THROW(modelv10 = getWithIRFrontend(testModelV10));
ASSERT_TRUE(!!modelv10);
ASSERT_NO_THROW(rtInfoV10 = modelv10->get_rt_info());
ASSERT_NO_THROW(version = rtInfoV10["version"].as<int64_t>());
ASSERT_EQ(10, version);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 3, 22, 22});
parameter->set_friendly_name("input");
auto result = std::make_shared<ov::opset1::Result>(parameter);
result->set_friendly_name("output");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(modelv10, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTests, elementary_model_reading_v9) {
std::string testModelV9 = R"V0G0N(
<net name="Network" version="9">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> modelv9;
ASSERT_THROW(modelv9 = core.read_model(testModelV9, ov::Tensor()), ov::Exception);
ASSERT_FALSE(!!modelv9);
}
TEST_F(IRFrontendTests, model_with_missing_weights) {
std::string testModelV11 = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="value1" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="32" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="Transpose0321" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
ASSERT_THROW(core.read_model(testModelV11, ov::Tensor()), ov::Exception);
}
TEST_F(IRFrontendTests, model_with_weights_reading_from_disk) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="value1" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="32" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="Transpose0321" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
std::vector<unsigned char> buffer(32, 0);
uint64_t* uint64Buffer = reinterpret_cast<uint64_t*>(buffer.data());
uint64Buffer[0] = 0;
uint64Buffer[1] = 3;
uint64Buffer[2] = 2;
uint64Buffer[3] = 1;
createTemporalModelFile(xmlModel, buffer);
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = core.read_model(xmlFileName, binFileName));
ASSERT_TRUE(!!model);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 3, 22, 22});
parameter->set_friendly_name("input");
auto constant =
std::make_shared<ov::opset1::Constant>(ov::element::i64, ov::Shape{4}, std::vector<uint64_t>{0, 3, 2, 1});
constant->set_friendly_name("value1");
auto transpose = std::make_shared<ov::opset1::Transpose>(parameter, constant);
transpose->set_friendly_name("Transpose0321");
auto result = std::make_shared<ov::opset1::Result>(transpose);
result->set_friendly_name("output");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTests, model_without_weights_reading_from_disk) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
createTemporalModelFile(xmlModel);
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = core.read_model(xmlFileName));
ASSERT_TRUE(!!model);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 3, 22, 22});
parameter->set_friendly_name("input");
auto result = std::make_shared<ov::opset1::Result>(parameter);
result->set_friendly_name("output");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTests, model_with_wrong_shape) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="value1" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="16" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="Transpose0321" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
std::vector<unsigned char> buffer(32, 0);
uint64_t* uint64Buffer = reinterpret_cast<uint64_t*>(buffer.data());
uint64Buffer[0] = 0;
uint64Buffer[1] = 3;
uint64Buffer[2] = 2;
uint64Buffer[3] = 1;
createTemporalModelFile(xmlModel, buffer);
std::shared_ptr<ov::Model> model;
ASSERT_THROW(core.read_model(xmlFileName, binFileName), ov::Exception);
}
TEST_F(IRFrontendTests, model_with_underallocated_weights_reading_from_disk) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="value1" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="32" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="Transpose0321" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
std::vector<unsigned char> buffer(24, 0);
uint64_t* uint64Buffer = reinterpret_cast<uint64_t*>(buffer.data());
uint64Buffer[0] = 0;
uint64Buffer[1] = 3;
uint64Buffer[2] = 2;
createTemporalModelFile(xmlModel, buffer);
std::shared_ptr<ov::Model> model;
ASSERT_THROW(core.read_model(xmlFileName, binFileName), ov::Exception);
}
TEST_F(IRFrontendTests, model_with_missing_weights_from_disk) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="value1" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="32" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="Transpose0321" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
createTemporalModelFile(xmlModel);
std::shared_ptr<ov::Model> model;
ASSERT_THROW(core.read_model(xmlFileName, binFileName), ov::Exception);
}
TEST_F(IRFrontendTests, missing_layer_data) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
ASSERT_THROW(core.read_model(model, ov::Tensor()), ov::Exception);
}
TEST_F(IRFrontendTests, model_with_wrong_dimensions) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>-2</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_THROW(model = core.read_model(testModel, ov::Tensor()), ov::Exception);
ASSERT_TRUE(!model);
}
TEST_F(IRFrontendTests, name_is_not_unique) {
std::string xmlModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="testname" type="Const" version="opset1">
<data element_type="i64" shape="4" offset="0" size="32" />
<output>
<port id="0" precision="I64">
<dim>4</dim>
</port>
</output>
</layer>
<layer id="2" name="testname" type="Transpose" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
<port id="1" precision="I64">
<dim>4</dim>
</port>
</input>
<output>
<port id="2" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="3" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>22</dim>
<dim>22</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
<edge from-layer="1" from-port="0" to-layer="2" to-port="1"/>
<edge from-layer="2" from-port="2" to-layer="3" to-port="0"/>
</edges>
</net>
)V0G0N";
std::vector<unsigned char> buffer(32, 0);
int64_t* int64Buffer = reinterpret_cast<int64_t*>(buffer.data());
int64Buffer[0] = 0;
int64Buffer[1] = 3;
int64Buffer[2] = 2;
int64Buffer[3] = 1;
createTemporalModelFile(xmlModel, buffer);
std::shared_ptr<ov::Model> model;
ASSERT_THROW(core.read_model(xmlFileName, binFileName), ov::Exception);
}
TEST_F(IRFrontendTests, edge_has_wrong_port_id) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="10"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_THROW(model = core.read_model(testModel, ov::Tensor()), ov::Exception);
ASSERT_FALSE(!!model);
}
TEST_F(IRFrontendTests, edge_has_wrong_layer_id) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_THROW(model = core.read_model(testModel, ov::Tensor()), ov::Exception);
ASSERT_FALSE(!!model);
}
TEST_F(IRFrontendTests, not_opset1) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer id="1" name="shapeof" type="ShapeOf" version="opset3">
<data output_type="i32" />
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
<output>
<port id="1" precision="I32">
<dim>4</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset1">
<input>
<port id="0" precision="I32">
<dim>4</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = getWithIRFrontend(testModel));
ASSERT_TRUE(!!model);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 3, 22, 22});
parameter->set_friendly_name("input");
auto shapeof = std::make_shared<ov::opset3::ShapeOf>(parameter, ov::element::i32);
shapeof->set_friendly_name("shapeof");
auto result = std::make_shared<ov::opset1::Result>(shapeof);
result->set_friendly_name("output");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTests, wrong_opset) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="wrongOpset">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_THROW(model = core.read_model(testModel, ov::Tensor()), ov::Exception);
ASSERT_FALSE(!!model);
}
@@ -0,0 +1,131 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "frontend_test.hpp"
#include "openvino/op/util/framework_node.hpp"
#include "openvino/opsets/opset1.hpp"
class IRFrontendExtensionTests : public ::testing::Test, public IRFrontendTestsImpl {
protected:
void SetUp() override {}
void TearDown() override {
RemoveTemporalFiles();
}
};
TEST_F(IRFrontendExtensionTests, custom_ops_test_with_framework_node_extension) {
static std::string customOpsModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="customOp1" id="1" type="testtype" version="testopset">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>2</dim>
<dim>2</dim>
</port>
</input>
<output>
<port id="1" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>2</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
auto extension = std::make_shared<ov::OpExtension<ov::op::util::FrameworkNode>>();
core.add_extension(extension);
ASSERT_NO_THROW(model = core.read_model(customOpsModel, ov::Tensor()));
ASSERT_TRUE(!!model);
}
TEST_F(IRFrontendExtensionTests, custom_ops_test_without_extension) {
static std::string customOpsModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data element_type="f32" shape="1,3,22,22"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="customOp1" id="1" type="testtype" version="testopset">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>2</dim>
<dim>2</dim>
</port>
</input>
<output>
<port id="1" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>2</dim>
<dim>2</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_THROW(model = core.read_model(customOpsModel, ov::Tensor()), ov::Exception);
ASSERT_TRUE(!model);
}
@@ -0,0 +1,377 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <gtest/gtest.h>
#include <memory>
#include <string>
#include "common_test_utils/graph_comparator.hpp"
#include "openvino/core/preprocess/input_tensor_info.hpp"
#include "openvino/frontend/manager.hpp"
#include "openvino/opsets/opset8.hpp"
#include "openvino/runtime/core.hpp"
class PartialShapeDeserialization : public testing::Test {
protected:
std::shared_ptr<ov::Model> getWithIRFrontend(const std::string& model) {
std::istringstream modelStringStream(model);
std::istream& modelStream = modelStringStream;
ov::frontend::FrontEnd::Ptr FE;
ov::frontend::InputModel::Ptr inputModel;
ov::AnyVector params{&modelStream};
FE = manager.load_by_model(params);
if (FE)
inputModel = FE->load(params);
if (inputModel)
return FE->convert(inputModel);
return nullptr;
}
private:
ov::frontend::FrontEndManager manager;
};
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_case1) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="1,3,100..200,120..320"/>
<output>
<port id="0" precision="FP16" names="input_tensor">
<dim>1</dim>
<dim>3</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer name="Round" id="1" type="Round" version="opset8">
<data mode="half_to_even"/>
<input>
<port id="1" precision="FP16">
<dim>1</dim>
<dim>3</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</input>
<output>
<port id="2" precision="FP16" names="output_tensor">
<dim>1</dim>
<dim>3</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset8">
<input>
<port id="0" precision="FP16">
<dim>1</dim>
<dim>3</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
<edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
auto f = getWithIRFrontend(model);
ASSERT_NE(nullptr, f);
ov::PartialShape shape{1, 3, ov::Dimension(100, 200), ov::Dimension(120, 320)};
auto type = ov::element::f16;
auto param = std::make_shared<ov::opset8::Parameter>(type, shape);
param->set_friendly_name("in1");
param->get_output_tensor(0).set_names({"input_tensor"});
auto round = std::make_shared<ov::opset8::Round>(param, ov::opset8::Round::RoundMode::HALF_TO_EVEN);
round->set_friendly_name("Round");
round->get_output_tensor(0).set_names({"output_tensor"});
auto result = std::make_shared<ov::opset8::Result>(round);
result->set_friendly_name("output");
auto f_11_ref = std::make_shared<ov::Model>(ov::ResultVector{result}, ov::ParameterVector{param});
f_11_ref->set_friendly_name("Network");
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
auto res = fc.compare(f, f_11_ref);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_testC_case2) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="1,?,..200,120.."/>
<output>
<port id="0" precision="FP16" names="input_tensor">
<dim>1</dim>
<dim>-1</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer name="Round" id="1" type="Round" version="opset8">
<data mode="half_to_even"/>
<input>
<port id="1" precision="FP16">
<dim>1</dim>
<dim>-1</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</input>
<output>
<port id="2" precision="FP16" names="output_tensor">
<dim>1</dim>
<dim>-1</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset8">
<input>
<port id="0" precision="FP16">
<dim>1</dim>
<dim>-1</dim>
<dim>-1</dim>
<dim>-1</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
<edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
auto f = getWithIRFrontend(model);
ASSERT_NE(nullptr, f);
ov::PartialShape shape{1, ov::Dimension(), ov::Dimension(0, 200), ov::Dimension(120, -1)};
auto type = ov::element::f16;
auto param = std::make_shared<ov::opset8::Parameter>(type, shape);
param->set_friendly_name("in1");
param->get_output_tensor(0).set_names({"input_tensor"});
auto round = std::make_shared<ov::opset8::Round>(param, ov::opset8::Round::RoundMode::HALF_TO_EVEN);
round->set_friendly_name("Round");
round->get_output_tensor(0).set_names({"output_tensor"});
auto result = std::make_shared<ov::opset8::Result>(round);
result->set_friendly_name("output");
auto f_11_ref = std::make_shared<ov::Model>(ov::ResultVector{result}, ov::ParameterVector{param});
f_11_ref->set_friendly_name("Network");
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
auto res = fc.compare(f, f_11_ref);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_dynamic_rank) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="..."/>
<output>
<port id="0" precision="FP16" names="input_tensor">
</port>
</output>
</layer>
<layer name="Round" id="1" type="Round" version="opset8">
<data mode="half_to_even"/>
<input>
<port id="1" precision="FP16">
</port>
</input>
<output>
<port id="2" precision="FP16" names="output_tensor">
</port>
</output>
</layer>
<layer name="output" type="Result" id="2" version="opset8">
<input>
<port id="0" precision="FP16">
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="1"/>
<edge from-layer="1" from-port="2" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
auto f = getWithIRFrontend(model);
ASSERT_NE(nullptr, f);
ov::PartialShape shape = ov::PartialShape::dynamic();
auto type = ov::element::f16;
auto param = std::make_shared<ov::opset8::Parameter>(type, shape);
param->set_friendly_name("in1");
param->get_output_tensor(0).set_names({"input_tensor"});
auto round = std::make_shared<ov::opset8::Round>(param, ov::opset8::Round::RoundMode::HALF_TO_EVEN);
round->set_friendly_name("Round");
round->get_output_tensor(0).set_names({"output_tensor"});
auto result = std::make_shared<ov::opset8::Result>(round);
result->set_friendly_name("output");
auto f_11_ref = std::make_shared<ov::Model>(ov::ResultVector{result}, ov::ParameterVector{param});
f_11_ref->set_friendly_name("Network");
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
auto res = fc.compare(f, f_11_ref);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_dynamic_rank_negative) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="...,..."/>
<output>
<port id="0" precision="FP16" names="input_tensor">
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset8">
<input>
<port id="0" precision="FP16">
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
// TODO: change to ov::Exception (69781)
ASSERT_THROW(getWithIRFrontend(model), ov::Exception);
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_dynamic_dim_negative) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="1,...,2"/>
<output>
<port id="0" precision="FP16" names="input_tensor">
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset8">
<input>
<port id="0" precision="FP16">
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
// TODO: change to ov::Exception (69781)
ASSERT_THROW(getWithIRFrontend(model), ov::Exception);
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_wrong_dim) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="1s,2"/>
<output>
<port id="0" precision="FP16" names="input_tensor">
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset8">
<input>
<port id="0" precision="FP16">
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
// TODO: change to ov::Exception (69781)
ASSERT_THROW(getWithIRFrontend(model), ov::Exception);
}
TEST_F(PartialShapeDeserialization, shape_with_boundaries_test_wrong_boundary) {
std::string model = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer name="in1" type="Parameter" id="0" version="opset8">
<data element_type="f16" shape="1..g,2"/>
<output>
<port id="0" precision="FP16" names="input_tensor">
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset8">
<input>
<port id="0" precision="FP16">
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
// TODO: change to ov::Exception (69781)
ASSERT_THROW(getWithIRFrontend(model), ov::Exception);
}
@@ -0,0 +1,73 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "frontend_test.hpp"
class IRFrontendTestsPreProcessing : public ::testing::Test, public IRFrontendTestsImpl {
protected:
void SetUp() override {}
void TearDown() override {
RemoveTemporalFiles();
}
};
TEST_F(IRFrontendTestsPreProcessing, pre_processing) {
std::string xmlModel = R"V0G0N(
<?xml version="1.0" ?>
<net name="Network" version="10">
<pre-process mean-precision="FP32" reference-layer-name="input">
<channel id="0">
<mean offset="0" size="1936"/>
</channel>
<channel id="1">
<mean offset="1936" size="1936"/>
</channel>
<channel id="2">
<mean offset="3872" size="1936"/>
</channel>
</pre-process>
<layers>
<layer name="input" type="Parameter" id="0" version="opset1">
<data shape="1,3,22,22" element_type="f32"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</output>
</layer>
<layer name="output" type="Result" id="1" version="opset1">
<input>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>3</dim>
<dim>22</dim>
<dim>22</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</net>
)V0G0N";
int dataSizeinFloat = 22 * 22 * 3;
std::vector<unsigned char> buffer(dataSizeinFloat * sizeof(float), 0);
float* floatBuffer = reinterpret_cast<float*>(buffer.data());
for (int i = 0; i < dataSizeinFloat; i++) {
floatBuffer[i] = 1;
}
createTemporalModelFile(xmlModel, buffer);
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = core.read_model(xmlFileName, binFileName));
ASSERT_TRUE(!!model);
}
File diff suppressed because it is too large. Load diff
@@ -0,0 +1,252 @@
// Copyright (C) 2018-2022 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include "frontend_test.hpp"
#include "openvino/opsets/opset1.hpp"
#include "openvino/opsets/opset8.hpp"
class IRFrontendTestsTensorIterator : public ::testing::Test, public IRFrontendTestsImpl {
protected:
void SetUp() override {}
void TearDown() override {
RemoveTemporalFiles();
}
};
TEST_F(IRFrontendTestsTensorIterator, tensor_iterator_merged_input) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer id="0" name="Parameter1" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2,3"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer id="1" name="TensorIterator" type="TensorIterator" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</input>
<output>
<port id="1" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</output>
<port_map>
<input external_port_id="0" internal_layer_id="0"/>
<output external_port_id="1" internal_layer_id="1"/>
</port_map>
<back_edges>
<edge from-layer="1" to-layer="0"/>
</back_edges>
<body>
<layers>
<layer id="0" name="internalParameter1" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2,3"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer id="1" name="internalResult1" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</body>
</layer>
<layer id="2" name="Result1" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = core.read_model(testModel, ov::Tensor()));
ASSERT_TRUE(!!model);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 2, 3});
parameter->set_friendly_name("Parameter1");
auto tensor_iterator = std::make_shared<ov::opset8::TensorIterator>();
std::shared_ptr<ov::Model> body;
auto internalParameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 2, 3});
internalParameter->set_friendly_name("internalParameter1");
auto result1 = std::make_shared<ov::opset1::Result>(internalParameter);
result1->set_friendly_name("internalResult1");
body = std::make_shared<ov::Model>(ov::NodeVector{result1}, ov::ParameterVector{internalParameter});
tensor_iterator->set_body(body);
tensor_iterator->set_friendly_name("TensorIterator");
tensor_iterator->set_merged_input(internalParameter, parameter, result1);
auto out0 = tensor_iterator->get_iter_value(result1, -1);
auto result = std::make_shared<ov::opset1::Result>(tensor_iterator->output(0));
result->set_friendly_name("Result1");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}
TEST_F(IRFrontendTestsTensorIterator, tensor_iterator_slised_input) {
std::string testModel = R"V0G0N(
<net name="Network" version="11">
<layers>
<layer id="0" name="Parameter1" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2,3"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</output>
</layer>
<layer id="1" name="TensorIterator" type="TensorIterator" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</input>
<output>
<port id="1" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</output>
<port_map>
<input axis="2" external_port_id="0" internal_layer_id="0" part_size="1" stride="1"/>
<output axis="2" external_port_id="1" internal_layer_id="1" part_size="1" stride="1"/>
</port_map>
<back_edges>
<edge from-layer="1" to-layer="0"/>
</back_edges>
<body>
<layers>
<layer id="0" name="internalParameter1" type="Parameter" version="opset1">
<data element_type="f32" shape="1,2,1"/>
<output>
<port id="0" precision="FP32">
<dim>1</dim>
<dim>2</dim>
<dim>1</dim>
</port>
</output>
</layer>
<layer id="1" name="internalResult1" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>1</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
</edges>
</body>
</layer>
<layer id="2" name="Result1" type="Result" version="opset1">
<input>
<port id="0">
<dim>1</dim>
<dim>2</dim>
<dim>3</dim>
</port>
</input>
</layer>
</layers>
<edges>
<edge from-layer="0" from-port="0" to-layer="1" to-port="0"/>
<edge from-layer="1" from-port="1" to-layer="2" to-port="0"/>
</edges>
</net>
)V0G0N";
std::shared_ptr<ov::Model> model;
ASSERT_NO_THROW(model = core.read_model(testModel, ov::Tensor()));
ASSERT_TRUE(!!model);
std::shared_ptr<ov::Model> modelRef;
{
auto parameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 2, 3});
parameter->set_friendly_name("Parameter1");
auto tensor_iterator = std::make_shared<ov::opset8::TensorIterator>();
std::shared_ptr<ov::Model> body;
auto internalParameter = std::make_shared<ov::opset1::Parameter>(ov::element::f32, ov::Shape{1, 2, 3});
internalParameter->set_friendly_name("internalParameter1");
auto result1 = std::make_shared<ov::opset1::Result>(internalParameter);
result1->set_friendly_name("internalResult1");
body = std::make_shared<ov::Model>(ov::NodeVector{result1}, ov::ParameterVector{internalParameter});
tensor_iterator->set_body(body);
tensor_iterator->set_friendly_name("TensorIterator");
tensor_iterator->set_sliced_input(internalParameter, parameter, 0, 1, 1, -1, 2);
auto out0 = tensor_iterator->get_concatenated_slices(result1, 0, 1, 1, -1, 2);
auto result = std::make_shared<ov::opset1::Result>(tensor_iterator->output(0));
result->set_friendly_name("Result1");
modelRef = std::make_shared<ov::Model>(ov::NodeVector{result}, ov::ParameterVector{parameter});
}
const auto fc = FunctionsComparator::with_default()
.enable(FunctionsComparator::ATTRIBUTES)
.enable(FunctionsComparator::PRECISIONS)
.enable(FunctionsComparator::RUNTIME_KEYS)
.enable(FunctionsComparator::NAMES)
.enable(FunctionsComparator::CONST_VALUES);
const auto res = fc.compare(model, modelRef);
EXPECT_TRUE(res.valid) << res.message;
}