xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/MeanTestImpl.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #pragma once
7 
8 #include <armnnTestUtils/LayerTestResult.hpp>
9 
10 #include <ResolveType.hpp>
11 
12 #include <armnn/backends/IBackendInternal.hpp>
13 #include <armnn/backends/WorkloadFactory.hpp>
14 
15 namespace
16 {
17 
18 template<armnn::DataType ArmnnType, typename T, std::size_t InputDim, std::size_t OutputDim>
MeanTestHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const unsigned int * inputShape,const std::vector<float> & inputData,const std::vector<unsigned int> & axis,bool keepDims,const unsigned int * outputShape,const std::vector<float> & outputData,float scale=1.0f,int32_t offset=0)19 LayerTestResult<T, OutputDim> MeanTestHelper(
20         armnn::IWorkloadFactory& workloadFactory,
21         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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 
51     armnn::MeanQueueDescriptor data;
52     data.m_Parameters.m_Axis = axis;
53     data.m_Parameters.m_KeepDims = keepDims;
54     armnn::WorkloadInfo info;
55     AddInputToWorkload(data,  info, inputTensorInfo, inputHandle.get());
56     AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
57 
58     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Mean, 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>>
MeanSimpleTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)79 LayerTestResult<T, 1> MeanSimpleTest(
80         armnn::IWorkloadFactory& workloadFactory,
81         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanSimpleAxisTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)95 LayerTestResult<T, 3> MeanSimpleAxisTest(
96         armnn::IWorkloadFactory& workloadFactory,
97         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanKeepDimsTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)111 LayerTestResult<T, 4> MeanKeepDimsTest(
112         armnn::IWorkloadFactory& workloadFactory,
113         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanMultipleDimsTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)127 LayerTestResult<T, 4> MeanMultipleDimsTest(
128         armnn::IWorkloadFactory& workloadFactory,
129         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanVts1Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)144 LayerTestResult<T, 1> MeanVts1Test(
145         armnn::IWorkloadFactory& workloadFactory,
146         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanVts2Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)162 LayerTestResult<T, 3> MeanVts2Test(
163         armnn::IWorkloadFactory& workloadFactory,
164         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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>>
MeanVts3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)180 LayerTestResult<T, 3> MeanVts3Test(
181         armnn::IWorkloadFactory& workloadFactory,
182         const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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 }
194