blob: 5dd21bf3c603391b59dc365c32814e57c75fb396 [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
7#include <armnn/ArmNN.hpp>
8#include <armnn/Tensor.hpp>
9#include <armnn/TypesUtils.hpp>
10
11#include <backendsCommon/CpuTensorHandle.hpp>
12#include <backendsCommon/WorkloadFactory.hpp>
13
14#include <test/TensorHelpers.hpp>
15
16template<typename T>
17LayerTestResult<T, 4> SpaceToBatchNdTestImpl(
18 const armnn::IWorkloadFactory& workloadFactory,
19 armnn::TensorInfo& inputTensorInfo,
20 armnn::TensorInfo& outputTensorInfo,
21 std::vector<float>& inputData,
22 std::vector<float>& outputExpectedData,
23 armnn::SpaceToBatchNdQueueDescriptor descriptor,
24 const float qScale = 1.0f,
25 const int32_t qOffset = 0)
26{
27 const armnn::PermutationVector NCHWToNHWC = {0, 3, 1, 2};
28 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NHWC)
29 {
30 inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NCHWToNHWC);
31 outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NCHWToNHWC);
32
33 std::vector<float> inputTmp(inputData.size());
34 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), inputTmp.data());
35 inputData = inputTmp;
36
37 std::vector<float> outputTmp(outputExpectedData.size());
38 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputExpectedData.data(), outputTmp.data());
39 outputExpectedData = outputTmp;
40 }
41
42 if(armnn::IsQuantizedType<T>())
43 {
44 inputTensorInfo.SetQuantizationScale(qScale);
45 inputTensorInfo.SetQuantizationOffset(qOffset);
46 outputTensorInfo.SetQuantizationScale(qScale);
47 outputTensorInfo.SetQuantizationOffset(qOffset);
48 }
49
50 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
51
52 LayerTestResult<T, 4> ret(outputTensorInfo);
53 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, outputExpectedData));
54
55 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
56 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
57
58 armnn::WorkloadInfo info;
59 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
60 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
61
62 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToBatchNd(descriptor, info);
63
64 inputHandle->Allocate();
65 outputHandle->Allocate();
66
67 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
68
69 workload->Execute();
70
71 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
72
73 return ret;
74}
75
76template <typename T>
77LayerTestResult<T, 4> SpaceToBatchNdSimpleTest(armnn::IWorkloadFactory& workloadFactory,
78 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
79{
80 armnn::TensorInfo inputTensorInfo;
81 armnn::TensorInfo outputTensorInfo;
82
83 unsigned int inputShape[] = {1, 1, 2, 2};
84 unsigned int outputShape[] = {4, 1, 1, 1};
85
86 armnn::SpaceToBatchNdQueueDescriptor desc;
87 desc.m_Parameters.m_DataLayout = dataLayout;
88 desc.m_Parameters.m_BlockShape = {2, 2};
89 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
90
91 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
92 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
93
94 std::vector<float> input = std::vector<float>(
95 {
96 1.0f, 2.0f, 3.0f, 4.0f
97 });
98
99 std::vector<float> outputExpected = std::vector<float>(
100 {
101 1.0f, 2.0f, 3.0f, 4.0f
102 });
103
104 return SpaceToBatchNdTestImpl<T>(workloadFactory, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
105}
106
107template <typename T>
108LayerTestResult<T, 4> SpaceToBatchNdMultiChannelsTest(armnn::IWorkloadFactory& workloadFactory,
109 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
110{
111 armnn::TensorInfo inputTensorInfo;
112 armnn::TensorInfo outputTensorInfo;
113
114 unsigned int inputShape[] = {1, 3, 2, 2};
115 unsigned int outputShape[] = {4, 3, 1, 1};
116
117 armnn::SpaceToBatchNdQueueDescriptor desc;
118 desc.m_Parameters.m_DataLayout = dataLayout;
119 desc.m_Parameters.m_BlockShape = {2, 2};
120 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
121
122 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
123 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
124
125 std::vector<float> input = std::vector<float>(
126 {
127 1.0f, 4.0f, 7.0f, 10.0f,
128 2.0f, 5.0, 8.0, 11.0f,
129 3.0f, 6.0f, 9.0f, 12.0f
130 });
131
132 std::vector<float> outputExpected = std::vector<float>(
133 {
134 1.0f, 2.0f, 3.0f,
135 4.0f, 5.0f, 6.0f,
136 7.0f, 8.0f, 9.0f,
137 10.0f, 11.0f, 12.0f
138 });
139
140 return SpaceToBatchNdTestImpl<T>(workloadFactory, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
141}
142
143template <typename T>
144LayerTestResult<T, 4> SpaceToBatchNdMultiBlockTest(armnn::IWorkloadFactory& workloadFactory,
145 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
146{
147 armnn::TensorInfo inputTensorInfo;
148 armnn::TensorInfo outputTensorInfo;
149
150 unsigned int inputShape[] = {1, 1, 4, 4};
151 unsigned int outputShape[] = {4, 1, 2, 2};
152
153 armnn::SpaceToBatchNdQueueDescriptor desc;
154 desc.m_Parameters.m_DataLayout = dataLayout;
155 desc.m_Parameters.m_BlockShape = {2, 2};
156 desc.m_Parameters.m_PadList = {{0, 0}, {0, 0}};
157
158 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
159 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
160
161 std::vector<float> input = std::vector<float>(
162 {
163 1.0f, 2.0f, 3.0f, 4.0f,
164 5.0f, 6.0f, 7.0f, 8.0f,
165 9.0f, 10.0f, 11.0f, 12.0f,
166 13.0f, 14.0f, 15.0f, 16.0f
167 });
168
169 std::vector<float> outputExpected = std::vector<float>(
170 {
171 1.0f, 3.0f, 9.0f, 11.0f,
172 2.0f, 4.0f, 10.0f, 12.0f,
173 5.0f, 7.0f, 13.0f, 15.0f,
174 6.0f, 8.0f, 14.0f, 16.0f
175 });
176
177 return SpaceToBatchNdTestImpl<T>(workloadFactory, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
178}
179
180template <typename T>
181LayerTestResult<T, 4> SpaceToBatchNdPaddingTest(armnn::IWorkloadFactory& workloadFactory,
182 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW)
183{
184 armnn::TensorInfo inputTensorInfo;
185 armnn::TensorInfo outputTensorInfo;
186
187 unsigned int inputShape[] = {2, 1, 2, 4};
188 unsigned int outputShape[] = {8, 1, 1, 3};
189
190 armnn::SpaceToBatchNdQueueDescriptor desc;
191 desc.m_Parameters.m_DataLayout = dataLayout;
192 desc.m_Parameters.m_BlockShape = {2, 2};
193 desc.m_Parameters.m_PadList = {{0, 0}, {2, 0}};
194
195 inputTensorInfo = armnn::TensorInfo(4, inputShape, armnn::GetDataType<T>());
196 outputTensorInfo = armnn::TensorInfo(4, outputShape, armnn::GetDataType<T>());
197
198 std::vector<float> input = std::vector<float>(
199 {
200 1.0f, 2.0f, 3.0f, 4.0f,
201 5.0f, 6.0f, 7.0f, 8.0f,
202 9.0f, 10.0f, 11.0f, 12.0f,
203 13.0f, 14.0f, 15.0f, 16.0f
204 });
205
206 std::vector<float> outputExpected = std::vector<float>(
207 {
208 0.0f, 1.0f, 3.0f,
209 0.0f, 9.0f, 11.0f,
210 0.0f, 2.0f, 4.0f,
211 0.0f, 10.0f, 12.0f,
212 0.0f, 5.0f, 7.0f,
213 0.0f, 13.0f, 15.0f,
214 0.0f, 6.0f, 8.0f,
215 0.0f, 14.0f, 16.0f
216 });
217
218 return SpaceToBatchNdTestImpl<T>(workloadFactory, inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
219}
220
221template <typename T>
222LayerTestResult<T, 4> SpaceToBatchNdSimpleNHWCTest(armnn::IWorkloadFactory& workloadFactory)
223{
224 return SpaceToBatchNdSimpleTest<T>(workloadFactory, armnn::DataLayout::NHWC);
225}
226
227template <typename T>
228LayerTestResult<T, 4> SpaceToBatchNdMultiChannelsNHWCTest(armnn::IWorkloadFactory& workloadFactory)
229{
230 return SpaceToBatchNdMultiChannelsTest<T>(workloadFactory, armnn::DataLayout::NHWC);
231}
232
233template <typename T>
234LayerTestResult<T, 4> SpaceToBatchNdMultiBlockNHWCTest(armnn::IWorkloadFactory& workloadFactory)
235{
236 return SpaceToBatchNdMultiBlockTest<T>(workloadFactory, armnn::DataLayout::NHWC);
237}
238
239template <typename T>
240LayerTestResult<T, 4> SpaceToBatchNdPaddingNHWCTest(armnn::IWorkloadFactory& workloadFactory)
241{
242 return SpaceToBatchNdPaddingTest<T>(workloadFactory, armnn::DataLayout::NHWC);
243}