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