blob: 74d29f025068641ca59d6567a52d90e9e615efcf [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,
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 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
31
32 LayerTestResult<T, 4> ret(outputTensorInfo);
33 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputExpectedData);
34
Finn Williams826a5432020-08-27 16:15:20 +010035 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
36 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000037
38 armnn::PermuteQueueDescriptor data;
39 data.m_Parameters = descriptor;
40 armnn::WorkloadInfo info;
41 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
42 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
43
44 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(data, info);
45
46 inputHandle->Allocate();
47 outputHandle->Allocate();
48
49 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
50
51 workload->Execute();
52
53 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
54
55 return ret;
56}
57
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010058template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
59LayerTestResult<T, 4> SimplePermuteTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000060 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +010061 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
62 const armnn::ITensorHandleFactory& tensorHandleFactory)
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
Finn Williams826a5432020-08-27 16:15:20 +0100103 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100104 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,
Finn Williams826a5432020-08-27 16:15:20 +0100111 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
112 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100113{
114 armnn::TensorInfo inputTensorInfo;
115 armnn::TensorInfo outputTensorInfo;
116
117 unsigned int inputShape[] = { 1, 2, 2, 3 };
118 unsigned int outputShape[] = { 1, 3, 2, 2 };
119
120 armnn::PermuteDescriptor descriptor;
121 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
122
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100123 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
124 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100125
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100126 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000127 float qScale = 0.5f;
128 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100129 if(armnn::IsQuantizedType<T>())
130 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000131 inputTensorInfo.SetQuantizationScale(qScale);
132 inputTensorInfo.SetQuantizationOffset(qOffset);
133 outputTensorInfo.SetQuantizationScale(qScale);
134 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100135 }
surmeh01bceff2f2018-03-29 16:29:27 +0100136
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000137 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100138 {
139 1, 2, 3,
140 11, 12, 13,
141 21, 22, 23,
142 31, 32, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000143 },
144 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100145
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000146 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100147 {
148 1, 11, 21, 31,
149 2, 12, 22, 32,
150 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000151 },
152 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100153
Finn Williams826a5432020-08-27 16:15:20 +0100154 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100155 descriptor, inputTensorInfo,
156 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100157}
158
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100159template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
160LayerTestResult<T, 4> PermuteValueSet2Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000161 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100162 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
163 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100164{
165 armnn::TensorInfo inputTensorInfo;
166 armnn::TensorInfo outputTensorInfo;
167
168 unsigned int inputShape[] = { 1, 3, 2, 2 };
169 unsigned int outputShape[] = { 1, 2, 2, 3 };
170
171 armnn::PermuteDescriptor descriptor;
172 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
173
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100174 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
175 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100176
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100177 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000178 float qScale = 0.5f;
179 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100180 if(armnn::IsQuantizedType<T>())
181 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000182 inputTensorInfo.SetQuantizationScale(qScale);
183 inputTensorInfo.SetQuantizationOffset(qOffset);
184 outputTensorInfo.SetQuantizationScale(qScale);
185 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100186 }
surmeh01bceff2f2018-03-29 16:29:27 +0100187
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000188 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100189 {
190 1, 11, 21, 31,
191 2, 12, 22, 32,
192 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000193 },
194 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100195
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000196 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100197 {
198 1, 2, 3,
199 11, 12, 13,
200 21, 22, 23,
201 31, 32, 33,
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000202 },
203 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100204
Finn Williams826a5432020-08-27 16:15:20 +0100205 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100206 descriptor, inputTensorInfo,
207 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100208}
209
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100210template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
211LayerTestResult<T, 4> PermuteValueSet3Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000212 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100213 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
214 const armnn::ITensorHandleFactory& tensorHandleFactory)
surmeh01bceff2f2018-03-29 16:29:27 +0100215{
216 armnn::TensorInfo inputTensorInfo;
217 armnn::TensorInfo outputTensorInfo;
218
219 unsigned int inputShape[] = { 1, 2, 3, 3 };
220 unsigned int outputShape[] = { 1, 3, 2, 3 };
221
222 armnn::PermuteDescriptor descriptor;
223 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
224
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100225 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
226 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100227
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100228 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000229 float qScale = 0.5f;
230 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100231 if(armnn::IsQuantizedType<T>())
232 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000233 inputTensorInfo.SetQuantizationScale(qScale);
234 inputTensorInfo.SetQuantizationOffset(qOffset);
235 outputTensorInfo.SetQuantizationScale(qScale);
236 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100237 }
238
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000239 std::vector<T> input = armnnUtils::QuantizedVector<T>(
240 {
241 1, 2, 3,
242 11, 12, 13,
243 21, 22, 23,
244 31, 32, 33,
245 41, 42, 43,
246 51, 52, 53
247 },
248 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100249
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000250 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
251 {
252 1, 11, 21, 31, 41, 51,
253 2, 12, 22, 32, 42, 52,
254 3, 13, 23, 33, 43, 53
255 },
256 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100257
Finn Williams826a5432020-08-27 16:15:20 +0100258 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager, tensorHandleFactory,
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100259 descriptor, inputTensorInfo,
260 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100261}