blob: 2733100d6cec88689846881def1593f9020c893c [file] [log] [blame]
Nikhil Raj68c2c902019-09-19 11:21:11 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "ArgMinMaxTestImpl.hpp"
7
8#include <armnn/ArmNN.hpp>
9
10#include <backendsCommon/test/DataTypeUtils.hpp>
11#include <backendsCommon/test/TensorCopyUtils.hpp>
12#include <backendsCommon/test/WorkloadTestUtils.hpp>
13
14#include <test/TensorHelpers.hpp>
15
16namespace
17{
18
19template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
20LayerTestResult<int32_t, 3> ArgMinMaxTestCommon(
21 armnn::IWorkloadFactory& workloadFactory,
22 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
23 armnn::ArgMinMaxFunction argMinMaxFunction,
24 const armnn::TensorInfo inputTensorInfo,
25 const armnn::TensorInfo outputTensorInfo,
26 const std::vector<float>& inputData,
27 const std::vector<int32_t>& outputData,
28 int axis = 3)
29{
Derek Lambertic374ff02019-12-10 21:57:35 +000030 boost::ignore_unused(memoryManager);
Nikhil Raj68c2c902019-09-19 11:21:11 +010031 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, ConvertToDataType<ArmnnType>(inputData, inputTensorInfo));
32
33 LayerTestResult<int32_t, 3> result(outputTensorInfo);
Nikhil Raj68c2c902019-09-19 11:21:11 +010034 result.outputExpected = MakeTensor<int32_t, 3>(outputTensorInfo, outputData);
35
36 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
37 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
38
39 armnn::ArgMinMaxQueueDescriptor descriptor;
40 descriptor.m_Parameters.m_Function = argMinMaxFunction;
41 descriptor.m_Parameters.m_Axis = axis;
42 armnn::WorkloadInfo info;
43
44 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
45 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
46
47 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateArgMinMax(descriptor, info);
48
49 inputHandle->Allocate();
50 outputHandle->Allocate();
51
52 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
53
54 workload->PostAllocationConfigure();
55 workload->Execute();
56
57 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
58
59 return result;
Nikhil Raj68c2c902019-09-19 11:21:11 +010060}
61
62} // namespace
63
64template<armnn::DataType ArmnnType, typename T>
65LayerTestResult<int32_t, 3> ArgMaxSimpleTest(
66 armnn::IWorkloadFactory& workloadFactory,
67 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
68{
69 const armnn::TensorShape inputShape{ 1, 1, 1, 5 };
70 const armnn::TensorShape outputShape{ 1, 1, 1 };
71
72 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
73
Francis Murtagh52ec3462019-11-19 12:24:19 +000074 if (armnn::IsQuantizedType<T>())
Nikhil Raj68c2c902019-09-19 11:21:11 +010075 {
76 inputTensorInfo.SetQuantizationScale(1.0f);
77 inputTensorInfo.SetQuantizationOffset(0);
78 }
79
80 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
81
82 std::vector<float> inputValues({ 5.0f, 2.0f, 8.0f, 10.0f, 9.0f });
83 std::vector<int32_t> outputValues({ 3 });
84
85 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
86 armnn::ArgMinMaxFunction::Max,
87 inputTensorInfo, outputTensorInfo,
James Conroyd47a0642019-09-17 14:22:06 +010088 inputValues, outputValues, -1); // axis -1 === 3
Nikhil Raj68c2c902019-09-19 11:21:11 +010089}
90
91template<armnn::DataType ArmnnType, typename T>
92LayerTestResult<int32_t, 3> ArgMinSimpleTest(
93 armnn::IWorkloadFactory& workloadFactory,
94 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
95{
96 const armnn::TensorShape inputShape{ 1, 1, 1, 5 };
97 const armnn::TensorShape outputShape{ 1, 1, 1 };
98
99 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
100
Francis Murtagh52ec3462019-11-19 12:24:19 +0000101 if (armnn::IsQuantizedType<T>())
Nikhil Raj68c2c902019-09-19 11:21:11 +0100102 {
103 inputTensorInfo.SetQuantizationScale(1.0f);
104 inputTensorInfo.SetQuantizationOffset(0);
105 }
106
107 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
108
109 std::vector<float> inputValues({ 5.0f, 2.0f, 8.0f, 10.0f, 9.0f });
110 std::vector<int32_t> outputValues({ 1 });
111
112 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
113 armnn::ArgMinMaxFunction::Min,
114 inputTensorInfo, outputTensorInfo,
115 inputValues, outputValues, 3);
116}
117
118template<armnn::DataType ArmnnType, typename T>
James Conroyd47a0642019-09-17 14:22:06 +0100119LayerTestResult<int32_t, 3> ArgMinChannelTest(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100120 armnn::IWorkloadFactory& workloadFactory,
121 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
122{
123 const armnn::TensorShape inputShape{ 1, 3, 2, 4};
124 const armnn::TensorShape outputShape{ 1, 2, 4 };
125
126 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
127
Francis Murtagh52ec3462019-11-19 12:24:19 +0000128 if (armnn::IsQuantizedType<T>())
Nikhil Raj68c2c902019-09-19 11:21:11 +0100129 {
130 inputTensorInfo.SetQuantizationScale(1.0f);
131 inputTensorInfo.SetQuantizationOffset(0);
132 }
133
134 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
135
James Conroyd47a0642019-09-17 14:22:06 +0100136 std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
137 5.0f, 6.0f, 7.0f, 8.0f,
138
139 10.0f, 20.0f, 30.0f, 40.0f,
140 50.0f, 60.0f, 70.0f, 80.0f,
141
142 100.0f, 200.0f, 300.0f, 400.0f,
143 500.0f, 600.0f, 700.0f, 800.0f });
144 std::vector<int32_t> outputValues({ 0, 0, 0, 0,
145 0, 0, 0, 0 });
146
147 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
148 armnn::ArgMinMaxFunction::Min,
149 inputTensorInfo, outputTensorInfo,
150 inputValues, outputValues, 1);
151}
152
153template<armnn::DataType ArmnnType, typename T>
154LayerTestResult<int32_t, 3> ArgMaxChannelTest(
155 armnn::IWorkloadFactory& workloadFactory,
156 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
157{
158 const armnn::TensorShape inputShape{ 1, 3, 2, 4};
159 const armnn::TensorShape outputShape{ 1, 2, 4 };
160
161 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
162
Francis Murtagh52ec3462019-11-19 12:24:19 +0000163 if (armnn::IsQuantizedType<T>())
James Conroyd47a0642019-09-17 14:22:06 +0100164 {
165 inputTensorInfo.SetQuantizationScale(1.0f);
166 inputTensorInfo.SetQuantizationOffset(0);
167 }
168
169 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
170
171 std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
172 5.0f, 6.0f, 7.0f, 8.0f,
Nikhil Raj68c2c902019-09-19 11:21:11 +0100173
174 10.0f, 20.0f, 30.0f, 40.0f,
175 50.0f, 60.0f, 70.0f, 80.0f,
176
James Conroyd47a0642019-09-17 14:22:06 +0100177 100.0f, 200.0f, 300.0f, 400.0f,
178 500.0f, 600.0f, 700.0f, 800.0f });
Nikhil Raj68c2c902019-09-19 11:21:11 +0100179 std::vector<int32_t> outputValues({ 2, 2, 2, 2,
180 2, 2, 2, 2 });
181
182 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
183 armnn::ArgMinMaxFunction::Max,
184 inputTensorInfo, outputTensorInfo,
185 inputValues, outputValues, 1);
186}
187
James Conroyd47a0642019-09-17 14:22:06 +0100188template<armnn::DataType ArmnnType, typename T>
189LayerTestResult<int32_t, 3> ArgMaxHeightTest(
190 armnn::IWorkloadFactory& workloadFactory,
191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
192{
193 const armnn::TensorShape inputShape{ 1, 3, 2, 4};
James Conroyc8724c72019-10-08 15:41:34 +0100194 const armnn::TensorShape outputShape{ 1, 3, 4 };
James Conroyd47a0642019-09-17 14:22:06 +0100195
196 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
197 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
198
Francis Murtagh52ec3462019-11-19 12:24:19 +0000199 if (armnn::IsQuantizedType<T>())
200 {
201 inputTensorInfo.SetQuantizationScale(1.0f);
202 inputTensorInfo.SetQuantizationOffset(0);
203 }
204
James Conroyd47a0642019-09-17 14:22:06 +0100205 std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
206 5.0f, 6.0f, 7.0f, 8.0f,
207
208 10.0f, 20.0f, 30.0f, 40.0f,
209 50.0f, 60.0f, 70.0f, 80.0f,
210
211 100.0f, 200.0f, 300.0f, 400.0f,
212 500.0f, 600.0f, 700.0f, 800.0f });
213 std::vector<int32_t> outputValues({ 1, 1, 1, 1,
214 1, 1, 1, 1,
215 1, 1, 1, 1 });
216
217 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
218 armnn::ArgMinMaxFunction::Max,
219 inputTensorInfo, outputTensorInfo,
220 inputValues, outputValues, 2);
221}
222
223template<armnn::DataType ArmnnType, typename T>
224LayerTestResult<int32_t, 3> ArgMinWidthTest(
225 armnn::IWorkloadFactory& workloadFactory,
226 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
227{
228 const armnn::TensorShape inputShape{ 1, 3, 2, 4};
James Conroyc8724c72019-10-08 15:41:34 +0100229 const armnn::TensorShape outputShape{ 1, 3, 2 };
James Conroyd47a0642019-09-17 14:22:06 +0100230
231 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
232 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
233
Francis Murtagh52ec3462019-11-19 12:24:19 +0000234 if (armnn::IsQuantizedType<T>())
235 {
236 inputTensorInfo.SetQuantizationScale(1.0f);
237 inputTensorInfo.SetQuantizationOffset(0);
238 }
239
James Conroyd47a0642019-09-17 14:22:06 +0100240 std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
241 5.0f, 6.0f, 7.0f, 8.0f,
242
243 10.0f, 20.0f, 30.0f, 40.0f,
244 50.0f, 60.0f, 70.0f, 80.0f,
245
246 100.0f, 200.0f, 300.0f, 400.0f,
247 500.0f, 600.0f, 700.0f, 800.0f });
248 std::vector<int32_t> outputValues({ 0, 0,
249 0, 0,
250 0, 0 });
251
252 return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager,
253 armnn::ArgMinMaxFunction::Min,
254 inputTensorInfo, outputTensorInfo,
255 inputValues, outputValues, 3);
256}
257
Nikhil Raj68c2c902019-09-19 11:21:11 +0100258
259// Explicit template specializations
260
261template LayerTestResult<int32_t, 3>
262ArgMaxSimpleTest<armnn::DataType::Float32>(
263 armnn::IWorkloadFactory& workloadFactory,
264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
265
266template LayerTestResult<int32_t, 3>
Nikhil Raj68c2c902019-09-19 11:21:11 +0100267ArgMaxSimpleTest<armnn::DataType::QuantisedAsymm8>(
268 armnn::IWorkloadFactory& workloadFactory,
269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
270
271template LayerTestResult<int32_t, 3>
Nikhil Raj68c2c902019-09-19 11:21:11 +0100272ArgMaxSimpleTest<armnn::DataType::QuantisedSymm16>(
273 armnn::IWorkloadFactory& workloadFactory,
274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
275
276template LayerTestResult<int32_t, 3>
Francis Murtagh1939df52019-11-13 15:21:09 +0000277ArgMaxSimpleTest<armnn::DataType::Signed32>(
278 armnn::IWorkloadFactory& workloadFactory,
279 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
280
281template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100282ArgMinSimpleTest<armnn::DataType::Float32>(
283 armnn::IWorkloadFactory& workloadFactory,
284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
285
286template LayerTestResult<int32_t, 3>
287ArgMinSimpleTest<armnn::DataType::QuantisedAsymm8>(
288 armnn::IWorkloadFactory& workloadFactory,
289 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
290
291template LayerTestResult<int32_t, 3>
Nikhil Raj68c2c902019-09-19 11:21:11 +0100292ArgMinSimpleTest<armnn::DataType::QuantisedSymm16>(
293 armnn::IWorkloadFactory& workloadFactory,
294 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
295
296template LayerTestResult<int32_t, 3>
Francis Murtagh1939df52019-11-13 15:21:09 +0000297ArgMinSimpleTest<armnn::DataType::Signed32>(
298 armnn::IWorkloadFactory& workloadFactory,
299 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
300
301template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100302ArgMinChannelTest<armnn::DataType::Float32>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100303 armnn::IWorkloadFactory& workloadFactory,
304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
305
306template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100307ArgMinChannelTest<armnn::DataType::QuantisedAsymm8>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100308 armnn::IWorkloadFactory& workloadFactory,
309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
310
311template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100312ArgMinChannelTest<armnn::DataType::QuantisedSymm16>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100313 armnn::IWorkloadFactory& workloadFactory,
314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
315
316template LayerTestResult<int32_t, 3>
Francis Murtagh1939df52019-11-13 15:21:09 +0000317ArgMinChannelTest<armnn::DataType::Signed32>(
318 armnn::IWorkloadFactory& workloadFactory,
319 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
320
321template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100322ArgMaxChannelTest<armnn::DataType::Float32>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100323 armnn::IWorkloadFactory& workloadFactory,
324 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
325
326template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100327ArgMaxChannelTest<armnn::DataType::QuantisedAsymm8>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100328 armnn::IWorkloadFactory& workloadFactory,
329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
330
331template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100332ArgMaxChannelTest<armnn::DataType::QuantisedSymm16>(
Nikhil Raj68c2c902019-09-19 11:21:11 +0100333 armnn::IWorkloadFactory& workloadFactory,
James Conroyd47a0642019-09-17 14:22:06 +0100334 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
335
336template LayerTestResult<int32_t, 3>
Francis Murtagh1939df52019-11-13 15:21:09 +0000337ArgMaxChannelTest<armnn::DataType::Signed32>(
338 armnn::IWorkloadFactory& workloadFactory,
339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
340
341template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100342ArgMaxHeightTest<armnn::DataType::Float32>(
343 armnn::IWorkloadFactory& workloadFactory,
344 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
345
346template LayerTestResult<int32_t, 3>
Francis Murtagh1939df52019-11-13 15:21:09 +0000347ArgMaxHeightTest<armnn::DataType::Signed32>(
348 armnn::IWorkloadFactory& workloadFactory,
349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
350
351template LayerTestResult<int32_t, 3>
Francis Murtagh52ec3462019-11-19 12:24:19 +0000352ArgMaxHeightTest<armnn::DataType::QuantisedAsymm8>(
353 armnn::IWorkloadFactory& workloadFactory,
354 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
355
356template LayerTestResult<int32_t, 3>
James Conroyd47a0642019-09-17 14:22:06 +0100357ArgMinWidthTest<armnn::DataType::Float32>(
358 armnn::IWorkloadFactory& workloadFactory,
359 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
Francis Murtagh1939df52019-11-13 15:21:09 +0000360
361template LayerTestResult<int32_t, 3>
362ArgMinWidthTest<armnn::DataType::Signed32>(
363 armnn::IWorkloadFactory& workloadFactory,
364 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
Francis Murtagh52ec3462019-11-19 12:24:19 +0000365
366template LayerTestResult<int32_t, 3>
367ArgMinWidthTest<armnn::DataType::QuantisedAsymm8>(
368 armnn::IWorkloadFactory& workloadFactory,
369 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);