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