blob: fc78074a4365bedb018d6a521094c72343f9221c [file] [log] [blame]
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// 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
11#include <armnn/ArmNN.hpp>
12
13#include <backendsCommon/test/TensorCopyUtils.hpp>
14#include <backendsCommon/test/WorkloadTestUtils.hpp>
15
16#include <test/TensorHelpers.hpp>
17
18namespace
19{
20
21template<typename T, std::size_t NumDims>
22LayerTestResult<T, NumDims> SliceTestImpl(
23 armnn::IWorkloadFactory& workloadFactory,
24 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
25 armnn::TensorInfo& inputInfo,
26 armnn::TensorInfo& outputInfo,
27 std::vector<float>& inputData,
28 std::vector<float>& expectedOutputData,
29 armnn::SliceQueueDescriptor descriptor,
30 const float qScale = 1.0f,
31 const int qOffset = 0)
32{
Derek Lambertic374ff02019-12-10 21:57:35 +000033 boost::ignore_unused(memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010034 if(armnn::IsQuantizedType<T>())
35 {
36 inputInfo.SetQuantizationScale(qScale);
37 inputInfo.SetQuantizationOffset(qOffset);
38
39 outputInfo.SetQuantizationScale(qScale);
40 outputInfo.SetQuantizationOffset(qOffset);
41 }
42
43 boost::multi_array<T, NumDims> input =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010044 MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010045
46 LayerTestResult<T, NumDims> result(outputInfo);
47 result.outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010048 MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010049
50 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
51 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
52
53 armnn::WorkloadInfo info;
54 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
55 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
56
57 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSlice(descriptor, info);
58
59 inputHandle->Allocate();
60 outputHandle->Allocate();
61
62 CopyDataToITensorHandle(inputHandle.get(), input.data());
63
64 ExecuteWorkload(*workload, memoryManager);
65
66 CopyDataFromITensorHandle(result.output.data(), outputHandle.get());
67
68 return result;
69}
70
71template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
72LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
73 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
74{
75 armnn::TensorShape inputShape = { 3, 2, 3, 5 };
76 armnn::TensorShape outputShape = { 2, 1, 2, 3 };
77
78 armnn::SliceQueueDescriptor desc;
79 desc.m_Parameters.m_Begin = { 1, 0, 1, 2 };
80 desc.m_Parameters.m_Size = { 2, 1, 2, 3 };
81
82 armnn::TensorInfo inputInfo(inputShape, ArmnnType);
83 armnn::TensorInfo outputInfo(outputShape, ArmnnType);
84
85 std::vector<float> input =
86 {
87 0.f, 1.f, 2.f, 3.f, 4.f,
88 5.f, 6.f, 7.f, 8.f, 9.f,
89 10.f, 11.f, 12.f, 13.f, 14.f,
90
91 15.f, 16.f, 17.f, 18.f, 19.f,
92 20.f, 21.f, 22.f, 23.f, 24.f,
93 25.f, 26.f, 27.f, 28.f, 29.f,
94
95
96 30.f, 31.f, 32.f, 33.f, 34.f,
97 35.f, 36.f, 37.f, 38.f, 39.f,
98 40.f, 41.f, 42.f, 43.f, 44.f,
99
100 45.f, 46.f, 47.f, 48.f, 49.f,
101 50.f, 51.f, 52.f, 53.f, 54.f,
102 55.f, 56.f, 57.f, 58.f, 59.f,
103
104
105 60.f, 61.f, 62.f, 63.f, 64.f,
106 65.f, 66.f, 67.f, 68.f, 69.f,
107 70.f, 71.f, 72.f, 73.f, 74.f,
108
109 75.f, 76.f, 77.f, 78.f, 79.f,
110 80.f, 81.f, 82.f, 83.f, 84.f,
111 85.f, 86.f, 87.f, 88.f, 89.f
112 };
113
114 std::vector<float> expectedOutput =
115 {
116 37.f, 38.f, 39.f,
117 42.f, 43.f, 44.f,
118
119
120 67.f, 68.f, 69.f,
121 72.f, 73.f, 74.f
122 };
123
124 return SliceTestImpl<T, 4>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
125}
126
127template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
128LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
129 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
130{
131 armnn::TensorShape inputShape = { 2, 3, 5 };
132 armnn::TensorShape outputShape = { 1, 2, 3 };
133
134 armnn::SliceQueueDescriptor desc;
135 desc.m_Parameters.m_Begin = { 0, 1, 2 };
136 desc.m_Parameters.m_Size = { 1, 2, 3 };
137
138 armnn::TensorInfo inputInfo(inputShape, ArmnnType);
139 armnn::TensorInfo outputInfo(outputShape, ArmnnType);
140
141 std::vector<float> input =
142 {
143 0.f, 1.f, 2.f, 3.f, 4.f,
144 5.f, 6.f, 7.f, 8.f, 9.f,
145 10.f, 11.f, 12.f, 13.f, 14.f,
146
147 15.f, 16.f, 17.f, 18.f, 19.f,
148 20.f, 21.f, 22.f, 23.f, 24.f,
149 25.f, 26.f, 27.f, 28.f, 29.f,
150 };
151
152 std::vector<float> expectedOutput =
153 {
154 7.f, 8.f, 9.f,
155 12.f, 13.f, 14.f
156 };
157
158 return SliceTestImpl<T, 3>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
159}
160
161template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
162LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
164{
165 armnn::TensorShape inputShape = { 3, 5 };
166 armnn::TensorShape outputShape = { 2, 3 };
167
168 armnn::SliceQueueDescriptor desc;
169 desc.m_Parameters.m_Begin = { 1, 2 };
170 desc.m_Parameters.m_Size = { 2, 3 };
171
172 armnn::TensorInfo inputInfo(inputShape, ArmnnType);
173 armnn::TensorInfo outputInfo(outputShape, ArmnnType);
174
175 std::vector<float> input =
176 {
177 0.f, 1.f, 2.f, 3.f, 4.f,
178 5.f, 6.f, 7.f, 8.f, 9.f,
179 10.f, 11.f, 12.f, 13.f, 14.f
180 };
181
182 std::vector<float> expectedOutput =
183 {
184 7.f, 8.f, 9.f,
185 12.f, 13.f, 14.f
186 };
187
188 return SliceTestImpl<T, 2>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
189}
190
191template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
192LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
193 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
194{
195 armnn::TensorShape inputShape = { 5 };
196 armnn::TensorShape outputShape = { 3 };
197
198 armnn::SliceQueueDescriptor desc;
199 desc.m_Parameters.m_Begin = { 2 };
200 desc.m_Parameters.m_Size = { 3 };
201
202 armnn::TensorInfo inputInfo(inputShape, ArmnnType);
203 armnn::TensorInfo outputInfo(outputShape, ArmnnType);
204
205 std::vector<float> input =
206 {
207 0.f, 1.f, 2.f, 3.f, 4.f
208 };
209
210 std::vector<float> expectedOutput =
211 {
212 2.f, 3.f, 4.f
213 };
214
215 return SliceTestImpl<T, 1>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
216}
217
218} // anonymous namespace
219
220// Float32 tests
221LayerTestResult<float, 4> Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
222 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
223{
224 return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
225}
226
227LayerTestResult<float, 3> Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
228 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
229{
230 return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
231}
232
233LayerTestResult<float, 2> Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
234 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
235{
236 return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
237}
238
239LayerTestResult<float, 1> Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
241{
242 return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
243}
244
245// Uint8 tests
246LayerTestResult<uint8_t, 4> Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory,
247 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
248{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000249 return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100250}
251
252LayerTestResult<uint8_t, 3> Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory,
253 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
254{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000255 return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100256}
257
258LayerTestResult<uint8_t, 2> Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory,
259 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
260{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000261 return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100262}
263
264LayerTestResult<uint8_t, 1> Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory,
265 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
266{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000267 return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100268}
269
270// Int16 tests
271LayerTestResult<int16_t, 4> Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory,
272 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
273{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000274 return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100275}
276
277LayerTestResult<int16_t, 3> Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory,
278 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
279{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000280 return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100281}
282
283LayerTestResult<int16_t, 2> Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory,
284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
285{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000286 return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100287}
288
289LayerTestResult<int16_t, 1> Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory,
290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
291{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000292 return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +0100293}