• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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