blob: 17fabe65e80025311d073f383e655fe9f949d572 [file] [log] [blame]
Narumol Prangnawarat958024b2020-12-17 12:17:58 +00001//
Teresa Charlinad1b3d72023-03-14 12:10:28 +00002// Copyright © 2020, 2023 Arm Ltd and Contributors. All rights reserved.
Narumol Prangnawarat958024b2020-12-17 12:17:58 +00003// SPDX-License-Identifier: MIT
4//
5
6#include "PadTestHelper.hpp"
7
8#include <armnn_delegate.hpp>
9
10#include <flatbuffers/flatbuffers.h>
Narumol Prangnawarat958024b2020-12-17 12:17:58 +000011
12#include <doctest/doctest.h>
13
14namespace armnnDelegate
15{
16
17void Pad2dTest(std::vector<armnn::BackendId>& backends,
18 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
19 float pad = 0.0f)
20{
21 // Set input data
22 std::vector<int32_t> inputShape { 2, 2, 2 };
23 std::vector<int32_t> outputShape { 3, 5, 6 };
24 std::vector<int32_t> paddingShape { 3, 2 };
25
26 std::vector<float> inputValues = { 0.0f, 4.0f,
27 2.0f, -5.0f,
28 6.0f, 1.0f,
29 5.0f, -2.0f };
30
31 std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad,
32 pad, pad, pad, pad, pad, pad,
33 pad, pad, 0.0f, 4.0f, pad, pad,
34 pad, pad, 2.0f, -5.0f, pad, pad,
35 pad, pad, pad, pad, pad, pad,
36
37 pad, pad, pad, pad, pad, pad,
38 pad, pad, pad, pad, pad, pad,
39 pad, pad, 6.0f, 1.0f, pad, pad,
40 pad, pad, 5.0f, -2.0f, pad, pad,
41 pad, pad, pad, pad, pad, pad,
42
43 pad, pad, pad, pad, pad, pad,
44 pad, pad, pad, pad, pad, pad,
45 pad, pad, pad, pad, pad, pad,
46 pad, pad, pad, pad, pad, pad,
47 pad, pad, pad, pad, pad, pad };
48
49 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
50
51 PadTest<float>(padOperatorCode,
52 ::tflite::TensorType_FLOAT32,
53 backends,
54 inputShape,
55 paddingShape,
56 outputShape,
57 inputValues,
58 paddingDim,
59 expectedOutputValues,
60 pad);
61}
62
63void Pad3dTest(std::vector<armnn::BackendId>& backends,
64 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
65 float pad = 0.0f)
66{
67 // Set input data
68 std::vector<int32_t> inputShape { 2, 2, 2 };
69 std::vector<int32_t> outputShape { 3, 5, 6 };
70 std::vector<int32_t> paddingShape { 3, 2 };
71
72 std::vector<float> inputValues = { 0.0f, 4.0f,
73 2.0f, 5.0f,
74 6.0f, 1.0f,
75 5.0f, 2.0f };
76
77 std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad,
78 pad, pad, pad, pad, pad, pad,
79 pad, pad, 0.0f, 4.0f, pad, pad,
80 pad, pad, 2.0f, 5.0f, pad, pad,
81 pad, pad, pad, pad, pad, pad,
82
83 pad, pad, pad, pad, pad, pad,
84 pad, pad, pad, pad, pad, pad,
85 pad, pad, 6.0f, 1.0f, pad, pad,
86 pad, pad, 5.0f, 2.0f, pad, pad,
87 pad, pad, pad, pad, pad, pad,
88
89 pad, pad, pad, pad, pad, pad,
90 pad, pad, pad, pad, pad, pad,
91 pad, pad, pad, pad, pad, pad,
92 pad, pad, pad, pad, pad, pad,
93 pad, pad, pad, pad, pad, pad };
94
95 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
96
97 PadTest<float>(padOperatorCode,
98 ::tflite::TensorType_FLOAT32,
99 backends,
100 inputShape,
101 paddingShape,
102 outputShape,
103 inputValues,
104 paddingDim,
105 expectedOutputValues,
106 pad);
107}
108
109void Pad4dTest(std::vector<armnn::BackendId>& backends,
110 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
111 float pad = 0.0f)
112{
113 // Set input data
114 std::vector<int32_t> inputShape { 2, 2, 3, 2 };
115 std::vector<int32_t> outputShape { 4, 5, 7, 4 };
116 std::vector<int32_t> paddingShape { 4, 2 };
117
118 std::vector<float> inputValues = { 0.0f, 1.0f,
119 2.0f, 3.0f,
120 4.0f, 5.0f,
121
122 6.0f, 7.0f,
123 8.0f, 9.0f,
124 10.0f, 11.0f,
125
126 12.0f, 13.0f,
127 14.0f, 15.0f,
128 16.0f, 17.0f,
129
130 18.0f, 19.0f,
131 20.0f, 21.0f,
132 22.0f, 23.0f };
133
134 std::vector<float> expectedOutputValues = { pad, pad, pad, pad,
135 pad, pad, pad, pad,
136 pad, pad, pad, pad,
137 pad, pad, pad, pad,
138 pad, pad, pad, pad,
139 pad, pad, pad, pad,
140 pad, pad, pad, pad,
141
142 pad, pad, pad, pad,
143 pad, pad, pad, pad,
144 pad, pad, pad, pad,
145 pad, pad, pad, pad,
146 pad, pad, pad, pad,
147 pad, pad, pad, pad,
148 pad, pad, pad, pad,
149
150 pad, pad, pad, pad,
151 pad, pad, pad, pad,
152 pad, pad, pad, pad,
153 pad, pad, pad, pad,
154 pad, pad, pad, pad,
155 pad, pad, pad, pad,
156 pad, pad, pad, pad,
157
158 pad, pad, pad, pad,
159 pad, pad, pad, pad,
160 pad, pad, pad, pad,
161 pad, pad, pad, pad,
162 pad, pad, pad, pad,
163 pad, pad, pad, pad,
164 pad, pad, pad, pad,
165
166 pad, pad, pad, pad,
167 pad, pad, pad, pad,
168 pad, pad, pad, pad,
169 pad, pad, pad, pad,
170 pad, pad, pad, pad,
171 pad, pad, pad, pad,
172 pad, pad, pad, pad,
173
174 pad, pad, pad, pad,
175 pad, pad, pad, pad,
176 pad, pad, pad, pad,
177 pad, pad, pad, pad,
178 pad, pad, pad, pad,
179 pad, pad, pad, pad,
180 pad, pad, pad, pad,
181
182 pad, pad, pad, pad,
183 pad, pad, pad, pad,
184 pad, pad, pad, pad,
185 pad, pad, pad, pad,
186 pad, pad, pad, pad,
187 pad, pad, pad, pad,
188 pad, pad, pad, pad,
189
190 pad, pad, pad, pad,
191 pad, pad, pad, pad,
192 pad, pad, pad, pad,
193 pad, 0.0f, 1.0f, pad,
194 pad, 2.0f, 3.0f, pad,
195 pad, 4.0f, 5.0f, pad,
196 pad, pad, pad, pad,
197
198 pad, pad, pad, pad,
199 pad, pad, pad, pad,
200 pad, pad, pad, pad,
201 pad, 6.0f, 7.0f, pad,
202 pad, 8.0f, 9.0f, pad,
203 pad, 10.0f, 11.0f, pad,
204 pad, pad, pad, pad,
205
206 pad, pad, pad, pad,
207 pad, pad, pad, pad,
208 pad, pad, pad, pad,
209 pad, pad, pad, pad,
210 pad, pad, pad, pad,
211 pad, pad, pad, pad,
212 pad, pad, pad, pad,
213
214 pad, pad, pad, pad,
215 pad, pad, pad, pad,
216 pad, pad, pad, pad,
217 pad, pad, pad, pad,
218 pad, pad, pad, pad,
219 pad, pad, pad, pad,
220 pad, pad, pad, pad,
221
222 pad, pad, pad, pad,
223 pad, pad, pad, pad,
224 pad, pad, pad, pad,
225 pad, pad, pad, pad,
226 pad, pad, pad, pad,
227 pad, pad, pad, pad,
228 pad, pad, pad, pad,
229
230 pad, pad, pad, pad,
231 pad, pad, pad, pad,
232 pad, pad, pad, pad,
233 pad, 12.0f, 13.0f, pad,
234 pad, 14.0f, 15.0f, pad,
235 pad, 16.0f, 17.0f, pad,
236 pad, pad, pad, pad,
237
238 pad, pad, pad, pad,
239 pad, pad, pad, pad,
240 pad, pad, pad, pad,
241 pad, 18.0f, 19.0f, pad,
242 pad, 20.0f, 21.0f, pad,
243 pad, 22.0f, 23.0f, pad,
244 pad, pad, pad, pad,
245
246 pad, pad, pad, pad,
247 pad, pad, pad, pad,
248 pad, pad, pad, pad,
249 pad, pad, pad, pad,
250 pad, pad, pad, pad,
251 pad, pad, pad, pad,
252 pad, pad, pad, pad,
253
254 pad, pad, pad, pad,
255 pad, pad, pad, pad,
256 pad, pad, pad, pad,
257 pad, pad, pad, pad,
258 pad, pad, pad, pad,
259 pad, pad, pad, pad,
260 pad, pad, pad, pad,
261
262 pad, pad, pad, pad,
263 pad, pad, pad, pad,
264 pad, pad, pad, pad,
265 pad, pad, pad, pad,
266 pad, pad, pad, pad,
267 pad, pad, pad, pad,
268 pad, pad, pad, pad,
269
270 pad, pad, pad, pad,
271 pad, pad, pad, pad,
272 pad, pad, pad, pad,
273 pad, pad, pad, pad,
274 pad, pad, pad, pad,
275 pad, pad, pad, pad,
276 pad, pad, pad, pad,
277
278 pad, pad, pad, pad,
279 pad, pad, pad, pad,
280 pad, pad, pad, pad,
281 pad, pad, pad, pad,
282 pad, pad, pad, pad,
283 pad, pad, pad, pad,
284 pad, pad, pad, pad,
285
286 pad, pad, pad, pad,
287 pad, pad, pad, pad,
288 pad, pad, pad, pad,
289 pad, pad, pad, pad,
290 pad, pad, pad, pad,
291 pad, pad, pad, pad,
292 pad, pad, pad, pad };
293
294 std::vector<int32_t> paddingDim = { 1, 1, 2, 1, 3, 1, 1, 1 };
295
296 PadTest<float>(padOperatorCode,
297 ::tflite::TensorType_FLOAT32,
298 backends,
299 inputShape,
300 paddingShape,
301 outputShape,
302 inputValues,
303 paddingDim,
304 expectedOutputValues,
305 pad);
306}
307
308void PadInt8Test(std::vector<armnn::BackendId>& backends,
309 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
310 int8_t paddingValue = 0,
311 int8_t p = 3,
312 float quantizationScale = -2.0f,
313 int32_t quantizationOffset = 3)
314{
315 // Set input data
316 std::vector<int32_t> inputShape { 2, 2, 2 };
317 std::vector<int32_t> outputShape { 3, 5, 6 };
318 std::vector<int32_t> paddingShape { 3, 2 };
319
320 std::vector<int8_t> inputValues = { 0, 4,
321 2, -5,
322 6, 1,
323 5, -2 };
324
325 std::vector<int8_t> expectedOutputValues = { p, p, p, p, p, p,
326 p, p, p, p, p, p,
327 p, p, 0, 4, p, p,
328 p, p, 2, -5, p, p,
329 p, p, p, p, p, p,
330
331 p, p, p, p, p, p,
332 p, p, p, p, p, p,
333 p, p, 6, 1, p, p,
334 p, p, 5, -2, p, p,
335 p, p, p, p, p, p,
336
337 p, p, p, p, p, p,
338 p, p, p, p, p, p,
339 p, p, p, p, p, p,
340 p, p, p, p, p, p,
341 p, p, p, p, p, p };
342
343 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
344
345 PadTest<int8_t>(padOperatorCode,
346 ::tflite::TensorType_INT8,
347 backends,
348 inputShape,
349 paddingShape,
350 outputShape,
351 inputValues,
352 paddingDim,
353 expectedOutputValues,
354 paddingValue,
355 quantizationScale,
356 quantizationOffset);
357}
358
359void PadUint8Test(std::vector<armnn::BackendId>& backends,
360 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
361 uint8_t paddingValue = 0,
362 uint8_t p = 3,
363 float quantizationScale = -2.0f,
364 int32_t quantizationOffset = 3)
365{
366 // Set input data
367 std::vector<int32_t> inputShape { 2, 2, 2 };
368 std::vector<int32_t> outputShape { 3, 5, 6 };
369 std::vector<int32_t> paddingShape { 3, 2 };
370
371 std::vector<uint8_t> inputValues = { 0, 4,
372 2, 5,
373 6, 1,
374 5, 2 };
375
376 std::vector<uint8_t> expectedOutputValues = { p, p, p, p, p, p,
377 p, p, p, p, p, p,
378 p, p, 0, 4, p, p,
379 p, p, 2, 5, p, p,
380 p, p, p, p, p, p,
381
382 p, p, p, p, p, p,
383 p, p, p, p, p, p,
384 p, p, 6, 1, p, p,
385 p, p, 5, 2, p, p,
386 p, p, p, p, p, p,
387
388 p, p, p, p, p, p,
389 p, p, p, p, p, p,
390 p, p, p, p, p, p,
391 p, p, p, p, p, p,
392 p, p, p, p, p, p };
393
394 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
395
396 PadTest<uint8_t>(padOperatorCode,
397 ::tflite::TensorType_UINT8,
398 backends,
399 inputShape,
400 paddingShape,
401 outputShape,
402 inputValues,
403 paddingDim,
404 expectedOutputValues,
405 paddingValue,
406 quantizationScale,
407 quantizationOffset);
408}
409
410TEST_SUITE("Pad_CpuRefTests")
411{
412
413TEST_CASE ("Pad2d_CpuRef_Test")
414{
415 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
416 Pad2dTest(backends);
417}
418
419TEST_CASE ("Pad3d_CpuRef_Test")
420{
421 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
422 Pad3dTest(backends);
423}
424
425TEST_CASE ("Pad4d_CpuRef_Test")
426{
427 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
428 Pad4dTest(backends);
429}
430
431TEST_CASE ("Pad_Int8_CpuRef_Test")
432{
433 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
434 PadInt8Test(backends);
435}
436
437TEST_CASE ("Pad_Uint8_CpuRef_Test")
438{
439 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
440 PadUint8Test(backends);
441}
442
443TEST_CASE ("PadV22d_CpuRef_Test")
444{
445 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
446 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
447}
448
449TEST_CASE ("PadV23d_CpuRef_Test")
450{
451 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
452 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
453}
454
455TEST_CASE ("PadV24d_CpuRef_Test")
456{
457 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
458 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
459}
460
461TEST_CASE ("PadV2_Int8_CpuRef_Test")
462{
463 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
464 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
465}
466
467TEST_CASE ("PadV2_Uint8_CpuRef_Test")
468{
469 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
470 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
471}
472
473} // TEST_SUITE("Pad_CpuRefTests")
474
475TEST_SUITE("Pad_CpuAccTests")
476{
477
478TEST_CASE ("Pad2d_CpuAcc_Test")
479{
480 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
481 Pad2dTest(backends);
482}
483
484TEST_CASE ("Pad3d_CpuAcc_Test")
485{
486 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
487 Pad3dTest(backends);
488}
489
490TEST_CASE ("Pad4d_CpuAcc_Test")
491{
492 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
493 Pad4dTest(backends);
494}
495
496TEST_CASE ("Pad_Int8_CpuAcc_Test")
497{
498 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
499 PadInt8Test(backends);
500}
501
502TEST_CASE ("Pad_Uint8_CpuAcc_Test")
503{
504 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
505 PadUint8Test(backends);
506}
507
508TEST_CASE ("PadV22d_CpuAcc_Test")
509{
510 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
511 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
512}
513
514TEST_CASE ("PadV23d_CpuAcc_Test")
515{
516 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
517 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
518}
519
520TEST_CASE ("PadV24d_CpuAcc_Test")
521{
522 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
523 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
524}
525
526TEST_CASE ("PadV2_Int8_CpuAcc_Test")
527{
528 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
529 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
530}
531
532TEST_CASE ("PadV2_Uint8_CpuAcc_Test")
533{
534 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
535 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
536}
537
538} // TEST_SUITE("Pad_CpuAccTests")
539
540TEST_SUITE("Pad_GpuAccTests")
541{
542
543TEST_CASE ("Pad2d_GpuAcc_Test")
544{
545 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
546 Pad2dTest(backends);
547}
548
549TEST_CASE ("Pad3d_GpuAcc_Test")
550{
551 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
552 Pad3dTest(backends);
553}
554
555TEST_CASE ("Pad4d_GpuAcc_Test")
556{
557 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
558 Pad4dTest(backends);
559}
560
561TEST_CASE ("Pad_Int8_GpuAcc_Test")
562{
563 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
564 PadInt8Test(backends);
565}
566
567TEST_CASE ("Pad_Uint8_GpuAcc_Test")
568{
569 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
570 PadUint8Test(backends);
571}
572
573TEST_CASE ("PadV22d_GpuAcc_Test")
574{
575 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
576 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
577}
578
579TEST_CASE ("PadV23d_GpuAcc_Test")
580{
581 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
582 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
583}
584
585TEST_CASE ("PadV24d_GpuAcc_Test")
586{
587 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
588 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
589}
590
591TEST_CASE ("PadV2_Int8_GpuAcc_Test")
592{
593 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
594 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
595}
596
597TEST_CASE ("PadV2_Uint8_GpuAcc_Test")
598{
599 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
600 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
601}
602
603} // TEST_SUITE("Pad_GpuAccTests")
604
605} // namespace armnnDelegate