blob: a60b1898adb6554041afb97f427d760acd44a8b5 [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{
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 =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010043 MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010044
45 LayerTestResult<T, NumDims> result(outputInfo);
46 result.outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010047 MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
Aron Virginas-Tar92b9f872019-09-17 17:27:04 +010048
49 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
50 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
51
52 armnn::WorkloadInfo info;
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
70template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
71LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
72 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
73{
74 armnn::TensorShape inputShape = { 3, 2, 3, 5 };
75 armnn::TensorShape outputShape = { 2, 1, 2, 3 };
76
77 armnn::SliceQueueDescriptor desc;
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
126template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
127LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
129{
130 armnn::TensorShape inputShape = { 2, 3, 5 };
131 armnn::TensorShape outputShape = { 1, 2, 3 };
132
133 armnn::SliceQueueDescriptor desc;
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
160template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
161LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
162 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
163{
164 armnn::TensorShape inputShape = { 3, 5 };
165 armnn::TensorShape outputShape = { 2, 3 };
166
167 armnn::SliceQueueDescriptor desc;
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
190template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
191LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
192 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
193{
194 armnn::TensorShape inputShape = { 5 };
195 armnn::TensorShape outputShape = { 3 };
196
197 armnn::SliceQueueDescriptor desc;
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
220LayerTestResult<float, 4> Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
221 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
222{
223 return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
224}
225
226LayerTestResult<float, 3> Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
227 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
228{
229 return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
230}
231
232LayerTestResult<float, 2> Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
234{
235 return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
236}
237
238LayerTestResult<float, 1> Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
240{
241 return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
242}
243
244// Uint8 tests
245LayerTestResult<uint8_t, 4> Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory,
246 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
247{
248 return Slice4dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
249}
250
251LayerTestResult<uint8_t, 3> Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory,
252 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
253{
254 return Slice3dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
255}
256
257LayerTestResult<uint8_t, 2> Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory,
258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
259{
260 return Slice2dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
261}
262
263LayerTestResult<uint8_t, 1> Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory,
264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
265{
266 return Slice1dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
267}
268
269// Int16 tests
270LayerTestResult<int16_t, 4> Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory,
271 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
272{
273 return Slice4dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
274}
275
276LayerTestResult<int16_t, 3> Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory,
277 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
278{
279 return Slice3dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
280}
281
282LayerTestResult<int16_t, 2> Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory,
283 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
284{
285 return Slice2dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
286}
287
288LayerTestResult<int16_t, 1> Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory,
289 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
290{
291 return Slice1dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
292}