blob: 96d4ec8f0fd1c9a306ff867b50b7129d7580a90c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. 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
34 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
35 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
36
37 armnn::PermuteQueueDescriptor data;
38 data.m_Parameters = descriptor;
39 armnn::WorkloadInfo info;
40 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
41 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
42
43 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(data, info);
44
45 inputHandle->Allocate();
46 outputHandle->Allocate();
47
48 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
49
50 workload->Execute();
51
52 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
53
54 return ret;
55}
56
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010057template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
58LayerTestResult<T, 4> SimplePermuteTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000059 armnn::IWorkloadFactory& workloadFactory,
60 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
telsoa014fcda012018-03-09 14:13:49 +000061{
62 armnn::TensorInfo inputTensorInfo;
63 armnn::TensorInfo outputTensorInfo;
64
65 unsigned int inputShape[] = { 1, 2, 2, 2 };
66 unsigned int outputShape[] = { 1, 2, 2, 2 };
67
68 armnn::PermuteDescriptor descriptor;
69 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
70
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010071 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
72 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000073
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010074 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000075 float qScale = 0.5f;
76 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010077 if(armnn::IsQuantizedType<T>())
78 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000079 inputTensorInfo.SetQuantizationScale(qScale);
80 inputTensorInfo.SetQuantizationOffset(qOffset);
81 outputTensorInfo.SetQuantizationScale(qScale);
82 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010083 }
telsoa014fcda012018-03-09 14:13:49 +000084
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000085 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010086 {
87 1, 2,
88 3, 4,
89 5, 6,
90 7, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000091 },
92 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +000093
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000094 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +010095 {
96 1, 5, 2, 6,
97 3, 7, 4, 8
Narumol Prangnawarat44179c32020-03-11 14:51:27 +000098 },
99 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000100
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100101 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
102 descriptor, inputTensorInfo,
103 outputTensorInfo, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000104}
105
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100106template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
107LayerTestResult<T, 4> PermuteValueSet1Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000108 armnn::IWorkloadFactory& workloadFactory,
109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100110{
111 armnn::TensorInfo inputTensorInfo;
112 armnn::TensorInfo outputTensorInfo;
113
114 unsigned int inputShape[] = { 1, 2, 2, 3 };
115 unsigned int outputShape[] = { 1, 3, 2, 2 };
116
117 armnn::PermuteDescriptor descriptor;
118 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
119
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100120 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
121 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100122
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100123 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000124 float qScale = 0.5f;
125 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100126 if(armnn::IsQuantizedType<T>())
127 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000128 inputTensorInfo.SetQuantizationScale(qScale);
129 inputTensorInfo.SetQuantizationOffset(qOffset);
130 outputTensorInfo.SetQuantizationScale(qScale);
131 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100132 }
surmeh01bceff2f2018-03-29 16:29:27 +0100133
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000134 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100135 {
136 1, 2, 3,
137 11, 12, 13,
138 21, 22, 23,
139 31, 32, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000140 },
141 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100142
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000143 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100144 {
145 1, 11, 21, 31,
146 2, 12, 22, 32,
147 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000148 },
149 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100150
151 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
152 descriptor, inputTensorInfo,
153 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100154}
155
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100156template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
157LayerTestResult<T, 4> PermuteValueSet2Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000158 armnn::IWorkloadFactory& workloadFactory,
159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100160{
161 armnn::TensorInfo inputTensorInfo;
162 armnn::TensorInfo outputTensorInfo;
163
164 unsigned int inputShape[] = { 1, 3, 2, 2 };
165 unsigned int outputShape[] = { 1, 2, 2, 3 };
166
167 armnn::PermuteDescriptor descriptor;
168 descriptor.m_DimMappings = {0U, 3U, 1U, 2U};
169
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100170 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
171 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100172
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100173 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000174 float qScale = 0.5f;
175 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100176 if(armnn::IsQuantizedType<T>())
177 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000178 inputTensorInfo.SetQuantizationScale(qScale);
179 inputTensorInfo.SetQuantizationOffset(qOffset);
180 outputTensorInfo.SetQuantizationScale(qScale);
181 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100182 }
surmeh01bceff2f2018-03-29 16:29:27 +0100183
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000184 std::vector<T> input = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100185 {
186 1, 11, 21, 31,
187 2, 12, 22, 32,
188 3, 13, 23, 33
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000189 },
190 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100191
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000192 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100193 {
194 1, 2, 3,
195 11, 12, 13,
196 21, 22, 23,
197 31, 32, 33,
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000198 },
199 qScale, qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100200
201 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
202 descriptor, inputTensorInfo,
203 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100204}
205
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100206template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
207LayerTestResult<T, 4> PermuteValueSet3Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000208 armnn::IWorkloadFactory& workloadFactory,
209 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
surmeh01bceff2f2018-03-29 16:29:27 +0100210{
211 armnn::TensorInfo inputTensorInfo;
212 armnn::TensorInfo outputTensorInfo;
213
214 unsigned int inputShape[] = { 1, 2, 3, 3 };
215 unsigned int outputShape[] = { 1, 3, 2, 3 };
216
217 armnn::PermuteDescriptor descriptor;
218 descriptor.m_DimMappings = {0U, 2U, 3U, 1U};
219
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100220 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
221 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100222
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100223 // Set quantization parameters if the requested type is a quantized type.
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000224 float qScale = 0.5f;
225 int32_t qOffset = 5;
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100226 if(armnn::IsQuantizedType<T>())
227 {
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000228 inputTensorInfo.SetQuantizationScale(qScale);
229 inputTensorInfo.SetQuantizationOffset(qOffset);
230 outputTensorInfo.SetQuantizationScale(qScale);
231 outputTensorInfo.SetQuantizationOffset(qOffset);
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100232 }
233
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000234 std::vector<T> input = armnnUtils::QuantizedVector<T>(
235 {
236 1, 2, 3,
237 11, 12, 13,
238 21, 22, 23,
239 31, 32, 33,
240 41, 42, 43,
241 51, 52, 53
242 },
243 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100244
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000245 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(
246 {
247 1, 11, 21, 31, 41, 51,
248 2, 12, 22, 32, 42, 52,
249 3, 13, 23, 33, 43, 53
250 },
251 qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +0100252
Narumol Prangnawarat86bb4e12019-07-08 11:36:05 +0100253 return SimplePermuteTestImpl<T>(workloadFactory, memoryManager,
254 descriptor, inputTensorInfo,
255 outputTensorInfo, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100256}