ArmNN
 22.08
SliceTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SliceTestImpl.hpp"
7 
9 #include <ResolveType.hpp>
10 
11 
14 
16 
17 namespace
18 {
19 
20 template<typename T, std::size_t NumDims>
21 LayerTestResult<T, NumDims> SliceTestImpl(
22  armnn::IWorkloadFactory& workloadFactory,
24  armnn::TensorInfo& inputInfo,
25  armnn::TensorInfo& outputInfo,
26  std::vector<float>& inputData,
27  std::vector<float>& expectedOutputData,
28  armnn::SliceQueueDescriptor descriptor,
29  const float qScale = 1.0f,
30  const int qOffset = 0)
31 {
32  IgnoreUnused(memoryManager);
33  if(armnn::IsQuantizedType<T>())
34  {
35  inputInfo.SetQuantizationScale(qScale);
36  inputInfo.SetQuantizationOffset(qOffset);
37 
38  outputInfo.SetQuantizationScale(qScale);
39  outputInfo.SetQuantizationOffset(qOffset);
40  }
41 
42  std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
43  std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
44  std::vector<T> actualOutput(outputInfo.GetNumElements());
45 
47  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
48  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
50 
52  AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
53  AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
54 
55  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Slice,
56  descriptor,
57  info);
58 
59  inputHandle->Allocate();
60  outputHandle->Allocate();
61 
62  CopyDataToITensorHandle(inputHandle.get(), input.data());
63 
64  ExecuteWorkload(*workload, memoryManager);
65 
66  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
67 
68  return LayerTestResult<T, NumDims>(actualOutput,
69  expectedOutput,
70  outputHandle->GetShape(),
71  outputInfo.GetShape());
72 }
73 
74 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
75 LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
77 {
78  armnn::TensorShape inputShape = { 3, 2, 3, 5 };
79  armnn::TensorShape outputShape = { 2, 1, 2, 3 };
80 
82  desc.m_Parameters.m_Begin = { 1, 0, 1, 2 };
83  desc.m_Parameters.m_Size = { 2, 1, 2, 3 };
84 
85  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
86  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
87 
88  std::vector<float> input =
89  {
90  0.f, 1.f, 2.f, 3.f, 4.f,
91  5.f, 6.f, 7.f, 8.f, 9.f,
92  10.f, 11.f, 12.f, 13.f, 14.f,
93 
94  15.f, 16.f, 17.f, 18.f, 19.f,
95  20.f, 21.f, 22.f, 23.f, 24.f,
96  25.f, 26.f, 27.f, 28.f, 29.f,
97 
98 
99  30.f, 31.f, 32.f, 33.f, 34.f,
100  35.f, 36.f, 37.f, 38.f, 39.f,
101  40.f, 41.f, 42.f, 43.f, 44.f,
102 
103  45.f, 46.f, 47.f, 48.f, 49.f,
104  50.f, 51.f, 52.f, 53.f, 54.f,
105  55.f, 56.f, 57.f, 58.f, 59.f,
106 
107 
108  60.f, 61.f, 62.f, 63.f, 64.f,
109  65.f, 66.f, 67.f, 68.f, 69.f,
110  70.f, 71.f, 72.f, 73.f, 74.f,
111 
112  75.f, 76.f, 77.f, 78.f, 79.f,
113  80.f, 81.f, 82.f, 83.f, 84.f,
114  85.f, 86.f, 87.f, 88.f, 89.f
115  };
116 
117  std::vector<float> expectedOutput =
118  {
119  37.f, 38.f, 39.f,
120  42.f, 43.f, 44.f,
121 
122 
123  67.f, 68.f, 69.f,
124  72.f, 73.f, 74.f
125  };
126 
127  return SliceTestImpl<T, 4>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
128 }
129 
130 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
131 LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
133 {
134  armnn::TensorShape inputShape = { 2, 3, 5 };
135  armnn::TensorShape outputShape = { 1, 2, 3 };
136 
138  desc.m_Parameters.m_Begin = { 0, 1, 2 };
139  desc.m_Parameters.m_Size = { 1, 2, 3 };
140 
141  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
142  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
143 
144  std::vector<float> input =
145  {
146  0.f, 1.f, 2.f, 3.f, 4.f,
147  5.f, 6.f, 7.f, 8.f, 9.f,
148  10.f, 11.f, 12.f, 13.f, 14.f,
149 
150  15.f, 16.f, 17.f, 18.f, 19.f,
151  20.f, 21.f, 22.f, 23.f, 24.f,
152  25.f, 26.f, 27.f, 28.f, 29.f,
153  };
154 
155  std::vector<float> expectedOutput =
156  {
157  7.f, 8.f, 9.f,
158  12.f, 13.f, 14.f
159  };
160 
161  return SliceTestImpl<T, 3>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
162 }
163 
164 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
165 LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
167 {
168  armnn::TensorShape inputShape = { 3, 5 };
169  armnn::TensorShape outputShape = { 2, 3 };
170 
172  desc.m_Parameters.m_Begin = { 1, 2 };
173  desc.m_Parameters.m_Size = { 2, 3 };
174 
175  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
176  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
177 
178  std::vector<float> input =
179  {
180  0.f, 1.f, 2.f, 3.f, 4.f,
181  5.f, 6.f, 7.f, 8.f, 9.f,
182  10.f, 11.f, 12.f, 13.f, 14.f
183  };
184 
185  std::vector<float> expectedOutput =
186  {
187  7.f, 8.f, 9.f,
188  12.f, 13.f, 14.f
189  };
190 
191  return SliceTestImpl<T, 2>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
192 }
193 
194 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
195 LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
197 {
198  armnn::TensorShape inputShape = { 5 };
199  armnn::TensorShape outputShape = { 3 };
200 
202  desc.m_Parameters.m_Begin = { 2 };
203  desc.m_Parameters.m_Size = { 3 };
204 
205  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
206  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
207 
208  std::vector<float> input =
209  {
210  0.f, 1.f, 2.f, 3.f, 4.f
211  };
212 
213  std::vector<float> expectedOutput =
214  {
215  2.f, 3.f, 4.f
216  };
217 
218  return SliceTestImpl<T, 1>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
219 }
220 
221 } // anonymous namespace
222 
223 // Float32 tests
226 {
227  return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
228 }
229 
232 {
233  return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
234 }
235 
238 {
239  return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
240 }
241 
244 {
245  return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
246 }
247 
248 // Uint8 tests
251 {
252  return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
253 }
254 
257 {
258  return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
259 }
260 
263 {
264  return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
265 }
266 
269 {
270  return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
271 }
272 
273 // Int16 tests
276 {
277  return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
278 }
279 
282 {
283  return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
284 }
285 
288 {
289  return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
290 }
291 
294 {
295  return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
296 }
LayerTestResult< uint8_t, 1 > Slice1dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< int16_t, 2 > Slice2dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > Slice4dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< int16_t, 1 > Slice1dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
#define ARMNN_NO_DEPRECATE_WARN_BEGIN
Definition: Deprecated.hpp:33
LayerTestResult< float, 2 > Slice2dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
std::vector< unsigned int > m_Size
Size of the slice in each dimension.
LayerTestResult< int16_t, 4 > Slice4dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< uint8_t, 3 > Slice3dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void IgnoreUnused(Ts &&...)
LayerTestResult< uint8_t, 4 > Slice4dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
#define ARMNN_NO_DEPRECATE_WARN_END
Definition: Deprecated.hpp:34
std::vector< unsigned int > m_Begin
Beginning indices of the slice in each dimension.
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:473
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
LayerTestResult< float, 3 > Slice3dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< int16_t, 3 > Slice3dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
Contains information about TensorInfos of a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:489
LayerTestResult< uint8_t, 2 > Slice2dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
unsigned int GetNumElements() const
Definition: Tensor.hpp:196
LayerTestResult< float, 1 > Slice1dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)