blob: a467cd30cf1da31752768813fe0a30e842905b95 [file] [log] [blame]
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00007#include "WorkloadTestUtils.hpp"
8
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +00009#include <armnn/ArmNN.hpp>
10#include <armnn/Tensor.hpp>
11#include <armnn/TypesUtils.hpp>
12
13#include <backendsCommon/CpuTensorHandle.hpp>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000014#include <backendsCommon/IBackendInternal.hpp>
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +000015#include <backendsCommon/WorkloadFactory.hpp>
16
17#include <test/TensorHelpers.hpp>
18
19template<typename T>
20LayerTestResult<T, 4> SpaceToBatchNdTestImpl(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000021 armnn::IWorkloadFactory& workloadFactory,
22 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +000023 armnn::TensorInfo& inputTensorInfo,
24 armnn::TensorInfo& outputTensorInfo,
25 std::vector<float>& inputData,
26 std::vector<float>& outputExpectedData,
27 armnn::SpaceToBatchNdQueueDescriptor descriptor,
28 const float qScale = 1.0f,
29 const int32_t qOffset = 0)
30{
31 const armnn::PermutationVector NCHWToNHWC = {0, 3, 1, 2};
32 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NHWC)
33 {
34 inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NCHWToNHWC);
35 outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NCHWToNHWC);
36
37 std::vector<float> inputTmp(inputData.size());
38 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), inputTmp.data());
39 inputData = inputTmp;
40
41 std::vector<float> outputTmp(outputExpectedData.size());
42 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputExpectedData.data(), outputTmp.data());
43 outputExpectedData = outputTmp;
44 }
45
46 if(armnn::IsQuantizedType<T>())
47 {
48 inputTensorInfo.SetQuantizationScale(qScale);
49 inputTensorInfo.SetQuantizationOffset(qOffset);
50 outputTensorInfo.SetQuantizationScale(qScale);
51 outputTensorInfo.SetQuantizationOffset(qOffset);
52 }
53
54 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
55
56 LayerTestResult<T, 4> ret(outputTensorInfo);
57 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, outputExpectedData));
58
59 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
60 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
61
62 armnn::WorkloadInfo info;
63 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
64 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
65
66 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToBatchNd(descriptor, info);
67
68 inputHandle->Allocate();
69 outputHandle->Allocate();
70
71 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
72
73 workload->Execute();
74
75 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
76
77 return ret;
78}
79
80template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000081LayerTestResult<T, 4> SpaceToBatchNdSimpleTest(
82 armnn::IWorkloadFactory& workloadFactory,
83 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
84 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +000085{
86 armnn::TensorInfo inputTensorInfo;
87 armnn::TensorInfo outputTensorInfo;
88
89 unsigned int inputShape[] = {1, 1, 2, 2};
90 unsigned int outputShape[] = {4, 1, 1, 1};
91
92 armnn::SpaceToBatchNdQueueDescriptor desc;
93 desc.m_Parameters.m_DataLayout = dataLayout;
94 desc.m_Parameters.m_BlockShape = {2, 2};
95 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
96
97 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
98 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
99
100 std::vector<float> input = std::vector<float>(
101 {
102 1.0f, 2.0f, 3.0f, 4.0f
103 });
104
105 std::vector<float> outputExpected = std::vector<float>(
106 {
107 1.0f, 2.0f, 3.0f, 4.0f
108 });
109
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000110 return SpaceToBatchNdTestImpl<T>(
111 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000112}
113
114template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000115LayerTestResult<T, 4> SpaceToBatchNdMultiChannelsTest(
116 armnn::IWorkloadFactory& workloadFactory,
117 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
118 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000119{
120 armnn::TensorInfo inputTensorInfo;
121 armnn::TensorInfo outputTensorInfo;
122
123 unsigned int inputShape[] = {1, 3, 2, 2};
124 unsigned int outputShape[] = {4, 3, 1, 1};
125
126 armnn::SpaceToBatchNdQueueDescriptor desc;
127 desc.m_Parameters.m_DataLayout = dataLayout;
128 desc.m_Parameters.m_BlockShape = {2, 2};
129 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
130
131 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
132 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
133
134 std::vector<float> input = std::vector<float>(
135 {
136 1.0f, 4.0f, 7.0f, 10.0f,
137 2.0f, 5.0, 8.0, 11.0f,
138 3.0f, 6.0f, 9.0f, 12.0f
139 });
140
141 std::vector<float> outputExpected = std::vector<float>(
142 {
143 1.0f, 2.0f, 3.0f,
144 4.0f, 5.0f, 6.0f,
145 7.0f, 8.0f, 9.0f,
146 10.0f, 11.0f, 12.0f
147 });
148
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000149 return SpaceToBatchNdTestImpl<T>(
150 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000151}
152
153template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000154LayerTestResult<T, 4> SpaceToBatchNdMultiBlockTest(
155 armnn::IWorkloadFactory& workloadFactory,
156 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
157 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000158{
159 armnn::TensorInfo inputTensorInfo;
160 armnn::TensorInfo outputTensorInfo;
161
162 unsigned int inputShape[] = {1, 1, 4, 4};
163 unsigned int outputShape[] = {4, 1, 2, 2};
164
165 armnn::SpaceToBatchNdQueueDescriptor desc;
166 desc.m_Parameters.m_DataLayout = dataLayout;
167 desc.m_Parameters.m_BlockShape = {2, 2};
168 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
169
170 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
171 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
172
173 std::vector<float> input = std::vector<float>(
174 {
175 1.0f, 2.0f, 3.0f, 4.0f,
176 5.0f, 6.0f, 7.0f, 8.0f,
177 9.0f, 10.0f, 11.0f, 12.0f,
178 13.0f, 14.0f, 15.0f, 16.0f
179 });
180
181 std::vector<float> outputExpected = std::vector<float>(
182 {
183 1.0f, 3.0f, 9.0f, 11.0f,
184 2.0f, 4.0f, 10.0f, 12.0f,
185 5.0f, 7.0f, 13.0f, 15.0f,
186 6.0f, 8.0f, 14.0f, 16.0f
187 });
188
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000189 return SpaceToBatchNdTestImpl<T>(
190 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000191}
192
193template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000194LayerTestResult<T, 4> SpaceToBatchNdPaddingTest(
195 armnn::IWorkloadFactory& workloadFactory,
196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
197 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000198{
199 armnn::TensorInfo inputTensorInfo;
200 armnn::TensorInfo outputTensorInfo;
201
202 unsigned int inputShape[] = {2, 1, 2, 4};
203 unsigned int outputShape[] = {8, 1, 1, 3};
204
205 armnn::SpaceToBatchNdQueueDescriptor desc;
206 desc.m_Parameters.m_DataLayout = dataLayout;
207 desc.m_Parameters.m_BlockShape = {2, 2};
208 desc.m_Parameters.m_PadList = {{0, 0}, {2, 0}};
209
210 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
211 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
212
213 std::vector<float> input = std::vector<float>(
214 {
215 1.0f, 2.0f, 3.0f, 4.0f,
216 5.0f, 6.0f, 7.0f, 8.0f,
217 9.0f, 10.0f, 11.0f, 12.0f,
218 13.0f, 14.0f, 15.0f, 16.0f
219 });
220
221 std::vector<float> outputExpected = std::vector<float>(
222 {
223 0.0f, 1.0f, 3.0f,
224 0.0f, 9.0f, 11.0f,
225 0.0f, 2.0f, 4.0f,
226 0.0f, 10.0f, 12.0f,
227 0.0f, 5.0f, 7.0f,
228 0.0f, 13.0f, 15.0f,
229 0.0f, 6.0f, 8.0f,
230 0.0f, 14.0f, 16.0f
231 });
232
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000233 return SpaceToBatchNdTestImpl<T>(
234 workloadFactory, memoryManager, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000235}
236
237template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000238LayerTestResult<T, 4> SpaceToBatchNdSimpleNHWCTest(
239 armnn::IWorkloadFactory& workloadFactory,
240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000241{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000242 return SpaceToBatchNdSimpleTest<T>(workloadFactory, memoryManager, armnn::DataLayout::NHWC);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000243}
244
245template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000246LayerTestResult<T, 4> SpaceToBatchNdMultiChannelsNHWCTest(
247 armnn::IWorkloadFactory& workloadFactory,
248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000249{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000250 return SpaceToBatchNdMultiChannelsTest<T>(workloadFactory, memoryManager, armnn::DataLayout::NHWC);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000251}
252
253template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000254LayerTestResult<T, 4> SpaceToBatchNdMultiBlockNHWCTest(
255 armnn::IWorkloadFactory& workloadFactory,
256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000257{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000258 return SpaceToBatchNdMultiBlockTest<T>(workloadFactory, memoryManager, armnn::DataLayout::NHWC);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000259}
260
261template <typename T>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000262LayerTestResult<T, 4> SpaceToBatchNdPaddingNHWCTest(
263 armnn::IWorkloadFactory& workloadFactory,
264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000265{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000266 return SpaceToBatchNdPaddingTest<T>(workloadFactory, memoryManager, armnn::DataLayout::NHWC);
Nattapat Chaimanowong3ea76d52018-11-09 14:10:38 +0000267}