1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #pragma once
7
8 #include <ResolveType.hpp>
9
10 #include <armnn/backends/IBackendInternal.hpp>
11 #include <armnn/backends/WorkloadFactory.hpp>
12
13 #include <DataTypeUtils.hpp>
14 #include <armnnTestUtils/LayerTestResult.hpp>
15 #include <armnnTestUtils/TensorCopyUtils.hpp>
16 #include <armnnTestUtils/TensorHelpers.hpp>
17 #include <armnnTestUtils/WorkloadTestUtils.hpp>
18
19 namespace
20 {
21
22 template<armnn::DataType ArmnnType,
23 std::size_t InputDim,
24 std::size_t OutputDim,
25 typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdHelper(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout & dataLayout,const unsigned int * inputShape,const std::vector<float> & inputData,const std::vector<unsigned int> & blockShape,const std::vector<std::pair<unsigned int,unsigned int>> & crops,const unsigned int * outputShape,const std::vector<float> & outputData,float scale=1.0f,int32_t offset=0)26 LayerTestResult<T, OutputDim> BatchToSpaceNdHelper(
27 armnn::IWorkloadFactory &workloadFactory,
28 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
29 const armnn::ITensorHandleFactory& tensorHandleFactory,
30 const armnn::DataLayout& dataLayout,
31 const unsigned int *inputShape,
32 const std::vector<float> &inputData,
33 const std::vector<unsigned int> &blockShape,
34 const std::vector<std::pair<unsigned int, unsigned int>> &crops,
35 const unsigned int *outputShape,
36 const std::vector<float> &outputData,
37 float scale = 1.0f,
38 int32_t offset = 0)
39 {
40 IgnoreUnused(memoryManager);
41
42 armnn::TensorInfo inputTensorInfo(InputDim, inputShape, ArmnnType);
43 armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, ArmnnType);
44
45 inputTensorInfo.SetQuantizationScale(scale);
46 inputTensorInfo.SetQuantizationOffset(offset);
47
48 outputTensorInfo.SetQuantizationScale(scale);
49 outputTensorInfo.SetQuantizationOffset(offset);
50
51 std::vector<T> input = ConvertToDataType<ArmnnType>(inputData, inputTensorInfo);
52
53 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
54 std::vector<T> expectedOutput = ConvertToDataType<ArmnnType>(outputData, outputTensorInfo);
55
56 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
57 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
58
59 armnn::BatchToSpaceNdQueueDescriptor data;
60 data.m_Parameters.m_DataLayout = dataLayout;
61 data.m_Parameters.m_BlockShape = blockShape;
62 data.m_Parameters.m_Crops = crops;
63 armnn::WorkloadInfo info;
64 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
65 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
66
67 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::BatchToSpaceNd,
68 data, info);
69
70 inputHandle->Allocate();
71 outputHandle->Allocate();
72
73 CopyDataToITensorHandle(inputHandle.get(), input.data());
74
75 workload->PostAllocationConfigure();
76 workload->Execute();
77
78 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
79
80 return LayerTestResult<T, OutputDim>(actualOutput,
81 expectedOutput,
82 outputHandle->GetShape(),
83 outputTensorInfo.GetShape());
84 }
85
86 } // anonymous namespace
87
88 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)89 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest1(
90 armnn::IWorkloadFactory& workloadFactory,
91 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
92 const armnn::ITensorHandleFactory& tensorHandleFactory)
93 {
94 const unsigned int inputShape[] = {4, 2, 2, 1};
95 const unsigned int outputShape[] = {1, 4, 4, 1};
96
97 std::vector<float> input({
98 // Batch 0, Height 0, Width (2) x Channel (1)
99 1.0f, 3.0f,
100 // Batch 0, Height 1, Width (2) x Channel (1)
101 9.0f, 11.0f,
102
103
104 // Batch 1, Height 0, Width (2) x Channel (1)
105 2.0f, 4.0f,
106 // Batch 1, Height 1, Width (2) x Channel (1)
107 10.0f, 12.0f,
108
109
110 // Batch 2, Height 0, Width (2) x Channel (1)
111 5.0f, 7.0f,
112 // Batch 2, Height 1, Width (2) x Channel (1)
113 13.0f, 15.0f,
114
115 // Batch 3, Height 0, Width (2) x Channel (3)
116 6.0f, 8.0f,
117 // Batch 3, Height 1, Width (2) x Channel (1)
118 14.0f, 16.0f
119 });
120
121 std::vector<float> expectedOutput({
122 1.0f, 2.0f, 3.0f, 4.0f,
123 5.0f, 6.0f, 7.0f, 8.0f,
124 9.0f, 10.0f, 11.0f, 12.0f,
125 13.0f, 14.0f, 15.0f, 16.0f
126 });
127
128 std::vector<unsigned int> blockShape {2, 2};
129 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
130
131 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
132 armnn::DataLayout::NHWC, inputShape, input, blockShape,
133 crops, outputShape, expectedOutput);
134 }
135
136 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)137 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest2(
138 armnn::IWorkloadFactory& workloadFactory,
139 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
140 const armnn::ITensorHandleFactory& tensorHandleFactory)
141 {
142 const unsigned int inputShape[] = {4, 1, 1, 1};
143 const unsigned int outputShape[] = {1, 2, 2, 1};
144
145 std::vector<float> input({
146 // Batch 0, Height 0, Width (2) x Channel (1)
147 1.0f, 2.0f, 3.0f, 4.0f
148 });
149
150 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f});
151
152 std::vector<unsigned int> blockShape({2, 2});
153 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
154
155 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
156 armnn::DataLayout::NHWC, inputShape, input, blockShape,
157 crops, outputShape, expectedOutput);
158 }
159
160 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest3(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)161 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest3(
162 armnn::IWorkloadFactory& workloadFactory,
163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
164 const armnn::ITensorHandleFactory& tensorHandleFactory)
165 {
166 const unsigned int inputShape[] = {4, 1, 1, 3};
167 const unsigned int outputShape[] = {1, 2, 2, 3};
168
169 std::vector<float> input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
170
171 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
172
173 std::vector<unsigned int> blockShape({2, 2});
174 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
175
176 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
177 armnn::DataLayout::NHWC, inputShape, input, blockShape,
178 crops, outputShape, expectedOutput);
179 }
180
181 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest4(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)182 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest4(
183 armnn::IWorkloadFactory& workloadFactory,
184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
185 const armnn::ITensorHandleFactory& tensorHandleFactory)
186 {
187 const unsigned int inputShape[] = {8, 1, 3, 1};
188 const unsigned int outputShape[] = {2, 2, 4, 1};
189
190 std::vector<float> input({
191 0.0f, 1.0f, 3.0f,
192 0.0f, 9.0f, 11.0f,
193 0.0f, 2.0f, 4.0f,
194 0.0f, 10.0f, 12.0f,
195 0.0f, 5.0f, 7.0f,
196 0.0f, 13.0f, 15.0f,
197 0.0f, 6.0f, 8.0f,
198 0.0f, 14.0f, 16.0f
199 });
200
201 std::vector<float> expectedOutput({
202 1.0f, 2.0f, 3.0f, 4.0f,
203 5.0f, 6.0f, 7.0f, 8.0f,
204 9.0f, 10.0f, 11.0f, 12.0f,
205 13.0f, 14.0f, 15.0f, 16.0f
206 });
207
208 std::vector<unsigned int> blockShape({2, 2});
209 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {2, 0}};
210
211 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
212 armnn::DataLayout::NHWC, inputShape, input, blockShape,
213 crops, outputShape, expectedOutput);
214 }
215
216 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest5(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)217 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest5(
218 armnn::IWorkloadFactory& workloadFactory,
219 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
220 const armnn::ITensorHandleFactory& tensorHandleFactory)
221 {
222 const unsigned int inputShape[] = {4, 2, 2, 1};
223 const unsigned int outputShape[] = {1, 4, 4, 1};
224
225 std::vector<float> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16});
226 std::vector<float> expectedOutput({1, 5, 2, 6, 9, 13, 10, 14, 3, 7, 4, 8, 11, 15, 12, 16});
227
228 std::vector<unsigned int> blockShape({2, 2});
229 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
230
231 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
232 armnn::DataLayout::NHWC, inputShape,
233 input, blockShape, crops, outputShape, expectedOutput);
234 }
235
236 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest6(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)237 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest6(
238 armnn::IWorkloadFactory& workloadFactory,
239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
240 const armnn::ITensorHandleFactory& tensorHandleFactory)
241 {
242 const unsigned int inputShape[] = {4, 1, 1, 1};
243 const unsigned int outputShape[] = {1, 2, 2, 1};
244
245 std::vector<float> input({
246 // Batch 0, Height 0, Width (2) x Channel (1)
247 1, 2, 3, 4
248 });
249
250 std::vector<float> expectedOutput({1, 2, 3, 4});
251
252 std::vector<unsigned int> blockShape({2, 2});
253 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
254
255 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
256 armnn::DataLayout::NHWC, inputShape, input, blockShape,
257 crops, outputShape, expectedOutput);
258 }
259
260 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNhwcTest7(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)261 LayerTestResult<T, 4> BatchToSpaceNdNhwcTest7(
262 armnn::IWorkloadFactory& workloadFactory,
263 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
264 const armnn::ITensorHandleFactory& tensorHandleFactory)
265 {
266 const unsigned int inputShape[] = {4, 1, 1, 3};
267 const unsigned int outputShape[] = {1, 2, 2, 3};
268
269 std::vector<float> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
270
271 std::vector<float> expectedOutput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
272
273 std::vector<unsigned int> blockShape({2, 2});
274 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
275
276 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
277 armnn::DataLayout::NHWC, inputShape, input, blockShape,
278 crops, outputShape, expectedOutput);
279 }
280
281 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)282 LayerTestResult<T, 4> BatchToSpaceNdNchwTest1(
283 armnn::IWorkloadFactory &workloadFactory,
284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
285 const armnn::ITensorHandleFactory& tensorHandleFactory)
286 {
287 const unsigned int inputShape[] = {4, 3, 1, 1};
288 const unsigned int outputShape[] = {1, 3, 2, 2};
289
290 std::vector<float> input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
291
292 std::vector<float> expectedOutput({
293 // Batch 0, Channel 0, Height (2) x Width (2)
294 1.0f, 4.0f,
295 7.0f, 10.0f,
296
297 // Batch 0, Channel 1, Height (2) x Width (2)
298 2.0f, 5.0f,
299 8.0f, 11.0f,
300
301 // Batch 0, Channel 2, Height (2) x Width (2)
302 3.0f, 6.0f,
303 9.0f, 12.0f,
304 });
305
306 std::vector<unsigned int> blockShape({2, 2});
307 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
308
309 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
310 armnn::DataLayout::NCHW, inputShape, input, blockShape,
311 crops, outputShape, expectedOutput);
312 }
313
314 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)315 LayerTestResult<T, 4> BatchToSpaceNdNchwTest2(
316 armnn::IWorkloadFactory& workloadFactory,
317 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
318 const armnn::ITensorHandleFactory& tensorHandleFactory)
319 {
320 const unsigned int inputShape[] = {4, 1, 1, 1};
321 const unsigned int outputShape[] = {1, 1, 2, 2};
322
323 std::vector<float> input({
324 // Batch 0, Height 0, Width (2) x Channel (1)
325 1.0f, 2.0f, 3.0f, 4.0f
326 });
327
328 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f});
329
330 std::vector<unsigned int> blockShape({2, 2});
331 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
332
333 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
334 armnn::DataLayout::NCHW, inputShape, input, blockShape,
335 crops, outputShape, expectedOutput);
336 }
337
338 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest3(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)339 LayerTestResult<T, 4> BatchToSpaceNdNchwTest3(
340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
342 const armnn::ITensorHandleFactory& tensorHandleFactory)
343 {
344 const unsigned int inputShape[] = {4, 3, 1, 1};
345 const unsigned int outputShape[] = {1, 3, 2, 2};
346
347 std::vector<float> input({1.0f, 3.0f, 5.0f, 7.0f, 9.0f, 11.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f});
348
349 std::vector<float> expectedOutput({
350 // Batch 0, Channel 0, Height (2) x Width (2)
351 1.0f, 7.0f,
352 2.0f, 8.0f,
353
354 // Batch 0, Channel 1, Height (2) x Width (2)
355 3.0f, 9.0f,
356 4.0f, 10.0f,
357
358 // Batch 0, Channel 2, Height (2) x Width (2)
359 5.0f, 11.0f,
360 6.0f, 12.0f,
361 });
362
363 std::vector<unsigned int> blockShape({2, 2});
364 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
365
366 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
367 armnn::DataLayout::NCHW, inputShape, input, blockShape,
368 crops, outputShape, expectedOutput);
369 }
370
371 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest4(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)372 LayerTestResult<T, 4> BatchToSpaceNdNchwTest4(
373 armnn::IWorkloadFactory &workloadFactory,
374 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
375 const armnn::ITensorHandleFactory& tensorHandleFactory)
376 {
377 const unsigned int inputShape[] = {4, 3, 1, 1};
378 const unsigned int outputShape[] = {1, 3, 2, 2};
379
380 std::vector<float> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
381
382 std::vector<float> expectedOutput({
383 // Batch 0, Channel 0, Height (2) x Width (2)
384 1, 4,
385 7, 10,
386
387 // Batch 0, Channel 1, Height (2) x Width (2)
388 2, 5,
389 8, 11,
390
391 // Batch 0, Channel 2, Height (2) x Width (2)
392 3, 6,
393 9, 12,
394 });
395
396 std::vector<unsigned int> blockShape({2, 2});
397 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
398
399 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
400 armnn::DataLayout::NCHW, inputShape, input, blockShape,
401 crops, outputShape, expectedOutput);
402 }
403
404 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest5(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)405 LayerTestResult<T, 4> BatchToSpaceNdNchwTest5(
406 armnn::IWorkloadFactory& workloadFactory,
407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
408 const armnn::ITensorHandleFactory& tensorHandleFactory)
409 {
410 const unsigned int inputShape[] = {4, 1, 1, 1};
411 const unsigned int outputShape[] = {1, 1, 2, 2};
412
413 std::vector<float> input({
414 // Batch 0, Height 0, Width (2) x Channel (1)
415 1, 2, 3, 4
416 });
417
418 std::vector<float> expectedOutput({1, 2, 3, 4});
419
420 std::vector<unsigned int> blockShape({2, 2});
421 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
422
423 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
424 armnn::DataLayout::NCHW, inputShape, input, blockShape,
425 crops, outputShape, expectedOutput);
426 }
427
428 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest6(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)429 LayerTestResult<T, 4> BatchToSpaceNdNchwTest6(
430 armnn::IWorkloadFactory& workloadFactory,
431 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
432 const armnn::ITensorHandleFactory& tensorHandleFactory)
433 {
434 const unsigned int inputShape[] = {4, 3, 1, 1};
435 const unsigned int outputShape[] = {1, 3, 2, 2};
436
437 std::vector<float> input({1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12});
438
439 std::vector<float> expectedOutput({
440 // Batch 0, Channel 0, Height (2) x Width (2)
441 1, 7,
442 2, 8,
443
444 // Batch 0, Channel 1, Height (2) x Width (2)
445 3, 9,
446 4, 10,
447
448 // Batch 0, Channel 2, Height (2) x Width (2)
449 5, 11,
450 6, 12,
451 });
452
453 std::vector<unsigned int> blockShape({2, 2});
454 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
455
456 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
457 armnn::DataLayout::NCHW, inputShape, input, blockShape,
458 crops, outputShape, expectedOutput);
459 }
460
461 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
BatchToSpaceNdNchwTest7(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)462 LayerTestResult<T, 4> BatchToSpaceNdNchwTest7(
463 armnn::IWorkloadFactory& workloadFactory,
464 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
465 const armnn::ITensorHandleFactory& tensorHandleFactory)
466 {
467 const unsigned int inputShape[] = {8, 1, 1, 3};
468 const unsigned int outputShape[] = {2, 1, 2, 4};
469
470 std::vector<float> input({
471 0, 1, 3, 0, 9, 11,
472 0, 2, 4, 0, 10, 12,
473 0, 5, 7, 0, 13, 15,
474 0, 6, 8, 0, 14, 16
475 });
476
477 std::vector<float> expectedOutput({
478 1, 2, 3, 4,
479 5, 6, 7, 8,
480 9, 10, 11, 12,
481 13, 14, 15, 16
482 });
483
484 std::vector<unsigned int> blockShape({2, 2});
485 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {2, 0}};
486
487 return BatchToSpaceNdHelper<ArmnnType, 4, 4>(workloadFactory, memoryManager, tensorHandleFactory,
488 armnn::DataLayout::NCHW, inputShape, input, blockShape,
489 crops, outputShape, expectedOutput);
490 }
491