blob: f2774037bd7817fe22392dcb39cdcc8600984071 [file] [log] [blame]
Tianle Cheng988354d2023-06-28 13:20:47 +01001//
2// Copyright © 2023 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "ReverseV2TestImpl.hpp"
7
8#include <armnn/backends/IBackendInternal.hpp>
9#include <armnn/backends/Workload.hpp>
10#include <armnn/backends/WorkloadData.hpp>
11#include <armnn/backends/WorkloadFactory.hpp>
12
13#include <armnnTestUtils/WorkloadTestUtils.hpp>
14#include <armnnUtils/QuantizeHelper.hpp>
15#include <armnnTestUtils/TensorCopyUtils.hpp>
16#include <armnn/Optional.hpp>
17#include <armnn/BackendHelper.hpp>
18
19namespace
20{
21 template<armnn::DataType ArmnnType, typename T, std::size_t NumDims>
22 LayerTestResult<T, NumDims> ReverseV2TestImpl(
23 armnn::IWorkloadFactory& workloadFactory,
24 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
25 const armnn::ITensorHandleFactory& tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +010026 const std::vector<T>& input,
Tracy Narinebb8d7592023-07-13 16:50:54 +010027 const std::vector<int>& axis,
Tianle Cheng988354d2023-06-28 13:20:47 +010028 const std::vector<T>& outputExpected,
29 const armnn::TensorInfo& inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +010030 const armnn::TensorInfo& axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +010031 const armnn::TensorInfo& outputInfo)
32 {
33 LayerTestResult<T, NumDims> result(outputInfo);
34 std::vector<T> outputActual(outputInfo.GetNumElements());
35
36 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
Tracy Narinebb8d7592023-07-13 16:50:54 +010037 std::unique_ptr<armnn::ITensorHandle> axisHandle = tensorHandleFactory.CreateTensorHandle(axisInfo);
Tianle Cheng988354d2023-06-28 13:20:47 +010038 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
39
40 armnn::ReverseV2QueueDescriptor queueDescriptor;
Tianle Cheng988354d2023-06-28 13:20:47 +010041 armnn::WorkloadInfo workloadInfo;
42
43 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
Tracy Narinebb8d7592023-07-13 16:50:54 +010044 AddInputToWorkload(queueDescriptor, workloadInfo, axisInfo, axisHandle.get());
Tianle Cheng988354d2023-06-28 13:20:47 +010045 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
46
47 // Don't execute if ReverseV2 is not supported, as an exception will be raised.
48 const armnn::BackendId& backend = workloadFactory.GetBackendId();
49 std::string reasonIfUnsupported;
50 armnn::LayerSupportHandle handle = armnn::GetILayerSupportByBackendId(backend);
51 result.m_Supported = handle.IsReverseV2Supported(inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +010052 axisInfo,
53 outputInfo,
54 reasonIfUnsupported);
Tianle Cheng988354d2023-06-28 13:20:47 +010055 if (!result.m_Supported)
56 {
57 return result;
58 }
59
60 auto workload = workloadFactory.CreateWorkload(armnn::LayerType::ReverseV2, queueDescriptor, workloadInfo);
61
62 inputHandle->Allocate();
Tracy Narinebb8d7592023-07-13 16:50:54 +010063 axisHandle->Allocate();
Tianle Cheng988354d2023-06-28 13:20:47 +010064 outputHandle->Allocate();
65
David Monahan6a1d5062023-08-29 09:10:50 +010066 if (input.data() != nullptr)
67 {
68 CopyDataToITensorHandle(inputHandle.get(), input.data());
69 }
70 if (axis.data() != nullptr)
71 {
72 CopyDataToITensorHandle(axisHandle.get(), axis.data());
73 }
Tianle Cheng988354d2023-06-28 13:20:47 +010074
75 workload->PostAllocationConfigure();
76 ExecuteWorkload(*workload, memoryManager);
77
David Monahan6a1d5062023-08-29 09:10:50 +010078 if (outputActual.data() != nullptr)
79 {
80 CopyDataFromITensorHandle(outputActual.data(), outputHandle.get());
81 }
Tianle Cheng988354d2023-06-28 13:20:47 +010082
83 return LayerTestResult<T, NumDims>(outputActual,
84 outputExpected,
85 outputHandle->GetShape(),
86 outputInfo.GetShape());
87 }
88}
89
90template<armnn::DataType ArmnnType, typename T>
91LayerTestResult<T, 2> ReverseV2SimpleTestEmptyAxis(
92 armnn::IWorkloadFactory& workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
94 const armnn::ITensorHandleFactory& tensorHandleFactory)
95{
Tracy Narinebb8d7592023-07-13 16:50:54 +010096 // Simple test with no axes set so output is the same as input
Tianle Cheng988354d2023-06-28 13:20:47 +010097
98 float qScale = 1.0f;
99 int32_t qOffset = 0;
100
101 armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100102 armnn::TensorInfo axisInfo({}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100103 armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset);
104
105 std::vector<T> input = armnnUtils::QuantizedVector<T>({
106 1, 2,
107 3, 4
108 }, qScale, qOffset);
109
David Monahan6a1d5062023-08-29 09:10:50 +0100110 std::vector<int> axis = armnnUtils::QuantizedVector<int>({1, 1}, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100111
Tianle Cheng988354d2023-06-28 13:20:47 +0100112 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
113 1, 2,
114 3, 4
115 }, qScale, qOffset);
116
117 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
118 memoryManager,
119 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100120 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100121 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100122 outputExpected,
123 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100124 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100125 outputInfo);
126}
127
128template<armnn::DataType ArmnnType, typename T>
129LayerTestResult<T, 2> ReverseV2SimpleTestEmptyTensor(
130 armnn::IWorkloadFactory& workloadFactory,
131 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
132 const armnn::ITensorHandleFactory& tensorHandleFactory)
133{
Tracy Narinebb8d7592023-07-13 16:50:54 +0100134 // Simple test with empty input tensor
Tianle Cheng988354d2023-06-28 13:20:47 +0100135
136 float qScale = 1.0f;
137 int32_t qOffset = 0;
138
139 armnn::TensorInfo inputInfo({0}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100140 armnn::TensorInfo axisInfo({0}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100141 armnn::TensorInfo outputInfo({0}, ArmnnType, qScale, qOffset);
142
143 std::vector<T> input = armnnUtils::QuantizedVector<T>({}, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100144 std::vector<int> axis = armnnUtils::QuantizedVector<int>({}, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100145 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({}, qScale, qOffset);
146
147 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
148 memoryManager,
149 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100150 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100151 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100152 outputExpected,
153 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100154 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100155 outputInfo);
156}
157
158template<armnn::DataType ArmnnType, typename T>
159LayerTestResult<T, 2> ReverseV2SimpleTest1Dim(
160 armnn::IWorkloadFactory& workloadFactory,
161 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
162 const armnn::ITensorHandleFactory& tensorHandleFactory)
163{
Tianle Cheng988354d2023-06-28 13:20:47 +0100164 float qScale = 1.0f;
165 int32_t qOffset = 0;
166
167 armnn::TensorInfo inputInfo({4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100168 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100169 armnn::TensorInfo outputInfo({4}, ArmnnType, qScale, qOffset);
170
171 std::vector<T> input = armnnUtils::QuantizedVector<T>({
172 1, 2,
173 3, 4
174 }, qScale, qOffset);
175
Tracy Narinebb8d7592023-07-13 16:50:54 +0100176 std::vector<int> axis = {0};
177
Tianle Cheng988354d2023-06-28 13:20:47 +0100178 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
179 4, 3,
180 2, 1
181 }, qScale, qOffset);
182
183 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
184 memoryManager,
185 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100186 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100187 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100188 outputExpected,
189 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100190 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100191 outputInfo);
192}
193
194template<armnn::DataType ArmnnType, typename T>
195LayerTestResult<T, 2> ReverseV2SimpleTest2Dim1Axis(
196 armnn::IWorkloadFactory& workloadFactory,
197 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
198 const armnn::ITensorHandleFactory& tensorHandleFactory)
199{
Tianle Cheng988354d2023-06-28 13:20:47 +0100200 float qScale = 1.0f;
201 int32_t qOffset = 0;
202
203 armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100204 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100205 armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset);
206
207 std::vector<T> input = armnnUtils::QuantizedVector<T>({
208 1, 2,
209 3, 4
210 }, qScale, qOffset);
211
Tracy Narinebb8d7592023-07-13 16:50:54 +0100212 std::vector<int> axis = {1};
213
Tianle Cheng988354d2023-06-28 13:20:47 +0100214 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
215 2, 1,
216 4, 3
217 }, qScale, qOffset);
218
219 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
220 memoryManager,
221 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100222 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100223 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100224 outputExpected,
225 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100226 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100227 outputInfo);
228}
229
230template<armnn::DataType ArmnnType, typename T>
231LayerTestResult<T, 2> ReverseV2SimpleTest2Dim2Axis(
232 armnn::IWorkloadFactory& workloadFactory,
233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
234 const armnn::ITensorHandleFactory& tensorHandleFactory)
235{
Tianle Cheng988354d2023-06-28 13:20:47 +0100236 float qScale = 1.0f;
237 int32_t qOffset = 0;
238
239 armnn::TensorInfo inputInfo({2,2}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100240 armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100241 armnn::TensorInfo outputInfo({2,2}, ArmnnType, qScale, qOffset);
242
243 std::vector<T> input = armnnUtils::QuantizedVector<T>({
244 1, 2,
245 3, 4
246 }, qScale, qOffset);
247
Tracy Narinebb8d7592023-07-13 16:50:54 +0100248 std::vector<int> axis = {1,0};
249
Tianle Cheng988354d2023-06-28 13:20:47 +0100250 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
251 4, 3,
252 2, 1
253 }, qScale, qOffset);
254
255 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
256 memoryManager,
257 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100258 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100259 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100260 outputExpected,
261 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100262 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100263 outputInfo);
264}
265
266template<armnn::DataType ArmnnType, typename T>
267LayerTestResult<T, 2> ReverseV2SimpleTest3Dim1Axis(
268 armnn::IWorkloadFactory& workloadFactory,
269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
270 const armnn::ITensorHandleFactory& tensorHandleFactory)
271{
Tianle Cheng988354d2023-06-28 13:20:47 +0100272 float qScale = 1.0f;
273 int32_t qOffset = 0;
274
275 armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100276 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100277 armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
278
279 std::vector<T> input = armnnUtils::QuantizedVector<T>({
280 1, 2, 3, 4,
281 5, 6, 7, 8,
282 9, 10, 11, 12,
283 13, 14, 15, 16,
284 17, 18, 19, 20,
285 21, 22, 23, 24
286 }, qScale, qOffset);
287
Tracy Narinebb8d7592023-07-13 16:50:54 +0100288 std::vector<int> axis = {1};
289
Tianle Cheng988354d2023-06-28 13:20:47 +0100290 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
291 9, 10, 11, 12,
292 5, 6, 7, 8,
293 1, 2, 3, 4,
294 21, 22, 23, 24,
295 17, 18, 19, 20,
296 13, 14, 15, 16
297 }, qScale, qOffset);
298
299 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
300 memoryManager,
301 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100302 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100303 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100304 outputExpected,
305 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100306 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100307 outputInfo);
308}
309
310template<armnn::DataType ArmnnType, typename T>
311LayerTestResult<T, 2> ReverseV2SimpleTest3Dim2Axis(
312 armnn::IWorkloadFactory& workloadFactory,
313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
314 const armnn::ITensorHandleFactory& tensorHandleFactory)
315{
Tianle Cheng988354d2023-06-28 13:20:47 +0100316 float qScale = 1.0f;
317 int32_t qOffset = 0;
318
319 armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100320 armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100321 armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
322
323 std::vector<T> input = armnnUtils::QuantizedVector<T>({
324 1, 2, 3, 4,
325 5, 6, 7, 8,
326 9, 10, 11, 12,
327 13, 14, 15, 16,
328 17, 18, 19, 20,
329 21, 22, 23, 24
330 }, qScale, qOffset);
331
Tracy Narinebb8d7592023-07-13 16:50:54 +0100332 std::vector<int> axis = {0, 1};
333
Tianle Cheng988354d2023-06-28 13:20:47 +0100334 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
335 21, 22, 23, 24,
336 17, 18, 19, 20,
337 13, 14, 15, 16,
338 9, 10, 11, 12,
339 5, 6, 7, 8,
340 1, 2, 3, 4
341 }, qScale, qOffset);
342
343 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
344 memoryManager,
345 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100346 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100347 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100348 outputExpected,
349 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100350 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100351 outputInfo);
352}
353
354template<armnn::DataType ArmnnType, typename T>
355LayerTestResult<T, 2> ReverseV2SimpleTest3Dim3Axis(
356 armnn::IWorkloadFactory& workloadFactory,
357 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
358 const armnn::ITensorHandleFactory& tensorHandleFactory)
359{
Tianle Cheng988354d2023-06-28 13:20:47 +0100360 float qScale = 1.0f;
361 int32_t qOffset = 0;
362
363 armnn::TensorInfo inputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100364 armnn::TensorInfo axisInfo({3}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100365 armnn::TensorInfo outputInfo({2, 3, 4}, ArmnnType, qScale, qOffset);
366
367 std::vector<T> input = armnnUtils::QuantizedVector<T>({
368 1, 2, 3, 4,
369 5, 6, 7, 8,
370 9, 10, 11, 12,
371 13, 14, 15, 16,
372 17, 18, 19, 20,
373 21, 22, 23, 24
374 }, qScale, qOffset);
375
Tracy Narinebb8d7592023-07-13 16:50:54 +0100376 std::vector<int> axis = {1, 0, 2};
377
Tianle Cheng988354d2023-06-28 13:20:47 +0100378 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
379 24, 23, 22, 21,
380 20, 19, 18, 17,
381 16, 15, 14, 13,
382 12, 11, 10, 9,
383 8, 7, 6, 5,
384 4, 3, 2, 1
385 }, qScale, qOffset);
386
387 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
388 memoryManager,
389 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100390 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100391 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100392 outputExpected,
393 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100394 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100395 outputInfo);
396}
397
398template<armnn::DataType ArmnnType, typename T>
399LayerTestResult<T, 2> ReverseV2SimpleTest4Dim1Axis(
400 armnn::IWorkloadFactory& workloadFactory,
401 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
402 const armnn::ITensorHandleFactory& tensorHandleFactory)
403{
Tianle Cheng988354d2023-06-28 13:20:47 +0100404 float qScale = 1.0f;
405 int32_t qOffset = 0;
406
407 armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100408 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100409 armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
410
411 std::vector<T> input = armnnUtils::QuantizedVector<T>({
412 1, 2, 3,
413 4, 5, 6,
414 7, 8, 9,
415 10, 11, 12,
416 13, 14, 15,
417 16, 17, 18,
418 19, 20, 21,
419 22, 23, 24
420 }, qScale, qOffset);
421
Tracy Narinebb8d7592023-07-13 16:50:54 +0100422 std::vector<int> axis = {0};
423
Tianle Cheng988354d2023-06-28 13:20:47 +0100424 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
425 13, 14, 15,
426 16, 17, 18,
427 19, 20, 21,
428 22, 23, 24,
429 1, 2, 3,
430 4, 5, 6,
431 7, 8, 9,
432 10, 11, 12
433 }, qScale, qOffset);
434
435 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
436 memoryManager,
437 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100438 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100439 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100440 outputExpected,
441 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100442 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100443 outputInfo);
444}
445
446template<armnn::DataType ArmnnType, typename T>
447LayerTestResult<T, 2> ReverseV2SimpleTest4Dim2Axis(
448 armnn::IWorkloadFactory& workloadFactory,
449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
450 const armnn::ITensorHandleFactory& tensorHandleFactory)
451{
Tianle Cheng988354d2023-06-28 13:20:47 +0100452 float qScale = 1.0f;
453 int32_t qOffset = 0;
454
455 armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100456 armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100457 armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
458
459 std::vector<T> input = armnnUtils::QuantizedVector<T>({
460 1, 2, 3,
461 4, 5, 6,
462 7, 8, 9,
463 10, 11, 12,
464 13, 14, 15,
465 16, 17, 18,
466 19, 20, 21,
467 22, 23, 24
468 }, qScale, qOffset);
469
Tracy Narinebb8d7592023-07-13 16:50:54 +0100470 std::vector<int> axis = {0, 1};
471
Tianle Cheng988354d2023-06-28 13:20:47 +0100472 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
473 19, 20, 21,
474 22, 23, 24,
475 13, 14, 15,
476 16, 17, 18,
477 7, 8, 9,
478 10, 11, 12,
479 1, 2, 3,
480 4, 5, 6
481 }, qScale, qOffset);
482
483 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
484 memoryManager,
485 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100486 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100487 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100488 outputExpected,
489 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100490 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100491 outputInfo);
492}
493
494template<armnn::DataType ArmnnType, typename T>
495LayerTestResult<T, 2> ReverseV2SimpleTest4Dim3Axis(
496 armnn::IWorkloadFactory& workloadFactory,
497 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
498 const armnn::ITensorHandleFactory& tensorHandleFactory)
499{
Tianle Cheng988354d2023-06-28 13:20:47 +0100500 float qScale = 1.0f;
501 int32_t qOffset = 0;
502
503 armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100504 armnn::TensorInfo axisInfo({3}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100505 armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
506
507 std::vector<T> input = armnnUtils::QuantizedVector<T>({
508 1, 2, 3,
509 4, 5, 6,
510 7, 8, 9,
511 10, 11, 12,
512 13, 14, 15,
513 16, 17, 18,
514 19, 20, 21,
515 22, 23, 24
516 }, qScale, qOffset);
517
Tracy Narinebb8d7592023-07-13 16:50:54 +0100518 std::vector<int> axis = {0, 1, 2};
519
Tianle Cheng988354d2023-06-28 13:20:47 +0100520 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
521 22, 23, 24,
522 19, 20, 21,
523 16, 17, 18,
524 13, 14, 15,
525 10, 11, 12,
526 7, 8, 9,
527 4, 5, 6,
528 1, 2, 3
529 }, qScale, qOffset);
530
531 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
532 memoryManager,
533 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100534 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100535 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100536 outputExpected,
537 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100538 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100539 outputInfo);
540}
541
542template<armnn::DataType ArmnnType, typename T>
543LayerTestResult<T, 2> ReverseV2SimpleTest4Dim4Axis(
544 armnn::IWorkloadFactory& workloadFactory,
545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
546 const armnn::ITensorHandleFactory& tensorHandleFactory)
547{
Tianle Cheng988354d2023-06-28 13:20:47 +0100548 float qScale = 1.0f;
549 int32_t qOffset = 0;
550
551 armnn::TensorInfo inputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100552 armnn::TensorInfo axisInfo({4}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100553 armnn::TensorInfo outputInfo({2, 2, 2, 3}, ArmnnType, qScale, qOffset);
554
555 std::vector<T> input = armnnUtils::QuantizedVector<T>({
556 1, 2, 3,
557 4, 5, 6,
558 7, 8, 9,
559 10, 11, 12,
560 13, 14, 15,
561 16, 17, 18,
562 19, 20, 21,
563 22, 23, 24
564 }, qScale, qOffset);
565
Tracy Narinebb8d7592023-07-13 16:50:54 +0100566 std::vector<int> axis = {0, 1, 2, 3};
567
Tianle Cheng988354d2023-06-28 13:20:47 +0100568 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
Tracy Narinebb8d7592023-07-13 16:50:54 +0100569 24, 23, 22,
570 21, 20, 19,
571 18, 17, 16,
572 15, 14, 13,
573 12, 11, 10,
574 9, 8, 7,
575 6, 5, 4,
576 3, 2, 1
577 }, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100578
579 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
580 memoryManager,
581 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100582 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100583 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100584 outputExpected,
585 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100586 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100587 outputInfo);
588}
589
590template<armnn::DataType ArmnnType, typename T>
591LayerTestResult<T, 2> ReverseV2EvenRowOddColTest2Dim(
592 armnn::IWorkloadFactory& workloadFactory,
593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
594 const armnn::ITensorHandleFactory& tensorHandleFactory)
595{
Tianle Cheng988354d2023-06-28 13:20:47 +0100596 float qScale = 1.0f;
597 int32_t qOffset = 0;
598
599 armnn::TensorInfo inputInfo({2, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100600 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100601 armnn::TensorInfo outputInfo({2, 3}, ArmnnType, qScale, qOffset);
602
603 std::vector<T> input = armnnUtils::QuantizedVector<T>({
604 1, 2, 3,
605 4, 5, 6
606 }, qScale, qOffset);
607
Tracy Narinebb8d7592023-07-13 16:50:54 +0100608 std::vector<int> axis = {1};
609
Tianle Cheng988354d2023-06-28 13:20:47 +0100610 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
611 3, 2, 1,
612 6, 5, 4
613 }, qScale, qOffset);
614
615 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
616 memoryManager,
617 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100618 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100619 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100620 outputExpected,
621 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100622 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100623 outputInfo);
624}
625
626template<armnn::DataType ArmnnType, typename T>
627LayerTestResult<T, 2> ReverseV2EvenRowOddColTest3Dim(
628 armnn::IWorkloadFactory& workloadFactory,
629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
630 const armnn::ITensorHandleFactory& tensorHandleFactory)
631{
Tianle Cheng988354d2023-06-28 13:20:47 +0100632 float qScale = 1.0f;
633 int32_t qOffset = 0;
634
635 armnn::TensorInfo inputInfo({2, 3, 1}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100636 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100637 armnn::TensorInfo outputInfo({2, 3, 1}, ArmnnType, qScale, qOffset);
638
639 std::vector<T> input = armnnUtils::QuantizedVector<T>({
640 1, 2, 3,
641 4, 5, 6
642 }, qScale, qOffset);
643
Tracy Narinebb8d7592023-07-13 16:50:54 +0100644 std::vector<int> axis = {1};
645
Tianle Cheng988354d2023-06-28 13:20:47 +0100646 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
647 3, 2, 1,
648 6, 5, 4
649 }, qScale, qOffset);
650
651 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
652 memoryManager,
653 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100654 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100655 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100656 outputExpected,
657 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100658 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100659 outputInfo);
660}
661
662template<armnn::DataType ArmnnType, typename T>
663LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest2Dim(
664 armnn::IWorkloadFactory& workloadFactory,
665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
666 const armnn::ITensorHandleFactory& tensorHandleFactory)
667{
Tianle Cheng988354d2023-06-28 13:20:47 +0100668 float qScale = 1.0f;
669 int32_t qOffset = 0;
670
671 armnn::TensorInfo inputInfo({2, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100672 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100673 armnn::TensorInfo outputInfo({2, 4}, ArmnnType, qScale, qOffset);
674
675 std::vector<T> input = armnnUtils::QuantizedVector<T>({
676 1, 2, 3, 4,
677 5, 6, 7, 8
678 }, qScale, qOffset);
679
Tracy Narinebb8d7592023-07-13 16:50:54 +0100680 std::vector<int> axis = {1};
681
Tianle Cheng988354d2023-06-28 13:20:47 +0100682 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
683 4, 3, 2, 1,
684 8, 7, 6, 5
685 }, qScale, qOffset);
686
687 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
688 memoryManager,
689 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100690 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100691 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100692 outputExpected,
693 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100694 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100695 outputInfo);
696}
697
698template<armnn::DataType ArmnnType, typename T>
699LayerTestResult<T, 2> ReverseV2EvenRowEvenColTest3Dim(
700 armnn::IWorkloadFactory& workloadFactory,
701 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
702 const armnn::ITensorHandleFactory& tensorHandleFactory)
703{
Tianle Cheng988354d2023-06-28 13:20:47 +0100704 float qScale = 1.0f;
705 int32_t qOffset = 0;
706
707 armnn::TensorInfo inputInfo({2, 4, 1}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100708 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100709 armnn::TensorInfo outputInfo({2, 4, 1}, ArmnnType, qScale, qOffset);
710
711 std::vector<T> input = armnnUtils::QuantizedVector<T>({
712 1, 2, 3, 4,
713 5, 6, 7, 8
714 }, qScale, qOffset);
715
Tracy Narinebb8d7592023-07-13 16:50:54 +0100716 std::vector<int> axis = {1};
717
Tianle Cheng988354d2023-06-28 13:20:47 +0100718 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
719 4, 3, 2, 1,
720 8, 7, 6, 5
721 }, qScale, qOffset);
722
723 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
724 memoryManager,
725 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100726 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100727 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100728 outputExpected,
729 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100730 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100731 outputInfo);
732}
733
734template<armnn::DataType ArmnnType, typename T>
735LayerTestResult<T, 2> ReverseV2OddRowOddColTest2Dim(
736 armnn::IWorkloadFactory& workloadFactory,
737 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
738 const armnn::ITensorHandleFactory& tensorHandleFactory)
739{
Tianle Cheng988354d2023-06-28 13:20:47 +0100740 float qScale = 1.0f;
741 int32_t qOffset = 0;
742
743 armnn::TensorInfo inputInfo({3, 3}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100744 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100745 armnn::TensorInfo outputInfo({3, 3}, ArmnnType, qScale, qOffset);
746
747 std::vector<T> input = armnnUtils::QuantizedVector<T>({
748 1, 2, 3,
749 4, 5, 6,
750 7, 8, 9
751 }, qScale, qOffset);
752
Tracy Narinebb8d7592023-07-13 16:50:54 +0100753 std::vector<int> axis = {1};
754
Tianle Cheng988354d2023-06-28 13:20:47 +0100755 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
756 3, 2, 1,
757 6, 5, 4,
758 9, 8, 7
759 }, qScale, qOffset);
760
761 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
762 memoryManager,
763 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100764 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100765 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100766 outputExpected,
767 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100768 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100769 outputInfo);
770}
771
772template<armnn::DataType ArmnnType, typename T>
773LayerTestResult<T, 2> ReverseV2OddRowOddColTest3Dim(
774 armnn::IWorkloadFactory& workloadFactory,
775 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
776 const armnn::ITensorHandleFactory& tensorHandleFactory)
777{
Tianle Cheng988354d2023-06-28 13:20:47 +0100778 float qScale = 1.0f;
779 int32_t qOffset = 0;
780
781 armnn::TensorInfo inputInfo({3, 3, 1}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100782 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100783 armnn::TensorInfo outputInfo({3, 3, 1}, ArmnnType, qScale, qOffset);
784
785 std::vector<T> input = armnnUtils::QuantizedVector<T>({
786 1, 2, 3,
787 4, 5, 6,
788 7, 8, 9
789 }, qScale, qOffset);
790
Tracy Narinebb8d7592023-07-13 16:50:54 +0100791 std::vector<int> axis = {1};
792
Tianle Cheng988354d2023-06-28 13:20:47 +0100793 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
794 3, 2, 1,
795 6, 5, 4,
796 9, 8, 7
797 }, qScale, qOffset);
798
799 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
800 memoryManager,
801 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100802 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100803 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100804 outputExpected,
805 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100806 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100807 outputInfo);
808}
809
810template<armnn::DataType ArmnnType, typename T>
811LayerTestResult<T, 2> ReverseV2OddRowEvenColTest2Dim(
812 armnn::IWorkloadFactory& workloadFactory,
813 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
814 const armnn::ITensorHandleFactory& tensorHandleFactory)
815{
Tianle Cheng988354d2023-06-28 13:20:47 +0100816 float qScale = 1.0f;
817 int32_t qOffset = 0;
818
819 armnn::TensorInfo inputInfo({3, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100820 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100821 armnn::TensorInfo outputInfo({3, 4}, ArmnnType, qScale, qOffset);
822
823 std::vector<T> input = armnnUtils::QuantizedVector<T>({
824 1, 2, 3, 4,
825 5, 6, 7, 8,
826 9, 10, 11, 12
827 }, qScale, qOffset);
828
Tracy Narinebb8d7592023-07-13 16:50:54 +0100829 std::vector<int> axis = {1};
830
Tianle Cheng988354d2023-06-28 13:20:47 +0100831 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
832 4, 3, 2, 1,
833 8, 7, 6, 5,
834 12, 11, 10, 9
835 }, qScale, qOffset);
836
837 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
838 memoryManager,
839 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100840 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100841 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100842 outputExpected,
843 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100844 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100845 outputInfo);
846}
847
848template<armnn::DataType ArmnnType, typename T>
849LayerTestResult<T, 2> ReverseV2OddRowEvenColTest3Dim(
850 armnn::IWorkloadFactory& workloadFactory,
851 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
852 const armnn::ITensorHandleFactory& tensorHandleFactory)
853{
Tianle Cheng988354d2023-06-28 13:20:47 +0100854 float qScale = 1.0f;
855 int32_t qOffset = 0;
856
857 armnn::TensorInfo inputInfo({3, 4, 1}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100858 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100859 armnn::TensorInfo outputInfo({3, 4, 1}, ArmnnType, qScale, qOffset);
860
861 std::vector<T> input = armnnUtils::QuantizedVector<T>({
862 1, 2, 3, 4,
863 5, 6, 7, 8,
864 9, 10, 11, 12
865 }, qScale, qOffset);
866
Tracy Narinebb8d7592023-07-13 16:50:54 +0100867 std::vector<int> axis = {1};
868
Tianle Cheng988354d2023-06-28 13:20:47 +0100869 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
870 4, 3, 2, 1,
871 8, 7, 6, 5,
872 12, 11, 10, 9
873 }, qScale, qOffset);
874
875 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
876 memoryManager,
877 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100878 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100879 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100880 outputExpected,
881 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100882 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100883 outputInfo);
884}
885
886template<armnn::DataType ArmnnType, typename T>
887LayerTestResult<T, 2> ReverseV2NegAxisTest2Dim1Axis(
888 armnn::IWorkloadFactory& workloadFactory,
889 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
890 const armnn::ITensorHandleFactory& tensorHandleFactory)
891{
Tianle Cheng988354d2023-06-28 13:20:47 +0100892 float qScale = 1.0f;
893 int32_t qOffset = 0;
894
895 armnn::TensorInfo inputInfo({2, 4}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100896 armnn::TensorInfo axisInfo({1}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100897 armnn::TensorInfo outputInfo({2, 4}, ArmnnType, qScale, qOffset);
898
899 std::vector<T> input = armnnUtils::QuantizedVector<T>({
900 1, 2, 3, 4,
901 5, 6, 7, 8,
902 }, qScale, qOffset);
903
Tracy Narinebb8d7592023-07-13 16:50:54 +0100904 std::vector<int> axis = {-1};
905
Tianle Cheng988354d2023-06-28 13:20:47 +0100906 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
907 4, 3, 2, 1,
908 8, 7, 6, 5
909 }, qScale, qOffset);
910
911 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
912 memoryManager,
913 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100914 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100915 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100916 outputExpected,
917 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100918 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100919 outputInfo);
920}
921
922template<armnn::DataType ArmnnType, typename T>
923LayerTestResult<T, 2> ReverseV2NegAxisTest3Dim2Axis(
924 armnn::IWorkloadFactory& workloadFactory,
925 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
926 const armnn::ITensorHandleFactory& tensorHandleFactory)
927{
Tianle Cheng988354d2023-06-28 13:20:47 +0100928 float qScale = 1.0f;
929 int32_t qOffset = 0;
930
931 armnn::TensorInfo inputInfo({2, 4, 1}, ArmnnType, qScale, qOffset);
Tracy Narinebb8d7592023-07-13 16:50:54 +0100932 armnn::TensorInfo axisInfo({2}, armnn::DataType::Signed32, qScale, qOffset);
Tianle Cheng988354d2023-06-28 13:20:47 +0100933 armnn::TensorInfo outputInfo({2, 4, 1}, ArmnnType, qScale, qOffset);
934
935 std::vector<T> input = armnnUtils::QuantizedVector<T>({
936 1, 2, 3, 4,
937 5, 6, 7, 8,
938 }, qScale, qOffset);
939
Tracy Narinebb8d7592023-07-13 16:50:54 +0100940 std::vector<int> axis = {1, -1};
941
Tianle Cheng988354d2023-06-28 13:20:47 +0100942 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>({
943 4, 3, 2, 1,
944 8, 7, 6, 5
945 }, qScale, qOffset);
946
947 return ReverseV2TestImpl<ArmnnType, T, 2>(workloadFactory,
948 memoryManager,
949 tensorHandleFactory,
Tianle Cheng988354d2023-06-28 13:20:47 +0100950 input,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100951 axis,
Tianle Cheng988354d2023-06-28 13:20:47 +0100952 outputExpected,
953 inputInfo,
Tracy Narinebb8d7592023-07-13 16:50:54 +0100954 axisInfo,
Tianle Cheng988354d2023-06-28 13:20:47 +0100955 outputInfo);
956}
957
958template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
959ReverseV2SimpleTestEmptyAxis<armnn::DataType::Float32>(
960 armnn::IWorkloadFactory& workloadFactory,
961 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
962 const armnn::ITensorHandleFactory& tensorHandleFactory);
963
964template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
965ReverseV2SimpleTestEmptyTensor<armnn::DataType::Float32>(
966 armnn::IWorkloadFactory& workloadFactory,
967 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
968 const armnn::ITensorHandleFactory& tensorHandleFactory);
969
970template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
971ReverseV2SimpleTest1Dim<armnn::DataType::Float32>(
972 armnn::IWorkloadFactory& workloadFactory,
973 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
974 const armnn::ITensorHandleFactory& tensorHandleFactory);
975
976template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
977ReverseV2SimpleTest2Dim1Axis<armnn::DataType::Float32>(
978 armnn::IWorkloadFactory& workloadFactory,
979 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
980 const armnn::ITensorHandleFactory& tensorHandleFactory);
981
982template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
983ReverseV2SimpleTest2Dim2Axis<armnn::DataType::Float32>(
984 armnn::IWorkloadFactory& workloadFactory,
985 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
986 const armnn::ITensorHandleFactory& tensorHandleFactory);
987
988template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
989ReverseV2SimpleTest3Dim1Axis<armnn::DataType::Float32>(
990 armnn::IWorkloadFactory& workloadFactory,
991 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
992 const armnn::ITensorHandleFactory& tensorHandleFactory);
993
994template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
995ReverseV2SimpleTest3Dim2Axis<armnn::DataType::Float32>(
996 armnn::IWorkloadFactory& workloadFactory,
997 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
998 const armnn::ITensorHandleFactory& tensorHandleFactory);
999
1000template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1001ReverseV2SimpleTest3Dim3Axis<armnn::DataType::Float32>(
1002 armnn::IWorkloadFactory& workloadFactory,
1003 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1004 const armnn::ITensorHandleFactory& tensorHandleFactory);
1005
1006template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1007ReverseV2SimpleTest4Dim1Axis<armnn::DataType::Float32>(
1008 armnn::IWorkloadFactory& workloadFactory,
1009 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1010 const armnn::ITensorHandleFactory& tensorHandleFactory);
1011
1012template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1013ReverseV2SimpleTest4Dim2Axis<armnn::DataType::Float32>(
1014 armnn::IWorkloadFactory& workloadFactory,
1015 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1016 const armnn::ITensorHandleFactory& tensorHandleFactory);
1017
1018template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1019ReverseV2SimpleTest4Dim3Axis<armnn::DataType::Float32>(
1020 armnn::IWorkloadFactory& workloadFactory,
1021 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1022 const armnn::ITensorHandleFactory& tensorHandleFactory);
1023
1024template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1025ReverseV2SimpleTest4Dim4Axis<armnn::DataType::Float32>(
1026 armnn::IWorkloadFactory& workloadFactory,
1027 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1028 const armnn::ITensorHandleFactory& tensorHandleFactory);
1029
1030template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1031ReverseV2EvenRowOddColTest2Dim<armnn::DataType::Float32>(
1032 armnn::IWorkloadFactory& workloadFactory,
1033 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1034 const armnn::ITensorHandleFactory& tensorHandleFactory);
1035
1036template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1037ReverseV2EvenRowOddColTest3Dim<armnn::DataType::Float32>(
1038 armnn::IWorkloadFactory& workloadFactory,
1039 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1040 const armnn::ITensorHandleFactory& tensorHandleFactory);
1041
1042template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1043ReverseV2EvenRowEvenColTest2Dim<armnn::DataType::Float32>(
1044 armnn::IWorkloadFactory& workloadFactory,
1045 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1046 const armnn::ITensorHandleFactory& tensorHandleFactory);
1047
1048template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1049ReverseV2EvenRowEvenColTest3Dim<armnn::DataType::Float32>(
1050 armnn::IWorkloadFactory& workloadFactory,
1051 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1052 const armnn::ITensorHandleFactory& tensorHandleFactory);
1053
1054template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1055ReverseV2OddRowOddColTest2Dim<armnn::DataType::Float32>(
1056 armnn::IWorkloadFactory& workloadFactory,
1057 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1058 const armnn::ITensorHandleFactory& tensorHandleFactory);
1059
1060template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1061ReverseV2OddRowOddColTest3Dim<armnn::DataType::Float32>(
1062 armnn::IWorkloadFactory& workloadFactory,
1063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1064 const armnn::ITensorHandleFactory& tensorHandleFactory);
1065
1066template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1067ReverseV2OddRowEvenColTest2Dim<armnn::DataType::Float32>(
1068 armnn::IWorkloadFactory& workloadFactory,
1069 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1070 const armnn::ITensorHandleFactory& tensorHandleFactory);
1071
1072template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1073ReverseV2OddRowEvenColTest3Dim<armnn::DataType::Float32>(
1074 armnn::IWorkloadFactory& workloadFactory,
1075 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1076 const armnn::ITensorHandleFactory& tensorHandleFactory);
1077
1078template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1079ReverseV2NegAxisTest2Dim1Axis<armnn::DataType::Float32>(
1080 armnn::IWorkloadFactory& workloadFactory,
1081 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1082 const armnn::ITensorHandleFactory& tensorHandleFactory);
1083
1084template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
1085ReverseV2NegAxisTest3Dim2Axis<armnn::DataType::Float32>(
1086 armnn::IWorkloadFactory& workloadFactory,
1087 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1088 const armnn::ITensorHandleFactory& tensorHandleFactory);
1089
1090template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 2>
1091ReverseV2SimpleTest2Dim2Axis<armnn::DataType::Float16>(
1092 armnn::IWorkloadFactory& workloadFactory,
1093 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1094 const armnn::ITensorHandleFactory& tensorHandleFactory);
1095
1096template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
1097ReverseV2SimpleTest2Dim2Axis<armnn::DataType::QAsymmS8>(
1098 armnn::IWorkloadFactory& workloadFactory,
1099 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1100 const armnn::ITensorHandleFactory& tensorHandleFactory);
1101
1102template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
1103ReverseV2SimpleTest2Dim2Axis<armnn::DataType::QAsymmU8>(
1104 armnn::IWorkloadFactory& workloadFactory,
1105 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1106 const armnn::ITensorHandleFactory& tensorHandleFactory);
1107
1108template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
1109ReverseV2SimpleTest2Dim2Axis<armnn::DataType::QSymmS16>(
1110 armnn::IWorkloadFactory& workloadFactory,
1111 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Tracy Narinebb8d7592023-07-13 16:50:54 +01001112 const armnn::ITensorHandleFactory& tensorHandleFactory);