Files
openvino/ngraph/test/backend/strided_slice.in.cpp
Ilya Churaev faeaf045a9 Graph comparator to ngraph util (#7729)
* Moved FrameworkNode to nGraph

* Moved graph comparator to ngraph test util

* Fixed build

* Try to fix centos

* Fix export target

* Moved engine utils to separate library

* Removed ONNX util from common library

* Fixed build

* Fixed code style
2021-10-01 07:24:28 +03:00

193 lines
10 KiB
C++

// Copyright (C) 2018-2021 Intel Corporation
// SPDX-License-Identifier: Apache-2.0
//
#include <numeric>
#include "engines_util/execute_tools.hpp"
#include "gtest/gtest.h"
#include "ngraph/ngraph.hpp"
#include "ngraph/runtime/tensor.hpp"
#include "runtime/backend.hpp"
#include "util/all_close_f.hpp"
#include "util/test_control.hpp"
using namespace std;
using namespace ngraph;
static string s_manifest = "${MANIFEST}";
template <typename T>
void check_strided_slice_success(const element::Type& input_element_type,
const Shape& input_shape,
const std::vector<int64_t>& begin_values,
const std::vector<int64_t>& end_values,
const std::vector<int64_t>& strides_values,
const std::vector<int64_t>& begin_mask,
const std::vector<int64_t>& end_mask,
const std::vector<int64_t>& new_axis_mask,
const std::vector<int64_t>& shrink_axis_mask,
const std::vector<int64_t>& ellipsis_mask,
const Shape& expected_output_shape,
const std::vector<T>& expected_values) {
auto arg = std::make_shared<op::Parameter>(input_element_type, input_shape);
auto begin_op = make_shared<ngraph::op::Parameter>(element::i64, Shape{begin_values.size()});
auto end_op = make_shared<ngraph::op::Parameter>(element::i64, Shape{end_values.size()});
auto strides_op = make_shared<ngraph::op::Parameter>(element::i64, Shape{strides_values.size()});
std::vector<T> input_values(shape_size(input_shape));
std::iota(input_values.begin(), input_values.end(), static_cast<T>(0));
auto strided_slice = std::make_shared<op::v1::StridedSlice>(arg,
begin_op,
end_op,
strides_op,
begin_mask,
end_mask,
new_axis_mask,
shrink_axis_mask,
ellipsis_mask);
auto f = std::make_shared<Function>(NodeVector{strided_slice}, ParameterVector{arg, begin_op, end_op, strides_op});
auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
auto ex = backend->compile(f);
auto arg_tensor = backend->create_tensor(input_element_type, input_shape);
auto begin_tensor = backend->create_tensor(element::i64, Shape{begin_values.size()});
auto end_tensor = backend->create_tensor(element::i64, Shape{end_values.size()});
auto strides_tensor = backend->create_tensor(element::i64, Shape{strides_values.size()});
copy_data(arg_tensor, input_values);
copy_data(begin_tensor, begin_values);
copy_data(end_tensor, end_values);
copy_data(strides_tensor, strides_values);
auto output = backend->create_dynamic_tensor(input_element_type, PartialShape::dynamic());
ex->call_with_validate({output}, {arg_tensor, begin_tensor, end_tensor, strides_tensor});
EXPECT_EQ(output->get_element_type(), input_element_type);
EXPECT_EQ(output->get_shape(), expected_output_shape);
auto output_values = read_vector<T>(output);
EXPECT_EQ(output_values, expected_values);
}
template <typename T>
void check_strided_slice_stride_optional_success(const element::Type& input_element_type,
const Shape& input_shape,
const std::vector<int64_t>& begin_values,
const std::vector<int64_t>& end_values,
const std::vector<int64_t>& begin_mask,
const std::vector<int64_t>& end_mask,
const std::vector<int64_t>& new_axis_mask,
const std::vector<int64_t>& shrink_axis_mask,
const std::vector<int64_t>& ellipsis_mask,
const Shape& expected_output_shape,
const std::vector<T>& expected_values) {
auto arg = std::make_shared<op::Parameter>(input_element_type, input_shape);
auto begin_op = make_shared<ngraph::op::Parameter>(element::i64, Shape{begin_values.size()});
auto end_op = make_shared<ngraph::op::Parameter>(element::i64, Shape{end_values.size()});
std::vector<T> input_values(shape_size(input_shape));
std::iota(input_values.begin(), input_values.end(), static_cast<T>(0));
auto strided_slice = std::make_shared<op::v1::StridedSlice>(arg,
begin_op,
end_op,
begin_mask,
end_mask,
new_axis_mask,
shrink_axis_mask,
ellipsis_mask);
auto f = std::make_shared<Function>(NodeVector{strided_slice}, ParameterVector{arg, begin_op, end_op});
auto backend = runtime::Backend::create("${BACKEND_NAME}", true);
auto ex = backend->compile(f);
auto arg_tensor = backend->create_tensor(input_element_type, input_shape);
auto begin_tensor = backend->create_tensor(element::i64, Shape{begin_values.size()});
auto end_tensor = backend->create_tensor(element::i64, Shape{end_values.size()});
copy_data(arg_tensor, input_values);
copy_data(begin_tensor, begin_values);
copy_data(end_tensor, end_values);
auto output = backend->create_dynamic_tensor(input_element_type, PartialShape::dynamic());
ex->call_with_validate({output}, {arg_tensor, begin_tensor, end_tensor});
EXPECT_EQ(output->get_element_type(), input_element_type);
EXPECT_EQ(output->get_shape(), expected_output_shape);
auto output_values = read_vector<T>(output);
EXPECT_EQ(output_values, expected_values);
}
// slices are: [1,newaxis]
// dtype is: uint32
// input shape is: Shape{2,3,4}
// expected output shape is Shape{1,3,4}
NGRAPH_TEST(${BACKEND_NAME}, strided_slice_0) {
check_strided_slice_success<uint32_t>(element::u32,
Shape{2, 3, 4},
std::vector<int64_t>{1, 0},
std::vector<int64_t>{0, 0},
std::vector<int64_t>{1, 1},
std::vector<int64_t>{0, 0, 0},
std::vector<int64_t>{0, 0, 0},
std::vector<int64_t>{0, 1, 0},
std::vector<int64_t>{1, 0, 0},
std::vector<int64_t>{0, 0, 0},
Shape{1, 3, 4},
std::vector<uint32_t>{12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23});
}
// slices are: [0:,:4,2:6:2,7:3:-2,newaxis,...,1]
// dtype is: uint32
// input shape is: Shape{2,4,6,8,2,2,2}
// expected output shape is Shape{2,4,2,2,1,2,2}
NGRAPH_TEST(${BACKEND_NAME}, strided_slice_1) {
check_strided_slice_success<uint32_t>(
element::u32,
Shape{2, 4, 6, 8, 2, 2, 2},
std::vector<int64_t>{0, 0, 2, 7, 0, 0, 1},
std::vector<int64_t>{0, 4, 6, 3, 0, 0, 0},
std::vector<int64_t>{1, 1, 2, -2, 1, 1, 1},
std::vector<int64_t>{0, 1, 0, 0, 0, 0, 0},
std::vector<int64_t>{1, 0, 0, 0, 0, 0, 0},
std::vector<int64_t>{0, 0, 0, 0, 1, 0, 0},
std::vector<int64_t>{0, 0, 0, 0, 0, 0, 1},
std::vector<int64_t>{0, 0, 0, 0, 0, 1, 0},
Shape{2, 4, 2, 2, 1, 2, 2},
std::vector<uint32_t>{185, 187, 189, 191, 169, 171, 173, 175, 313, 315, 317, 319, 297, 299, 301,
303, 569, 571, 573, 575, 553, 555, 557, 559, 697, 699, 701, 703, 681, 683,
685, 687, 953, 955, 957, 959, 937, 939, 941, 943, 1081, 1083, 1085, 1087, 1065,
1067, 1069, 1071, 1337, 1339, 1341, 1343, 1321, 1323, 1325, 1327, 1465, 1467, 1469, 1471,
1449, 1451, 1453, 1455, 1721, 1723, 1725, 1727, 1705, 1707, 1709, 1711, 1849, 1851, 1853,
1855, 1833, 1835, 1837, 1839, 2105, 2107, 2109, 2111, 2089, 2091, 2093, 2095, 2233, 2235,
2237, 2239, 2217, 2219, 2221, 2223, 2489, 2491, 2493, 2495, 2473, 2475, 2477, 2479, 2617,
2619, 2621, 2623, 2601, 2603, 2605, 2607, 2873, 2875, 2877, 2879, 2857, 2859, 2861, 2863,
3001, 3003, 3005, 3007, 2985, 2987, 2989, 2991});
}
// slices are: [-1,-1,newaxis]
// dtype is: uint32
// input shape is: Shape{2,3,4}
// expected output shape is Shape{1,4}
NGRAPH_TEST(${BACKEND_NAME}, strided_slice_stride_optional) {
check_strided_slice_stride_optional_success<uint32_t>(element::u32,
Shape{2, 3, 4},
std::vector<int64_t>{-1, -1, 0},
std::vector<int64_t>{0, 0, 0},
std::vector<int64_t>{0, 0, 0},
std::vector<int64_t>{0, 0, 0},
std::vector<int64_t>{0, 0, 1},
std::vector<int64_t>{1, 1, 0},
std::vector<int64_t>{0, 0, 0},
Shape{1, 4},
std::vector<uint32_t>{20, 21, 22, 23});
}