2 * Copyright (c) 2023 Samsung Electronics Co., Ltd. All Rights Reserved
3 * Copyright 2018 The TensorFlow Authors. All Rights Reserved.
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
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 #include "kernels/FloorMod.h"
19 #include "kernels/TestUtils.h"
20 #include "luci_interpreter/TestMemoryManager.h"
22 namespace luci_interpreter
29 using namespace testing;
31 class FloorModTest : public ::testing::Test
34 void SetUp() override { _memory_manager = std::make_unique<TestMemoryManager>(); }
36 std::unique_ptr<IMemoryManager> _memory_manager;
39 TEST_F(FloorModTest, Simple)
41 Shape input1_shape{1, 2, 2, 1};
42 std::vector<int32_t> input1_data{10, 9, 11, 3};
44 Shape input2_shape = input1_shape;
45 std::vector<int32_t> input2_data{2, 2, 3, 4};
47 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
48 std::vector<int32_t> ref_output_data{0, 1, 2, 3};
50 Tensor input1_tensor =
51 makeInputTensor<DataType::S32>(input1_shape, input1_data, _memory_manager.get());
52 Tensor input2_tensor =
53 makeInputTensor<DataType::S32>(input2_shape, input2_data, _memory_manager.get());
54 Tensor output_tensor = makeOutputTensor(DataType::S32);
56 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
58 _memory_manager->allocate_memory(output_tensor);
61 EXPECT_THAT(extractTensorData<int32_t>(output_tensor),
62 ::testing::ElementsAreArray(ref_output_data));
63 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
66 TEST_F(FloorModTest, NegativeValue)
68 Shape input1_shape{1, 2, 2, 1};
69 std::vector<int32_t> input1_data{10, -9, -11, 7};
71 Shape input2_shape = input1_shape;
72 std::vector<int32_t> input2_data{2, 2, -3, -4};
74 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
75 std::vector<int32_t> ref_output_data{0, 1, -2, -1};
77 Tensor input1_tensor =
78 makeInputTensor<DataType::S32>(input1_shape, input1_data, _memory_manager.get());
79 Tensor input2_tensor =
80 makeInputTensor<DataType::S32>(input2_shape, input2_data, _memory_manager.get());
81 Tensor output_tensor = makeOutputTensor(DataType::S32);
83 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
85 _memory_manager->allocate_memory(output_tensor);
88 EXPECT_THAT(extractTensorData<int32_t>(output_tensor),
89 ::testing::ElementsAreArray(ref_output_data));
90 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
93 TEST_F(FloorModTest, BroadcastFloorMod)
95 Shape input1_shape{1, 2, 2, 1};
96 std::vector<int32_t> input1_data{
103 Shape input2_shape{1};
104 std::vector<int32_t> input2_data{-3};
106 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
107 std::vector<int32_t> ref_output_data{-2, 0, -2, -2};
109 Tensor input1_tensor =
110 makeInputTensor<DataType::S32>(input1_shape, input1_data, _memory_manager.get());
111 Tensor input2_tensor =
112 makeInputTensor<DataType::S32>(input2_shape, input2_data, _memory_manager.get());
113 Tensor output_tensor = makeOutputTensor(DataType::S32);
115 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
117 _memory_manager->allocate_memory(output_tensor);
120 EXPECT_THAT(extractTensorData<int32_t>(output_tensor),
121 ::testing::ElementsAreArray(ref_output_data));
122 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
125 TEST_F(FloorModTest, Int64WithBroadcast)
127 Shape input1_shape{1, 2, 2, 1};
128 std::vector<int64_t> input1_data{10, -9, -11, (1LL << 34) + 9};
130 Shape input2_shape{1};
131 std::vector<int64_t> input2_data{-(1LL << 33)};
133 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
134 std::vector<int64_t> ref_output_data{-8589934582, -9, -11, -8589934583};
136 Tensor input1_tensor =
137 makeInputTensor<DataType::S64>(input1_shape, input1_data, _memory_manager.get());
138 Tensor input2_tensor =
139 makeInputTensor<DataType::S64>(input2_shape, input2_data, _memory_manager.get());
140 Tensor output_tensor = makeOutputTensor(DataType::S64);
142 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
144 _memory_manager->allocate_memory(output_tensor);
147 EXPECT_THAT(extractTensorData<int64_t>(output_tensor),
148 ::testing::ElementsAreArray(ref_output_data));
149 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
152 TEST_F(FloorModTest, FloatSimple)
154 Shape input1_shape{1, 2, 2, 1};
155 std::vector<float> input1_data{10.0, 9.0, 11.0, 3.0};
157 Shape input2_shape = input1_shape;
158 std::vector<float> input2_data{2.0, 2.0, 3.0, 4.0};
160 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
161 std::vector<float> ref_output_data{0.0, 1.0, 2.0, 3.0};
163 Tensor input1_tensor =
164 makeInputTensor<DataType::FLOAT32>(input1_shape, input1_data, _memory_manager.get());
165 Tensor input2_tensor =
166 makeInputTensor<DataType::FLOAT32>(input2_shape, input2_data, _memory_manager.get());
167 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
169 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
171 _memory_manager->allocate_memory(output_tensor);
174 EXPECT_THAT(extractTensorData<float>(output_tensor),
175 ::testing::ElementsAreArray(ref_output_data));
176 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
179 TEST_F(FloorModTest, FloatNegativeValue)
181 Shape input1_shape{1, 2, 2, 1};
182 std::vector<float> input1_data{10.0, -9.0, -11.0, 7.0};
184 Shape input2_shape = input1_shape;
185 std::vector<float> input2_data{2.0, 2.0, -3.0, -4.0};
187 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
188 std::vector<float> ref_output_data{0.0, 1.0, -2.0, -1.0};
190 Tensor input1_tensor =
191 makeInputTensor<DataType::FLOAT32>(input1_shape, input1_data, _memory_manager.get());
192 Tensor input2_tensor =
193 makeInputTensor<DataType::FLOAT32>(input2_shape, input2_data, _memory_manager.get());
194 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
196 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
198 _memory_manager->allocate_memory(output_tensor);
201 EXPECT_THAT(extractTensorData<float>(output_tensor),
202 ::testing::ElementsAreArray(ref_output_data));
203 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
206 TEST_F(FloorModTest, FloatBroadcast)
208 Shape input1_shape{1, 2, 2, 1};
209 std::vector<float> input1_data{
216 Shape input2_shape{1};
217 std::vector<float> input2_data{-3.0};
219 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
220 std::vector<float> ref_output_data{-2.0, 0.0, -2.0, -2.0};
222 Tensor input1_tensor =
223 makeInputTensor<DataType::FLOAT32>(input1_shape, input1_data, _memory_manager.get());
224 Tensor input2_tensor =
225 makeInputTensor<DataType::FLOAT32>(input2_shape, input2_data, _memory_manager.get());
226 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
228 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
230 _memory_manager->allocate_memory(output_tensor);
233 EXPECT_THAT(extractTensorData<float>(output_tensor),
234 ::testing::ElementsAreArray(ref_output_data));
235 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
238 TEST_F(FloorModTest, SimpleInt16)
240 Shape input1_shape{1, 2, 2, 1};
241 std::vector<int16_t> input1_data{10, 9, 11, 3};
243 Shape input2_shape = input1_shape;
244 std::vector<int16_t> input2_data{2, 2, 3, 4};
246 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
247 std::vector<int16_t> ref_output_data{0, 1, 2, 3};
249 Tensor input1_tensor =
250 makeInputTensor<DataType::S16>(input1_shape, input1_data, _memory_manager.get());
251 Tensor input2_tensor =
252 makeInputTensor<DataType::S16>(input2_shape, input2_data, _memory_manager.get());
253 Tensor output_tensor = makeOutputTensor(DataType::S16);
255 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
257 _memory_manager->allocate_memory(output_tensor);
260 EXPECT_THAT(extractTensorData<int16_t>(output_tensor),
261 ::testing::ElementsAreArray(ref_output_data));
262 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
265 TEST_F(FloorModTest, NegativeValueInt16)
267 Shape input1_shape{1, 2, 2, 1};
268 std::vector<int16_t> input1_data{110, -9, -11, 7};
270 Shape input2_shape = input1_shape;
271 std::vector<int16_t> input2_data{2, 2, -3, -4};
273 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
274 std::vector<int16_t> ref_output_data{0, 1, -2, -1};
276 Tensor input1_tensor =
277 makeInputTensor<DataType::S16>(input1_shape, input1_data, _memory_manager.get());
278 Tensor input2_tensor =
279 makeInputTensor<DataType::S16>(input2_shape, input2_data, _memory_manager.get());
280 Tensor output_tensor = makeOutputTensor(DataType::S16);
282 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
284 _memory_manager->allocate_memory(output_tensor);
287 EXPECT_THAT(extractTensorData<int16_t>(output_tensor),
288 ::testing::ElementsAreArray(ref_output_data));
289 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
292 TEST_F(FloorModTest, BroadcastFloorModInt16)
294 Shape input1_shape{1, 2, 2, 1};
295 std::vector<int16_t> input1_data{10, -9, -11, 7};
297 Shape input2_shape{1};
298 std::vector<int16_t> input2_data{-3};
300 std::vector<int32_t> ref_output_shape{1, 2, 2, 1};
301 std::vector<int16_t> ref_output_data{-2, 0, -2, -2};
303 Tensor input1_tensor =
304 makeInputTensor<DataType::S16>(input1_shape, input1_data, _memory_manager.get());
305 Tensor input2_tensor =
306 makeInputTensor<DataType::S16>(input2_shape, input2_data, _memory_manager.get());
307 Tensor output_tensor = makeOutputTensor(DataType::S16);
309 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
311 _memory_manager->allocate_memory(output_tensor);
314 EXPECT_THAT(extractTensorData<int16_t>(output_tensor),
315 ::testing::ElementsAreArray(ref_output_data));
316 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(ref_output_shape));
319 TEST_F(FloorModTest, DivByZero_NEG)
322 std::vector<int32_t> input1_data{1, 0, -1};
323 std::vector<int32_t> input2_data{0, 0, 0};
325 Tensor input1_tensor = makeInputTensor<DataType::S32>(shape, input1_data, _memory_manager.get());
326 Tensor input2_tensor = makeInputTensor<DataType::S32>(shape, input2_data, _memory_manager.get());
327 Tensor output_tensor = makeOutputTensor(DataType::S32);
329 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
331 _memory_manager->allocate_memory(output_tensor);
333 EXPECT_ANY_THROW(kernel.execute());
336 TEST_F(FloorModTest, Int64DivByZero_NEG)
339 std::vector<int64_t> input1_data{1, 0, -1};
340 std::vector<int64_t> input2_data{0, 0, 0};
342 Tensor input1_tensor = makeInputTensor<DataType::S64>(shape, input1_data, _memory_manager.get());
343 Tensor input2_tensor = makeInputTensor<DataType::S64>(shape, input2_data, _memory_manager.get());
344 Tensor output_tensor = makeOutputTensor(DataType::S64);
346 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
348 _memory_manager->allocate_memory(output_tensor);
350 EXPECT_ANY_THROW(kernel.execute());
353 TEST_F(FloorModTest, Int16DivByZero_NEG)
356 std::vector<int16_t> input1_data{1, 0, -1};
357 std::vector<int16_t> input2_data{0, 0, 0};
359 Tensor input1_tensor = makeInputTensor<DataType::S16>(shape, input1_data, _memory_manager.get());
360 Tensor input2_tensor = makeInputTensor<DataType::S16>(shape, input2_data, _memory_manager.get());
361 Tensor output_tensor = makeOutputTensor(DataType::S16);
363 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
365 _memory_manager->allocate_memory(output_tensor);
367 EXPECT_ANY_THROW(kernel.execute());
370 TEST_F(FloorModTest, Input_Output_Type_Mismatch_NEG)
372 Tensor input1_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1.f}, _memory_manager.get());
373 Tensor input2_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1.f}, _memory_manager.get());
374 Tensor output_tensor = makeOutputTensor(DataType::S8);
376 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
377 EXPECT_ANY_THROW(kernel.configure());
380 TEST_F(FloorModTest, Input_Type_Mismatch_NEG)
382 Tensor input1_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1}, _memory_manager.get());
383 Tensor input2_tensor = makeInputTensor<DataType::S8>({1}, {1}, _memory_manager.get());
384 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
386 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
387 EXPECT_ANY_THROW(kernel.configure());
390 TEST_F(FloorModTest, Float_Broadcast_NEG)
392 Tensor input1_tensor = makeInputTensor<DataType::FLOAT32>({2}, {1.f, 2.f}, _memory_manager.get());
393 Tensor input2_tensor =
394 makeInputTensor<DataType::FLOAT32>({3}, {1.f, 2.f, 3.f}, _memory_manager.get());
395 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
397 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
398 ASSERT_ANY_THROW(kernel.configure());
401 TEST_F(FloorModTest, Int64_Broadcast_NEG)
403 Tensor input1_tensor = makeInputTensor<DataType::S64>({2}, {1, 2}, _memory_manager.get());
404 Tensor input2_tensor = makeInputTensor<DataType::S64>({3}, {1, 2, 3}, _memory_manager.get());
405 Tensor output_tensor = makeOutputTensor(DataType::S64);
407 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
408 ASSERT_ANY_THROW(kernel.configure());
411 TEST_F(FloorModTest, Int32_Broadcast_NEG)
413 Tensor input1_tensor = makeInputTensor<DataType::S32>({2}, {1, 2}, _memory_manager.get());
414 Tensor input2_tensor = makeInputTensor<DataType::S32>({3}, {1, 2, 3}, _memory_manager.get());
415 Tensor output_tensor = makeOutputTensor(DataType::S32);
417 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
418 ASSERT_ANY_THROW(kernel.configure());
421 TEST_F(FloorModTest, Int16_Broadcast_NEG)
423 Tensor input1_tensor = makeInputTensor<DataType::S16>({2}, {1, 2}, _memory_manager.get());
424 Tensor input2_tensor = makeInputTensor<DataType::S16>({3}, {1, 2, 3}, _memory_manager.get());
425 Tensor output_tensor = makeOutputTensor(DataType::S16);
427 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
428 ASSERT_ANY_THROW(kernel.configure());
431 TEST_F(FloorModTest, UnsupportedType_NEG)
433 Tensor input1_tensor = makeInputTensor<DataType::U8>({1}, {1}, _memory_manager.get());
434 Tensor input2_tensor = makeInputTensor<DataType::U8>({1}, {1}, _memory_manager.get());
435 Tensor output_tensor = makeOutputTensor(DataType::U8);
437 FloorMod kernel(&input1_tensor, &input2_tensor, &output_tensor);
440 _memory_manager->allocate_memory(output_tensor);
441 ASSERT_ANY_THROW(kernel.execute());
445 } // namespace kernels
446 } // namespace luci_interpreter