blob: 0d66af93e692e803e56d8871affec6fb915d105f [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01005
telsoa014fcda012018-03-09 14:13:49 +00006#pragma once
7
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01008#include <ResolveType.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009
telsoa014fcda012018-03-09 14:13:49 +000010
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000011#include <armnn/backends/IBackendInternal.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/WorkloadFactory.hpp>
telsoa014fcda012018-03-09 14:13:49 +000013
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010014#include <backendsCommon/test/WorkloadTestUtils.hpp>
15
16#include <test/TensorHelpers.hpp>
17
telsoa014fcda012018-03-09 14:13:49 +000018template<typename T>
19LayerTestResult<T, 4> SimplePermuteTestImpl(
20 armnn::IWorkloadFactory& workloadFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000021 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
telsoa014fcda012018-03-09 14:13:49 +000022 armnn::PermuteDescriptor descriptor,
23 armnn::TensorInfo inputTensorInfo,
24 armnn::TensorInfo outputTensorInfo,
25 const std::vector<T>& inputData,
26 const std::vector<T>& outputExpectedData)
27{
Jan Eilers8eb25602020-03-09 12:13:48 +000028 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000029 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
30
31 LayerTestResult<T, 4> ret(outputTensorInfo);
32 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputExpectedData);
33
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010034 ARMNN_NO_DEPRECATE_WARN_BEGIN
telsoa014fcda012018-03-09 14:13:49 +000035 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
36 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010037 ARMNN_NO_DEPRECATE_WARN_END
telsoa014fcda012018-03-09 14:13:49 +000038
39 armnn::PermuteQueueDescriptor data;
40 data.m_Parameters = descriptor;
41 armnn::WorkloadInfo info;
42 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
43 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
44
45 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(data, info);
46
47 inputHandle->Allocate();
48 outputHandle->Allocate();
49
50 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
51
52 workload->Execute();
53
54 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
55
56 return ret;
57}
58
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010059template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
60LayerTestResult<T, 4> SimplePermuteTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000061 armnn::IWorkloadFactory& workloadFactory,
62 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
telsoa014fcda012018-03-09 14:13:49 +000063{
64 armnn::TensorInfo inputTensorInfo;
65 armnn::TensorInfo outputTensorInfo;
66
67 unsigned int inputShape[] = { 1, 2, 2, 2 };
68 unsigned int outputShape[] = { 1, 2, 2, 2 };
69
70 armnn::PermuteDescriptor descriptor;
71 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
72
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010073 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
74 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000075
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010076 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000077 float qScale = 0.5f;
78 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010079 if(armnn::IsQuantizedType<T>())
80 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000081 inputTensorInfo.SetQuantizationScale(qScale);
82 inputTensorInfo.SetQuantizationOffset(qOffset);
83 outputTensorInfo.SetQuantizationScale(qScale);
84 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010085 }
telsoa014fcda012018-03-09 14:13:49 +000086
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000087 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010088 {
89 1, 2,
90 3, 4,
91 5, 6,
92 7, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000093 },
94 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +000095
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000096 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010097 {
98 1, 5, 2, 6,
99 3, 7, 4, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000100 },
101 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000102
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100103 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
104 descriptor, inputTensorInfo,
105 outputTensorInfo, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000106}
107
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100108template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
109LayerTestResult<T, 4> PermuteValueSet1Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000110 armnn::IWorkloadFactory& workloadFactory,
111 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100112{
113 armnn::TensorInfo inputTensorInfo;
114 armnn::TensorInfo outputTensorInfo;
115
116 unsigned int inputShape[] = { 1, 2, 2, 3 };
117 unsigned int outputShape[] = { 1, 3, 2, 2 };
118
119 armnn::PermuteDescriptor descriptor;
120 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
121
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100122 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
123 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100124
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100125 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000126 float qScale = 0.5f;
127 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100128 if(armnn::IsQuantizedType<T>())
129 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000130 inputTensorInfo.SetQuantizationScale(qScale);
131 inputTensorInfo.SetQuantizationOffset(qOffset);
132 outputTensorInfo.SetQuantizationScale(qScale);
133 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100134 }
surmeh01bceff2f2018-03-29 16:29:27 +0100135
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000136 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100137 {
138 1, 2, 3,
139 11, 12, 13,
140 21, 22, 23,
141 31, 32, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000142 },
143 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100144
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000145 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100146 {
147 1, 11, 21, 31,
148 2, 12, 22, 32,
149 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000150 },
151 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100152
153 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
154 descriptor, inputTensorInfo,
155 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100156}
157
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100158template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
159LayerTestResult<T, 4> PermuteValueSet2Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000160 armnn::IWorkloadFactory& workloadFactory,
161 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100162{
163 armnn::TensorInfo inputTensorInfo;
164 armnn::TensorInfo outputTensorInfo;
165
166 unsigned int inputShape[] = { 1, 3, 2, 2 };
167 unsigned int outputShape[] = { 1, 2, 2, 3 };
168
169 armnn::PermuteDescriptor descriptor;
170 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
171
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100172 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
173 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100174
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100175 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000176 float qScale = 0.5f;
177 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100178 if(armnn::IsQuantizedType<T>())
179 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000180 inputTensorInfo.SetQuantizationScale(qScale);
181 inputTensorInfo.SetQuantizationOffset(qOffset);
182 outputTensorInfo.SetQuantizationScale(qScale);
183 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100184 }
surmeh01bceff2f2018-03-29 16:29:27 +0100185
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000186 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100187 {
188 1, 11, 21, 31,
189 2, 12, 22, 32,
190 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000191 },
192 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100193
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000194 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100195 {
196 1, 2, 3,
197 11, 12, 13,
198 21, 22, 23,
199 31, 32, 33,
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000200 },
201 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100202
203 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
204 descriptor, inputTensorInfo,
205 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100206}
207
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100208template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
209LayerTestResult<T, 4> PermuteValueSet3Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000210 armnn::IWorkloadFactory& workloadFactory,
211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100212{
213 armnn::TensorInfo inputTensorInfo;
214 armnn::TensorInfo outputTensorInfo;
215
216 unsigned int inputShape[] = { 1, 2, 3, 3 };
217 unsigned int outputShape[] = { 1, 3, 2, 3 };
218
219 armnn::PermuteDescriptor descriptor;
220 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
221
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100222 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
223 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100224
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100225 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000226 float qScale = 0.5f;
227 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100228 if(armnn::IsQuantizedType<T>())
229 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000230 inputTensorInfo.SetQuantizationScale(qScale);
231 inputTensorInfo.SetQuantizationOffset(qOffset);
232 outputTensorInfo.SetQuantizationScale(qScale);
233 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100234 }
235
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000236 std::vector<T> input = armnnUtils::QuantizedVector<T>(
237 {
238 1, 2, 3,
239 11, 12, 13,
240 21, 22, 23,
241 31, 32, 33,
242 41, 42, 43,
243 51, 52, 53
244 },
245 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100246
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000247 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
248 {
249 1, 11, 21, 31, 41, 51,
250 2, 12, 22, 32, 42, 52,
251 3, 13, 23, 33, 43, 53
252 },
253 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100254
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100255 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
256 descriptor, inputTensorInfo,
257 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100258}