xref: /aosp_15_r20/external/armnn/delegate/test/MirrorPadTest.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2021, 2023 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "PadTestHelper.hpp"
7 
8 #include <armnn_delegate.hpp>
9 
10 #include <flatbuffers/flatbuffers.h>
11 #include <schema_generated.h>
12 
13 #include <doctest/doctest.h>
14 
15 namespace armnnDelegate
16 {
17 
MirrorPadSymmetric2dTest(std::vector<armnn::BackendId> & backends)18 void MirrorPadSymmetric2dTest(std::vector<armnn::BackendId>& backends)
19 {
20     // Set input data
21     std::vector<int32_t> inputShape { 3, 3 };
22     std::vector<int32_t> outputShape { 7, 7 };
23     std::vector<int32_t> paddingShape { 2, 2 };
24 
25     std::vector<float> inputValues =
26     {
27         1.0f, 2.0f, 3.0f,
28         4.0f, 5.0f, 6.0f,
29         7.0f, 8.0f, 9.0f
30     };
31 
32     std::vector<float> expectedOutputValues =
33     {
34         5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f,
35         2.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 2.0f,
36         2.0f, 1.0f, 1.0f, 2.0f, 3.0f, 3.0f, 2.0f,
37         5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f,
38         8.0f, 7.0f, 7.0f, 8.0f, 9.0f, 9.0f, 8.0f,
39         8.0f, 7.0f, 7.0f, 8.0f, 9.0f, 9.0f, 8.0f,
40         5.0f, 4.0f, 4.0f, 5.0f, 6.0f, 6.0f, 5.0f
41     };
42 
43     std::vector<int32_t> paddingDim = { 2, 2, 2, 2 };
44 
45     PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
46                    ::tflite::TensorType_FLOAT32,
47                    backends,
48                    inputShape,
49                    paddingShape,
50                    outputShape,
51                    inputValues,
52                    paddingDim,
53                    expectedOutputValues,
54                    0,    // Padding value - Not used in these tests.
55                    1.0f, // Scale
56                    0,    // Offset
57                    tflite::MirrorPadMode_SYMMETRIC);
58 }
59 
MirrorPadReflect2dTest(std::vector<armnn::BackendId> & backends)60 void MirrorPadReflect2dTest(std::vector<armnn::BackendId>& backends)
61 {
62     // Set input data
63     std::vector<int32_t> inputShape { 3, 3 };
64     std::vector<int32_t> outputShape { 7, 7 };
65     std::vector<int32_t> paddingShape { 2, 2 };
66 
67     std::vector<float> inputValues =
68     {
69         1.0f, 2.0f, 3.0f,
70         4.0f, 5.0f, 6.0f,
71         7.0f, 8.0f, 9.0f
72     };
73 
74     std::vector<float> expectedOutputValues =
75     {
76         9.0f, 8.0f, 7.0f, 8.0f, 9.0f, 8.0f, 7.0f,
77         6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
78         3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 2.0f, 1.0f,
79         6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
80         9.0f, 8.0f, 7.0f, 8.0f, 9.0f, 8.0f, 7.0f,
81         6.0f, 5.0f, 4.0f, 5.0f, 6.0f, 5.0f, 4.0f,
82         3.0f, 2.0f, 1.0f, 2.0f, 3.0f, 2.0f, 1.0f
83     };
84 
85     std::vector<int32_t> paddingDim = { 2, 2, 2, 2 };
86 
87     PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
88                    ::tflite::TensorType_FLOAT32,
89                    backends,
90                    inputShape,
91                    paddingShape,
92                    outputShape,
93                    inputValues,
94                    paddingDim,
95                    expectedOutputValues,
96                    0,    // Padding value - Not used in these tests.
97                    1.0f, // Scale
98                    0,    // Offset
99                    tflite::MirrorPadMode_REFLECT);
100 }
101 
MirrorPadSymmetric3dTest(std::vector<armnn::BackendId> & backends)102 void MirrorPadSymmetric3dTest(std::vector<armnn::BackendId>& backends)
103 {
104     // Set input data
105     std::vector<int32_t> inputShape { 2, 2, 2 };
106     std::vector<int32_t> outputShape { 4, 4, 4 };
107     std::vector<int32_t> paddingShape { 3, 2 };
108 
109     std::vector<float> inputValues =
110     {
111         // Channel 0, Height (2) x Width (2)
112         1.0f, 2.0f,
113         3.0f, 4.0f,
114 
115         // Channel 1, Height (2) x Width (2)
116         5.0f, 6.0f,
117         7.0f, 8.0f
118     };
119 
120     std::vector<float> expectedOutputValues =
121     {
122         1.0f, 1.0f, 2.0f, 2.0f,
123         1.0f, 1.0f, 2.0f, 2.0f,
124         3.0f, 3.0f, 4.0f, 4.0f,
125         3.0f, 3.0f, 4.0f, 4.0f,
126 
127         1.0f, 1.0f, 2.0f, 2.0f,
128         1.0f, 1.0f, 2.0f, 2.0f,
129         3.0f, 3.0f, 4.0f, 4.0f,
130         3.0f, 3.0f, 4.0f, 4.0f,
131 
132         5.0f, 5.0f, 6.0f, 6.0f,
133         5.0f, 5.0f, 6.0f, 6.0f,
134         7.0f, 7.0f, 8.0f, 8.0f,
135         7.0f, 7.0f, 8.0f, 8.0f,
136 
137         5.0f, 5.0f, 6.0f, 6.0f,
138         5.0f, 5.0f, 6.0f, 6.0f,
139         7.0f, 7.0f, 8.0f, 8.0f,
140         7.0f, 7.0f, 8.0f, 8.0f
141     };
142 
143     std::vector<int32_t> paddingDim = { 1, 1, 1, 1, 1, 1 };
144 
145     PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
146                    ::tflite::TensorType_FLOAT32,
147                    backends,
148                    inputShape,
149                    paddingShape,
150                    outputShape,
151                    inputValues,
152                    paddingDim,
153                    expectedOutputValues,
154                    0,    // Padding value - Not used in these tests.
155                    1.0f, // Scale
156                    0,    // Offset
157                    tflite::MirrorPadMode_SYMMETRIC);
158 }
159 
MirrorPadReflect3dTest(std::vector<armnn::BackendId> & backends)160 void MirrorPadReflect3dTest(std::vector<armnn::BackendId>& backends)
161 {
162     // Set input data
163     std::vector<int32_t> inputShape { 2, 2, 2 };
164     std::vector<int32_t> outputShape { 4, 4, 4 };
165     std::vector<int32_t> paddingShape { 3, 2 };
166 
167     std::vector<float> inputValues =
168     {
169         // Channel 0, Height (2) x Width (2)
170         1.0f, 2.0f,
171         3.0f, 4.0f,
172 
173         // Channel 1, Height (2) x Width (2)
174         5.0f, 6.0f,
175         7.0f, 8.0f
176     };
177 
178     std::vector<float> expectedOutputValues =
179     {
180         8.0f, 7.0f, 8.0f, 7.0f,
181         6.0f, 5.0f, 6.0f, 5.0f,
182         8.0f, 7.0f, 8.0f, 7.0f,
183         6.0f, 5.0f, 6.0f, 5.0f,
184 
185         4.0f, 3.0f, 4.0f, 3.0f,
186         2.0f, 1.0f, 2.0f, 1.0f,
187         4.0f, 3.0f, 4.0f, 3.0f,
188         2.0f, 1.0f, 2.0f, 1.0f,
189 
190         8.0f, 7.0f, 8.0f, 7.0f,
191         6.0f, 5.0f, 6.0f, 5.0f,
192         8.0f, 7.0f, 8.0f, 7.0f,
193         6.0f, 5.0f, 6.0f, 5.0f,
194 
195         4.0f, 3.0f, 4.0f, 3.0f,
196         2.0f, 1.0f, 2.0f, 1.0f,
197         4.0f, 3.0f, 4.0f, 3.0f,
198         2.0f, 1.0f, 2.0f, 1.0f
199     };
200 
201     std::vector<int32_t> paddingDim = { 1, 1, 1, 1, 1, 1 };
202 
203     PadTest<float>(tflite::BuiltinOperator_MIRROR_PAD,
204                    ::tflite::TensorType_FLOAT32,
205                    backends,
206                    inputShape,
207                    paddingShape,
208                    outputShape,
209                    inputValues,
210                    paddingDim,
211                    expectedOutputValues,
212                    0,    // Padding value - Not used in these tests.
213                    1.0f, // Scale
214                    0,    // Offset
215                    tflite::MirrorPadMode_REFLECT);
216 }
217 
MirrorPadSymmetricUint8Test(std::vector<armnn::BackendId> & backends)218 void MirrorPadSymmetricUint8Test(std::vector<armnn::BackendId>& backends)
219 {
220     // Set input data
221     std::vector<int32_t> inputShape { 3, 3 };
222     std::vector<int32_t> outputShape { 5, 7 };
223     std::vector<int32_t> paddingShape { 2, 2 };
224 
225     std::vector<uint8_t> inputValues =
226     {
227         1, 2, 3,
228         4, 5, 6,
229         7, 8, 9
230     };
231 
232     std::vector<uint8_t> expectedOutputValues =
233     {
234         2, 1, 1, 2, 3, 3, 2,
235         2, 1, 1, 2, 3, 3, 2,
236         5, 4, 4, 5, 6, 6, 5,
237         8, 7, 7, 8, 9, 9, 8,
238         8, 7, 7, 8, 9, 9, 8,
239     };
240 
241     std::vector<int32_t> paddingDim = { 1, 1, 2, 2 };
242 
243     PadTest<uint8_t>(tflite::BuiltinOperator_MIRROR_PAD,
244                      ::tflite::TensorType_UINT8,
245                      backends,
246                      inputShape,
247                      paddingShape,
248                      outputShape,
249                      inputValues,
250                      paddingDim,
251                      expectedOutputValues,
252                      0,    // Padding value - Not used in these tests.
253                      1.0f, // Scale
254                      1,    // Offset
255                      tflite::MirrorPadMode_SYMMETRIC);
256 }
257 
MirrorPadReflectInt8Test(std::vector<armnn::BackendId> & backends)258 void MirrorPadReflectInt8Test(std::vector<armnn::BackendId>& backends)
259 {
260     // Set input data
261     std::vector<int32_t> inputShape { 3, 3 };
262     std::vector<int32_t> outputShape { 7, 5 };
263     std::vector<int32_t> paddingShape { 2, 2 };
264 
265     std::vector<int8_t> inputValues =
266     {
267         1, 2, 3,
268         4, 5, 6,
269         7, 8, 9
270     };
271 
272     std::vector<int8_t> expectedOutputValues =
273     {
274         8, 7, 8, 9, 8,
275         5, 4, 5, 6, 5,
276         2, 1, 2, 3, 2,
277         5, 4, 5, 6, 5,
278         8, 7, 8, 9, 8,
279         5, 4, 5, 6, 5,
280         2, 1, 2, 3, 2
281     };
282 
283     std::vector<int32_t> paddingDim = { 2, 2, 1, 1 };
284 
285     PadTest<int8_t>(tflite::BuiltinOperator_MIRROR_PAD,
286                     ::tflite::TensorType_INT8,
287                     backends,
288                     inputShape,
289                     paddingShape,
290                     outputShape,
291                     inputValues,
292                     paddingDim,
293                     expectedOutputValues,
294                     0,    // Padding value - Not used in these tests.
295                     1.0f, // Scale
296                     1,    // Offset
297                     tflite::MirrorPadMode_REFLECT);
298 }
299 
300 TEST_SUITE("MirrorPad_CpuRefTests")
301 {
302 
303 TEST_CASE ("MirrorPadSymmetric2d_CpuRef_Test")
304 {
305     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
306     MirrorPadSymmetric2dTest(backends);
307 }
308 
309 TEST_CASE ("MirrorPadReflect2d_CpuRef_Test")
310 {
311     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
312     MirrorPadReflect2dTest(backends);
313 }
314 
315 TEST_CASE ("MirrorPadSymmetric3d_CpuRef_Test")
316 {
317     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
318     MirrorPadSymmetric3dTest(backends);
319 }
320 
321 TEST_CASE ("MirrorPadReflect3d_CpuRef_Test")
322 {
323     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
324     MirrorPadReflect3dTest(backends);
325 }
326 
327 TEST_CASE ("MirrorPadSymmetricUint8_CpuRef_Test")
328 {
329     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
330     MirrorPadSymmetricUint8Test(backends);
331 }
332 
333 TEST_CASE ("MirrorPadSymmetricInt8_CpuRef_Test")
334 {
335     std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
336     MirrorPadReflectInt8Test(backends);
337 }
338 
339 } // TEST_SUITE("MirrorPad_CpuRefTests")
340 
341 } // namespace armnnDelegate