ArmNN
 20.02
SliceTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2019 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SliceTestImpl.hpp"
7 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
14 
15 #include <test/TensorHelpers.hpp>
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  boost::multi_array<T, NumDims> input =
43  MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
44 
45  LayerTestResult<T, NumDims> result(outputInfo);
46  result.outputExpected =
47  MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
48 
49  std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
50  std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
51 
53  AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
54  AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
55 
56  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSlice(descriptor, info);
57 
58  inputHandle->Allocate();
59  outputHandle->Allocate();
60 
61  CopyDataToITensorHandle(inputHandle.get(), input.data());
62 
63  ExecuteWorkload(*workload, memoryManager);
64 
65  CopyDataFromITensorHandle(result.output.data(), outputHandle.get());
66 
67  return result;
68 }
69 
70 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
71 LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
73 {
74  armnn::TensorShape inputShape = { 3, 2, 3, 5 };
75  armnn::TensorShape outputShape = { 2, 1, 2, 3 };
76 
78  desc.m_Parameters.m_Begin = { 1, 0, 1, 2 };
79  desc.m_Parameters.m_Size = { 2, 1, 2, 3 };
80 
81  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
82  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
83 
84  std::vector<float> input =
85  {
86  0.f, 1.f, 2.f, 3.f, 4.f,
87  5.f, 6.f, 7.f, 8.f, 9.f,
88  10.f, 11.f, 12.f, 13.f, 14.f,
89 
90  15.f, 16.f, 17.f, 18.f, 19.f,
91  20.f, 21.f, 22.f, 23.f, 24.f,
92  25.f, 26.f, 27.f, 28.f, 29.f,
93 
94 
95  30.f, 31.f, 32.f, 33.f, 34.f,
96  35.f, 36.f, 37.f, 38.f, 39.f,
97  40.f, 41.f, 42.f, 43.f, 44.f,
98 
99  45.f, 46.f, 47.f, 48.f, 49.f,
100  50.f, 51.f, 52.f, 53.f, 54.f,
101  55.f, 56.f, 57.f, 58.f, 59.f,
102 
103 
104  60.f, 61.f, 62.f, 63.f, 64.f,
105  65.f, 66.f, 67.f, 68.f, 69.f,
106  70.f, 71.f, 72.f, 73.f, 74.f,
107 
108  75.f, 76.f, 77.f, 78.f, 79.f,
109  80.f, 81.f, 82.f, 83.f, 84.f,
110  85.f, 86.f, 87.f, 88.f, 89.f
111  };
112 
113  std::vector<float> expectedOutput =
114  {
115  37.f, 38.f, 39.f,
116  42.f, 43.f, 44.f,
117 
118 
119  67.f, 68.f, 69.f,
120  72.f, 73.f, 74.f
121  };
122 
123  return SliceTestImpl<T, 4>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
124 }
125 
126 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
127 LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
129 {
130  armnn::TensorShape inputShape = { 2, 3, 5 };
131  armnn::TensorShape outputShape = { 1, 2, 3 };
132 
134  desc.m_Parameters.m_Begin = { 0, 1, 2 };
135  desc.m_Parameters.m_Size = { 1, 2, 3 };
136 
137  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
138  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
139 
140  std::vector<float> input =
141  {
142  0.f, 1.f, 2.f, 3.f, 4.f,
143  5.f, 6.f, 7.f, 8.f, 9.f,
144  10.f, 11.f, 12.f, 13.f, 14.f,
145 
146  15.f, 16.f, 17.f, 18.f, 19.f,
147  20.f, 21.f, 22.f, 23.f, 24.f,
148  25.f, 26.f, 27.f, 28.f, 29.f,
149  };
150 
151  std::vector<float> expectedOutput =
152  {
153  7.f, 8.f, 9.f,
154  12.f, 13.f, 14.f
155  };
156 
157  return SliceTestImpl<T, 3>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
158 }
159 
160 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
161 LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
163 {
164  armnn::TensorShape inputShape = { 3, 5 };
165  armnn::TensorShape outputShape = { 2, 3 };
166 
168  desc.m_Parameters.m_Begin = { 1, 2 };
169  desc.m_Parameters.m_Size = { 2, 3 };
170 
171  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
172  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
173 
174  std::vector<float> input =
175  {
176  0.f, 1.f, 2.f, 3.f, 4.f,
177  5.f, 6.f, 7.f, 8.f, 9.f,
178  10.f, 11.f, 12.f, 13.f, 14.f
179  };
180 
181  std::vector<float> expectedOutput =
182  {
183  7.f, 8.f, 9.f,
184  12.f, 13.f, 14.f
185  };
186 
187  return SliceTestImpl<T, 2>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
188 }
189 
190 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
191 LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
193 {
194  armnn::TensorShape inputShape = { 5 };
195  armnn::TensorShape outputShape = { 3 };
196 
198  desc.m_Parameters.m_Begin = { 2 };
199  desc.m_Parameters.m_Size = { 3 };
200 
201  armnn::TensorInfo inputInfo(inputShape, ArmnnType);
202  armnn::TensorInfo outputInfo(outputShape, ArmnnType);
203 
204  std::vector<float> input =
205  {
206  0.f, 1.f, 2.f, 3.f, 4.f
207  };
208 
209  std::vector<float> expectedOutput =
210  {
211  2.f, 3.f, 4.f
212  };
213 
214  return SliceTestImpl<T, 1>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
215 }
216 
217 } // anonymous namespace
218 
219 // Float32 tests
222 {
223  return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
224 }
225 
228 {
229  return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
230 }
231 
234 {
235  return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
236 }
237 
240 {
241  return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
242 }
243 
244 // Uint8 tests
247 {
248  return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
249 }
250 
253 {
254  return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
255 }
256 
259 {
260  return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
261 }
262 
265 {
266  return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
267 }
268 
269 // Int16 tests
272 {
273  return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
274 }
275 
278 {
279  return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
280 }
281 
284 {
285  return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
286 }
287 
290 {
291  return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
292 }
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)
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)
std::vector< unsigned int > m_Begin
Beginning indices of the slice in each dimension.
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:259
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
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)
virtual std::unique_ptr< IWorkload > CreateSlice(const SliceQueueDescriptor &descriptor, const WorkloadInfo &info) const
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:275
LayerTestResult< uint8_t, 2 > Slice2dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 1 > Slice1dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)