ArmNN
 22.02
ArgMinMaxTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "ArgMinMaxTestImpl.hpp"
7 
8 
9 #include <DataTypeUtils.hpp>
12 
14 
15 namespace
16 {
17 
18 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
19 LayerTestResult<int32_t, 3> ArgMinMaxTestCommon(
20  armnn::IWorkloadFactory& workloadFactory,
22  const armnn::ITensorHandleFactory& tensorHandleFactory,
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 {
30  std::vector<T> inputTensor = ConvertToDataType<ArmnnType>(inputData, inputTensorInfo);
31  std::vector<int32_t> actualOutput(outputTensorInfo.GetNumElements());
32 
33  std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
34  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
35 
37  descriptor.m_Parameters.m_Function = argMinMaxFunction;
38  descriptor.m_Parameters.m_Axis = axis;
40 
41  AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
42  AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
43 
44  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::ArgMinMax,
45  descriptor, info);
46 
47  inputHandle->Allocate();
48  outputHandle->Allocate();
49 
50  CopyDataToITensorHandle(inputHandle.get(), inputTensor.data());
51 
52  workload->PostAllocationConfigure();
53  workload->Execute();
54 
55  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
56 
57  return LayerTestResult<int32_t, 3>(actualOutput,
58  outputData,
59  outputHandle->GetShape(),
60  outputTensorInfo.GetShape());
61 }
62 
63 } // namespace
64 
65 template<armnn::DataType ArmnnType, typename T>
67  armnn::IWorkloadFactory& workloadFactory,
69  const armnn::ITensorHandleFactory& tensorHandleFactory)
70 {
71  const armnn::TensorShape inputShape{ 1, 1, 1, 5 };
72  const armnn::TensorShape outputShape{ 1, 1, 1 };
73 
74  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
75 
76  if (armnn::IsQuantizedType<T>())
77  {
78  inputTensorInfo.SetQuantizationScale(1.0f);
79  inputTensorInfo.SetQuantizationOffset(0);
80  }
81 
82  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
83 
84  std::vector<float> inputValues({ 5.0f, 2.0f, 8.0f, 10.0f, 9.0f });
85  std::vector<int32_t> outputValues({ 3 });
86 
87  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
89  inputTensorInfo, outputTensorInfo,
90  inputValues, outputValues, -1); // axis -1 === 3
91 }
92 
93 template<armnn::DataType ArmnnType, typename T>
95  armnn::IWorkloadFactory& workloadFactory,
97  const armnn::ITensorHandleFactory& tensorHandleFactory)
98 {
99  const armnn::TensorShape inputShape{ 1, 1, 1, 5 };
100  const armnn::TensorShape outputShape{ 1, 1, 1 };
101 
102  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
103 
104  if (armnn::IsQuantizedType<T>())
105  {
106  inputTensorInfo.SetQuantizationScale(1.0f);
107  inputTensorInfo.SetQuantizationOffset(0);
108  }
109 
110  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
111 
112  std::vector<float> inputValues({ 5.0f, 2.0f, 8.0f, 10.0f, 9.0f });
113  std::vector<int32_t> outputValues({ 1 });
114 
115  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
117  inputTensorInfo, outputTensorInfo,
118  inputValues, outputValues, 3);
119 }
120 
121 template<armnn::DataType ArmnnType, typename T>
123  armnn::IWorkloadFactory& workloadFactory,
125  const armnn::ITensorHandleFactory& tensorHandleFactory)
126 {
127  const armnn::TensorShape inputShape{ 1, 3, 2, 4};
128  const armnn::TensorShape outputShape{ 1, 2, 4 };
129 
130  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
131 
132  if (armnn::IsQuantizedType<T>())
133  {
134  inputTensorInfo.SetQuantizationScale(1.0f);
135  inputTensorInfo.SetQuantizationOffset(0);
136  }
137 
138  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
139 
140  std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
141  5.0f, 6.0f, 7.0f, 8.0f,
142 
143  10.0f, 20.0f, 30.0f, 40.0f,
144  50.0f, 60.0f, 70.0f, 80.0f,
145 
146  100.0f, 200.0f, 300.0f, 400.0f,
147  500.0f, 600.0f, 700.0f, 800.0f });
148  std::vector<int32_t> outputValues({ 0, 0, 0, 0,
149  0, 0, 0, 0 });
150 
151  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
153  inputTensorInfo, outputTensorInfo,
154  inputValues, outputValues, 1);
155 }
156 
157 template<armnn::DataType ArmnnType, typename T>
159  armnn::IWorkloadFactory& workloadFactory,
161  const armnn::ITensorHandleFactory& tensorHandleFactory)
162 {
163  const armnn::TensorShape inputShape{ 1, 3, 2, 4};
164  const armnn::TensorShape outputShape{ 1, 2, 4 };
165 
166  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
167 
168  if (armnn::IsQuantizedType<T>())
169  {
170  inputTensorInfo.SetQuantizationScale(1.0f);
171  inputTensorInfo.SetQuantizationOffset(0);
172  }
173 
174  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
175 
176  std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
177  5.0f, 6.0f, 7.0f, 8.0f,
178 
179  10.0f, 20.0f, 30.0f, 40.0f,
180  50.0f, 60.0f, 70.0f, 80.0f,
181 
182  100.0f, 200.0f, 300.0f, 400.0f,
183  500.0f, 600.0f, 700.0f, 800.0f });
184  std::vector<int32_t> outputValues({ 2, 2, 2, 2,
185  2, 2, 2, 2 });
186 
187  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
189  inputTensorInfo, outputTensorInfo,
190  inputValues, outputValues, 1);
191 }
192 
193 template<armnn::DataType ArmnnType, typename T>
195  armnn::IWorkloadFactory& workloadFactory,
197  const armnn::ITensorHandleFactory& tensorHandleFactory)
198 {
199  const armnn::TensorShape inputShape{ 1, 3, 2, 4};
200  const armnn::TensorShape outputShape{ 1, 3, 4 };
201 
202  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
203  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
204 
205  if (armnn::IsQuantizedType<T>())
206  {
207  inputTensorInfo.SetQuantizationScale(1.0f);
208  inputTensorInfo.SetQuantizationOffset(0);
209  }
210 
211  std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
212  5.0f, 6.0f, 7.0f, 8.0f,
213 
214  10.0f, 20.0f, 30.0f, 40.0f,
215  50.0f, 60.0f, 70.0f, 80.0f,
216 
217  100.0f, 200.0f, 300.0f, 400.0f,
218  500.0f, 600.0f, 700.0f, 800.0f });
219  std::vector<int32_t> outputValues({ 1, 1, 1, 1,
220  1, 1, 1, 1,
221  1, 1, 1, 1 });
222 
223  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
225  inputTensorInfo, outputTensorInfo,
226  inputValues, outputValues, 2);
227 }
228 
229 template<armnn::DataType ArmnnType, typename T>
231  armnn::IWorkloadFactory& workloadFactory,
233  const armnn::ITensorHandleFactory& tensorHandleFactory)
234 {
235  const armnn::TensorShape inputShape{ 1, 3, 2, 4};
236  const armnn::TensorShape outputShape{ 1, 3, 2 };
237 
238  armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
239  armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
240 
241  if (armnn::IsQuantizedType<T>())
242  {
243  inputTensorInfo.SetQuantizationScale(1.0f);
244  inputTensorInfo.SetQuantizationOffset(0);
245  }
246 
247  std::vector<float> inputValues({ 1.0f, 2.0f, 3.0f, 4.0f,
248  5.0f, 6.0f, 7.0f, 8.0f,
249 
250  10.0f, 20.0f, 30.0f, 40.0f,
251  50.0f, 60.0f, 70.0f, 80.0f,
252 
253  100.0f, 200.0f, 300.0f, 400.0f,
254  500.0f, 600.0f, 700.0f, 800.0f });
255  std::vector<int32_t> outputValues({ 0, 0,
256  0, 0,
257  0, 0 });
258 
259  return ArgMinMaxTestCommon<ArmnnType>(workloadFactory, memoryManager, tensorHandleFactory,
261  inputTensorInfo, outputTensorInfo,
262  inputValues, outputValues, 3);
263 }
264 
265 
266 // Explicit template specializations
267 
269 ArgMaxSimpleTest<armnn::DataType::Float32>(
270  armnn::IWorkloadFactory& workloadFactory,
272  const armnn::ITensorHandleFactory& tensorHandleFactory);
273 
275 ArgMaxSimpleTest<armnn::DataType::Float16>(
276  armnn::IWorkloadFactory& workloadFactory,
278  const armnn::ITensorHandleFactory& tensorHandleFactory);
279 
281 ArgMaxSimpleTest<armnn::DataType::QAsymmS8>(
282  armnn::IWorkloadFactory& workloadFactory,
284  const armnn::ITensorHandleFactory& tensorHandleFactory);
285 
287 ArgMaxSimpleTest<armnn::DataType::QAsymmU8>(
288  armnn::IWorkloadFactory& workloadFactory,
290  const armnn::ITensorHandleFactory& tensorHandleFactory);
291 
293 ArgMaxSimpleTest<armnn::DataType::QSymmS16>(
294  armnn::IWorkloadFactory& workloadFactory,
296  const armnn::ITensorHandleFactory& tensorHandleFactory);
297 
299 ArgMaxSimpleTest<armnn::DataType::Signed32>(
300  armnn::IWorkloadFactory& workloadFactory,
302  const armnn::ITensorHandleFactory& tensorHandleFactory);
303 
305 ArgMinSimpleTest<armnn::DataType::Float32>(
306  armnn::IWorkloadFactory& workloadFactory,
308  const armnn::ITensorHandleFactory& tensorHandleFactory);
309 
311 ArgMinSimpleTest<armnn::DataType::Float16>(
312  armnn::IWorkloadFactory& workloadFactory,
314  const armnn::ITensorHandleFactory& tensorHandleFactory);
315 
317 ArgMinSimpleTest<armnn::DataType::QAsymmS8>(
318  armnn::IWorkloadFactory& workloadFactory,
320  const armnn::ITensorHandleFactory& tensorHandleFactory);
321 
323 ArgMinSimpleTest<armnn::DataType::QAsymmU8>(
324  armnn::IWorkloadFactory& workloadFactory,
326  const armnn::ITensorHandleFactory& tensorHandleFactory);
327 
329 ArgMinSimpleTest<armnn::DataType::QSymmS16>(
330  armnn::IWorkloadFactory& workloadFactory,
332  const armnn::ITensorHandleFactory& tensorHandleFactory);
333 
335 ArgMinSimpleTest<armnn::DataType::Signed32>(
336  armnn::IWorkloadFactory& workloadFactory,
338  const armnn::ITensorHandleFactory& tensorHandleFactory);
339 
341 ArgMinChannelTest<armnn::DataType::Float32>(
342  armnn::IWorkloadFactory& workloadFactory,
344  const armnn::ITensorHandleFactory& tensorHandleFactory);
345 
347 ArgMinChannelTest<armnn::DataType::Float16>(
348  armnn::IWorkloadFactory& workloadFactory,
350  const armnn::ITensorHandleFactory& tensorHandleFactory);
351 
353 ArgMinChannelTest<armnn::DataType::QAsymmS8>(
354  armnn::IWorkloadFactory& workloadFactory,
356  const armnn::ITensorHandleFactory& tensorHandleFactory);
357 
359 ArgMinChannelTest<armnn::DataType::QAsymmU8>(
360  armnn::IWorkloadFactory& workloadFactory,
362  const armnn::ITensorHandleFactory& tensorHandleFactory);
363 
365 ArgMinChannelTest<armnn::DataType::QSymmS16>(
366  armnn::IWorkloadFactory& workloadFactory,
368  const armnn::ITensorHandleFactory& tensorHandleFactory);
369 
371 ArgMinChannelTest<armnn::DataType::Signed32>(
372  armnn::IWorkloadFactory& workloadFactory,
374  const armnn::ITensorHandleFactory& tensorHandleFactory);
375 
377 ArgMaxChannelTest<armnn::DataType::Float32>(
378  armnn::IWorkloadFactory& workloadFactory,
380  const armnn::ITensorHandleFactory& tensorHandleFactory);
381 
383 ArgMaxChannelTest<armnn::DataType::Float16>(
384  armnn::IWorkloadFactory& workloadFactory,
386  const armnn::ITensorHandleFactory& tensorHandleFactory);
387 
389 ArgMaxChannelTest<armnn::DataType::QAsymmS8>(
390  armnn::IWorkloadFactory& workloadFactory,
392  const armnn::ITensorHandleFactory& tensorHandleFactory);
393 
395 ArgMaxChannelTest<armnn::DataType::QAsymmU8>(
396  armnn::IWorkloadFactory& workloadFactory,
398  const armnn::ITensorHandleFactory& tensorHandleFactory);
399 
401 ArgMaxChannelTest<armnn::DataType::QSymmS16>(
402  armnn::IWorkloadFactory& workloadFactory,
404  const armnn::ITensorHandleFactory& tensorHandleFactory);
405 
407 ArgMaxChannelTest<armnn::DataType::Signed32>(
408  armnn::IWorkloadFactory& workloadFactory,
410  const armnn::ITensorHandleFactory& tensorHandleFactory);
411 
413 ArgMaxHeightTest<armnn::DataType::Float32>(
414  armnn::IWorkloadFactory& workloadFactory,
416  const armnn::ITensorHandleFactory& tensorHandleFactory);
417 
419 ArgMaxHeightTest<armnn::DataType::Float16>(
420  armnn::IWorkloadFactory& workloadFactory,
422  const armnn::ITensorHandleFactory& tensorHandleFactory);
423 
425 ArgMaxHeightTest<armnn::DataType::Signed32>(
426  armnn::IWorkloadFactory& workloadFactory,
428  const armnn::ITensorHandleFactory& tensorHandleFactory);
429 
431 ArgMaxHeightTest<armnn::DataType::QAsymmS8>(
432  armnn::IWorkloadFactory& workloadFactory,
434  const armnn::ITensorHandleFactory& tensorHandleFactory);
435 
437 ArgMaxHeightTest<armnn::DataType::QAsymmU8>(
438  armnn::IWorkloadFactory& workloadFactory,
440  const armnn::ITensorHandleFactory& tensorHandleFactory);
441 
443 ArgMinWidthTest<armnn::DataType::Float32>(
444  armnn::IWorkloadFactory& workloadFactory,
446  const armnn::ITensorHandleFactory& tensorHandleFactory);
447 
449 ArgMinWidthTest<armnn::DataType::Float16>(
450  armnn::IWorkloadFactory& workloadFactory,
452  const armnn::ITensorHandleFactory& tensorHandleFactory);
453 
455 ArgMinWidthTest<armnn::DataType::Signed32>(
456  armnn::IWorkloadFactory& workloadFactory,
458  const armnn::ITensorHandleFactory& tensorHandleFactory);
459 
461 ArgMinWidthTest<armnn::DataType::QAsymmS8>(
462  armnn::IWorkloadFactory& workloadFactory,
464  const armnn::ITensorHandleFactory& tensorHandleFactory);
465 
467 ArgMinWidthTest<armnn::DataType::QAsymmU8>(
468  armnn::IWorkloadFactory& workloadFactory,
470  const armnn::ITensorHandleFactory& tensorHandleFactory);
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
LayerTestResult< int32_t, 3 > ArgMaxSimpleTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
ArgMinMaxFunction m_Function
Specify if the function is to find Min or Max.
Definition: Descriptors.hpp:81
LayerTestResult< int32_t, 3 > ArgMaxHeightTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< int32_t, 3 > ArgMinChannelTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:475
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
ArgMinMaxFunction
Definition: Types.hpp:89
Contains information about TensorInfos of a layer.
int m_Axis
Axis to reduce across the input tensor.
Definition: Descriptors.hpp:83
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:491
LayerTestResult< int32_t, 3 > ArgMinSimpleTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
LayerTestResult< int32_t, 3 > ArgMinWidthTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
unsigned int GetNumElements() const
Definition: Tensor.hpp:196
LayerTestResult< int32_t, 3 > ArgMaxChannelTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)