blob: 44415cc1b5f7474a18fbc0182cfa6b3151c356f9 [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>
Colm Donelan0c479742021-12-10 12:43:54 +000012#include <armnn/backends/WorkloadFactory.hpp>
telsoa014fcda012018-03-09 14:13:49 +000013
Colm Donelan0c479742021-12-10 12:43:54 +000014#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010015
Colm Donelanc42a9872022-02-02 16:35:09 +000016#include <armnnTestUtils/TensorHelpers.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010017
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,
Finn Williams826a5432020-08-27 16:15:20 +010022 const armnn::ITensorHandleFactory& tensorHandleFactory,
telsoa014fcda012018-03-09 14:13:49 +000023 armnn::PermuteDescriptor descriptor,
24 armnn::TensorInfo inputTensorInfo,
25 armnn::TensorInfo outputTensorInfo,
26 const std::vector<T>& inputData,
27 const std::vector<T>& outputExpectedData)
28{
Jan Eilers8eb25602020-03-09 12:13:48 +000029 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000030
Sadik Armagan483c8112021-06-01 09:24:52 +010031 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +000032
Finn Williams826a5432020-08-27 16:15:20 +010033 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
34 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000035
36 armnn::PermuteQueueDescriptor data;
37 data.m_Parameters = descriptor;
38 armnn::WorkloadInfo info;
39 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
40 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
41
Teresa Charlin611c7fb2022-01-07 09:47:29 +000042 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Permute, data, info);
telsoa014fcda012018-03-09 14:13:49 +000043
44 inputHandle->Allocate();
45 outputHandle->Allocate();
46
Sadik Armagan483c8112021-06-01 09:24:52 +010047 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
telsoa014fcda012018-03-09 14:13:49 +000048
49 workload->Execute();
50
Sadik Armagan483c8112021-06-01 09:24:52 +010051 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +000052
Sadik Armagan483c8112021-06-01 09:24:52 +010053 return LayerTestResult<T, 4>(actualOutput,
54 outputExpectedData,
55 outputHandle->GetShape(),
56 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +000057}
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,
Finn Williams826a5432020-08-27 16:15:20 +010062 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
63 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +000064{
65 armnn::TensorInfo inputTensorInfo;
66 armnn::TensorInfo outputTensorInfo;
67
68 unsigned int inputShape[] = { 1, 2, 2, 2 };
69 unsigned int outputShape[] = { 1, 2, 2, 2 };
70
71 armnn::PermuteDescriptor descriptor;
72 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
73
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010074 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
75 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000076
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010077 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000078 float qScale = 0.5f;
79 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010080 if(armnn::IsQuantizedType<T>())
81 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000082 inputTensorInfo.SetQuantizationScale(qScale);
83 inputTensorInfo.SetQuantizationOffset(qOffset);
84 outputTensorInfo.SetQuantizationScale(qScale);
85 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010086 }
telsoa014fcda012018-03-09 14:13:49 +000087
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000088 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010089 {
90 1, 2,
91 3, 4,
92 5, 6,
93 7, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000094 },
95 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +000096
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000097 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010098 {
99 1, 5, 2, 6,
100 3, 7, 4, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000101 },
102 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000103
Finn Williams826a5432020-08-27 16:15:20 +0100104 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100105 descriptor, inputTensorInfo,
106 outputTensorInfo, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000107}
108
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100109template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
110LayerTestResult<T, 4> PermuteValueSet1Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000111 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100112 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
113 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100114{
115 armnn::TensorInfo inputTensorInfo;
116 armnn::TensorInfo outputTensorInfo;
117
118 unsigned int inputShape[] = { 1, 2, 2, 3 };
119 unsigned int outputShape[] = { 1, 3, 2, 2 };
120
121 armnn::PermuteDescriptor descriptor;
122 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
123
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100124 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
125 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100126
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100127 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000128 float qScale = 0.5f;
129 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100130 if(armnn::IsQuantizedType<T>())
131 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000132 inputTensorInfo.SetQuantizationScale(qScale);
133 inputTensorInfo.SetQuantizationOffset(qOffset);
134 outputTensorInfo.SetQuantizationScale(qScale);
135 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100136 }
surmeh01bceff2f2018-03-29 16:29:27 +0100137
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000138 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100139 {
140 1, 2, 3,
141 11, 12, 13,
142 21, 22, 23,
143 31, 32, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000144 },
145 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100146
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000147 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100148 {
149 1, 11, 21, 31,
150 2, 12, 22, 32,
151 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000152 },
153 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100154
Finn Williams826a5432020-08-27 16:15:20 +0100155 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100156 descriptor, inputTensorInfo,
157 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100158}
159
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100160template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
161LayerTestResult<T, 4> PermuteValueSet2Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000162 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
164 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100165{
166 armnn::TensorInfo inputTensorInfo;
167 armnn::TensorInfo outputTensorInfo;
168
169 unsigned int inputShape[] = { 1, 3, 2, 2 };
170 unsigned int outputShape[] = { 1, 2, 2, 3 };
171
172 armnn::PermuteDescriptor descriptor;
173 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
174
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100175 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
176 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100177
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100178 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000179 float qScale = 0.5f;
180 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100181 if(armnn::IsQuantizedType<T>())
182 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000183 inputTensorInfo.SetQuantizationScale(qScale);
184 inputTensorInfo.SetQuantizationOffset(qOffset);
185 outputTensorInfo.SetQuantizationScale(qScale);
186 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100187 }
surmeh01bceff2f2018-03-29 16:29:27 +0100188
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000189 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100190 {
191 1, 11, 21, 31,
192 2, 12, 22, 32,
193 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000194 },
195 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100196
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000197 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100198 {
199 1, 2, 3,
200 11, 12, 13,
201 21, 22, 23,
202 31, 32, 33,
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000203 },
204 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100205
Finn Williams826a5432020-08-27 16:15:20 +0100206 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100207 descriptor, inputTensorInfo,
208 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100209}
210
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100211template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
212LayerTestResult<T, 4> PermuteValueSet3Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000213 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100214 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
215 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100216{
217 armnn::TensorInfo inputTensorInfo;
218 armnn::TensorInfo outputTensorInfo;
219
220 unsigned int inputShape[] = { 1, 2, 3, 3 };
221 unsigned int outputShape[] = { 1, 3, 2, 3 };
222
223 armnn::PermuteDescriptor descriptor;
224 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
225
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100226 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
227 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100228
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100229 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000230 float qScale = 0.5f;
231 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100232 if(armnn::IsQuantizedType<T>())
233 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000234 inputTensorInfo.SetQuantizationScale(qScale);
235 inputTensorInfo.SetQuantizationOffset(qOffset);
236 outputTensorInfo.SetQuantizationScale(qScale);
237 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100238 }
239
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000240 std::vector<T> input = armnnUtils::QuantizedVector<T>(
241 {
242 1, 2, 3,
243 11, 12, 13,
244 21, 22, 23,
245 31, 32, 33,
246 41, 42, 43,
247 51, 52, 53
248 },
249 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100250
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000251 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
252 {
253 1, 11, 21, 31, 41, 51,
254 2, 12, 22, 32, 42, 52,
255 3, 13, 23, 33, 43, 53
256 },
257 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100258
Finn Williams826a5432020-08-27 16:15:20 +0100259 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100260 descriptor, inputTensorInfo,
261 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100262}