1 //*****************************************************************************
2 // Copyright 2017-2020 Intel Corporation
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://www.apache.org/licenses/LICENSE-2.0
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //*****************************************************************************
22 #include "gmock/gmock.h"
23 #include "gtest/gtest.h"
25 #include "ngraph/node.hpp"
26 #include "ngraph/node_output.hpp"
27 #include "ngraph/op/abs.hpp"
28 #include "ngraph/op/acos.hpp"
29 #include "ngraph/op/add.hpp"
30 #include "ngraph/op/asin.hpp"
31 #include "ngraph/op/atan.hpp"
32 #include "ngraph/op/broadcast.hpp"
33 #include "ngraph/op/ceiling.hpp"
34 #include "ngraph/op/concat.hpp"
35 #include "ngraph/op/constant.hpp"
36 #include "ngraph/op/convert.hpp"
37 #include "ngraph/op/cos.hpp"
38 #include "ngraph/op/cosh.hpp"
39 #include "ngraph/op/erf.hpp"
40 #include "ngraph/op/exp.hpp"
41 #include "ngraph/op/floor.hpp"
42 #include "ngraph/op/gather.hpp"
43 #include "ngraph/op/log.hpp"
44 #include "ngraph/op/max_pool.hpp"
45 #include "ngraph/op/min.hpp"
46 #include "ngraph/op/minimum.hpp"
47 #include "ngraph/op/negative.hpp"
48 #include "ngraph/op/non_zero.hpp"
49 #include "ngraph/op/not.hpp"
50 #include "ngraph/op/parameter.hpp"
51 #include "ngraph/op/range.hpp"
52 #include "ngraph/op/reduce_logical_and.hpp"
53 #include "ngraph/op/relu.hpp"
54 #include "ngraph/op/reshape.hpp"
55 #include "ngraph/op/round.hpp"
56 #include "ngraph/op/scatter_elements_update.hpp"
57 #include "ngraph/op/shape_of.hpp"
58 #include "ngraph/op/sigmoid.hpp"
59 #include "ngraph/op/sign.hpp"
60 #include "ngraph/op/sin.hpp"
61 #include "ngraph/op/sinh.hpp"
62 #include "ngraph/op/sqrt.hpp"
63 #include "ngraph/op/squeeze.hpp"
64 #include "ngraph/op/stop_gradient.hpp"
65 #include "ngraph/op/tan.hpp"
66 #include "ngraph/op/tanh.hpp"
67 #include "ngraph/op/topk.hpp"
68 #include "ngraph/op/transpose.hpp"
69 #include "ngraph/op/unsqueeze.hpp"
70 #include "ngraph/runtime/host_tensor.hpp"
71 #include "ngraph/validation_util.hpp"
72 #include "util/all_close_f.hpp"
73 #include "util/ndarray.hpp"
74 #include "util/test_tools.hpp"
75 #include "util/type_prop.hpp"
77 NGRAPH_SUPPRESS_DEPRECATED_START
80 using namespace ngraph;
82 #define ASSERT_FLOAT_VECTORS_EQ(expected, result) \
83 ASSERT_EQ(expected.size(), result.size()) << "Array sizes differ."; \
84 for (size_t i = 0; i < expected.size(); ++i) \
86 ASSERT_FLOAT_EQ(expected[i], result[i]) << "at index: " << i; \
89 TEST(eval, bad_get_data_ptr)
91 HostTensor c(element::f32, Shape{});
92 *c.get_data_ptr<float>() = 1.0;
93 EXPECT_EQ(*c.get_data_ptr<element::Type_t::f32>(), 1.0);
96 c.get_data_ptr<element::Type_t::f64>();
97 FAIL() << "Bad type not detected.";
99 catch (const CheckFailure& error)
101 EXPECT_HAS_SUBSTRING(error.what(), std::string("get_data_ptr"));
105 c.get_data_ptr<element::Type_t::i32>();
106 FAIL() << "Bad type not detected.";
108 catch (const CheckFailure& error)
110 EXPECT_HAS_SUBSTRING(error.what(), std::string("get_data_ptr"));
114 TEST(eval, max_eval_parameter)
116 auto p = make_shared<op::Parameter>(element::i64, Shape{});
118 auto result = maximum_value(p);
119 EXPECT_FALSE(result.first);
120 EXPECT_EQ(result.second, numeric_limits<uint64_t>::max());
123 TEST(eval, max_eval_constant)
125 auto c = op::Constant::create<int64_t>(element::i64, Shape{}, {27});
126 auto result = maximum_value(c);
127 ASSERT_TRUE(result.first);
128 EXPECT_EQ(result.second, 27);
131 TEST(eval, max_eval_minimum_constant)
133 auto c = op::Constant::create<int64_t>(element::i64, Shape{}, {27});
134 auto p = make_shared<op::Parameter>(element::i64, Shape{});
135 auto m = make_shared<op::Minimum>(c, p);
136 auto result = maximum_value(m);
137 ASSERT_TRUE(result.first);
138 EXPECT_EQ(result.second, 27);
141 TEST(eval, max_eval_reduce_min)
143 auto concat = make_shared<op::v0::Convert>(
144 make_shared<op::v0::Concat>(
145 OutputVector{make_shared<op::v0::Parameter>(element::i64, Shape{4}),
146 make_shared<op::v0::Constant>(element::i64, Shape{4}, 37)},
149 auto reduce = make_shared<op::v0::Convert>(
150 make_shared<op::v1::ReduceMin>(concat,
151 make_shared<op::v0::Constant>(element::i32, Shape{1}, 0)),
153 auto squeezes = make_shared<op::v0::Squeeze>(
154 make_shared<op::v0::Unsqueeze>(reduce,
155 make_shared<op::v0::Constant>(element::i32, Shape{1}, 0)),
156 make_shared<op::v0::Constant>(element::i64, Shape{1}, 0));
157 EXPECT_EQ(maximum_value(squeezes).second, 37);
160 TEST(eval, evaluate_shape_of)
162 auto p = make_shared<op::Parameter>(element::f32, PartialShape{-1, -1});
163 auto so = make_shared<op::v0::ShapeOf>(p);
164 auto fun = make_shared<Function>(OutputVector{so}, ParameterVector{p});
165 auto result = make_shared<HostTensor>();
166 ASSERT_TRUE(fun->evaluate({result},
167 {make_host_tensor<element::Type_t::f32>(
168 Shape{2, 3}, {0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f})}));
169 EXPECT_EQ(result->get_element_type(), element::i64);
170 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2}));
171 auto result_shape = read_vector<int64_t>(result);
172 vector<int64_t> arg_shape{2, 3};
173 ASSERT_EQ(result_shape, arg_shape);
176 TEST(eval, evaluate_dynamic_range_sum)
178 auto p_start = make_shared<op::Parameter>(element::f32, PartialShape{});
179 auto p_stop = make_shared<op::Parameter>(element::f32, PartialShape{});
180 auto p_step = make_shared<op::Parameter>(element::f32, PartialShape{});
181 auto p1 = make_shared<op::Parameter>(element::f32, PartialShape{});
182 auto range = make_shared<op::v0::Range>(p_start, p_stop, p_step);
183 auto add = make_shared<op::v1::Add>(range, p1);
185 make_shared<Function>(OutputVector{add}, ParameterVector{p_start, p_stop, p_step, p1});
186 auto result_tensor = make_shared<HostTensor>();
187 ASSERT_TRUE(fun->evaluate({result_tensor},
188 {make_host_tensor<element::Type_t::f32>({}, {1.0f}),
189 make_host_tensor<element::Type_t::f32>({}, {10.0f}),
190 make_host_tensor<element::Type_t::f32>({}, {3.0f}),
191 make_host_tensor<element::Type_t::f32>({}, {7.0f})}));
192 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
193 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3}));
194 auto cval = read_vector<float>(result_tensor);
195 vector<float> seq{8.0f, 11.0f, 14.0f};
196 ASSERT_EQ(cval, seq);
199 #ifdef NGRAPH_INTERPRETER_ENABLE
200 TEST(eval, interpret_dynamic_range_sum)
202 auto p_start = make_shared<op::Parameter>(element::f32, PartialShape{});
203 auto p_stop = make_shared<op::Parameter>(element::f32, PartialShape{});
204 auto p_step = make_shared<op::Parameter>(element::f32, PartialShape{});
205 auto p1 = make_shared<op::Parameter>(element::f32, PartialShape{});
206 auto range = make_shared<op::v0::Range>(p_start, p_stop, p_step);
207 auto add = make_shared<op::v1::Add>(range, p1);
209 make_shared<Function>(OutputVector{add}, ParameterVector{p_start, p_stop, p_step, p1});
210 auto backend = runtime::Backend::create("INTERPRETER");
211 auto p_start_val = backend->create_tensor(element::f32, Shape{});
212 copy_data(p_start_val, vector<float>{1.0f});
213 auto p_stop_val = backend->create_tensor(element::f32, Shape{});
214 copy_data(p_stop_val, vector<float>{10.0f});
215 auto p_step_val = backend->create_tensor(element::f32, Shape{});
216 copy_data(p_step_val, vector<float>{3.0f});
217 auto p1_val = backend->create_tensor(element::f32, Shape{});
218 copy_data(p1_val, vector<float>{7.0f});
219 auto result = backend->create_tensor();
220 auto cfun = backend->compile(fun);
221 cfun->call({result}, {p_start_val, p_stop_val, p_step_val, p1_val});
222 EXPECT_EQ(result->get_element_type(), element::f32);
223 EXPECT_EQ(result->get_partial_shape(), (PartialShape{3}));
224 auto result_val = read_vector<float>(result);
225 vector<float> seq{8.0f, 11.0f, 14.0f};
226 ASSERT_EQ(result_val, seq);
230 TEST(eval, evaluate_broadcast_v3_bidirectional)
233 auto A = make_shared<op::Parameter>(element::f32, shape_a);
234 auto target_shape = op::Constant::create<int32_t>(element::i32, Shape{3}, {2, 1, 4});
236 make_shared<op::v3::Broadcast>(A, target_shape, op::BroadcastType::BIDIRECTIONAL);
237 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
239 auto result = make_shared<HostTensor>();
240 ASSERT_TRUE(fun->evaluate(
241 {result}, {make_host_tensor<element::Type_t::f32>(Shape{4, 1}, {1.0f, 2.0f, 3.0f, 4.0f})}));
242 EXPECT_EQ(result->get_element_type(), element::f32);
243 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 4, 4}));
244 auto result_val = read_vector<float>(result);
245 vector<float> expec{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,
246 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4};
247 ASSERT_EQ(result_val, expec);
250 TEST(eval, evaluate_broadcast_v3_bidirectional_dyn)
253 auto A = make_shared<op::Parameter>(element::i32, shape_a);
254 auto target_shape = make_shared<op::Parameter>(element::i32, Shape{3});
256 make_shared<op::v3::Broadcast>(A, target_shape, op::BroadcastType::BIDIRECTIONAL);
257 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A, target_shape});
259 auto result = make_shared<HostTensor>();
260 ASSERT_TRUE(fun->evaluate({result},
261 {make_host_tensor<element::Type_t::i32>(Shape{4, 1}, {1, 2, 3, 4}),
262 make_host_tensor<element::Type_t::i32>(Shape{3}, {2, 1, 4})}));
263 EXPECT_EQ(result->get_element_type(), element::i32);
264 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 4, 4}));
265 auto result_val = read_vector<int32_t>(result);
266 vector<int32_t> expec{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4,
267 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4};
268 ASSERT_EQ(result_val, expec);
271 TEST(eval, evaluate_broadcast_v3_numpy)
274 auto A = make_shared<op::Parameter>(element::f32, shape_a);
275 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {2, 3, 6});
276 auto bcast_v3 = make_shared<op::v3::Broadcast>(A, target_shape);
277 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
279 auto result = make_shared<HostTensor>();
280 ASSERT_TRUE(fun->evaluate(
281 {result}, {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f})}));
282 EXPECT_EQ(result->get_element_type(), element::f32);
283 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
284 auto result_val = read_vector<float>(result);
286 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
287 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
289 ASSERT_EQ(result_val, expec);
292 TEST(eval, evaluate_broadcast_v3_numpy_dyn)
295 auto A = make_shared<op::Parameter>(element::f32, shape_a);
296 auto target_shape = make_shared<op::Parameter>(element::i32, Shape{3});
297 auto bcast_v3 = make_shared<op::v3::Broadcast>(A, target_shape);
298 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A, target_shape});
300 auto result = make_shared<HostTensor>();
302 fun->evaluate({result},
303 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
304 make_host_tensor<element::Type_t::i32>(Shape{3}, {2, 3, 6})}));
305 EXPECT_EQ(result->get_element_type(), element::f32);
306 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
307 auto result_val = read_vector<float>(result);
309 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
310 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
312 ASSERT_EQ(result_val, expec);
315 TEST(eval, evaluate_broadcast_v3_numpy_vs_bidi)
317 Shape in_shape{1, 4, 1};
319 auto A = make_shared<op::Parameter>(element::f32, in_shape);
320 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {1, 4, 4});
321 auto bcast_v3_num = make_shared<op::v3::Broadcast>(A, target_shape, op::BroadcastType::NUMPY);
322 auto fun_num = make_shared<Function>(OutputVector{bcast_v3_num}, ParameterVector{A});
324 auto result = make_shared<HostTensor>();
325 ASSERT_TRUE(fun_num->evaluate(
326 {result}, {make_host_tensor<element::Type_t::f32>(in_shape, {1.0f, 2.0f, 3.0f, 4.0f})}));
327 EXPECT_EQ(result->get_element_type(), element::f32);
328 EXPECT_EQ(result->get_partial_shape(), (PartialShape{1, 4, 4}));
329 auto result_val = read_vector<float>(result);
330 vector<float> expec{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4};
331 ASSERT_EQ(expec, result_val);
333 auto target_shape2 = op::Constant::create<int64_t>(element::i64, Shape{2}, {1, 4});
335 make_shared<op::v3::Broadcast>(A, target_shape2, op::BroadcastType::BIDIRECTIONAL);
336 auto fun_bidi = make_shared<Function>(OutputVector{bcast_v3_num}, ParameterVector{A});
338 auto result2 = make_shared<HostTensor>();
339 ASSERT_TRUE(fun_bidi->evaluate(
340 {result2}, {make_host_tensor<element::Type_t::f32>(in_shape, {1.0f, 2.0f, 3.0f, 4.0f})}));
341 EXPECT_EQ(result2->get_element_type(), element::f32);
342 EXPECT_EQ(result2->get_partial_shape(), (PartialShape{1, 4, 4}));
343 auto result_val2 = read_vector<float>(result2);
344 vector<float> expec2{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4};
345 ASSERT_EQ(expec2, result_val2);
348 TEST(eval, evaluate_broadcast_v3_bidi_3d)
350 Shape in_shape{1, 4, 1};
352 auto A = make_shared<op::Parameter>(element::f32, in_shape);
353 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {1, 1, 3});
355 make_shared<op::v3::Broadcast>(A, target_shape, op::BroadcastType::BIDIRECTIONAL);
356 auto fun_num = make_shared<Function>(OutputVector{bcast_v3_num}, ParameterVector{A});
358 auto result = make_shared<HostTensor>();
359 ASSERT_TRUE(fun_num->evaluate(
360 {result}, {make_host_tensor<element::Type_t::f32>(in_shape, {1.0f, 2.0f, 3.0f, 4.0f})}));
361 EXPECT_EQ(result->get_element_type(), element::f32);
362 EXPECT_EQ(result->get_partial_shape(), (PartialShape{1, 4, 3}));
363 auto result_val = read_vector<float>(result);
364 vector<float> expec{1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f, 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f};
365 ASSERT_EQ(expec, result_val);
368 TEST(eval, evaluate_broadcast_v3_bidi_4d)
370 Shape in_shape{4, 1, 1};
371 Shape expec_shape{1, 4, 2, 2};
373 auto A = make_shared<op::Parameter>(element::f32, in_shape);
374 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{4}, {1, 1, 2, 2});
376 make_shared<op::v3::Broadcast>(A, target_shape, op::BroadcastType::BIDIRECTIONAL);
377 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
379 auto result = make_shared<HostTensor>();
380 ASSERT_TRUE(fun->evaluate(
381 {result}, {make_host_tensor<element::Type_t::f32>(in_shape, {1.0f, 2.0f, 3.0f, 4.0f})}));
382 EXPECT_EQ(result->get_element_type(), element::f32);
383 EXPECT_EQ(result->get_partial_shape(), (PartialShape{1, 4, 2, 2}));
384 auto result_val = read_vector<float>(result);
385 vector<float> expec{1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4};
386 ASSERT_EQ(result_val, expec);
389 TEST(eval, evaluate_broadcast_v3_pdpd)
392 auto A = make_shared<op::Parameter>(element::f32, shape_a);
393 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {2, 3, 6});
394 auto bcast_v3 = make_shared<op::v3::Broadcast>(
395 A, target_shape, op::BroadcastModeSpec(op::BroadcastType::PDPD, 1));
396 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
398 auto result = make_shared<HostTensor>();
399 ASSERT_TRUE(fun->evaluate(
400 {result}, {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f})}));
401 EXPECT_EQ(result->get_element_type(), element::f32);
402 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
403 auto result_val = read_vector<float>(result);
405 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
406 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
408 ASSERT_EQ(result_val, expec);
411 TEST(eval, evaluate_broadcast_v3_pdpd_dyn)
414 auto A = make_shared<op::Parameter>(element::f32, shape_a);
415 auto target_shape = make_shared<op::Parameter>(element::i32, Shape{3});
416 auto bcast_v3 = make_shared<op::v3::Broadcast>(
417 A, target_shape, op::BroadcastModeSpec(op::BroadcastType::PDPD, 1));
418 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A, target_shape});
420 auto result = make_shared<HostTensor>();
422 fun->evaluate({result},
423 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
424 make_host_tensor<element::Type_t::i32>(Shape{3}, {2, 3, 6})}));
425 EXPECT_EQ(result->get_element_type(), element::f32);
426 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
427 auto result_val = read_vector<float>(result);
429 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
430 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
432 ASSERT_EQ(result_val, expec);
435 TEST(eval, evaluate_broadcast_v1_numpy)
438 auto A = make_shared<op::Parameter>(element::f32, shape_a);
439 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {2, 3, 6});
440 auto bcast_v3 = make_shared<op::v1::Broadcast>(A, target_shape);
441 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
443 auto result = make_shared<HostTensor>();
444 ASSERT_TRUE(fun->evaluate(
445 {result}, {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f})}));
446 EXPECT_EQ(result->get_element_type(), element::f32);
447 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
448 auto result_val = read_vector<float>(result);
450 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
451 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
453 ASSERT_EQ(result_val, expec);
456 TEST(eval, evaluate_broadcast_v1_numpy_dyn)
459 auto A = make_shared<op::Parameter>(element::f32, shape_a);
460 auto target_shape = make_shared<op::Parameter>(element::i64, Shape{3});
461 auto bcast_v3 = make_shared<op::v1::Broadcast>(A, target_shape);
462 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A, target_shape});
464 auto result = make_shared<HostTensor>();
466 fun->evaluate({result},
467 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
468 make_host_tensor<element::Type_t::i64>(Shape{3}, {2, 3, 6})}));
469 EXPECT_EQ(result->get_element_type(), element::f32);
470 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
471 auto result_val = read_vector<float>(result);
473 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
474 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
476 ASSERT_EQ(result_val, expec);
479 TEST(eval, evaluate_broadcast_v1_pdpd)
482 auto A = make_shared<op::Parameter>(element::f32, shape_a);
483 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {2, 3, 6});
484 auto bcast_v3 = make_shared<op::v1::Broadcast>(
485 A, target_shape, op::AutoBroadcastSpec(op::AutoBroadcastType::PDPD, 1));
486 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
488 auto result = make_shared<HostTensor>();
489 ASSERT_TRUE(fun->evaluate(
490 {result}, {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f})}));
491 EXPECT_EQ(result->get_element_type(), element::f32);
492 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
493 auto result_val = read_vector<float>(result);
495 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
496 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
498 ASSERT_EQ(result_val, expec);
501 TEST(eval, evaluate_broadcast_v1_pdpd_dyn)
504 auto A = make_shared<op::Parameter>(element::f32, shape_a);
505 auto target_shape = make_shared<op::Parameter>(element::i64, Shape{3});
506 auto bcast_v3 = make_shared<op::v1::Broadcast>(
507 A, target_shape, op::AutoBroadcastSpec(op::AutoBroadcastType::PDPD, 1));
508 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A, target_shape});
510 auto result = make_shared<HostTensor>();
512 fun->evaluate({result},
513 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
514 make_host_tensor<element::Type_t::i64>(Shape{3}, {2, 3, 6})}));
515 EXPECT_EQ(result->get_element_type(), element::f32);
516 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 6}));
517 auto result_val = read_vector<float>(result);
519 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
520 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3,
522 ASSERT_EQ(result_val, expec);
525 TEST(eval, evaluate_broadcast_v1_explicit)
528 auto A = make_shared<op::Parameter>(element::f32, shape_a);
529 auto target_shape = op::Constant::create<int64_t>(element::i64, Shape{3}, {2, 3, 1});
530 auto axes_mapping = op::Constant::create<int32_t>(element::i32, Shape{2}, {1, 2});
531 auto bcast_v3 = make_shared<op::v1::Broadcast>(
532 A, target_shape, axes_mapping, op::AutoBroadcastSpec(op::AutoBroadcastType::EXPLICIT));
533 auto fun = make_shared<Function>(OutputVector{bcast_v3}, ParameterVector{A});
535 auto result = make_shared<HostTensor>();
536 ASSERT_TRUE(fun->evaluate(
537 {result}, {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f})}));
538 EXPECT_EQ(result->get_element_type(), element::f32);
539 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 1}));
540 auto result_val = read_vector<float>(result);
541 vector<float> expec{1, 2, 3, 1, 2, 3};
542 ASSERT_EQ(result_val, expec);
545 TEST(eval, evaluate_broadcast_v1_explicit_dyn)
548 auto A = make_shared<op::Parameter>(element::f32, shape_a);
549 auto target_shape = make_shared<op::Parameter>(element::i64, Shape{3});
550 auto axes_mapping = make_shared<op::Parameter>(element::i32, Shape{2});
552 auto bcast_v1 = make_shared<op::v1::Broadcast>(
553 A, target_shape, axes_mapping, op::AutoBroadcastSpec(op::AutoBroadcastType::EXPLICIT));
554 auto fun = make_shared<Function>(OutputVector{bcast_v1},
555 ParameterVector{A, target_shape, axes_mapping});
557 auto result = make_shared<HostTensor>();
559 fun->evaluate({result},
560 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
561 make_host_tensor<element::Type_t::i64>(Shape{3}, {2, 3, 1}),
562 make_host_tensor<element::Type_t::i32>(Shape{2}, {1, 2})}));
563 EXPECT_EQ(result->get_element_type(), element::f32);
564 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 1}));
565 auto result_val = read_vector<float>(result);
566 vector<float> expec{1, 2, 3, 1, 2, 3};
567 ASSERT_EQ(result_val, expec);
570 TEST(eval, evaluate_broadcast_v3_explicit_dyn)
573 auto A = make_shared<op::Parameter>(element::f32, shape_a);
574 auto target_shape = make_shared<op::Parameter>(element::i64, Shape{3});
575 auto axes_mapping = make_shared<op::Parameter>(element::i32, Shape{2});
577 auto bcast_v3 = make_shared<op::v3::Broadcast>(
578 A, target_shape, axes_mapping, op::BroadcastModeSpec(op::BroadcastType::EXPLICIT));
579 auto fun = make_shared<Function>(OutputVector{bcast_v3},
580 ParameterVector{A, target_shape, axes_mapping});
582 auto result = make_shared<HostTensor>();
584 fun->evaluate({result},
585 {make_host_tensor<element::Type_t::f32>(Shape{3, 1}, {1.0f, 2.0f, 3.0f}),
586 make_host_tensor<element::Type_t::i64>(Shape{3}, {2, 3, 1}),
587 make_host_tensor<element::Type_t::i32>(Shape{2}, {1, 2})}));
588 EXPECT_EQ(result->get_element_type(), element::f32);
589 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 1}));
590 auto result_val = read_vector<float>(result);
591 vector<float> expec{1, 2, 3, 1, 2, 3};
592 ASSERT_EQ(result_val, expec);
595 TEST(eval, evaluate_broadcast_v0)
598 auto A = make_shared<op::Parameter>(element::f32, shape_a);
599 Shape target_shape = Shape{2, 3, 4};
600 auto bcast_v0 = make_shared<op::v0::Broadcast>(A, target_shape, AxisSet{1});
601 auto fun = make_shared<Function>(OutputVector{bcast_v0}, ParameterVector{A});
603 auto result = make_shared<HostTensor>();
604 ASSERT_TRUE(fun->evaluate(
605 {result}, {make_host_tensor<element::Type_t::f32>(Shape{2, 4}, {1, 2, 3, 4, 1, 2, 3, 4})}));
606 EXPECT_EQ(result->get_element_type(), element::f32);
607 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3, 4}));
608 auto result_val = read_vector<float>(result);
609 vector<float> expec{1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4};
610 ASSERT_EQ(result_val, expec);
613 TEST(eval, test_op_multi_out)
615 auto p = make_shared<op::Parameter>(element::f32, PartialShape{2, 3});
616 auto p2 = make_shared<op::Parameter>(element::f64, PartialShape{2, 2});
617 auto so = make_shared<TestOpMultiOut>(p, p2);
619 make_shared<Function>(OutputVector{so->output(0), so->output(1)}, ParameterVector{p, p2});
620 auto result = make_shared<HostTensor>(element::Type_t::f32, Shape{2, 3});
621 auto result2 = make_shared<HostTensor>(element::Type_t::f64, Shape{2, 2});
622 HostTensorVector ins{make_host_tensor<element::Type_t::f32>(Shape{2, 3}),
623 make_host_tensor<element::Type_t::f64>(Shape{2, 2})};
624 ASSERT_TRUE(fun->evaluate({result, result2}, ins));
625 EXPECT_EQ(result->get_element_type(), element::f32);
626 EXPECT_EQ(result->get_partial_shape(), (PartialShape{2, 3}));
627 auto result_val = read_vector<float>(result);
628 auto arg_val = read_vector<float>(ins[0]);
629 ASSERT_EQ(result_val, arg_val);
630 EXPECT_EQ(result2->get_element_type(), element::f64);
631 EXPECT_EQ(result2->get_partial_shape(), (PartialShape{2, 2}));
632 auto result_val2 = read_vector<double>(result2);
633 auto arg_val2 = read_vector<double>(ins[1]);
634 ASSERT_EQ(result_val2, arg_val2);
637 TEST(eval, evaluate_reshape_v1)
639 auto data = make_shared<op::Parameter>(element::f32, Shape{2, 5});
640 auto pattern = make_shared<op::Parameter>(element::i64, Shape{2});
641 auto dyn_reshape = make_shared<op::v1::Reshape>(data, pattern, false);
642 auto func = make_shared<Function>(OutputVector{dyn_reshape}, ParameterVector{data, pattern});
643 auto result_tensor = make_shared<HostTensor>();
644 ASSERT_TRUE(func->evaluate(
646 {make_host_tensor<element::Type_t::f32>({2, 5}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}),
647 make_host_tensor<element::Type_t::i64>({2}, {5, 2})}));
648 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
649 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{5, 2}));
650 auto computed_val = read_vector<float>(result_tensor);
651 vector<float> expected_val{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
652 ASSERT_EQ(computed_val, expected_val);
655 TEST(eval, evaluate_reshape_v1_negative_index)
657 auto data = make_shared<op::Parameter>(element::f32, Shape{2, 5});
658 auto pattern = make_shared<op::Parameter>(element::i64, Shape{2});
659 auto dyn_reshape = make_shared<op::v1::Reshape>(data, pattern, false);
660 auto func = make_shared<Function>(OutputVector{dyn_reshape}, ParameterVector{data, pattern});
661 auto result_tensor = make_shared<HostTensor>();
662 ASSERT_TRUE(func->evaluate(
664 {make_host_tensor<element::Type_t::f32>({2, 5}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}),
665 make_host_tensor<element::Type_t::i64>({2}, {2, -1})}));
666 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
667 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{2, 5}));
668 auto computed_val = read_vector<float>(result_tensor);
669 vector<float> expected_val{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
670 ASSERT_EQ(computed_val, expected_val);
673 TEST(eval, evaluate_reshape_v1_negative_index_zero_dim_zero_flag)
675 auto data = make_shared<op::Parameter>(element::f32, Shape{2, 2, 2, 2});
676 auto pattern = make_shared<op::Parameter>(element::i64, Shape{6});
677 auto dyn_reshape = make_shared<op::v1::Reshape>(data, pattern, true);
678 auto func = make_shared<Function>(OutputVector{dyn_reshape}, ParameterVector{data, pattern});
679 auto result_tensor = make_shared<HostTensor>();
681 func->evaluate({result_tensor},
682 {make_host_tensor<element::Type_t::f32>(
683 {2, 2, 2, 2}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}),
684 make_host_tensor<element::Type_t::i64>({6}, {2, 0, 1, -1, 1, 2})}));
685 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
686 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{2, 2, 1, 2, 1, 2}));
687 auto computed_val = read_vector<float>(result_tensor);
688 vector<float> expected_val{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
689 ASSERT_EQ(computed_val, expected_val);
692 TEST(eval, evaluate_reshape_v1_pattern_int16)
694 auto data = make_shared<op::Parameter>(element::f32, Shape{2, 2, 2, 2});
695 auto pattern = make_shared<op::Parameter>(element::i16, Shape{6});
696 auto dyn_reshape = make_shared<op::v1::Reshape>(data, pattern, true);
697 auto func = make_shared<Function>(OutputVector{dyn_reshape}, ParameterVector{data, pattern});
698 auto result_tensor = make_shared<HostTensor>();
700 func->evaluate({result_tensor},
701 {make_host_tensor<element::Type_t::f32>(
702 {2, 2, 2, 2}, {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}),
703 make_host_tensor<element::Type_t::i16>({6}, {2, 0, 1, -1, 1, 2})}));
704 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
705 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{2, 2, 1, 2, 1, 2}));
706 auto computed_val = read_vector<float>(result_tensor);
707 vector<float> expected_val{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
708 ASSERT_EQ(computed_val, expected_val);
711 TEST(eval, evaluate_convert)
713 auto p = make_shared<op::Parameter>(element::f32, PartialShape{-1, -1});
714 auto convert = make_shared<op::v0::Convert>(p, element::i64);
715 auto fun = make_shared<Function>(OutputVector{convert}, ParameterVector{p});
717 std::vector<std::vector<float>> inputs{{-1, 1}};
718 std::vector<std::vector<int64_t>> expected_result{{-1, 1}};
719 for (size_t i = 0; i < inputs.size(); i++)
721 auto result = make_shared<HostTensor>();
722 ASSERT_TRUE(fun->evaluate(
723 {result}, {make_host_tensor<element::Type_t::f32>(Shape{1, 2}, inputs[i])}));
724 EXPECT_EQ(result->get_element_type(), element::i64);
725 EXPECT_EQ(result->get_shape(), (Shape{1, 2}));
726 auto result_data = read_vector<int64_t>(result);
727 ASSERT_EQ(result_data, expected_result[i]);
731 TEST(eval, evaluate_abs)
733 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 3});
734 auto abs = make_shared<op::Abs>(p);
735 auto fun = make_shared<Function>(OutputVector{abs}, ParameterVector{p});
736 auto result = make_shared<HostTensor>();
737 ASSERT_TRUE(fun->evaluate({result},
738 {make_host_tensor<element::Type_t::f32>(
739 Shape{2, 3}, {0.0f, -1.0f, -2.0f, -3.0f, 4.0f, 5.0f})}));
740 EXPECT_EQ(result->get_element_type(), element::f32);
741 auto result_val = read_vector<float>(result);
742 vector<float> expec{0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
743 ASSERT_EQ(result_val, expec);
746 TEST(eval, evaluate_erf)
748 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 3});
749 auto erf = make_shared<op::Erf>(p);
750 auto fun = make_shared<Function>(OutputVector{erf}, ParameterVector{p});
751 auto result = make_shared<HostTensor>();
752 ASSERT_TRUE(fun->evaluate({result},
753 {make_host_tensor<element::Type_t::f32>(
754 Shape{2, 3}, {0.0f, -1.0f, -2.0f, -3.0f, 4.0f, 5.0f})}));
755 EXPECT_EQ(result->get_element_type(), element::f32);
756 auto result_val = read_vector<float>(result);
757 vector<float> expec{std::erf(0.0f),
763 ASSERT_EQ(result_val, expec);
766 TEST(eval, evaluate_exp)
768 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 3});
769 auto exp = make_shared<op::Exp>(p);
770 auto fun = make_shared<Function>(OutputVector{exp}, ParameterVector{p});
771 auto result = make_shared<HostTensor>();
772 ASSERT_TRUE(fun->evaluate({result},
773 {make_host_tensor<element::Type_t::f32>(
774 Shape{2, 3}, {0.0f, -1.0f, -2.0f, -3.0f, 4.0f, 5.0f})}));
775 EXPECT_EQ(result->get_element_type(), element::f32);
776 auto result_val = read_vector<float>(result);
777 vector<float> expec{std::exp(0.0f),
783 ASSERT_FLOAT_VECTORS_EQ(expec, result_val);
786 TEST(eval, evaluate_floor)
788 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 2});
789 auto floor = make_shared<op::Floor>(p);
790 auto fun = make_shared<Function>(OutputVector{floor}, ParameterVector{p});
791 auto result = make_shared<HostTensor>();
792 ASSERT_TRUE(fun->evaluate(
794 {make_host_tensor<element::Type_t::f32>(Shape{2, 2}, {-2.5f, -2.0f, 0.3f, 4.8f})}));
795 EXPECT_EQ(result->get_element_type(), element::f32);
796 auto result_val = read_vector<float>(result);
797 vector<float> expec{-3.0f, -2.0f, 0.0f, 4.0f};
798 ASSERT_EQ(result_val, expec);
801 TEST(eval, evaluate_floor_int32)
803 auto p = make_shared<op::Parameter>(element::i32, Shape{2, 2});
804 auto floor = make_shared<op::Floor>(p);
805 auto fun = make_shared<Function>(OutputVector{floor}, ParameterVector{p});
806 auto result = make_shared<HostTensor>();
807 ASSERT_TRUE(fun->evaluate({result},
808 {make_host_tensor<element::Type_t::i32>(
809 Shape{2, 2}, {-2, -136314888, 0x40000010, 0x40000001})}));
810 EXPECT_EQ(result->get_element_type(), element::i32);
811 auto result_val = read_vector<int32_t>(result);
812 vector<int32_t> expec{-2, -136314888, 0x40000010, 0x40000001};
813 ASSERT_EQ(result_val, expec);
816 TEST(eval, evaluate_log)
818 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 2, 2});
819 auto log = make_shared<op::Log>(p);
820 auto fun = make_shared<Function>(OutputVector{log}, ParameterVector{p});
821 auto result = make_shared<HostTensor>();
823 fun->evaluate({result},
824 {make_host_tensor<element::Type_t::f32>(
825 Shape{2, 2, 2}, {0.125f, 0.25f, 0.5f, 1.f, 2.f, 4.f, 8.f, 16.f})}));
826 EXPECT_EQ(result->get_element_type(), element::f32);
827 auto result_val = read_vector<float>(result);
828 vector<float> expec{std::log(0.125f),
836 ASSERT_EQ(result_val, expec);
839 TEST(eval, evaluate_negative_f32)
841 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 5});
842 auto negate = make_shared<op::Negative>(p);
843 auto fun = make_shared<Function>(OutputVector{negate}, ParameterVector{p});
844 auto result = make_shared<HostTensor>();
845 ASSERT_TRUE(fun->evaluate(
847 {make_host_tensor<element::Type_t::f32>(
849 {1.35f, 8.76f, -8.0f, 17.234f, -2.121f, 1.0f, 8.7f, -8.92f, 17.0f, -1.0f})}));
850 EXPECT_EQ(result->get_element_type(), element::f32);
851 auto result_val = read_vector<float>(result);
852 vector<float> expec{-1.35f, -8.76f, 8.0f, -17.234f, 2.121f, -1.0f, -8.7f, 8.92f, -17.0f, 1.0f};
853 ASSERT_EQ(result_val, expec);
856 TEST(eval, evaluate_negative_i32)
858 auto p = make_shared<op::Parameter>(element::i32, Shape{2, 5});
859 auto negate = make_shared<op::Negative>(p);
860 auto fun = make_shared<Function>(OutputVector{negate}, ParameterVector{p});
861 auto result = make_shared<HostTensor>();
862 ASSERT_TRUE(fun->evaluate({result},
863 {make_host_tensor<element::Type_t::i32>(
864 Shape{2, 5}, {1, 8, -8, 17, -2, 1, 8, -8, 17, 0})}));
865 EXPECT_EQ(result->get_element_type(), element::i32);
866 auto result_val = read_vector<int32_t>(result);
867 vector<int32_t> expec{-1, -8, 8, -17, 2, -1, -8, 8, -17, 0};
868 ASSERT_EQ(result_val, expec);
871 TEST(eval, evaluate_relu_2Ffprop_f32)
873 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 5});
874 auto relu = make_shared<op::Relu>(p);
875 auto fun = make_shared<Function>(OutputVector{relu}, ParameterVector{p});
876 auto result = make_shared<HostTensor>();
877 ASSERT_TRUE(fun->evaluate({result},
878 {make_host_tensor<element::Type_t::f32>(
879 Shape{2, 5}, {1, 8, -8, 17, -0.5, 0.1, 8.5, -8, 17, -0.5})}));
880 EXPECT_EQ(result->get_element_type(), element::f32);
881 auto result_val = read_vector<float>(result);
882 vector<float> expec{1, 8, 0, 17, 0, 0.1, 8.5, 0, 17, 0};
883 ASSERT_EQ(result_val, expec);
886 TEST(eval, evaluate_relu_2Ffprop_i32)
888 auto p = make_shared<op::Parameter>(element::i32, Shape{2, 5});
889 auto relu = make_shared<op::Relu>(p);
890 auto fun = make_shared<Function>(OutputVector{relu}, ParameterVector{p});
891 auto result = make_shared<HostTensor>();
892 ASSERT_TRUE(fun->evaluate({result},
893 {make_host_tensor<element::Type_t::i32>(
894 Shape{2, 5}, {1, 8, -8, 17, -2, 1, 8, -8, 17, -1})}));
895 EXPECT_EQ(result->get_element_type(), element::i32);
896 auto result_val = read_vector<int32_t>(result);
897 vector<int32_t> expec{1, 8, 0, 17, 0, 1, 8, 0, 17, 0};
898 ASSERT_EQ(result_val, expec);
901 TEST(eval, evaluate_round)
903 auto p = make_shared<op::Parameter>(element::f32, Shape{5});
904 auto round = make_shared<op::Round>(p);
905 auto fun = make_shared<Function>(OutputVector{round}, ParameterVector{p});
906 auto result = make_shared<HostTensor>();
907 ASSERT_TRUE(fun->evaluate(
909 {make_host_tensor<element::Type_t::f32>(Shape{5}, {0.9f, 2.5f, 2.3f, 1.5f, -4.5f})}));
910 EXPECT_EQ(result->get_element_type(), element::f32);
911 auto result_val = read_vector<float>(result);
912 vector<float> expec{1.0f, 2.0f, 2.0f, 2.0f, -4.0f};
913 ASSERT_EQ(result_val, expec);
916 TEST(eval, evaluate_round_2D)
918 auto p = make_shared<op::Parameter>(element::f32, Shape{3, 5});
919 auto round = make_shared<op::Round>(p);
920 auto fun = make_shared<Function>(OutputVector{round}, ParameterVector{p});
921 auto result = make_shared<HostTensor>();
922 ASSERT_TRUE(fun->evaluate({result},
923 {make_host_tensor<element::Type_t::f32>(Shape{3, 5},
939 EXPECT_EQ(result->get_element_type(), element::f32);
940 auto result_val = read_vector<float>(result);
942 0.f, 0.f, 1.f, 1.f, 2.f, 2.f, 2.f, 2.f, 3.f, -1.f, -2.f, -2.f, -2.f, -2.f, -3.f};
943 ASSERT_EQ(result_val, expec);
946 TEST(eval, evaluate_sigmoid)
948 auto p = make_shared<op::Parameter>(element::f32, Shape{1, 1, 2, 2});
949 auto sigmoid = make_shared<op::Sigmoid>(p);
950 auto fun = make_shared<Function>(OutputVector{sigmoid}, ParameterVector{p});
951 auto result = make_shared<HostTensor>();
955 float sigma1 = 1.0f / (1.0f + std::exp(-x1));
956 float sigma2 = 1.0f / (1.0f + std::exp(-x2));
957 ASSERT_TRUE(fun->evaluate(
958 {result}, {make_host_tensor<element::Type_t::f32>(Shape{1, 1, 2, 2}, {x1, x2, x1, x2})}));
959 EXPECT_EQ(result->get_element_type(), element::f32);
960 auto result_val = read_vector<float>(result);
961 vector<float> expec{sigma1, sigma2, sigma1, sigma2};
962 EXPECT_EQ(result_val.size(), expec.size());
965 TEST(eval, evaluate_sign)
967 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 3});
968 auto sign = make_shared<op::Sign>(p);
969 auto fun = make_shared<Function>(OutputVector{sign}, ParameterVector{p});
970 auto result = make_shared<HostTensor>();
972 ASSERT_TRUE(fun->evaluate(
974 {make_host_tensor<element::Type_t::f32>(Shape{2, 3}, {1, -2, 0, -4.8f, 4.8f, -0.0f})}));
975 EXPECT_EQ(result->get_element_type(), element::f32);
976 auto result_val = read_vector<float>(result);
977 vector<float> expec{1, -1, 0, -1, 1, 0};
978 ASSERT_EQ(result_val, expec);
981 TEST(eval, evaluate_sin)
983 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
984 auto sin = make_shared<op::Sin>(p);
985 auto fun = make_shared<Function>(OutputVector{sin}, ParameterVector{p});
986 auto result = make_shared<HostTensor>();
988 ASSERT_TRUE(fun->evaluate(
990 {make_host_tensor<element::Type_t::f32>(
991 Shape{11}, {0.f, 0.25f, -0.25f, 0.5f, -0.5f, 1.f, -1.f, 2.f, -2.f, 4.f, -4.f})}));
992 EXPECT_EQ(result->get_element_type(), element::f32);
993 auto result_val = read_vector<float>(result);
994 vector<float> expec{0.00000000f,
1005 ASSERT_FLOAT_VECTORS_EQ(expec, result_val);
1008 TEST(eval, evaluate_sinh)
1010 auto p = make_shared<op::Parameter>(element::f32, Shape{6});
1011 auto sinh = make_shared<op::Sinh>(p);
1012 auto fun = make_shared<Function>(OutputVector{sinh}, ParameterVector{p});
1013 auto result = make_shared<HostTensor>();
1015 vector<float> input{1.0f, 0.0f, -0.0f, -1.0f, 5.0f, -5.0f};
1016 ASSERT_TRUE(fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{6}, input)}));
1017 EXPECT_EQ(result->get_element_type(), element::f32);
1018 auto result_val = read_vector<float>(result);
1020 input.begin(), input.end(), input.begin(), [](float x) -> float { return sinhf(x); });
1021 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1024 TEST(eval, evaluate_sqrt)
1026 auto p = make_shared<op::Parameter>(element::f32, Shape{6});
1027 auto sqrt = make_shared<op::Sqrt>(p);
1028 auto fun = make_shared<Function>(OutputVector{sqrt}, ParameterVector{p});
1029 auto result = make_shared<HostTensor>();
1031 vector<float> input{16, 4, 81, 100, 10000, 0};
1032 ASSERT_TRUE(fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{6}, input)}));
1033 EXPECT_EQ(result->get_element_type(), element::f32);
1034 auto result_val = read_vector<float>(result);
1035 vector<float> expec{4, 2, 9, 10, 100, 0};
1036 ASSERT_FLOAT_VECTORS_EQ(expec, result_val);
1039 TEST(eval, evaluate_acos)
1041 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
1042 auto acos = make_shared<op::Acos>(p);
1043 auto fun = make_shared<Function>(OutputVector{acos}, ParameterVector{p});
1044 auto result = make_shared<HostTensor>();
1046 vector<float> input{-1.f, -0.75f, -0.5f, -0.25f, -0.125f, 0.f, 0.125f, 0.25f, 0.5f, 0.75f, 1.f};
1048 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{11}, input)}));
1049 EXPECT_EQ(result->get_element_type(), element::f32);
1050 auto result_val = read_vector<float>(result);
1052 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::acos(x); });
1053 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1056 TEST(eval, evaluate_asin)
1058 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
1059 auto asin = make_shared<op::Asin>(p);
1060 auto fun = make_shared<Function>(OutputVector{asin}, ParameterVector{p});
1061 auto result = make_shared<HostTensor>();
1063 vector<float> input{-1.f, -0.75f, -0.5f, -0.25f, -0.125f, 0.f, 0.125f, 0.25f, 0.5f, 0.75f, 1.f};
1065 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{11}, input)}));
1066 EXPECT_EQ(result->get_element_type(), element::f32);
1067 auto result_val = read_vector<float>(result);
1069 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::asin(x); });
1071 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1074 TEST(eval, evaluate_atan)
1076 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
1077 auto atan = make_shared<op::Atan>(p);
1078 auto fun = make_shared<Function>(OutputVector{atan}, ParameterVector{p});
1079 auto result = make_shared<HostTensor>();
1081 vector<float> input{-4.f, -2.f, -1.f, -0.5f, -0.25f, 0.f, 0.25f, 0.5f, 1.f, 2.f, 4.f};
1083 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{11}, input)}));
1084 EXPECT_EQ(result->get_element_type(), element::f32);
1085 auto result_val = read_vector<float>(result);
1087 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::atan(x); });
1089 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1092 TEST(eval, evaluate_ceiling)
1094 auto p = make_shared<op::Parameter>(element::f32, Shape{2, 2});
1095 auto ceil = make_shared<op::Ceiling>(p);
1096 auto fun = make_shared<Function>(OutputVector{ceil}, ParameterVector{p});
1097 auto result = make_shared<HostTensor>();
1099 vector<float> input{-2.5f, -2.0f, 0.3f, 4.8f};
1101 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{2, 2}, input)}));
1102 EXPECT_EQ(result->get_element_type(), element::f32);
1103 auto result_val = read_vector<float>(result);
1104 vector<float> expec{-2.0f, -2.0f, 1.0f, 5.0f};
1105 ASSERT_EQ(result_val, expec);
1108 TEST(eval, evaluate_cos)
1110 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
1111 auto cos = make_shared<op::Cos>(p);
1112 auto fun = make_shared<Function>(OutputVector{cos}, ParameterVector{p});
1113 auto result = make_shared<HostTensor>();
1115 vector<float> input{0.f, 0.25f, -0.25f, 0.5f, -0.5f, 1.f, -1.f, 2.f, -2.f, 4.f, -4.f};
1117 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{11}, input)}));
1118 EXPECT_EQ(result->get_element_type(), element::f32);
1119 auto result_val = read_vector<float>(result);
1121 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::cos(x); });
1123 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1126 TEST(eval, evaluate_cosh)
1128 auto p = make_shared<op::Parameter>(element::f32, Shape{6});
1129 auto cosh = make_shared<op::Cosh>(p);
1130 auto fun = make_shared<Function>(OutputVector{cosh}, ParameterVector{p});
1131 auto result = make_shared<HostTensor>();
1133 vector<float> input{1.0f, 0.0f, -0.0f, -1.0f, 5.0f, -5.0f};
1134 ASSERT_TRUE(fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{6}, input)}));
1135 EXPECT_EQ(result->get_element_type(), element::f32);
1136 auto result_val = read_vector<float>(result);
1138 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::cosh(x); });
1140 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1143 TEST(eval, evaluate_tan)
1145 auto p = make_shared<op::Parameter>(element::f32, Shape{11});
1146 auto tan = make_shared<op::Tan>(p);
1147 auto fun = make_shared<Function>(OutputVector{tan}, ParameterVector{p});
1148 auto result = make_shared<HostTensor>();
1150 vector<float> input{0.f, 0.25f, -0.25f, 0.5f, -0.5f, 1.f, -1.f, 2.f, -2.f, 4.f, -4.f};
1152 fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{11}, input)}));
1153 EXPECT_EQ(result->get_element_type(), element::f32);
1154 auto result_val = read_vector<float>(result);
1156 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::tan(x); });
1158 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1161 TEST(eval, evaluate_tanh)
1163 auto p = make_shared<op::Parameter>(element::f32, Shape{6});
1164 auto tanh = make_shared<op::Tanh>(p);
1165 auto fun = make_shared<Function>(OutputVector{tanh}, ParameterVector{p});
1166 auto result = make_shared<HostTensor>();
1168 vector<float> input{1.0f, 0.0f, -0.0f, -1.0f, 0.5f, -0.5f};
1169 ASSERT_TRUE(fun->evaluate({result}, {make_host_tensor<element::Type_t::f32>(Shape{6}, input)}));
1170 EXPECT_EQ(result->get_element_type(), element::f32);
1171 auto result_val = read_vector<float>(result);
1173 input.begin(), input.end(), input.begin(), [](float x) -> float { return std::tanh(x); });
1175 ASSERT_FLOAT_VECTORS_EQ(input, result_val);
1178 TEST(eval, evaluate_not)
1180 auto p = make_shared<op::Parameter>(element::boolean, Shape{2, 2});
1181 auto op_not = make_shared<op::Not>(p);
1182 auto fun = make_shared<Function>(OutputVector{op_not}, ParameterVector{p});
1183 auto result = make_shared<HostTensor>();
1185 ASSERT_TRUE(fun->evaluate(
1186 {result}, {make_host_tensor<element::Type_t::boolean>(Shape{2, 2}, {1, 0, 1, 0})}));
1187 EXPECT_EQ(result->get_element_type(), element::boolean);
1188 auto result_val = read_vector<char>(result);
1189 vector<char> expec{0, 1, 0, 1};
1190 ASSERT_EQ(result_val, expec);
1193 TEST(eval, evaluate_not_i32)
1195 auto p = make_shared<op::Parameter>(element::i32, Shape{2, 2});
1196 auto op_not = make_shared<op::Not>(p);
1197 auto fun = make_shared<Function>(OutputVector{op_not}, ParameterVector{p});
1198 auto result = make_shared<HostTensor>();
1200 ASSERT_TRUE(fun->evaluate(
1201 {result}, {make_host_tensor<element::Type_t::i32>(Shape{2, 2}, {100, 0, -2, 0})}));
1202 EXPECT_EQ(result->get_element_type(), element::i32);
1203 auto result_val = read_vector<int32_t>(result);
1204 vector<int32_t> expec{0, 1, 0, 1};
1205 ASSERT_EQ(result_val, expec);
1208 TEST(eval, evaluate_logical_not)
1210 auto p = make_shared<op::Parameter>(element::boolean, Shape{2, 2});
1211 auto logical_not = make_shared<op::v1::LogicalNot>(p);
1212 auto fun = make_shared<Function>(OutputVector{logical_not}, ParameterVector{p});
1213 auto result = make_shared<HostTensor>();
1215 ASSERT_TRUE(fun->evaluate(
1216 {result}, {make_host_tensor<element::Type_t::boolean>(Shape{2, 2}, {1, 0, 1, 0})}));
1217 EXPECT_EQ(result->get_element_type(), element::boolean);
1218 auto result_val = read_vector<char>(result);
1219 vector<char> expec{0, 1, 0, 1};
1220 ASSERT_EQ(result_val, expec);
1223 TEST(eval, evaluate_dynamic_gather)
1225 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1226 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1227 auto gather = make_shared<op::v0::Gather>(arg1, arg2);
1228 auto fun = make_shared<Function>(OutputVector{gather}, ParameterVector{arg1, arg2});
1229 auto result_tensor = make_shared<HostTensor>();
1230 ASSERT_TRUE(fun->evaluate({result_tensor},
1231 {make_host_tensor<element::Type_t::f32>({3}, {1.0f, 2.0f, 3.0f}),
1232 make_host_tensor<element::Type_t::i32>({2}, {1, 0})}));
1233 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1234 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{2}));
1235 auto cval = read_vector<float>(result_tensor);
1236 vector<float> out{2.0f, 1.0f};
1237 ASSERT_EQ(cval, out);
1240 TEST(eval, evaluate_dynamic_axis_gather)
1242 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1243 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1244 auto arg3 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1245 auto gather = make_shared<op::v1::Gather>(arg1, arg2, arg3);
1246 auto fun = make_shared<Function>(OutputVector{gather}, ParameterVector{arg1, arg2, arg3});
1247 auto result_tensor = make_shared<HostTensor>();
1248 ASSERT_TRUE(fun->evaluate({result_tensor},
1249 {make_host_tensor<element::Type_t::f32>(
1250 {3, 3}, {1.0f, 1.1f, 1.2f, 2.0f, 2.1f, 2.2f, 3.0f, 3.1f, 3.2f}),
1251 make_host_tensor<element::Type_t::i32>({1, 2}, {0, 2}),
1252 make_host_tensor<element::Type_t::u64>({}, {1})}));
1253 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1254 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 1, 2}));
1255 auto cval = read_vector<float>(result_tensor);
1256 vector<float> out{1.0f, 1.2f, 2.0f, 2.2f, 3.0f, 3.2f};
1257 ASSERT_EQ(cval, out);
1260 TEST(eval, evaluate_dynamic_concat)
1262 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1263 auto arg2 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1264 auto concat = make_shared<op::v0::Concat>(NodeVector{arg1, arg2}, 1);
1265 auto fun = make_shared<Function>(OutputVector{concat}, ParameterVector{arg1, arg2});
1266 auto result_tensor = make_shared<HostTensor>();
1267 ASSERT_TRUE(fun->evaluate({result_tensor},
1268 {make_host_tensor<element::Type_t::f32>({1, 1}, {1.0f}),
1269 make_host_tensor<element::Type_t::f32>({1, 2}, {8.0f, 10.0f})}));
1270 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1271 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{1, 3}));
1272 auto cval = read_vector<float>(result_tensor);
1273 vector<float> out{1.0f, 8.0f, 10.0f};
1274 ASSERT_EQ(cval, out);
1277 template <element::Type_t T>
1278 void test_eval(shared_ptr<Function> fun,
1279 vector<vector<float>>& inputs,
1280 vector<Shape>& x_shapes,
1281 vector<Shape>& result_shapes,
1282 vector<vector<float>>& results)
1284 using IN_T = typename element_type_traits<T>::value_type;
1285 std::vector<std::vector<IN_T>> perms{{0, 1}, {1, 0}, {2, 1, 0}};
1286 for (size_t i = 0; i < x_shapes.size(); i++)
1288 auto result_tensor = make_shared<HostTensor>();
1289 ASSERT_TRUE(fun->evaluate({result_tensor},
1290 {make_host_tensor<element::Type_t::f32>(x_shapes[i], inputs[i]),
1291 make_host_tensor<T>(Shape{perms[i].size()}, perms[i])}));
1293 ASSERT_EQ(result_tensor->get_shape(), result_shapes[i]);
1294 auto actual_results = read_vector<float>(result_tensor);
1295 ASSERT_EQ(actual_results, results[i]);
1299 TEST(eval, eval_transpose)
1301 auto x = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1302 vector<shared_ptr<op::Parameter>> axes;
1303 axes.push_back(make_shared<op::Parameter>(element::i8, PartialShape{Dimension::dynamic()}));
1304 axes.push_back(make_shared<op::Parameter>(element::i16, PartialShape{Dimension::dynamic()}));
1305 axes.push_back(make_shared<op::Parameter>(element::i32, PartialShape{Dimension::dynamic()}));
1306 axes.push_back(make_shared<op::Parameter>(element::i64, PartialShape{Dimension::dynamic()}));
1308 axes.push_back(make_shared<op::Parameter>(element::u8, PartialShape{Dimension::dynamic()}));
1309 axes.push_back(make_shared<op::Parameter>(element::u16, PartialShape{Dimension::dynamic()}));
1310 axes.push_back(make_shared<op::Parameter>(element::u32, PartialShape{Dimension::dynamic()}));
1311 axes.push_back(make_shared<op::Parameter>(element::u64, PartialShape{Dimension::dynamic()}));
1313 std::vector<Shape> x_shapes{Shape{2, 3}, Shape{2, 3}, Shape{2, 2, 3}};
1315 std::vector<std::vector<float>> inputs{
1316 {1, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 5, 6}, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}};
1317 std::vector<Shape> result_shapes{Shape{2, 3}, Shape{3, 2}, {3, 2, 2}};
1318 std::vector<std::vector<float>> results{
1319 {1, 2, 3, 4, 5, 6}, {1, 4, 2, 5, 3, 6}, {1, 7, 4, 10, 2, 8, 5, 11, 3, 9, 6, 12}};
1321 for (auto& axis : axes)
1323 auto x_transpose = make_shared<op::v1::Transpose>(x, axis);
1324 auto fun = make_shared<Function>(NodeVector{x_transpose}, ParameterVector{x, axis});
1326 switch (axis->get_element_type())
1328 case element::Type_t::i8:
1329 test_eval<element::Type_t::i8>(fun, inputs, x_shapes, result_shapes, results);
1331 case element::Type_t::i16:
1332 test_eval<element::Type_t::i16>(fun, inputs, x_shapes, result_shapes, results);
1334 case element::Type_t::i32:
1335 test_eval<element::Type_t::i32>(fun, inputs, x_shapes, result_shapes, results);
1337 case element::Type_t::i64:
1338 test_eval<element::Type_t::i64>(fun, inputs, x_shapes, result_shapes, results);
1340 case element::Type_t::u8:
1341 test_eval<element::Type_t::u8>(fun, inputs, x_shapes, result_shapes, results);
1343 case element::Type_t::u16:
1344 test_eval<element::Type_t::u16>(fun, inputs, x_shapes, result_shapes, results);
1346 case element::Type_t::u32:
1347 test_eval<element::Type_t::u32>(fun, inputs, x_shapes, result_shapes, results);
1349 case element::Type_t::u64:
1350 test_eval<element::Type_t::u64>(fun, inputs, x_shapes, result_shapes, results);
1352 default: NGRAPH_CHECK(false, "Invalid type"); break;
1357 TEST(eval, max_pool_v1_dynamic)
1359 Shape window_shape{3};
1360 auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1361 auto f = make_shared<Function>(
1362 make_shared<op::v1::MaxPool>(
1363 A, Strides(), Shape(), Shape(), window_shape, op::RoundingType::FLOOR),
1364 ParameterVector{A});
1365 auto result_tensor = make_shared<HostTensor>();
1367 ASSERT_TRUE(f->evaluate({result_tensor},
1368 {make_host_tensor<element::Type_t::f32>(
1369 {1, 1, 14}, {0, 1, 0, 2, 1, 0, 3, 2, 0, 0, 2, 0, 0, 0})}));
1371 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1372 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{1, 1, 12}));
1373 auto cval = read_vector<float>(result_tensor);
1374 vector<float> out{1, 2, 2, 2, 3, 3, 3, 2, 2, 2, 2, 0};
1377 TEST(eval, evaluate_static_scatter_elements_update_basic)
1379 const Shape data_shape{3, 3};
1380 const Shape indices_shape{2, 3};
1381 auto arg1 = make_shared<op::Parameter>(element::f32, data_shape);
1382 auto arg2 = make_shared<op::Parameter>(element::i32, indices_shape);
1383 auto arg3 = make_shared<op::Parameter>(element::f32, indices_shape);
1384 auto arg4 = make_shared<op::Parameter>(element::i64, Shape{});
1385 auto scatter_elements_update =
1386 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1387 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1388 ParameterVector{arg1, arg2, arg3, arg4});
1389 auto result_tensor = make_shared<HostTensor>();
1391 fun->evaluate({result_tensor},
1392 {make_host_tensor<element::Type_t::f32>(
1393 data_shape, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}),
1394 make_host_tensor<element::Type_t::i32>(indices_shape, {1, 0, 2, 0, 2, 1}),
1395 make_host_tensor<element::Type_t::f32>(indices_shape,
1396 {1.0f, 1.1f, 1.2f, 2.0f, 2.1f, 2.2f}),
1397 make_host_tensor<element::Type_t::i64>({}, {0})}));
1398 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1399 EXPECT_EQ(result_tensor->get_shape(), (Shape{3, 3}));
1400 auto cval = read_vector<float>(result_tensor);
1401 vector<float> out{2.f, 1.1f, 0.0f, 1.f, 0.0f, 2.2f, 0.f, 2.1f, 1.2f};
1402 ASSERT_EQ(cval, out);
1405 TEST(eval, evaluate_dynamic_scatter_elements_update_basic)
1407 const Shape data_shape{3, 3};
1408 const Shape indices_shape{2, 3};
1410 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1411 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1412 auto arg3 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1413 auto arg4 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1415 auto scatter_elements_update =
1416 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1417 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1418 ParameterVector{arg1, arg2, arg3, arg4});
1419 auto result_tensor = make_shared<HostTensor>();
1421 fun->evaluate({result_tensor},
1422 {make_host_tensor<element::Type_t::f32>(
1423 data_shape, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}),
1424 make_host_tensor<element::Type_t::i32>(indices_shape, {1, 0, 2, 0, 2, 1}),
1425 make_host_tensor<element::Type_t::f32>(indices_shape,
1426 {1.0f, 1.1f, 1.2f, 2.0f, 2.1f, 2.2f}),
1427 make_host_tensor<element::Type_t::i64>({}, {0})}));
1429 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1430 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 3}));
1431 auto cval = read_vector<float>(result_tensor);
1432 vector<float> out{2.f, 1.1f, 0.0f, 1.f, 0.0f, 2.2f, 0.f, 2.1f, 1.2f};
1433 ASSERT_EQ(cval, out);
1436 TEST(eval, evaluate_dynamic_scatter_elements_update_negative_axis)
1438 const Shape data_shape{3, 3};
1439 const Shape indices_shape{2, 3};
1440 const Shape axis_shape{};
1442 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1443 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1444 auto arg3 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1445 auto arg4 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1447 auto scatter_elements_update =
1448 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1449 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1450 ParameterVector{arg1, arg2, arg3, arg4});
1451 auto result_tensor = make_shared<HostTensor>();
1453 fun->evaluate({result_tensor},
1454 {make_host_tensor<element::Type_t::f32>(
1455 data_shape, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}),
1456 make_host_tensor<element::Type_t::i32>(indices_shape, {1, 0, 2, 0, 2, 1}),
1457 make_host_tensor<element::Type_t::f32>(indices_shape,
1458 {1.0f, 1.1f, 1.2f, 2.0f, 2.1f, 2.2f}),
1459 make_host_tensor<element::Type_t::i64>(axis_shape, {-1})}));
1461 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1462 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 3}));
1463 auto cval = read_vector<float>(result_tensor);
1464 vector<float> out{1.1f, 1.0f, 1.2f, 2.0f, 2.2f, 2.1f, 0.0f, 0.0f, 0.0f};
1465 ASSERT_EQ(cval, out);
1468 TEST(eval, evaluate_dynamic_scatter_elements_update_1d_axis)
1470 const Shape data_shape{3, 3};
1471 const Shape indices_shape{2, 3};
1473 auto arg1 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1474 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1475 auto arg3 = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1476 auto arg4 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1478 auto scatter_elements_update =
1479 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1480 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1481 ParameterVector{arg1, arg2, arg3, arg4});
1482 auto result_tensor = make_shared<HostTensor>();
1484 fun->evaluate({result_tensor},
1485 {make_host_tensor<element::Type_t::f32>(
1486 data_shape, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}),
1487 make_host_tensor<element::Type_t::i32>(indices_shape, {1, 0, 2, 0, 2, 1}),
1488 make_host_tensor<element::Type_t::f32>(indices_shape,
1489 {1.0f, 1.1f, 1.2f, 2.0f, 2.1f, 2.2f}),
1490 make_host_tensor<element::Type_t::i64>({1}, {0})}));
1492 EXPECT_EQ(result_tensor->get_element_type(), element::f32);
1493 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 3}));
1494 auto cval = read_vector<float>(result_tensor);
1495 vector<float> out{2.f, 1.1f, 0.0f, 1.f, 0.0f, 2.2f, 0.f, 2.1f, 1.2f};
1496 ASSERT_EQ(cval, out);
1499 // Disabled test for disabled reference implementation
1500 TEST(eval, DISABLED_evaluate_dynamic_scatter_elements_update_3d_i16)
1502 const Shape data_shape{3, 3, 3};
1503 const Shape indices_shape{2, 2, 3};
1505 auto arg1 = make_shared<op::Parameter>(element::i16, PartialShape::dynamic());
1506 auto arg2 = make_shared<op::Parameter>(element::i16, PartialShape::dynamic());
1507 auto arg3 = make_shared<op::Parameter>(element::i16, PartialShape::dynamic());
1508 auto arg4 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1510 auto scatter_elements_update =
1511 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1512 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1513 ParameterVector{arg1, arg2, arg3, arg4});
1514 auto result_tensor = make_shared<HostTensor>();
1515 ASSERT_TRUE(fun->evaluate({result_tensor},
1516 {make_host_tensor<element::Type_t::i16>(
1517 data_shape, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1518 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}),
1519 make_host_tensor<element::Type_t::i16>(
1520 indices_shape, {1, 0, 2, 0, 2, 1, 2, 2, 2, 0, 1, 0}),
1521 make_host_tensor<element::Type_t::i16>(
1522 indices_shape, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}),
1523 make_host_tensor<element::Type_t::i64>({}, {1})}));
1525 EXPECT_EQ(result_tensor->get_element_type(), element::i16);
1526 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 3, 3}));
1527 auto cval = read_vector<int16_t>(result_tensor);
1528 vector<int16_t> out{4, 2, 0, 1, 0, 6, 0, 5, 3, 10, 0, 12, 0, 11,
1529 0, 7, 8, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1530 ASSERT_EQ(cval, out);
1533 TEST(eval, evaluate_dynamic_scatter_elements_update_one_elem_i32)
1535 const Shape data_shape{3, 3, 3};
1536 const Shape indices_shape{1, 1, 1};
1538 auto arg1 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1539 auto arg2 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1540 auto arg3 = make_shared<op::Parameter>(element::i32, PartialShape::dynamic());
1541 auto arg4 = make_shared<op::Parameter>(element::i64, PartialShape::dynamic());
1543 auto scatter_elements_update =
1544 make_shared<op::v3::ScatterElementsUpdate>(arg1, arg2, arg3, arg4);
1545 auto fun = make_shared<Function>(OutputVector{scatter_elements_update},
1546 ParameterVector{arg1, arg2, arg3, arg4});
1547 auto result_tensor = make_shared<HostTensor>();
1548 ASSERT_TRUE(fun->evaluate({result_tensor},
1549 {make_host_tensor<element::Type_t::i32>(
1550 data_shape, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1551 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}),
1552 make_host_tensor<element::Type_t::i32>(indices_shape, {1}),
1553 make_host_tensor<element::Type_t::i32>(indices_shape, {2}),
1554 make_host_tensor<element::Type_t::i64>({}, {0})}));
1556 EXPECT_EQ(result_tensor->get_element_type(), element::i32);
1557 EXPECT_EQ(result_tensor->get_partial_shape(), (PartialShape{3, 3, 3}));
1558 auto cval = read_vector<int32_t>(result_tensor);
1559 vector<int32_t> out{0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
1560 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1561 ASSERT_EQ(cval, out);
1566 Shape shape{2, 3, 2};
1567 Shape rshape{2, 2, 2};
1569 auto A = make_shared<op::Parameter>(element::f32, shape);
1570 const auto k = op::Constant::create(element::i32, Shape{}, {2});
1571 auto B = make_shared<op::v1::TopK>(A, k, 1, "max", "index", element::i32);
1573 auto fun = make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A});
1575 auto result0 = make_shared<HostTensor>();
1576 auto result1 = make_shared<HostTensor>();
1577 ASSERT_TRUE(fun->evaluate({result0, result1},
1578 {make_host_tensor<element::Type_t::f32>(
1579 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7})}));
1580 EXPECT_EQ(result0->get_element_type(), element::f32);
1581 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1582 EXPECT_EQ(result1->get_element_type(), element::i32);
1583 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1584 auto result0_val = read_vector<float>(result0);
1586 auto result1_val = read_vector<int32_t>(result1);
1588 vector<float> expec0{12, 9, 10, 4, 6, 3, 11, 7};
1589 ASSERT_EQ(result0_val, expec0);
1591 vector<int32_t> expec1{0, 1, 1, 2, 0, 1, 2, 2};
1592 ASSERT_EQ(result1_val, expec1);
1595 TEST(eval, topk_v1_dyn)
1597 Shape shape{2, 3, 2};
1599 auto A = make_shared<op::Parameter>(element::f32, shape);
1600 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1601 auto B = make_shared<op::v1::TopK>(A, k, 1, "max", "index", element::i32);
1604 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1606 auto result0 = make_shared<HostTensor>();
1607 auto result1 = make_shared<HostTensor>();
1608 ASSERT_TRUE(fun->evaluate({result0, result1},
1609 {make_host_tensor<element::Type_t::f32>(
1610 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1611 make_host_tensor<element::Type_t::i32>(Shape{}, {2})}));
1612 EXPECT_EQ(result0->get_element_type(), element::f32);
1613 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1614 EXPECT_EQ(result1->get_element_type(), element::i32);
1615 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1616 auto result0_val = read_vector<float>(result0);
1617 auto result1_val = read_vector<int32_t>(result1);
1618 vector<float> expec0{12, 9, 10, 4, 6, 3, 11, 7};
1619 ASSERT_EQ(result0_val, expec0);
1621 vector<int32_t> expec1{0, 1, 1, 2, 0, 1, 2, 2};
1622 ASSERT_EQ(result1_val, expec1);
1625 TEST(eval, topk_v3_dyn)
1627 Shape shape{2, 3, 2};
1629 auto A = make_shared<op::Parameter>(element::f32, shape);
1630 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1631 auto B = make_shared<op::v3::TopK>(A, k, 1, "max", "index", element::i32);
1634 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1636 auto result0 = make_shared<HostTensor>();
1637 auto result1 = make_shared<HostTensor>();
1638 ASSERT_TRUE(fun->evaluate({result0, result1},
1639 {make_host_tensor<element::Type_t::f32>(
1640 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1641 make_host_tensor<element::Type_t::i32>(Shape{}, {2})}));
1642 EXPECT_EQ(result0->get_element_type(), element::f32);
1643 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1644 EXPECT_EQ(result1->get_element_type(), element::i32);
1645 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1646 auto result0_val = read_vector<float>(result0);
1647 auto result1_val = read_vector<int32_t>(result1);
1648 vector<float> expec0{12, 9, 10, 4, 6, 3, 11, 7};
1649 ASSERT_EQ(result0_val, expec0);
1651 vector<int32_t> expec1{0, 1, 1, 2, 0, 1, 2, 2};
1652 ASSERT_EQ(result1_val, expec1);
1655 TEST(eval, topk_v3_dyn_values)
1657 Shape shape{2, 3, 2};
1659 auto A = make_shared<op::Parameter>(element::f32, shape);
1660 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1661 auto B = make_shared<op::v3::TopK>(A, k, 1, "max", "value", element::i32);
1664 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1666 auto result0 = make_shared<HostTensor>();
1667 auto result1 = make_shared<HostTensor>();
1668 ASSERT_TRUE(fun->evaluate({result0, result1},
1669 {make_host_tensor<element::Type_t::f32>(
1670 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1671 make_host_tensor<element::Type_t::i32>(Shape{}, {2})}));
1672 EXPECT_EQ(result0->get_element_type(), element::f32);
1673 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1674 EXPECT_EQ(result1->get_element_type(), element::i32);
1675 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1676 auto result0_val = read_vector<float>(result0);
1677 auto result1_val = read_vector<int32_t>(result1);
1678 vector<float> expec0{12, 9, 10, 4, 11, 7, 6, 3};
1679 ASSERT_EQ(result0_val, expec0);
1681 vector<int32_t> expec1{0, 1, 1, 2, 2, 2, 0, 1};
1682 ASSERT_EQ(result1_val, expec1);
1685 TEST(eval, topk_v3_dyn_values_k0)
1687 Shape shape{2, 3, 2};
1689 auto A = make_shared<op::Parameter>(element::f32, shape);
1690 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1691 auto B = make_shared<op::v3::TopK>(A, k, 1, "max", "value", element::i32);
1694 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1696 auto result0 = make_shared<HostTensor>();
1697 auto result1 = make_shared<HostTensor>();
1698 ASSERT_TRUE(fun->evaluate({result0, result1},
1699 {make_host_tensor<element::Type_t::f32>(
1700 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1701 make_host_tensor<element::Type_t::i32>(Shape{}, {0})}));
1702 EXPECT_EQ(result0->get_element_type(), element::f32);
1703 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 3, 2}));
1704 EXPECT_EQ(result1->get_element_type(), element::i32);
1705 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 3, 2}));
1706 auto result0_val = read_vector<float>(result0);
1707 auto result1_val = read_vector<int32_t>(result1);
1708 vector<float> expec0{12, 9, 10, 4, 8, 2, 11, 7, 6, 3, 5, 1};
1709 ASSERT_EQ(result0_val, expec0);
1711 vector<int32_t> expec1{0, 1, 1, 2, 2, 0, 2, 2, 0, 1, 1, 0};
1712 ASSERT_EQ(result1_val, expec1);
1715 TEST(eval, topk_v0_dyn)
1717 Shape shape{2, 3, 2};
1719 auto A = make_shared<op::Parameter>(element::f32, shape);
1720 auto k = make_shared<op::Parameter>(element::i64, Shape{});
1721 auto axis = make_shared<op::Parameter>(element::i64, Shape{});
1723 element::Type result_et{element::i32};
1724 bool compute_max = true;
1726 auto B = make_shared<op::v0::TopK>(
1727 A, k, axis, result_et, compute_max, op::v0::TopK::SortType::SORT_VALUES);
1729 auto fun = make_shared<Function>(OutputVector{B->output(0), B->output(1)},
1730 ParameterVector{A, k, axis});
1732 auto result0 = make_shared<HostTensor>();
1733 auto result1 = make_shared<HostTensor>();
1734 ASSERT_TRUE(fun->evaluate({result0, result1},
1735 {make_host_tensor<element::Type_t::f32>(
1736 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1737 make_host_tensor<element::Type_t::i64>(Shape{}, {2}),
1738 make_host_tensor<element::Type_t::i64>(Shape{}, {1})}));
1739 EXPECT_EQ(result0->get_element_type(), element::i32);
1740 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1741 EXPECT_EQ(result1->get_element_type(), element::f32);
1742 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1743 auto result1_val = read_vector<float>(result1);
1744 auto result0_val = read_vector<int32_t>(result0);
1746 vector<float> expec1{12, 9, 10, 4, 11, 7, 6, 3};
1747 ASSERT_EQ(result1_val, expec1);
1749 vector<int32_t> expec0{0, 1, 1, 2, 2, 2, 0, 1};
1750 ASSERT_EQ(result0_val, expec0);
1753 TEST(eval, topk_v0_dyn_k0)
1755 Shape shape{2, 3, 2};
1757 auto A = make_shared<op::Parameter>(element::f32, shape);
1758 auto k = make_shared<op::Parameter>(element::i64, Shape{});
1759 auto axis = make_shared<op::Parameter>(element::i64, Shape{});
1761 element::Type result_et{element::i32};
1762 bool compute_max = true;
1764 auto B = make_shared<op::v0::TopK>(
1765 A, k, axis, result_et, compute_max, op::v0::TopK::SortType::SORT_VALUES);
1767 auto fun = make_shared<Function>(OutputVector{B->output(0), B->output(1)},
1768 ParameterVector{A, k, axis});
1770 auto result0 = make_shared<HostTensor>();
1771 auto result1 = make_shared<HostTensor>();
1772 ASSERT_TRUE(fun->evaluate({result0, result1},
1773 {make_host_tensor<element::Type_t::f32>(
1774 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1775 make_host_tensor<element::Type_t::i64>(Shape{}, {0}),
1776 make_host_tensor<element::Type_t::i64>(Shape{}, {1})}));
1777 EXPECT_EQ(result0->get_element_type(), element::i32);
1778 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 3, 2}));
1779 EXPECT_EQ(result1->get_element_type(), element::f32);
1780 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 3, 2}));
1781 auto result1_val = read_vector<float>(result1);
1782 auto result0_val = read_vector<int32_t>(result0);
1784 vector<float> expec1{12, 9, 10, 4, 8, 2, 11, 7, 6, 3, 5, 1};
1785 ASSERT_EQ(result1_val, expec1);
1787 vector<int32_t> expec0{0, 1, 1, 2, 2, 0, 2, 2, 0, 1, 1, 0};
1788 ASSERT_EQ(result0_val, expec0);
1791 TEST(eval, topk_v3_param_dyn_values_k0)
1793 auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1794 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1795 auto B = make_shared<op::v3::TopK>(A, k, 1, "max", "value", element::i32);
1798 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1800 auto result0 = make_shared<HostTensor>();
1801 auto result1 = make_shared<HostTensor>();
1802 ASSERT_TRUE(fun->evaluate({result0, result1},
1803 {make_host_tensor<element::Type_t::f32>(
1804 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1805 make_host_tensor<element::Type_t::i32>(Shape{}, {0})}));
1806 EXPECT_EQ(result0->get_element_type(), element::f32);
1807 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 3, 2}));
1808 EXPECT_EQ(result1->get_element_type(), element::i32);
1809 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 3, 2}));
1810 auto result0_val = read_vector<float>(result0);
1811 auto result1_val = read_vector<int32_t>(result1);
1812 vector<float> expec0{12, 9, 10, 4, 8, 2, 11, 7, 6, 3, 5, 1};
1813 ASSERT_EQ(result0_val, expec0);
1815 vector<int32_t> expec1{0, 1, 1, 2, 2, 0, 2, 2, 0, 1, 1, 0};
1816 ASSERT_EQ(result1_val, expec1);
1819 TEST(eval, topk_v3_param_dyn_values_k2)
1821 auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1822 auto k = make_shared<op::Parameter>(element::u32, Shape{});
1823 auto B = make_shared<op::v3::TopK>(A, k, 1, "max", "value", element::i32);
1826 make_shared<Function>(OutputVector{B->output(0), B->output(1)}, ParameterVector{A, k});
1828 auto result0 = make_shared<HostTensor>();
1829 auto result1 = make_shared<HostTensor>();
1830 ASSERT_TRUE(fun->evaluate({result0, result1},
1831 {make_host_tensor<element::Type_t::f32>(
1832 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1833 make_host_tensor<element::Type_t::i32>(Shape{}, {2})}));
1834 EXPECT_EQ(result0->get_element_type(), element::f32);
1835 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1836 EXPECT_EQ(result1->get_element_type(), element::i32);
1837 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1838 auto result0_val = read_vector<float>(result0);
1839 auto result1_val = read_vector<int32_t>(result1);
1840 vector<float> expec0{12, 9, 10, 4, 11, 7, 6, 3};
1841 ASSERT_EQ(result0_val, expec0);
1843 vector<int32_t> expec1{0, 1, 1, 2, 2, 2, 0, 1};
1844 ASSERT_EQ(result1_val, expec1);
1847 TEST(eval, topk_v0_param_dyn_k2)
1849 auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1850 auto k = make_shared<op::Parameter>(element::i64, Shape{});
1851 auto axis = make_shared<op::Parameter>(element::i64, Shape{});
1853 element::Type result_et{element::i32};
1854 bool compute_max = true;
1856 auto B = make_shared<op::v0::TopK>(
1857 A, k, axis, result_et, compute_max, op::v0::TopK::SortType::SORT_VALUES);
1859 auto fun = make_shared<Function>(OutputVector{B->output(0), B->output(1)},
1860 ParameterVector{A, k, axis});
1862 auto result0 = make_shared<HostTensor>();
1863 auto result1 = make_shared<HostTensor>();
1864 ASSERT_TRUE(fun->evaluate({result0, result1},
1865 {make_host_tensor<element::Type_t::f32>(
1866 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1867 make_host_tensor<element::Type_t::i64>(Shape{}, {2}),
1868 make_host_tensor<element::Type_t::i64>(Shape{}, {1})}));
1869 EXPECT_EQ(result0->get_element_type(), element::i32);
1870 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 2, 2}));
1871 EXPECT_EQ(result1->get_element_type(), element::f32);
1872 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 2, 2}));
1873 auto result1_val = read_vector<float>(result1);
1874 auto result0_val = read_vector<int32_t>(result0);
1876 vector<float> expec1{12, 9, 10, 4, 11, 7, 6, 3};
1877 ASSERT_EQ(result1_val, expec1);
1879 vector<int32_t> expec0{0, 1, 1, 2, 2, 2, 0, 1};
1880 ASSERT_EQ(result0_val, expec0);
1883 TEST(eval, topk_v0_param_dyn_k0)
1885 auto A = make_shared<op::Parameter>(element::f32, PartialShape::dynamic());
1886 auto k = make_shared<op::Parameter>(element::i64, Shape{});
1887 auto axis = make_shared<op::Parameter>(element::i64, Shape{});
1889 element::Type result_et{element::i32};
1890 bool compute_max = true;
1892 auto B = make_shared<op::v0::TopK>(
1893 A, k, axis, result_et, compute_max, op::v0::TopK::SortType::SORT_VALUES);
1895 auto fun = make_shared<Function>(OutputVector{B->output(0), B->output(1)},
1896 ParameterVector{A, k, axis});
1898 auto result0 = make_shared<HostTensor>();
1899 auto result1 = make_shared<HostTensor>();
1900 ASSERT_TRUE(fun->evaluate({result0, result1},
1901 {make_host_tensor<element::Type_t::f32>(
1902 Shape{2, 3, 2}, {12, 2, 10, 9, 8, 4, 6, 1, 5, 3, 11, 7}),
1903 make_host_tensor<element::Type_t::i64>(Shape{}, {0}),
1904 make_host_tensor<element::Type_t::i64>(Shape{}, {1})}));
1905 EXPECT_EQ(result0->get_element_type(), element::i32);
1906 EXPECT_EQ(result0->get_partial_shape(), (PartialShape{2, 3, 2}));
1907 EXPECT_EQ(result1->get_element_type(), element::f32);
1908 EXPECT_EQ(result1->get_partial_shape(), (PartialShape{2, 3, 2}));
1909 auto result1_val = read_vector<float>(result1);
1910 auto result0_val = read_vector<int32_t>(result0);
1912 vector<float> expec1{12, 9, 10, 4, 8, 2, 11, 7, 6, 3, 5, 1};
1913 ASSERT_EQ(result1_val, expec1);
1915 vector<int32_t> expec0{0, 1, 1, 2, 2, 0, 2, 2, 0, 1, 1, 0};
1916 ASSERT_EQ(result0_val, expec0);
1919 TEST(eval, reduce_logical_and__neg_axis)
1921 const auto data = make_shared<op::Parameter>(element::boolean, Shape{2, 2, 2});
1922 const auto axes = make_shared<op::Parameter>(element::i64, Shape{});
1924 const auto op = make_shared<op::v1::ReduceLogicalAnd>(data, axes);
1926 auto fun = make_shared<Function>(op, ParameterVector{data, axes});
1928 auto result = make_shared<HostTensor>();
1930 // when ReduceLogicalAnd node evaluator returns false -> the Function object throws
1932 fun->evaluate({result},
1934 make_host_tensor<element::Type_t::boolean>(
1935 Shape{2, 2, 2}, {true, false, true, false, true, false, true, false}),
1936 make_host_tensor<element::Type_t::i64>(Shape{}, {-1}),
1938 ngraph::ngraph_error);