• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
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
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
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  */
16 
17 #include <SampleDriverPartial.h>
18 #include <Utils.h>
19 #include <gtest/gtest.h>
20 
21 #include <algorithm>
22 #include <iostream>
23 #include <limits>
24 #include <string>
25 #include <vector>
26 
27 #include "GeneratedTestUtils.h"
28 #include "HalUtils.h"
29 #include "Manager.h"
30 #include "TestNeuralNetworksWrapper.h"
31 
32 namespace generated_tests::avg_pool_v1_2 {
33 const test_helper::TestModel& get_test_model_nhwc();
34 const test_helper::TestModel& get_test_model_nchw();
35 const test_helper::TestModel& get_test_model_nhwc_5();
36 }  // namespace generated_tests::avg_pool_v1_2
37 
38 namespace generated_tests::conv2d_dilation {
39 const test_helper::TestModel& get_test_model_nhwc();
40 const test_helper::TestModel& get_test_model_nchw();
41 const test_helper::TestModel& get_test_model_valid_padding_nhwc();
42 }  // namespace generated_tests::conv2d_dilation
43 
44 namespace generated_tests::depthwise_conv2d_dilation {
45 const test_helper::TestModel& get_test_model_nhwc();
46 const test_helper::TestModel& get_test_model_valid_padding_nhwc();
47 }  // namespace generated_tests::depthwise_conv2d_dilation
48 
49 namespace generated_tests::depth_to_space_v1_2 {
50 const test_helper::TestModel& get_test_model_nhwc();
51 }  // namespace generated_tests::depth_to_space_v1_2
52 
53 namespace generated_tests::l2_normalization_axis {
54 const test_helper::TestModel& get_test_model_dim4_axis3_neg();
55 }  // namespace generated_tests::l2_normalization_axis
56 
57 namespace generated_tests::l2_pool_v1_2 {
58 const test_helper::TestModel& get_test_model_nhwc();
59 const test_helper::TestModel& get_test_model_nhwc_2();
60 }  // namespace generated_tests::l2_pool_v1_2
61 
62 namespace generated_tests::local_response_normalization_v1_2 {
63 const test_helper::TestModel& get_test_model_axis_dim2_axis1_neg();
64 }  // namespace generated_tests::local_response_normalization_v1_2
65 
66 namespace generated_tests::max_pool_v1_2 {
67 const test_helper::TestModel& get_test_model_nhwc();
68 const test_helper::TestModel& get_test_model_nhwc_4();
69 }  // namespace generated_tests::max_pool_v1_2
70 
71 namespace generated_tests::resize_bilinear_v1_2 {
72 const test_helper::TestModel& get_test_model_shape_nhwc();
73 }  // namespace generated_tests::resize_bilinear_v1_2
74 
75 namespace generated_tests::resize_bilinear_v1_3 {
76 const test_helper::TestModel& get_test_model_align_corners_2x2_to_1x1();
77 }  // namespace generated_tests::resize_bilinear_v1_3
78 
79 namespace generated_tests::softmax_v1_2 {
80 const test_helper::TestModel& get_test_model_axis_quant8_dim1_axis0_neg();
81 }  // namespace generated_tests::softmax_v1_2
82 
83 namespace generated_tests::space_to_depth_v1_2 {
84 const test_helper::TestModel& get_test_model_nhwc();
85 }  // namespace generated_tests::space_to_depth_v1_2
86 
87 namespace generated_tests::batch_to_space_v1_2 {
88 const test_helper::TestModel& get_test_model_nhwc();
89 }  // namespace generated_tests::batch_to_space_v1_2
90 
91 namespace generated_tests::space_to_batch_v1_2 {
92 const test_helper::TestModel& get_test_model_nhwc();
93 }  // namespace generated_tests::space_to_batch_v1_2
94 
95 namespace generated_tests::resize_nearest_neighbor_v1_3 {
96 const test_helper::TestModel& get_test_model_align_corners_2x2_to_1x1();
97 }  // namespace generated_tests::resize_nearest_neighbor_v1_3
98 
99 namespace android::nn {
100 namespace {
101 
102 using sample_driver::SampleDriverPartial;
103 using Result = test_wrapper::Result;
104 using WrapperOperandType = test_wrapper::OperandType;
105 using WrapperCompilation = test_wrapper::Compilation;
106 using WrapperType = test_wrapper::Type;
107 using WrapperModel = test_wrapper::Model;
108 
109 const char* kTestDriverName = "nnapi-test";
110 
111 // A driver that rejects operations based solely on the input count.
112 class TestDriver : public SampleDriverPartial {
113    public:
TestDriver()114     TestDriver() : SampleDriverPartial(kTestDriverName) {}
115 
getCapabilities_1_3(getCapabilities_1_3_cb cb)116     hardware::Return<void> getCapabilities_1_3(getCapabilities_1_3_cb cb) override {
117         cb(V1_3::ErrorStatus::NONE, makeCapabilities(1.0));
118         return hardware::Void();
119     }
120 
setSupportedInputCount(uint32_t count)121     void setSupportedInputCount(uint32_t count) { mSupportedInputCount = count; }
122 
123    private:
getSupportedOperationsImpl(const V1_3::Model & model) const124     std::vector<bool> getSupportedOperationsImpl(const V1_3::Model& model) const override {
125         std::vector<bool> supported(model.main.operations.size());
126         std::transform(model.main.operations.begin(), model.main.operations.end(),
127                        supported.begin(), [this](const V1_3::Operation& operation) {
128                            SCOPED_TRACE("operation = " + toString(operation.type));
129                            EXPECT_EQ(operation.inputs.size(), mSupportedInputCount);
130                            return operation.inputs.size() == mSupportedInputCount;
131                        });
132         return supported;
133     }
134 
135     uint32_t mSupportedInputCount = std::numeric_limits<uint32_t>::max();
136 };
137 
138 class TestRemoveDefaultArguments : public ::testing::Test {
SetUp()139     virtual void SetUp() {
140         // skip the tests if useCpuOnly = 1
141         if (DeviceManager::get()->getUseCpuOnly()) {
142             GTEST_SKIP();
143         }
144         mTestDriver = new TestDriver();
145         DeviceManager::get()->forTest_registerDevice(
146                 makeSharedDevice(kTestDriverName, mTestDriver));
147         mTestDevice = getDeviceByName(kTestDriverName);
148         ASSERT_NE(mTestDevice, nullptr);
149     }
150 
TearDown()151     virtual void TearDown() { DeviceManager::get()->forTest_reInitializeDeviceList(); }
152 
153    protected:
test(const test_helper::TestModel & testModel,uint32_t originalInputCount,uint32_t expectedInputCount)154     void test(const test_helper::TestModel& testModel, uint32_t originalInputCount,
155               uint32_t expectedInputCount) {
156         ASSERT_EQ(testModel.main.operations.size(), 1u);
157         ASSERT_EQ(testModel.main.operations[0].inputs.size(), originalInputCount);
158 
159         mTestDriver->setSupportedInputCount(expectedInputCount);
160 
161         generated_tests::GeneratedModel model;
162         generated_tests::createModel(testModel, &model);
163         ASSERT_TRUE(model.isValid());
164         ASSERT_EQ(model.finish(), Result::NO_ERROR);
165 
166         auto [result, compilation] = WrapperCompilation::createForDevice(&model, mTestDevice);
167         ASSERT_EQ(result, Result::NO_ERROR);
168         ASSERT_EQ(compilation.finish(), Result::NO_ERROR);
169     }
170 
171    private:
getDeviceByName(const std::string & name)172     ANeuralNetworksDevice* getDeviceByName(const std::string& name) {
173         ANeuralNetworksDevice* result = nullptr;
174         uint32_t numDevices = 0;
175         EXPECT_EQ(ANeuralNetworks_getDeviceCount(&numDevices), ANEURALNETWORKS_NO_ERROR);
176         EXPECT_GE(numDevices, 1u);
177         for (uint32_t i = 0; i < numDevices; i++) {
178             ANeuralNetworksDevice* device = nullptr;
179             EXPECT_EQ(ANeuralNetworks_getDevice(i, &device), ANEURALNETWORKS_NO_ERROR);
180             const char* buffer = nullptr;
181             EXPECT_EQ(ANeuralNetworksDevice_getName(device, &buffer), ANEURALNETWORKS_NO_ERROR);
182             if (name == buffer) {
183                 EXPECT_EQ(result, nullptr) << "multiple devices named " << name;
184                 result = device;
185             }
186         }
187         return result;
188     }
189 
190     sp<TestDriver> mTestDriver;
191     ANeuralNetworksDevice* mTestDevice;
192 };
193 
TEST_F(TestRemoveDefaultArguments,AVERAGE_POOL_2D_11_inputs_to_10_inputs)194 TEST_F(TestRemoveDefaultArguments, AVERAGE_POOL_2D_11_inputs_to_10_inputs) {
195     const uint32_t originalInputCount = 11;
196     const uint32_t expectedInputCount = 10;
197     test(::generated_tests::avg_pool_v1_2::get_test_model_nhwc(), originalInputCount,
198          expectedInputCount);
199 }
200 
TEST_F(TestRemoveDefaultArguments,AVERAGE_POOL_2D_11_inputs_no_default_values)201 TEST_F(TestRemoveDefaultArguments, AVERAGE_POOL_2D_11_inputs_no_default_values) {
202     const uint32_t originalInputCount = 11;
203     const uint32_t expectedInputCount = 11;
204     test(::generated_tests::avg_pool_v1_2::get_test_model_nchw(), originalInputCount,
205          expectedInputCount);
206 }
207 
TEST_F(TestRemoveDefaultArguments,AVERAGE_POOL_2D_8_inputs_to_7_inputs)208 TEST_F(TestRemoveDefaultArguments, AVERAGE_POOL_2D_8_inputs_to_7_inputs) {
209     const uint32_t originalInputCount = 8;
210     const uint32_t expectedInputCount = 7;
211     test(::generated_tests::avg_pool_v1_2::get_test_model_nhwc_5(), originalInputCount,
212          expectedInputCount);
213 }
214 
TEST_F(TestRemoveDefaultArguments,CONV_2D_13_inputs_to_10_inputs)215 TEST_F(TestRemoveDefaultArguments, CONV_2D_13_inputs_to_10_inputs) {
216     const uint32_t originalInputCount = 13;
217     const uint32_t expectedInputCount = 10;
218     test(::generated_tests::conv2d_dilation::get_test_model_nhwc(), originalInputCount,
219          expectedInputCount);
220 }
221 
TEST_F(TestRemoveDefaultArguments,CONV_2D_13_inputs_to_11_inputs)222 TEST_F(TestRemoveDefaultArguments, CONV_2D_13_inputs_to_11_inputs) {
223     const uint32_t originalInputCount = 13;
224     const uint32_t expectedInputCount = 11;
225     test(::generated_tests::conv2d_dilation::get_test_model_nchw(), originalInputCount,
226          expectedInputCount);
227 }
228 
TEST_F(TestRemoveDefaultArguments,CONV_2D_10_inputs_to_7_inputs)229 TEST_F(TestRemoveDefaultArguments, CONV_2D_10_inputs_to_7_inputs) {
230     const uint32_t originalInputCount = 10;
231     const uint32_t expectedInputCount = 7;
232     test(::generated_tests::conv2d_dilation::get_test_model_valid_padding_nhwc(),
233          originalInputCount, expectedInputCount);
234 }
235 
TEST_F(TestRemoveDefaultArguments,DEPTHWISE_CONV_3D_14_inputs_to_11_inputs)236 TEST_F(TestRemoveDefaultArguments, DEPTHWISE_CONV_3D_14_inputs_to_11_inputs) {
237     const uint32_t originalInputCount = 14;
238     const uint32_t expectedInputCount = 11;
239     test(::generated_tests::depthwise_conv2d_dilation::get_test_model_nhwc(), originalInputCount,
240          expectedInputCount);
241 }
242 
TEST_F(TestRemoveDefaultArguments,DEPTHWISE_CONV_2D_11_inputs_to_8_inputs)243 TEST_F(TestRemoveDefaultArguments, DEPTHWISE_CONV_2D_11_inputs_to_8_inputs) {
244     const uint32_t originalInputCount = 11;
245     const uint32_t expectedInputCount = 8;
246     test(::generated_tests::depthwise_conv2d_dilation::get_test_model_valid_padding_nhwc(),
247          originalInputCount, expectedInputCount);
248 }
249 
TEST_F(TestRemoveDefaultArguments,DEPTH_TO_SPACE_3_inputs_to_2_inputs)250 TEST_F(TestRemoveDefaultArguments, DEPTH_TO_SPACE_3_inputs_to_2_inputs) {
251     const uint32_t originalInputCount = 3;
252     const uint32_t expectedInputCount = 2;
253     test(::generated_tests::depth_to_space_v1_2::get_test_model_nhwc(), originalInputCount,
254          expectedInputCount);
255 }
256 
TEST_F(TestRemoveDefaultArguments,L2_NORMALIZATION_2_inputs_to_1_input)257 TEST_F(TestRemoveDefaultArguments, L2_NORMALIZATION_2_inputs_to_1_input) {
258     const uint32_t originalInputCount = 2;
259     const uint32_t expectedInputCount = 1;
260     test(::generated_tests::l2_normalization_axis::get_test_model_dim4_axis3_neg(),
261          originalInputCount, expectedInputCount);
262 }
263 
TEST_F(TestRemoveDefaultArguments,L2_POOL_2D_11_inputs_to_10_inputs)264 TEST_F(TestRemoveDefaultArguments, L2_POOL_2D_11_inputs_to_10_inputs) {
265     const uint32_t originalInputCount = 11;
266     const uint32_t expectedInputCount = 10;
267     test(::generated_tests::l2_pool_v1_2::get_test_model_nhwc(), originalInputCount,
268          expectedInputCount);
269 }
270 
TEST_F(TestRemoveDefaultArguments,L2_POOL_2D_8_inputs_to_7_inputs)271 TEST_F(TestRemoveDefaultArguments, L2_POOL_2D_8_inputs_to_7_inputs) {
272     const uint32_t originalInputCount = 8;
273     const uint32_t expectedInputCount = 7;
274     test(::generated_tests::l2_pool_v1_2::get_test_model_nhwc_2(), originalInputCount,
275          expectedInputCount);
276 }
277 
TEST_F(TestRemoveDefaultArguments,LOCAL_RESPONSE_NORMALIZATION_6_inputs_to_5_inputs)278 TEST_F(TestRemoveDefaultArguments, LOCAL_RESPONSE_NORMALIZATION_6_inputs_to_5_inputs) {
279     const uint32_t originalInputCount = 6;
280     const uint32_t expectedInputCount = 5;
281     test(::generated_tests::local_response_normalization_v1_2::get_test_model_axis_dim2_axis1_neg(),
282          originalInputCount, expectedInputCount);
283 }
284 
TEST_F(TestRemoveDefaultArguments,MAX_POOL_2D_11_inputs_to_10_inputs)285 TEST_F(TestRemoveDefaultArguments, MAX_POOL_2D_11_inputs_to_10_inputs) {
286     const uint32_t originalInputCount = 11;
287     const uint32_t expectedInputCount = 10;
288     test(::generated_tests::max_pool_v1_2::get_test_model_nhwc(), originalInputCount,
289          expectedInputCount);
290 }
291 
TEST_F(TestRemoveDefaultArguments,MAX_POOL_2D_8_inputs_to_7_inputs)292 TEST_F(TestRemoveDefaultArguments, MAX_POOL_2D_8_inputs_to_7_inputs) {
293     const uint32_t originalInputCount = 8;
294     const uint32_t expectedInputCount = 7;
295     test(::generated_tests::max_pool_v1_2::get_test_model_nhwc_4(), originalInputCount,
296          expectedInputCount);
297 }
298 
TEST_F(TestRemoveDefaultArguments,RESIZE_BILINEAR_by_shape_6_inputs_to_5_inputs)299 TEST_F(TestRemoveDefaultArguments, RESIZE_BILINEAR_by_shape_6_inputs_to_5_inputs) {
300     const uint32_t originalInputCount = 6;
301     const uint32_t expectedInputCount = 5;
302     test(::generated_tests::resize_bilinear_v1_3::get_test_model_align_corners_2x2_to_1x1(),
303          originalInputCount, expectedInputCount);
304 }
305 
TEST_F(TestRemoveDefaultArguments,RESIZE_BILINEAR_by_shape_4_inputs_to_3_inputs)306 TEST_F(TestRemoveDefaultArguments, RESIZE_BILINEAR_by_shape_4_inputs_to_3_inputs) {
307     const uint32_t originalInputCount = 4;
308     const uint32_t expectedInputCount = 3;
309     test(::generated_tests::resize_bilinear_v1_2::get_test_model_shape_nhwc(), originalInputCount,
310          expectedInputCount);
311 }
312 
TEST_F(TestRemoveDefaultArguments,SOFTMAX_3_inputs_to_2_inputs)313 TEST_F(TestRemoveDefaultArguments, SOFTMAX_3_inputs_to_2_inputs) {
314     const uint32_t originalInputCount = 3;
315     const uint32_t expectedInputCount = 2;
316     test(::generated_tests::softmax_v1_2::get_test_model_axis_quant8_dim1_axis0_neg(),
317          originalInputCount, expectedInputCount);
318 }
319 
TEST_F(TestRemoveDefaultArguments,SPACE_TO_DEPTH_3_inputs_to_2_inputs)320 TEST_F(TestRemoveDefaultArguments, SPACE_TO_DEPTH_3_inputs_to_2_inputs) {
321     const uint32_t originalInputCount = 3;
322     const uint32_t expectedInputCount = 2;
323     test(::generated_tests::space_to_depth_v1_2::get_test_model_nhwc(), originalInputCount,
324          expectedInputCount);
325 }
326 
TEST_F(TestRemoveDefaultArguments,BATCH_TO_SPACE_ND_3_inputs_to_2_inputs)327 TEST_F(TestRemoveDefaultArguments, BATCH_TO_SPACE_ND_3_inputs_to_2_inputs) {
328     const uint32_t originalInputCount = 3;
329     const uint32_t expectedInputCount = 2;
330     test(::generated_tests::batch_to_space_v1_2::get_test_model_nhwc(), originalInputCount,
331          expectedInputCount);
332 }
333 
TEST_F(TestRemoveDefaultArguments,SPACE_TO_BATCH_ND_4_inputs_to_3_inputs)334 TEST_F(TestRemoveDefaultArguments, SPACE_TO_BATCH_ND_4_inputs_to_3_inputs) {
335     const uint32_t originalInputCount = 4;
336     const uint32_t expectedInputCount = 3;
337     test(::generated_tests::space_to_batch_v1_2::get_test_model_nhwc(), originalInputCount,
338          expectedInputCount);
339 }
340 
TEST_F(TestRemoveDefaultArguments,RESIZE_NEAREST_NEIGHBOR_by_shape_6_inputs_to_5_inputs)341 TEST_F(TestRemoveDefaultArguments, RESIZE_NEAREST_NEIGHBOR_by_shape_6_inputs_to_5_inputs) {
342     const uint32_t originalInputCount = 6;
343     const uint32_t expectedInputCount = 5;
344     test(::generated_tests::resize_nearest_neighbor_v1_3::get_test_model_align_corners_2x2_to_1x1(),
345          originalInputCount, expectedInputCount);
346 }
347 
348 }  // namespace
349 }  // namespace android::nn
350