ArmNN
 21.08
MeanTestImpl.hpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include "LayerTestResult.hpp"
9 
10 #include <ResolveType.hpp>
11 
14 
15 namespace
16 {
17 
18 template<armnn::DataType ArmnnType, typename T, std::size_t InputDim, std::size_t OutputDim>
19 LayerTestResult<T, OutputDim> MeanTestHelper(
20  armnn::IWorkloadFactory& workloadFactory,
22  const armnn::ITensorHandleFactory& tensorHandleFactory,
23  const unsigned int* inputShape,
24  const std::vector<float>& inputData,
25  const std::vector<unsigned int>& axis,
26  bool keepDims,
27  const unsigned int* outputShape,
28  const std::vector<float>& outputData,
29  float scale = 1.0f,
30  int32_t offset = 0)
31 {
32  IgnoreUnused(memoryManager);
33 
34  armnn::TensorInfo inputTensorInfo(InputDim, inputShape, ArmnnType);
35  armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, ArmnnType);
36 
37  inputTensorInfo.SetQuantizationScale(scale);
38  inputTensorInfo.SetQuantizationOffset(offset);
39 
40  outputTensorInfo.SetQuantizationScale(scale);
41  outputTensorInfo.SetQuantizationOffset(offset);
42 
43  auto input = ConvertToDataType<ArmnnType>(inputData, inputTensorInfo);
44 
45  std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
46  std::vector<T> expectedOutput = ConvertToDataType<ArmnnType>(outputData, outputTensorInfo);
47 
48  std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
49  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
50 
52  data.m_Parameters.m_Axis = axis;
53  data.m_Parameters.m_KeepDims = keepDims;
55  AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
56  AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
57 
58  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMean(data, info);
59 
60  inputHandle->Allocate();
61  outputHandle->Allocate();
62 
63  CopyDataToITensorHandle(inputHandle.get(), input.data());
64 
65  workload->PostAllocationConfigure();
66  workload->Execute();
67 
68  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
69 
70  return LayerTestResult<T, OutputDim>(actualOutput,
71  expectedOutput,
72  outputHandle->GetShape(),
73  outputTensorInfo.GetShape());
74 }
75 
76 } // anonymous namespace
77 
78 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
80  armnn::IWorkloadFactory& workloadFactory,
82  const armnn::ITensorHandleFactory& tensorHandleFactory)
83 {
84  const unsigned int inputShape[] = { 3, 2 };
85  const unsigned int outputShape[] = { 1 };
86 
87  std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
88  std::vector<float> output({ 2.5f });
89 
90  return MeanTestHelper<ArmnnType, T, 2, 1>(
91  workloadFactory, memoryManager, tensorHandleFactory, inputShape, input, {}, false, outputShape, output);
92 }
93 
94 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
96  armnn::IWorkloadFactory& workloadFactory,
98  const armnn::ITensorHandleFactory& tensorHandleFactory)
99 {
100  const unsigned int inputShape[] = { 2, 3, 1, 2 };
101  const unsigned int outputShape[] = { 3, 1, 2 };
102 
103  std::vector<float> input({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f });
104  std::vector<float> output({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f });
105 
106  return MeanTestHelper<ArmnnType, T, 4, 3>(
107  workloadFactory, memoryManager, tensorHandleFactory, inputShape, input, { 0 }, false, outputShape, output);
108 }
109 
110 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
112  armnn::IWorkloadFactory& workloadFactory,
114  const armnn::ITensorHandleFactory& tensorHandleFactory)
115 {
116  const unsigned int inputShape[] = { 1, 1, 3, 2 };
117  const unsigned int outputShape[] = { 1, 1, 1, 2 };
118 
119  std::vector<float> input({ 1.5f, 1.5f, 2.5f, 2.5f, 3.5f, 3.5f });
120  std::vector<float> output({ 2.5f, 2.5f });
121 
122  return MeanTestHelper<ArmnnType, T, 4, 4>(
123  workloadFactory, memoryManager, tensorHandleFactory, inputShape, input, { 2 }, true, outputShape, output);
124 }
125 
126 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
128  armnn::IWorkloadFactory& workloadFactory,
130  const armnn::ITensorHandleFactory& tensorHandleFactory)
131 {
132  const unsigned int inputShape[] = { 2, 3, 1, 2 };
133  const unsigned int outputShape[] = { 1, 3, 1, 1 };
134 
135  std::vector<float> input({ 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5f, 1.5f, 2.5f, 3.5f, 4.5f, 5.5f, 6.5 });
136  std::vector<float> output({ 2.0f, 4.0f, 6.0f });
137 
138  return MeanTestHelper<ArmnnType, T, 4, 4>(
139  workloadFactory, memoryManager, tensorHandleFactory,
140  inputShape, input, { 0, 3 }, true, outputShape, output);
141 }
142 
143 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
145  armnn::IWorkloadFactory& workloadFactory,
147  const armnn::ITensorHandleFactory& tensorHandleFactory)
148 {
149  const unsigned int inputShape[] = { 4, 3, 2 };
150  const unsigned int outputShape[] = { 2 };
151 
152  std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
153  15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
154  std::vector<float> output({ 12.0f, 13.0f });
155 
156  return MeanTestHelper<ArmnnType, T, 3, 1>(
157  workloadFactory, memoryManager, tensorHandleFactory,
158  inputShape, input, { 0, 1 }, false, outputShape, output);
159 }
160 
161 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
163  armnn::IWorkloadFactory& workloadFactory,
165  const armnn::ITensorHandleFactory& tensorHandleFactory)
166 {
167  const unsigned int inputShape[] = { 4, 3, 2 };
168  const unsigned int outputShape[] = { 1, 3, 1 };
169 
170  std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
171  15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
172  std::vector<float> output({ 10.5f, 12.5f, 14.5f });
173 
174  return MeanTestHelper<ArmnnType, T, 3, 3>(
175  workloadFactory, memoryManager, tensorHandleFactory,
176  inputShape, input, { 0, 2 }, true, outputShape, output);
177 }
178 
179 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
181  armnn::IWorkloadFactory& workloadFactory,
183  const armnn::ITensorHandleFactory& tensorHandleFactory)
184 {
185  const unsigned int inputShape[] = { 1, 2, 2, 1 };
186  const unsigned int outputShape[] = { 1, 2, 1 };
187 
188  std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f });
189  std::vector<float> output({ 1.5f, 3.5f });
190 
191  return MeanTestHelper<ArmnnType, T, 4, 3>(
192  workloadFactory, memoryManager, tensorHandleFactory, inputShape, input, { 2 }, false, outputShape, output);
193 }
LayerTestResult< T, 4 > MeanKeepDimsTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 4 > MeanMultipleDimsTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< T, 1 > MeanVts1Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void IgnoreUnused(Ts &&...)
std::vector< unsigned int > m_Axis
Values for the dimensions to reduce.
LayerTestResult< T, 3 > MeanVts2Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
bool m_KeepDims
Enable/disable keep dimensions. If true, then the reduced dimensions that are of length 1 are kept...
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
LayerTestResult< T, 3 > MeanVts3Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
LayerTestResult< T, 3 > MeanSimpleAxisTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
virtual std::unique_ptr< IWorkload > CreateMean(const MeanQueueDescriptor &descriptor, const WorkloadInfo &Info) const
Contains information about TensorInfos of a layer.
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
LayerTestResult< T, 1 > MeanSimpleTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)