2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
7 #include "TypeUtils.hpp"
8 #include "WorkloadTestUtils.hpp"
10 #include <armnn/ArmNN.hpp>
11 #include <armnn/Tensor.hpp>
12 #include <armnn/TypesUtils.hpp>
14 #include <backendsCommon/CpuTensorHandle.hpp>
15 #include <backendsCommon/IBackendInternal.hpp>
16 #include <backendsCommon/WorkloadFactory.hpp>
18 #include <test/TensorHelpers.hpp>
23 template<typename T, std::size_t InDim, std::size_t OutDim>
24 LayerTestResult<T, OutDim> StridedSliceTestImpl(
25 armnn::IWorkloadFactory& workloadFactory,
26 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
27 armnn::TensorInfo& inputTensorInfo,
28 armnn::TensorInfo& outputTensorInfo,
29 std::vector<float>& inputData,
30 std::vector<float>& outputExpectedData,
31 armnn::StridedSliceQueueDescriptor descriptor,
32 const float qScale = 1.0f,
33 const int32_t qOffset = 0)
35 if(armnn::IsQuantizedType<T>())
37 inputTensorInfo.SetQuantizationScale(qScale);
38 inputTensorInfo.SetQuantizationOffset(qOffset);
40 outputTensorInfo.SetQuantizationScale(qScale);
41 outputTensorInfo.SetQuantizationOffset(qOffset);
44 boost::multi_array<T, InDim> input =
45 MakeTensor<T, InDim>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
47 LayerTestResult<T, OutDim> ret(outputTensorInfo);
49 MakeTensor<T, OutDim>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, outputExpectedData));
51 std::unique_ptr<armnn::ITensorHandle> inputHandle =
52 workloadFactory.CreateTensorHandle(inputTensorInfo);
54 std::unique_ptr<armnn::ITensorHandle> outputHandle =
55 workloadFactory.CreateTensorHandle(outputTensorInfo);
57 armnn::WorkloadInfo info;
58 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
59 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
61 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateStridedSlice(descriptor, info);
63 inputHandle->Allocate();
64 outputHandle->Allocate();
66 CopyDataToITensorHandle(inputHandle.get(), input.data());
68 ExecuteWorkload(*workload, memoryManager);
70 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
75 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
76 LayerTestResult<T, 4> StridedSlice4DTest(
77 armnn::IWorkloadFactory& workloadFactory,
78 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
80 armnn::TensorInfo inputTensorInfo;
81 armnn::TensorInfo outputTensorInfo;
83 unsigned int inputShape[] = {3, 2, 3, 1};
84 unsigned int outputShape[] = {1, 2, 3, 1};
86 armnn::StridedSliceQueueDescriptor desc;
87 desc.m_Parameters.m_Begin = {1, 0, 0, 0};
88 desc.m_Parameters.m_End = {2, 2, 3, 1};
89 desc.m_Parameters.m_Stride = {1, 1, 1, 1};
91 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
92 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
94 std::vector<float> input = std::vector<float>(
96 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
98 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
100 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
103 std::vector<float> outputExpected = std::vector<float>(
105 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f
108 return StridedSliceTestImpl<T, 4, 4>(
109 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
112 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
113 LayerTestResult<T, 4> StridedSlice4DReverseTest(
114 armnn::IWorkloadFactory& workloadFactory,
115 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
117 armnn::TensorInfo inputTensorInfo;
118 armnn::TensorInfo outputTensorInfo;
120 unsigned int inputShape[] = {3, 2, 3, 1};
121 unsigned int outputShape[] = {1, 2, 3, 1};
123 armnn::StridedSliceQueueDescriptor desc;
124 desc.m_Parameters.m_Begin = {1, -1, 0, 0};
125 desc.m_Parameters.m_End = {2, -3, 3, 1};
126 desc.m_Parameters.m_Stride = {1, -1, 1, 1};
128 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
129 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
131 std::vector<float> input = std::vector<float>(
133 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
135 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
137 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
140 std::vector<float> outputExpected = std::vector<float>(
142 4.0f, 4.0f, 4.0f, 3.0f, 3.0f, 3.0f
145 return StridedSliceTestImpl<T, 4, 4>(
146 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
149 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
150 LayerTestResult<T, 4> StridedSliceSimpleStrideTest(
151 armnn::IWorkloadFactory& workloadFactory,
152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
154 armnn::TensorInfo inputTensorInfo;
155 armnn::TensorInfo outputTensorInfo;
157 unsigned int inputShape[] = {3, 2, 3, 1};
158 unsigned int outputShape[] = {2, 1, 2, 1};
160 armnn::StridedSliceQueueDescriptor desc;
161 desc.m_Parameters.m_Begin = {0, 0, 0, 0};
162 desc.m_Parameters.m_End = {3, 2, 3, 1};
163 desc.m_Parameters.m_Stride = {2, 2, 2, 1};
165 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
166 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
168 std::vector<float> input = std::vector<float>(
170 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
172 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
174 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
177 std::vector<float> outputExpected = std::vector<float>(
184 return StridedSliceTestImpl<T, 4, 4>(
185 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
188 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
189 LayerTestResult<T, 4> StridedSliceSimpleRangeMaskTest(
190 armnn::IWorkloadFactory& workloadFactory,
191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
193 armnn::TensorInfo inputTensorInfo;
194 armnn::TensorInfo outputTensorInfo;
196 unsigned int inputShape[] = {3, 2, 3, 1};
197 unsigned int outputShape[] = {3, 2, 3, 1};
199 armnn::StridedSliceQueueDescriptor desc;
200 desc.m_Parameters.m_Begin = {1, 1, 1, 1};
201 desc.m_Parameters.m_End = {1, 1, 1, 1};
202 desc.m_Parameters.m_Stride = {1, 1, 1, 1};
203 desc.m_Parameters.m_BeginMask = (1 << 4) - 1;
204 desc.m_Parameters.m_EndMask = (1 << 4) - 1;
206 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
207 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
209 std::vector<float> input = std::vector<float>(
211 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
213 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
215 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
218 std::vector<float> outputExpected = std::vector<float>(
220 1.0f, 1.0f, 1.0f, 2.0f, 2.0f, 2.0f,
222 3.0f, 3.0f, 3.0f, 4.0f, 4.0f, 4.0f,
224 5.0f, 5.0f, 5.0f, 6.0f, 6.0f, 6.0f
227 return StridedSliceTestImpl<T, 4, 4>(
228 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
231 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
232 LayerTestResult<T, 2> StridedSliceShrinkAxisMaskTest(
233 armnn::IWorkloadFactory& workloadFactory,
234 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
236 armnn::TensorInfo inputTensorInfo;
237 armnn::TensorInfo outputTensorInfo;
239 unsigned int inputShape[] = {3, 2, 3, 1};
240 unsigned int outputShape[] = {3, 1};
242 armnn::StridedSliceQueueDescriptor desc;
243 desc.m_Parameters.m_Begin = {0, 0, 1, 0};
244 desc.m_Parameters.m_End = {1, 1, 1, 1};
245 desc.m_Parameters.m_Stride = {1, 1, 1, 1};
246 desc.m_Parameters.m_EndMask = (1 << 4) - 1;
247 desc.m_Parameters.m_ShrinkAxisMask = (1 << 1) | (1 << 2);
249 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
250 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
252 std::vector<float> input = std::vector<float>(
254 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f,
256 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f,
258 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
261 std::vector<float> outputExpected = std::vector<float>(
266 return StridedSliceTestImpl<T, 4, 2>(
267 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
270 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
271 LayerTestResult<T, 3> StridedSlice3DTest(
272 armnn::IWorkloadFactory& workloadFactory,
273 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
275 armnn::TensorInfo inputTensorInfo;
276 armnn::TensorInfo outputTensorInfo;
278 unsigned int inputShape[] = {3, 3, 3};
279 unsigned int outputShape[] = {2, 2, 2};
281 armnn::StridedSliceQueueDescriptor desc;
282 desc.m_Parameters.m_Begin = {0, 0, 0};
283 desc.m_Parameters.m_End = {1, 1, 1};
284 desc.m_Parameters.m_Stride = {2, 2, 2};
285 desc.m_Parameters.m_EndMask = (1 << 3) - 1;
287 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
288 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
290 std::vector<float> input = std::vector<float>(
292 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
294 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
296 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f
299 std::vector<float> outputExpected = std::vector<float>(
301 1.0f, 3.0f, 7.0f, 9.0f,
303 19.0f, 21.0f, 25.0f, 27.0f
306 return StridedSliceTestImpl<T, 3, 3>(
307 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
310 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
311 LayerTestResult<T, 3> StridedSlice3DReverseTest(
312 armnn::IWorkloadFactory& workloadFactory,
313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
315 armnn::TensorInfo inputTensorInfo;
316 armnn::TensorInfo outputTensorInfo;
318 unsigned int inputShape[] = {3, 3, 3};
319 unsigned int outputShape[] = {2, 2, 2};
321 armnn::StridedSliceQueueDescriptor desc;
322 desc.m_Parameters.m_Begin = {-1, -1, -1};
323 desc.m_Parameters.m_End = {-4, -4, -4};
324 desc.m_Parameters.m_Stride = {-2, -2, -2};
326 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
327 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
329 std::vector<float> input = std::vector<float>(
331 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
333 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
335 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f, 25.0f, 26.0f, 27.0f
338 std::vector<float> outputExpected = std::vector<float>(
340 27.0f, 25.0f, 21.0f, 19.0f,
342 9.0f, 7.0f, 3.0f, 1.0f
345 return StridedSliceTestImpl<T, 3, 3>(
346 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
349 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
350 LayerTestResult<T, 2> StridedSlice2DTest(
351 armnn::IWorkloadFactory& workloadFactory,
352 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
354 armnn::TensorInfo inputTensorInfo;
355 armnn::TensorInfo outputTensorInfo;
357 unsigned int inputShape[] = {3, 3};
358 unsigned int outputShape[] = {2, 2};
360 armnn::StridedSliceQueueDescriptor desc;
361 desc.m_Parameters.m_Begin = {0, 0};
362 desc.m_Parameters.m_End = {1, 1};
363 desc.m_Parameters.m_Stride = {2, 2};
364 desc.m_Parameters.m_EndMask = (1 << 2) - 1;
366 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
367 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
369 std::vector<float> input = std::vector<float>(
378 std::vector<float> outputExpected = std::vector<float>(
385 return StridedSliceTestImpl<T, 2, 2>(
386 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
389 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
390 LayerTestResult<T, 2> StridedSlice2DReverseTest(
391 armnn::IWorkloadFactory& workloadFactory,
392 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
394 armnn::TensorInfo inputTensorInfo;
395 armnn::TensorInfo outputTensorInfo;
397 unsigned int inputShape[] = {3, 3};
398 unsigned int outputShape[] = {2, 2};
400 armnn::StridedSliceQueueDescriptor desc;
401 desc.m_Parameters.m_Begin = {0, 0};
402 desc.m_Parameters.m_End = {1, 1};
403 desc.m_Parameters.m_Stride = {-2, -2};
404 desc.m_Parameters.m_BeginMask = (1 << 2) - 1;
405 desc.m_Parameters.m_EndMask = (1 << 2) - 1;
407 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
408 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
410 std::vector<float> input = std::vector<float>(
419 std::vector<float> outputExpected = std::vector<float>(
426 return StridedSliceTestImpl<T, 2, 2>(
427 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
430 } // anonymous namespace