xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/ReshapeTestImpl.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "ReshapeTestImpl.hpp"
7 
8 #include <DataTypeUtils.hpp>
9 #include <armnnTestUtils/TensorCopyUtils.hpp>
10 #include <armnnTestUtils/WorkloadTestUtils.hpp>
11 
12 #include <armnnTestUtils/TensorHelpers.hpp>
13 
14 namespace
15 {
16 
17 template<typename T, size_t NumDims>
SimpleReshapeTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::TensorInfo inputTensorInfo,armnn::TensorInfo outputTensorInfo,const std::vector<T> & inputData,const std::vector<T> & outputExpectedData)18 LayerTestResult<T, NumDims> SimpleReshapeTestImpl(
19     armnn::IWorkloadFactory& workloadFactory,
20     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
21     const armnn::ITensorHandleFactory& tensorHandleFactory,
22     armnn::TensorInfo inputTensorInfo,
23     armnn::TensorInfo outputTensorInfo,
24     const std::vector<T>& inputData,
25     const std::vector<T>& outputExpectedData)
26 {
27     IgnoreUnused(memoryManager);
28     std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
29 
30     std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
31     std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
32 
33     armnn::ReshapeQueueDescriptor data;
34     armnn::WorkloadInfo info;
35     AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
36     AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
37 
38     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Reshape, data, info);
39 
40     inputHandle->Allocate();
41     outputHandle->Allocate();
42 
43     CopyDataToITensorHandle(inputHandle.get(), inputData.data());
44 
45     workload->Execute();
46 
47     CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
48 
49     return LayerTestResult<T, NumDims>(actualOutput,
50                                        outputExpectedData,
51                                        outputHandle->GetShape(),
52                                        outputTensorInfo.GetShape());
53 }
54 
55 } // anonymous namespace
56 
57 template<armnn::DataType ArmnnType, typename T>
SimpleReshapeTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)58 LayerTestResult<T, 4> SimpleReshapeTest(
59     armnn::IWorkloadFactory& workloadFactory,
60     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
61     const armnn::ITensorHandleFactory& tensorHandleFactory)
62 {
63     armnn::TensorInfo inputTensorInfo;
64     armnn::TensorInfo outputTensorInfo;
65 
66     unsigned int inputShape[] = { 2, 2, 3, 3 };
67     unsigned int outputShape[] = { 2, 2, 9, 1 };
68 
69     inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
70     inputTensorInfo.SetQuantizationScale(1.0f);
71     outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
72     outputTensorInfo.SetQuantizationScale(1.0f);
73 
74     auto input = ConvertToDataType<ArmnnType>(
75         {
76             0.0f, 1.0f, 2.0f,
77             3.0f, 4.0f, 5.0f,
78             6.0f, 7.0f, 8.0f,
79 
80             9.0f, 10.0f, 11.0f,
81             12.0f, 13.0f, 14.0f,
82             15.0f, 16.0f, 17.0f,
83 
84             18.0f, 19.0f, 20.0f,
85             21.0f, 22.0f, 23.0f,
86             24.0f, 25.0f, 26.0f,
87 
88             27.0f, 28.0f, 29.0f,
89             30.0f, 31.0f, 32.0f,
90             33.0f, 34.0f, 35.0f,
91         },
92         inputTensorInfo);
93 
94     auto outputExpected = ConvertToDataType<ArmnnType>(
95         {
96             0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
97 
98             9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
99 
100             18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f,
101 
102             27.0f, 28.0f, 29.0f, 30.0f, 31.0f, 32.0f, 33.0f, 34.0f, 35.0f,
103         },
104         outputTensorInfo);
105 
106     return SimpleReshapeTestImpl<T, 4>(
107         workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected);
108 }
109 
110 template<armnn::DataType ArmnnType, typename T>
Reshape5dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)111 LayerTestResult<T, 5> Reshape5dTest(
112     armnn::IWorkloadFactory& workloadFactory,
113     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
114     const armnn::ITensorHandleFactory& tensorHandleFactory)
115 {
116     armnn::TensorInfo inputTensorInfo;
117     armnn::TensorInfo outputTensorInfo;
118 
119     unsigned int inputShape[] = { 2, 2, 8, 1, 1 };
120     unsigned int outputShape[] = { 2, 2, 2, 2, 2 };
121 
122     inputTensorInfo = armnn::TensorInfo(5, inputShape, ArmnnType);
123     inputTensorInfo.SetQuantizationScale(1.0f);
124     outputTensorInfo = armnn::TensorInfo(5, outputShape, ArmnnType);
125     outputTensorInfo.SetQuantizationScale(1.0f);
126 
127     auto input = ConvertToDataType<ArmnnType>(
128         {
129             0.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f,
130             8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f,
131 
132             16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f,
133             24.0f, 25.0f, 26.0f, 27.0f, 28.0f, 29.0f, 30.0f, 31.0f,
134         },
135         inputTensorInfo);
136 
137     auto outputExpected = ConvertToDataType<ArmnnType>(
138         {
139             0.0f, 1.0f,
140             2.0f, 3.0f,
141 
142             4.0f, 5.0f,
143             6.0f, 7.0f,
144 
145 
146             8.0f, 9.0f,
147             10.0f, 11.0f,
148 
149             12.0f, 13.0f,
150             14.0f, 15.0f,
151 
152 
153 
154             16.0f, 17.0f,
155             18.0f, 19.0f,
156 
157             20.0f, 21.0f,
158             22.0f, 23.0f,
159 
160 
161             24.0f, 25.0f,
162             26.0f, 27.0f,
163 
164             28.0f, 29.0f,
165             30.0f, 31.0f,
166         },
167         outputTensorInfo);
168 
169     return SimpleReshapeTestImpl<T, 5>(
170         workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected);
171 }
172 
ReshapeBooleanTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)173 LayerTestResult<uint8_t, 2> ReshapeBooleanTest(
174     armnn::IWorkloadFactory& workloadFactory,
175     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
176     const armnn::ITensorHandleFactory& tensorHandleFactory)
177 {
178     armnn::TensorInfo inputTensorInfo;
179     armnn::TensorInfo outputTensorInfo;
180 
181     unsigned int inputShape[] = { 1, 4 };
182     unsigned int outputShape[] = { 2, 2 };
183 
184     inputTensorInfo = armnn::TensorInfo(2, inputShape, armnn::DataType::Boolean);
185     inputTensorInfo.SetQuantizationScale(1.0f);
186     outputTensorInfo = armnn::TensorInfo(2, outputShape, armnn::DataType::Boolean);
187     outputTensorInfo.SetQuantizationScale(1.0f);
188 
189     const std::vector<uint8_t> input = { true, false, false, true };
190 
191     const std::vector<uint8_t> outputExpected = { true, false, false, true };
192 
193     return SimpleReshapeTestImpl<uint8_t, 2>(
194         workloadFactory, memoryManager, tensorHandleFactory, inputTensorInfo, outputTensorInfo, input, outputExpected);
195 }
196 
197 //
198 // Explicit template specializations
199 //
200 
201 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
202 SimpleReshapeTest<armnn::DataType::Float32>(
203     armnn::IWorkloadFactory& workloadFactory,
204     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
205     const armnn::ITensorHandleFactory& tensorHandleFactory);
206 
207 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
208 SimpleReshapeTest<armnn::DataType::QAsymmS8>(
209     armnn::IWorkloadFactory& workloadFactory,
210     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
211     const armnn::ITensorHandleFactory& tensorHandleFactory);
212 
213 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
214 SimpleReshapeTest<armnn::DataType::QAsymmU8>(
215     armnn::IWorkloadFactory& workloadFactory,
216     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
217     const armnn::ITensorHandleFactory& tensorHandleFactory);
218 
219 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
220 SimpleReshapeTest<armnn::DataType::QSymmS16>(
221     armnn::IWorkloadFactory& workloadFactory,
222     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
223     const armnn::ITensorHandleFactory& tensorHandleFactory);
224 
225 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 5>
226 Reshape5dTest<armnn::DataType::Float32>(
227     armnn::IWorkloadFactory& workloadFactory,
228     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
229     const armnn::ITensorHandleFactory& tensorHandleFactory);
230 
231 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 5>
232 Reshape5dTest<armnn::DataType::QAsymmS8>(
233     armnn::IWorkloadFactory& workloadFactory,
234     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
235     const armnn::ITensorHandleFactory& tensorHandleFactory);
236 
237 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 5>
238 Reshape5dTest<armnn::DataType::QAsymmU8>(
239     armnn::IWorkloadFactory& workloadFactory,
240     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
241     const armnn::ITensorHandleFactory& tensorHandleFactory);
242 
243 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 5>
244 Reshape5dTest<armnn::DataType::QSymmS16>(
245     armnn::IWorkloadFactory& workloadFactory,
246     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
247     const armnn::ITensorHandleFactory& tensorHandleFactory);
248