44da107b8614ba21d2a0b42637e24bea01299cfa
[platform/core/ml/nnfw.git] / onert-micro / luci-interpreter / src / kernels / StridedSlice.test.cpp
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
3  * Copyright 2019 The TensorFlow Authors. All Rights Reserved.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *    http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17
18 #include "kernels/StridedSlice.h"
19 #include "kernels/TestUtils.h"
20 #include "luci_interpreter/TestMemoryManager.h"
21
22 namespace luci_interpreter
23 {
24 namespace kernels
25 {
26 namespace
27 {
28
29 using namespace testing;
30
31 TEST(StridedSliceTest, Float)
32 {
33   std::unique_ptr<IMemoryManager> memory_manager = std::make_unique<TestMemoryManager>();
34
35   Shape input_shape{2, 3, 2};
36   std::vector<float> input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
37   Shape begin_shape{3};
38   std::vector<int32_t> begin_data{0, 0, 0};
39   Shape end_shape{3};
40   std::vector<int32_t> end_data{1, 3, 2};
41   Shape strides_shape{3};
42   std::vector<int32_t> strides_data{1, 1, 1};
43   Tensor input_tensor =
44     makeInputTensor<DataType::FLOAT32>(input_shape, input_data, memory_manager.get());
45   Tensor begin_tensor =
46     makeInputTensor<DataType::S32>(begin_shape, begin_data, memory_manager.get());
47   Tensor end_tensor = makeInputTensor<DataType::S32>(end_shape, end_data, memory_manager.get());
48   Tensor strides_tensor =
49     makeInputTensor<DataType::S32>(strides_shape, strides_data, memory_manager.get());
50   Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
51
52   StridedSliceParams params{};
53   params.begin_mask = 0;
54   params.end_mask = 0;
55   params.ellipsis_mask = 0;
56   params.new_axis_mask = 0;
57   params.shrink_axis_mask = 1;
58
59   StridedSlice kernel(&input_tensor, &begin_tensor, &end_tensor, &strides_tensor, &output_tensor,
60                       params);
61   kernel.configure();
62   memory_manager->allocate_memory(output_tensor);
63   kernel.execute();
64
65   std::vector<int32_t> output_shape{3, 2};
66   std::vector<float> output_data{1, 2, 3, 4, 5, 6};
67   EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(output_data));
68   EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape));
69 }
70
71 TEST(StridedSliceTest, Uint8)
72 {
73   std::unique_ptr<IMemoryManager> memory_manager = std::make_unique<TestMemoryManager>();
74
75   Shape input_shape{2, 3, 2};
76   std::vector<float> input_data{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
77   Shape begin_shape{3};
78   std::vector<int32_t> begin_data{0, 0, 0};
79   Shape end_shape{3};
80   std::vector<int32_t> end_data{1, 3, 2};
81   Shape strides_shape{3};
82   std::vector<int32_t> strides_data{1, 1, 1};
83   Tensor input_tensor =
84     makeInputTensor<DataType::U8>(input_shape, 1.0f, 0, input_data, memory_manager.get());
85   Tensor begin_tensor =
86     makeInputTensor<DataType::S32>(begin_shape, begin_data, memory_manager.get());
87   Tensor end_tensor = makeInputTensor<DataType::S32>(end_shape, end_data, memory_manager.get());
88   Tensor strides_tensor =
89     makeInputTensor<DataType::S32>(strides_shape, strides_data, memory_manager.get());
90   Tensor output_tensor = makeOutputTensor(DataType::U8, 1.0f, 0);
91
92   StridedSliceParams params{};
93   params.begin_mask = 0;
94   params.end_mask = 0;
95   params.ellipsis_mask = 0;
96   params.new_axis_mask = 0;
97   params.shrink_axis_mask = 1;
98
99   StridedSlice kernel(&input_tensor, &begin_tensor, &end_tensor, &strides_tensor, &output_tensor,
100                       params);
101   kernel.configure();
102   memory_manager->allocate_memory(output_tensor);
103   kernel.execute();
104
105   std::vector<int32_t> output_shape{3, 2};
106   std::vector<float> output_data{1, 2, 3, 4, 5, 6};
107   EXPECT_THAT(dequantizeTensorData(output_tensor), FloatArrayNear(output_data));
108   EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(output_shape));
109 }
110
111 } // namespace
112 } // namespace kernels
113 } // namespace luci_interpreter