blob: be54ede7a3e5e1ce4e94ed9ba3ec8bf40cfef10b [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>
Teresa Charlinad1b3d72023-03-14 12:10:28 +000011#include <schema_generated.h>
Narumol Prangnawarat958024b2020-12-17 12:17:58 +000012
13#include <doctest/doctest.h>
14
15namespace armnnDelegate
16{
17
18void Pad2dTest(std::vector<armnn::BackendId>& backends,
19 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
20 float pad = 0.0f)
21{
22 // Set input data
23 std::vector<int32_t> inputShape { 2, 2, 2 };
24 std::vector<int32_t> outputShape { 3, 5, 6 };
25 std::vector<int32_t> paddingShape { 3, 2 };
26
27 std::vector<float> inputValues = { 0.0f, 4.0f,
28 2.0f, -5.0f,
29 6.0f, 1.0f,
30 5.0f, -2.0f };
31
32 std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad,
33 pad, pad, pad, pad, pad, pad,
34 pad, pad, 0.0f, 4.0f, pad, pad,
35 pad, pad, 2.0f, -5.0f, pad, pad,
36 pad, pad, pad, pad, pad, pad,
37
38 pad, pad, pad, pad, pad, pad,
39 pad, pad, pad, pad, pad, pad,
40 pad, pad, 6.0f, 1.0f, pad, pad,
41 pad, pad, 5.0f, -2.0f, pad, pad,
42 pad, pad, pad, pad, pad, pad,
43
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 pad, pad, pad, pad, pad, pad };
49
50 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
51
52 PadTest<float>(padOperatorCode,
53 ::tflite::TensorType_FLOAT32,
54 backends,
55 inputShape,
56 paddingShape,
57 outputShape,
58 inputValues,
59 paddingDim,
60 expectedOutputValues,
61 pad);
62}
63
64void Pad3dTest(std::vector<armnn::BackendId>& backends,
65 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
66 float pad = 0.0f)
67{
68 // Set input data
69 std::vector<int32_t> inputShape { 2, 2, 2 };
70 std::vector<int32_t> outputShape { 3, 5, 6 };
71 std::vector<int32_t> paddingShape { 3, 2 };
72
73 std::vector<float> inputValues = { 0.0f, 4.0f,
74 2.0f, 5.0f,
75 6.0f, 1.0f,
76 5.0f, 2.0f };
77
78 std::vector<float> expectedOutputValues = { pad, pad, pad, pad, pad, pad,
79 pad, pad, pad, pad, pad, pad,
80 pad, pad, 0.0f, 4.0f, pad, pad,
81 pad, pad, 2.0f, 5.0f, pad, pad,
82 pad, pad, pad, pad, pad, pad,
83
84 pad, pad, pad, pad, pad, pad,
85 pad, pad, pad, pad, pad, pad,
86 pad, pad, 6.0f, 1.0f, pad, pad,
87 pad, pad, 5.0f, 2.0f, pad, pad,
88 pad, pad, pad, pad, pad, pad,
89
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 pad, pad, pad, pad, pad, pad };
95
96 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
97
98 PadTest<float>(padOperatorCode,
99 ::tflite::TensorType_FLOAT32,
100 backends,
101 inputShape,
102 paddingShape,
103 outputShape,
104 inputValues,
105 paddingDim,
106 expectedOutputValues,
107 pad);
108}
109
110void Pad4dTest(std::vector<armnn::BackendId>& backends,
111 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
112 float pad = 0.0f)
113{
114 // Set input data
115 std::vector<int32_t> inputShape { 2, 2, 3, 2 };
116 std::vector<int32_t> outputShape { 4, 5, 7, 4 };
117 std::vector<int32_t> paddingShape { 4, 2 };
118
119 std::vector<float> inputValues = { 0.0f, 1.0f,
120 2.0f, 3.0f,
121 4.0f, 5.0f,
122
123 6.0f, 7.0f,
124 8.0f, 9.0f,
125 10.0f, 11.0f,
126
127 12.0f, 13.0f,
128 14.0f, 15.0f,
129 16.0f, 17.0f,
130
131 18.0f, 19.0f,
132 20.0f, 21.0f,
133 22.0f, 23.0f };
134
135 std::vector<float> expectedOutputValues = { 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 pad, pad, pad, pad,
142
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 pad, pad, pad, pad,
150
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 pad, pad, pad, pad,
158
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 pad, pad, pad, pad,
166
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 pad, pad, pad, pad,
174
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 pad, pad, pad, pad,
182
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 pad, pad, pad, pad,
190
191 pad, pad, pad, pad,
192 pad, pad, pad, pad,
193 pad, pad, pad, pad,
194 pad, 0.0f, 1.0f, pad,
195 pad, 2.0f, 3.0f, pad,
196 pad, 4.0f, 5.0f, pad,
197 pad, pad, pad, pad,
198
199 pad, pad, pad, pad,
200 pad, pad, pad, pad,
201 pad, pad, pad, pad,
202 pad, 6.0f, 7.0f, pad,
203 pad, 8.0f, 9.0f, pad,
204 pad, 10.0f, 11.0f, pad,
205 pad, pad, pad, pad,
206
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 pad, pad, pad, pad,
214
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 pad, pad, pad, pad,
222
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 pad, pad, pad, pad,
230
231 pad, pad, pad, pad,
232 pad, pad, pad, pad,
233 pad, pad, pad, pad,
234 pad, 12.0f, 13.0f, pad,
235 pad, 14.0f, 15.0f, pad,
236 pad, 16.0f, 17.0f, pad,
237 pad, pad, pad, pad,
238
239 pad, pad, pad, pad,
240 pad, pad, pad, pad,
241 pad, pad, pad, pad,
242 pad, 18.0f, 19.0f, pad,
243 pad, 20.0f, 21.0f, pad,
244 pad, 22.0f, 23.0f, pad,
245 pad, pad, pad, pad,
246
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 pad, pad, pad, pad,
254
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 pad, pad, pad, pad,
262
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 pad, pad, pad, pad,
270
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 pad, pad, pad, pad,
278
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 pad, pad, pad, pad,
286
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 pad, pad, pad, pad };
294
295 std::vector<int32_t> paddingDim = { 1, 1, 2, 1, 3, 1, 1, 1 };
296
297 PadTest<float>(padOperatorCode,
298 ::tflite::TensorType_FLOAT32,
299 backends,
300 inputShape,
301 paddingShape,
302 outputShape,
303 inputValues,
304 paddingDim,
305 expectedOutputValues,
306 pad);
307}
308
309void PadInt8Test(std::vector<armnn::BackendId>& backends,
310 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
311 int8_t paddingValue = 0,
312 int8_t p = 3,
313 float quantizationScale = -2.0f,
314 int32_t quantizationOffset = 3)
315{
316 // Set input data
317 std::vector<int32_t> inputShape { 2, 2, 2 };
318 std::vector<int32_t> outputShape { 3, 5, 6 };
319 std::vector<int32_t> paddingShape { 3, 2 };
320
321 std::vector<int8_t> inputValues = { 0, 4,
322 2, -5,
323 6, 1,
324 5, -2 };
325
326 std::vector<int8_t> expectedOutputValues = { p, p, p, p, p, p,
327 p, p, p, p, p, p,
328 p, p, 0, 4, p, p,
329 p, p, 2, -5, p, p,
330 p, p, p, p, p, p,
331
332 p, p, p, p, p, p,
333 p, p, p, p, p, p,
334 p, p, 6, 1, p, p,
335 p, p, 5, -2, p, p,
336 p, p, p, p, p, p,
337
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 p, p, p, p, p, p };
343
344 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
345
346 PadTest<int8_t>(padOperatorCode,
347 ::tflite::TensorType_INT8,
348 backends,
349 inputShape,
350 paddingShape,
351 outputShape,
352 inputValues,
353 paddingDim,
354 expectedOutputValues,
355 paddingValue,
356 quantizationScale,
357 quantizationOffset);
358}
359
360void PadUint8Test(std::vector<armnn::BackendId>& backends,
361 tflite::BuiltinOperator padOperatorCode = tflite::BuiltinOperator_PAD,
362 uint8_t paddingValue = 0,
363 uint8_t p = 3,
364 float quantizationScale = -2.0f,
365 int32_t quantizationOffset = 3)
366{
367 // Set input data
368 std::vector<int32_t> inputShape { 2, 2, 2 };
369 std::vector<int32_t> outputShape { 3, 5, 6 };
370 std::vector<int32_t> paddingShape { 3, 2 };
371
372 std::vector<uint8_t> inputValues = { 0, 4,
373 2, 5,
374 6, 1,
375 5, 2 };
376
377 std::vector<uint8_t> expectedOutputValues = { p, p, p, p, p, p,
378 p, p, p, p, p, p,
379 p, p, 0, 4, p, p,
380 p, p, 2, 5, p, p,
381 p, p, p, p, p, p,
382
383 p, p, p, p, p, p,
384 p, p, p, p, p, p,
385 p, p, 6, 1, p, p,
386 p, p, 5, 2, p, p,
387 p, p, p, p, p, p,
388
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 p, p, p, p, p, p };
394
395 std::vector<int32_t> paddingDim = { 0, 1, 2, 1, 2, 2 };
396
397 PadTest<uint8_t>(padOperatorCode,
398 ::tflite::TensorType_UINT8,
399 backends,
400 inputShape,
401 paddingShape,
402 outputShape,
403 inputValues,
404 paddingDim,
405 expectedOutputValues,
406 paddingValue,
407 quantizationScale,
408 quantizationOffset);
409}
410
411TEST_SUITE("Pad_CpuRefTests")
412{
413
414TEST_CASE ("Pad2d_CpuRef_Test")
415{
416 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
417 Pad2dTest(backends);
418}
419
420TEST_CASE ("Pad3d_CpuRef_Test")
421{
422 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
423 Pad3dTest(backends);
424}
425
426TEST_CASE ("Pad4d_CpuRef_Test")
427{
428 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
429 Pad4dTest(backends);
430}
431
432TEST_CASE ("Pad_Int8_CpuRef_Test")
433{
434 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
435 PadInt8Test(backends);
436}
437
438TEST_CASE ("Pad_Uint8_CpuRef_Test")
439{
440 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
441 PadUint8Test(backends);
442}
443
444TEST_CASE ("PadV22d_CpuRef_Test")
445{
446 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
447 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
448}
449
450TEST_CASE ("PadV23d_CpuRef_Test")
451{
452 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
453 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
454}
455
456TEST_CASE ("PadV24d_CpuRef_Test")
457{
458 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
459 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
460}
461
462TEST_CASE ("PadV2_Int8_CpuRef_Test")
463{
464 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
465 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
466}
467
468TEST_CASE ("PadV2_Uint8_CpuRef_Test")
469{
470 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuRef };
471 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
472}
473
474} // TEST_SUITE("Pad_CpuRefTests")
475
476TEST_SUITE("Pad_CpuAccTests")
477{
478
479TEST_CASE ("Pad2d_CpuAcc_Test")
480{
481 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
482 Pad2dTest(backends);
483}
484
485TEST_CASE ("Pad3d_CpuAcc_Test")
486{
487 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
488 Pad3dTest(backends);
489}
490
491TEST_CASE ("Pad4d_CpuAcc_Test")
492{
493 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
494 Pad4dTest(backends);
495}
496
497TEST_CASE ("Pad_Int8_CpuAcc_Test")
498{
499 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
500 PadInt8Test(backends);
501}
502
503TEST_CASE ("Pad_Uint8_CpuAcc_Test")
504{
505 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
506 PadUint8Test(backends);
507}
508
509TEST_CASE ("PadV22d_CpuAcc_Test")
510{
511 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
512 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
513}
514
515TEST_CASE ("PadV23d_CpuAcc_Test")
516{
517 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
518 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
519}
520
521TEST_CASE ("PadV24d_CpuAcc_Test")
522{
523 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
524 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
525}
526
527TEST_CASE ("PadV2_Int8_CpuAcc_Test")
528{
529 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
530 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
531}
532
533TEST_CASE ("PadV2_Uint8_CpuAcc_Test")
534{
535 std::vector<armnn::BackendId> backends = { armnn::Compute::CpuAcc };
536 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
537}
538
539} // TEST_SUITE("Pad_CpuAccTests")
540
541TEST_SUITE("Pad_GpuAccTests")
542{
543
544TEST_CASE ("Pad2d_GpuAcc_Test")
545{
546 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
547 Pad2dTest(backends);
548}
549
550TEST_CASE ("Pad3d_GpuAcc_Test")
551{
552 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
553 Pad3dTest(backends);
554}
555
556TEST_CASE ("Pad4d_GpuAcc_Test")
557{
558 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
559 Pad4dTest(backends);
560}
561
562TEST_CASE ("Pad_Int8_GpuAcc_Test")
563{
564 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
565 PadInt8Test(backends);
566}
567
568TEST_CASE ("Pad_Uint8_GpuAcc_Test")
569{
570 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
571 PadUint8Test(backends);
572}
573
574TEST_CASE ("PadV22d_GpuAcc_Test")
575{
576 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
577 Pad2dTest(backends, tflite::BuiltinOperator_PADV2, -2.5);
578}
579
580TEST_CASE ("PadV23d_GpuAcc_Test")
581{
582 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
583 Pad3dTest(backends, tflite::BuiltinOperator_PADV2, 2.0);
584}
585
586TEST_CASE ("PadV24d_GpuAcc_Test")
587{
588 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
589 Pad4dTest(backends, tflite::BuiltinOperator_PADV2, -1.33);
590}
591
592TEST_CASE ("PadV2_Int8_GpuAcc_Test")
593{
594 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
595 PadInt8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
596}
597
598TEST_CASE ("PadV2_Uint8_GpuAcc_Test")
599{
600 std::vector<armnn::BackendId> backends = { armnn::Compute::GpuAcc };
601 PadUint8Test(backends, tflite::BuiltinOperator_PADV2, -1, -1);
602}
603
604} // TEST_SUITE("Pad_GpuAccTests")
605
606} // namespace armnnDelegate