blob: 95d2320508a803541c9bc574164076a4bd537ff7 [file] [log] [blame]
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "SliceTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +01009#include <ResolveType.hpp>
10
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010011
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010014
Sadik Armagana097d2a2021-11-24 15:47:28 +000015#include <TensorHelpers.hpp>
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010016
17namespace
18{
19
20template<typename T, std::size_t NumDims>
21LayerTestResult<T, NumDims> SliceTestImpl(
22 armnn::IWorkloadFactory& workloadFactory,
23 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
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{
Jan Eilers8eb25602020-03-09 12:13:48 +000032 IgnoreUnused(memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010033 if(armnn::IsQuantizedType<T>())
34 {
35 inputInfo.SetQuantizationScale(qScale);
36 inputInfo.SetQuantizationOffset(qOffset);
37
38 outputInfo.SetQuantizationScale(qScale);
39 outputInfo.SetQuantizationOffset(qOffset);
40 }
41
Sadik Armagan483c8112021-06-01 09:24:52 +010042 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());
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010045
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010046 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010047 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
48 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010049 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010050
51 armnn::WorkloadInfo info;
52 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
53 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
54
Teresa Charlin611c7fb2022-01-07 09:47:29 +000055 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Slice,
56 descriptor,
57 info);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010058
59 inputHandle->Allocate();
60 outputHandle->Allocate();
61
62 CopyDataToITensorHandle(inputHandle.get(), input.data());
63
64 ExecuteWorkload(*workload, memoryManager);
65
Sadik Armagan483c8112021-06-01 09:24:52 +010066 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010067
Sadik Armagan483c8112021-06-01 09:24:52 +010068 return LayerTestResult<T, NumDims>(actualOutput,
69 expectedOutput,
70 outputHandle->GetShape(),
71 outputInfo.GetShape());
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010072}
73
74template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
75LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
76 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
77{
78 armnn::TensorShape inputShape = { 3, 2, 3, 5 };
79 armnn::TensorShape outputShape = { 2, 1, 2, 3 };
80
81 armnn::SliceQueueDescriptor desc;
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
130template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
131LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
133{
134 armnn::TensorShape inputShape = { 2, 3, 5 };
135 armnn::TensorShape outputShape = { 1, 2, 3 };
136
137 armnn::SliceQueueDescriptor desc;
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
164template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
165LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
167{
168 armnn::TensorShape inputShape = { 3, 5 };
169 armnn::TensorShape outputShape = { 2, 3 };
170
171 armnn::SliceQueueDescriptor desc;
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
194template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
195LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
197{
198 armnn::TensorShape inputShape = { 5 };
199 armnn::TensorShape outputShape = { 3 };
200
201 armnn::SliceQueueDescriptor desc;
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
224LayerTestResult<float, 4> Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
225 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
226{
227 return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
228}
229
230LayerTestResult<float, 3> Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
231 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
232{
233 return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
234}
235
236LayerTestResult<float, 2> Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
238{
239 return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
240}
241
242LayerTestResult<float, 1> Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
244{
245 return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
246}
247
248// Uint8 tests
249LayerTestResult<uint8_t, 4> Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory,
250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
251{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000252 return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100253}
254
255LayerTestResult<uint8_t, 3> Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory,
256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
257{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000258 return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100259}
260
261LayerTestResult<uint8_t, 2> Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory,
262 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
263{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000264 return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100265}
266
267LayerTestResult<uint8_t, 1> Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory,
268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
269{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000270 return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100271}
272
273// Int16 tests
274LayerTestResult<int16_t, 4> Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory,
275 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
276{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000277 return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100278}
279
280LayerTestResult<int16_t, 3> Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory,
281 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
282{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000283 return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100284}
285
286LayerTestResult<int16_t, 2> Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory,
287 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
288{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000289 return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100290}
291
292LayerTestResult<int16_t, 1> Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory,
293 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
294{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000295 return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100296}