2 * Copyright (c) 2020 Samsung Electronics Co., Ltd. All Rights Reserved
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.
17 #include "kernels/Pow.h"
18 #include "kernels/TestUtils.h"
19 #include "luci_interpreter/TestMemoryManager.h"
21 namespace luci_interpreter
28 using namespace testing;
30 class PowTest : public ::testing::Test
33 void SetUp() override { _memory_manager = std::make_unique<TestMemoryManager>(); }
35 std::unique_ptr<IMemoryManager> _memory_manager;
38 TEST_F(PowTest, SimplePow)
40 std::initializer_list<int32_t> base_shape = {1, 1, 3, 2};
42 std::vector<float> input1_data{0.3f, 2.3f, 0.9f, 0.5f, 0.8f, 1.1f};
43 std::vector<float> input2_data{0.2f, 0.3f, -0.4f, 0.5f, 1.0f, 0.9f};
44 std::vector<float> test_outputs{0.786f, 1.2838f, 1.043f, 0.7071f, 0.8f, 1.08956f};
46 Tensor input1_tensor =
47 makeInputTensor<DataType::FLOAT32>(base_shape, input1_data, _memory_manager.get());
48 Tensor input2_tensor =
49 makeInputTensor<DataType::FLOAT32>(base_shape, input2_data, _memory_manager.get());
50 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
52 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
54 _memory_manager->allocate_memory(output_tensor);
57 EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(test_outputs, 0.0001f));
58 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(base_shape));
61 TEST_F(PowTest, FloatBroadcastPow)
63 std::initializer_list<int32_t> input1_shape = {1, 3};
64 std::initializer_list<int32_t> input2_shape = {3, 1};
66 std::vector<float> input1_data{0.3f, 2.3f, 0.9f};
67 std::vector<float> input2_data{0.2f, 0.3f, 0.4f};
68 std::vector<float> test_outputs{0.786f, 1.18126f, 0.9791f, 0.6968f, 1.28386f,
69 0.96888f, 0.6178f, 1.3953f, 0.9587f};
71 Tensor input1_tensor =
72 makeInputTensor<DataType::FLOAT32>(input1_shape, input1_data, _memory_manager.get());
73 Tensor input2_tensor =
74 makeInputTensor<DataType::FLOAT32>(input2_shape, input2_data, _memory_manager.get());
75 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
77 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
79 _memory_manager->allocate_memory(output_tensor);
82 EXPECT_THAT(extractTensorData<float>(output_tensor), FloatArrayNear(test_outputs, 0.0001f));
85 TEST_F(PowTest, IntPow)
87 std::initializer_list<int32_t> base_shape = {1, 3};
89 std::vector<int32_t> input_data{2, 3, 4};
90 std::vector<int32_t> test_outputs{4, 27, 256};
92 Tensor input1_tensor =
93 makeInputTensor<DataType::S32>(base_shape, input_data, _memory_manager.get());
94 Tensor input2_tensor =
95 makeInputTensor<DataType::S32>(base_shape, input_data, _memory_manager.get());
96 Tensor output_tensor = makeOutputTensor(DataType::S32);
98 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
100 _memory_manager->allocate_memory(output_tensor);
103 EXPECT_THAT(extractTensorData<int32_t>(output_tensor), ::testing::ElementsAreArray(test_outputs));
104 EXPECT_THAT(extractTensorShape(output_tensor), ::testing::ElementsAreArray(base_shape));
107 TEST_F(PowTest, Input_Output_Type_NEG)
109 Tensor input1_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1.0f}, _memory_manager.get());
110 Tensor input2_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1.0f}, _memory_manager.get());
111 Tensor output_tensor = makeOutputTensor(DataType::BOOL);
113 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
114 EXPECT_ANY_THROW(kernel.configure());
117 TEST_F(PowTest, Input_Type_Mismatch_NEG)
119 Tensor input1_tensor = makeInputTensor<DataType::FLOAT32>({1}, {1.0f}, _memory_manager.get());
120 Tensor input2_tensor = makeInputTensor<DataType::S32>({1}, {4}, _memory_manager.get());
121 Tensor output_tensor = makeOutputTensor(DataType::FLOAT32);
123 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
124 EXPECT_ANY_THROW(kernel.configure());
127 TEST_F(PowTest, Invalid_Input_Type_NEG)
129 Tensor input1_tensor = makeInputTensor<DataType::S64>({1}, {1}, _memory_manager.get());
130 Tensor input2_tensor = makeInputTensor<DataType::S64>({1}, {1}, _memory_manager.get());
131 Tensor output_tensor = makeOutputTensor(DataType::S64);
133 Pow kernel(&input1_tensor, &input2_tensor, &output_tensor);
135 EXPECT_ANY_THROW(kernel.execute());
139 } // namespace kernels
140 } // namespace luci_interpreter