ArmNN
 21.02
ReshapeTestImpl.cpp
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 #include "ReshapeTestImpl.hpp"
7 
11 
12 #include <test/TensorHelpers.hpp>
13 
14 namespace
15 {
16 
17 template<typename T, size_t NumDims>
18 LayerTestResult<T, NumDims> SimpleReshapeTestImpl(
19  armnn::IWorkloadFactory& workloadFactory,
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  auto input = MakeTensor<T, NumDims>(inputTensorInfo, inputData);
29 
30  LayerTestResult<T, NumDims> ret(outputTensorInfo);
31  ret.outputExpected = MakeTensor<T, NumDims>(outputTensorInfo, outputExpectedData);
32 
33  std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
34  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
35 
38  AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
39  AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
40 
41  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateReshape(data, info);
42 
43  inputHandle->Allocate();
44  outputHandle->Allocate();
45 
46  CopyDataToITensorHandle(inputHandle.get(), input.origin());
47 
48  workload->Execute();
49 
50  CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
51 
52  return ret;
53 }
54 
55 } // anonymous namespace
56 
57 template<armnn::DataType ArmnnType, typename T>
59  armnn::IWorkloadFactory& workloadFactory,
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>
112  armnn::IWorkloadFactory& workloadFactory,
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 
174  armnn::IWorkloadFactory& workloadFactory,
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 
202 SimpleReshapeTest<armnn::DataType::Float32>(
203  armnn::IWorkloadFactory& workloadFactory,
205  const armnn::ITensorHandleFactory& tensorHandleFactory);
206 
208 SimpleReshapeTest<armnn::DataType::QAsymmS8>(
209  armnn::IWorkloadFactory& workloadFactory,
211  const armnn::ITensorHandleFactory& tensorHandleFactory);
212 
214 SimpleReshapeTest<armnn::DataType::QAsymmU8>(
215  armnn::IWorkloadFactory& workloadFactory,
217  const armnn::ITensorHandleFactory& tensorHandleFactory);
218 
220 SimpleReshapeTest<armnn::DataType::QSymmS16>(
221  armnn::IWorkloadFactory& workloadFactory,
223  const armnn::ITensorHandleFactory& tensorHandleFactory);
224 
225 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 5>
226 Reshape5dTest<armnn::DataType::Float32>(
227  armnn::IWorkloadFactory& workloadFactory,
229  const armnn::ITensorHandleFactory& tensorHandleFactory);
230 
231 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 5>
232 Reshape5dTest<armnn::DataType::QAsymmS8>(
233  armnn::IWorkloadFactory& workloadFactory,
235  const armnn::ITensorHandleFactory& tensorHandleFactory);
236 
237 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 5>
238 Reshape5dTest<armnn::DataType::QAsymmU8>(
239  armnn::IWorkloadFactory& workloadFactory,
241  const armnn::ITensorHandleFactory& tensorHandleFactory);
242 
243 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 5>
244 Reshape5dTest<armnn::DataType::QSymmS16>(
245  armnn::IWorkloadFactory& workloadFactory,
247  const armnn::ITensorHandleFactory& tensorHandleFactory);
LayerTestResult< uint8_t, 2 > ReshapeBooleanTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void IgnoreUnused(Ts &&...)
LayerTestResult< T, 4 > SimpleReshapeTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:464
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
virtual std::unique_ptr< IWorkload > CreateReshape(const ReshapeQueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerTestResult< T, 5 > Reshape5dTest(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
Contains information about inputs and outputs to a layer.
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)