blob: cc578934399ef60a3e04508242ebe4d204868567 [file] [log] [blame]
Sadik Armagan9199e582019-09-05 17:35:31 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "AbsTestImpl.hpp"
7
Sadik Armagan9199e582019-09-05 17:35:31 +01008
9#include <backendsCommon/test/DataTypeUtils.hpp>
10#include <backendsCommon/test/TensorCopyUtils.hpp>
11#include <backendsCommon/test/WorkloadTestUtils.hpp>
12
13#include <test/TensorHelpers.hpp>
14
15namespace
16{
17
18template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
19LayerTestResult<T, 2> Abs2dTestCommon(
20 armnn::IWorkloadFactory& workloadFactory,
21 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
22 const armnn::TensorInfo inputTensorInfo,
23 const armnn::TensorInfo outputTensorInfo,
24 const std::vector<float>& inputValues,
25 const std::vector<float>& expectedOutputValues)
26{
Derek Lambertic374ff02019-12-10 21:57:35 +000027 boost::ignore_unused(memoryManager);
Sadik Armagan9199e582019-09-05 17:35:31 +010028 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, ConvertToDataType<ArmnnType>(inputValues,inputTensorInfo));
29
30 LayerTestResult<T, 2> result(outputTensorInfo);
31
32 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo,
33 ConvertToDataType<ArmnnType>(expectedOutputValues,outputTensorInfo));
34
35 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
36 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
37
38 armnn::AbsQueueDescriptor descriptor;
39
40 armnn::WorkloadInfo info;
41
42 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
43 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
44
45 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAbs(descriptor, info);
46
47 inputHandle->Allocate();
48 outputHandle->Allocate();
49
50 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
51
52 workload->PostAllocationConfigure();
53 workload->Execute();
54
55 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
56
57 return result;
58}
59
60} // anonymous namespace
61
62template<armnn::DataType ArmnnType, typename T>
63LayerTestResult<T, 2> Abs2dTest(
64 armnn::IWorkloadFactory& workloadFactory,
65 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
66{
67 const armnn::TensorShape inputShape{ 2, 2 };
68 const armnn::TensorShape outputShape{ 2, 2 };
69
70 float qScale = 0.0625f;
71 int32_t qOffset = 64;
72
Derek Lambertif90c56d2020-01-10 17:14:08 +000073 if (ArmnnType == armnn::DataType::QSymmS16)
Sadik Armagan9199e582019-09-05 17:35:31 +010074 {
75 qScale = 0.1f;
76 qOffset = 0;
77 }
78
79 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
80 inputTensorInfo.SetQuantizationScale(qScale);
81 inputTensorInfo.SetQuantizationOffset(qOffset);
82
83 armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
84 outputTensorInfo.SetQuantizationScale(qScale);
85 outputTensorInfo.SetQuantizationOffset(qOffset);
86
87 std::vector<float> inputValues
88 {
89 -0.1f, 0.2f,
90 0.3f, -0.4f
91 };
92
93 // Calculate output values for input.
94 auto f = [](float value)
95 {
96 return std::abs(value);
97 };
98 std::vector<float> expectedOutputValues(inputValues.size());
99 std::transform(inputValues.begin(), inputValues.end(), expectedOutputValues.begin(), f);
100
101 return Abs2dTestCommon<ArmnnType>(workloadFactory, memoryManager,
102 inputTensorInfo, outputTensorInfo,
103 inputValues, expectedOutputValues);
104}
105
106template<armnn::DataType ArmnnType, typename T>
107LayerTestResult<T, 3> Abs3dTest(
108 armnn::IWorkloadFactory& workloadFactory,
109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
110{
Derek Lambertic374ff02019-12-10 21:57:35 +0000111 boost::ignore_unused(memoryManager);
112
Sadik Armagan9199e582019-09-05 17:35:31 +0100113 const armnn::TensorShape inputShape{ 3, 1, 2 };
114 const armnn::TensorShape outputShape{ 3, 1, 2 };
115
116 float qScale = 0.0625f;
117 int32_t qOffset = 64;
118
Derek Lambertif90c56d2020-01-10 17:14:08 +0000119 if (ArmnnType == armnn::DataType::QSymmS16)
Sadik Armagan9199e582019-09-05 17:35:31 +0100120 {
121 qScale = 0.1f;
122 qOffset = 0;
123 }
124
125 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
126 inputTensorInfo.SetQuantizationScale(qScale);
127 inputTensorInfo.SetQuantizationOffset(qOffset);
128
129 armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
130 outputTensorInfo.SetQuantizationScale(qScale);
131 outputTensorInfo.SetQuantizationOffset(qOffset);
132
133 std::vector<float> inputValues
134 {
135 -0.1f, -0.2f, -0.3f,
136 0.1f, 0.2f, 0.3f
137 };
138
139 auto f = [](float value)
140 {
141 return std::abs(value);
142 };
143 std::vector<float>expectedOutputValues(inputValues.size());
144 std::transform(inputValues.begin(), inputValues.end(), expectedOutputValues.begin(), f);
145
146 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, ConvertToDataType<ArmnnType>(inputValues,inputTensorInfo));
147
148 LayerTestResult<T, 3> result(outputTensorInfo);
149 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo,
150 ConvertToDataType<ArmnnType>(expectedOutputValues,outputTensorInfo));
151
152 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
153 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
154
155 armnn::AbsQueueDescriptor descriptor;
156
157 armnn::WorkloadInfo info;
158
159 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
160 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
161
162 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAbs(descriptor, info);
163
164 inputHandle->Allocate();
165 outputHandle->Allocate();
166
167 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
168
169 workload->PostAllocationConfigure();
170 workload->Execute();
171
172 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
173
174 return result;
175}
176
177template<armnn::DataType ArmnnType, typename T>
178LayerTestResult<T, 2> AbsZeroTest(
179 armnn::IWorkloadFactory& workloadFactory,
180 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
181{
182 const armnn::TensorShape inputShape{ 1, 2 };
183 const armnn::TensorShape outputShape{ 1, 2 };
184
185 armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
186 inputTensorInfo.SetQuantizationScale(0.1f);
187
188 armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
189 outputTensorInfo.SetQuantizationScale(0.1f);
190
191 std::vector<float> inputValues
192 {
193 0.f, -0.f
194 };
195
196 std::vector<float> expectedOutputValues
197 {
198 0.f, 0.f
199 };
200
201 return Abs2dTestCommon<ArmnnType>(workloadFactory, memoryManager,
202 inputTensorInfo, outputTensorInfo,
203 inputValues, expectedOutputValues);
204}
205
206//
207// Explicit template specializations
208//
209
210template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
211Abs2dTest<armnn::DataType::Float32>(
212 armnn::IWorkloadFactory& workloadFactory,
213 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
214
Kevin Mayb6482f32019-09-11 12:31:38 +0100215template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 2>
216Abs2dTest<armnn::DataType::Float16>(
217 armnn::IWorkloadFactory& workloadFactory,
218 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
219
Derek Lambertif90c56d2020-01-10 17:14:08 +0000220template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
221Abs2dTest<armnn::DataType::QAsymmU8>(
Sadik Armagan9199e582019-09-05 17:35:31 +0100222 armnn::IWorkloadFactory& workloadFactory,
223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
224
Derek Lambertif90c56d2020-01-10 17:14:08 +0000225template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
226Abs2dTest<armnn::DataType::QSymmS16>(
Sadik Armagan9199e582019-09-05 17:35:31 +0100227 armnn::IWorkloadFactory& workloadFactory,
228 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
229
230template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 3>
231Abs3dTest<armnn::DataType::Float32>(
232 armnn::IWorkloadFactory& workloadFactory,
233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
234
Kevin Mayb6482f32019-09-11 12:31:38 +0100235template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 3>
236Abs3dTest<armnn::DataType::Float16>(
237 armnn::IWorkloadFactory& workloadFactory,
238 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
239
Derek Lambertif90c56d2020-01-10 17:14:08 +0000240template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 3>
241Abs3dTest<armnn::DataType::QAsymmU8>(
Sadik Armagan9199e582019-09-05 17:35:31 +0100242 armnn::IWorkloadFactory& workloadFactory,
243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
244
Derek Lambertif90c56d2020-01-10 17:14:08 +0000245template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
246Abs3dTest<armnn::DataType::QSymmS16>(
Sadik Armagan9199e582019-09-05 17:35:31 +0100247 armnn::IWorkloadFactory& workloadFactory,
248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
249
250template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 2>
251AbsZeroTest<armnn::DataType::Float32>(
252 armnn::IWorkloadFactory& workloadFactory,
Kevin Mayb6482f32019-09-11 12:31:38 +0100253 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);
254
255template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 2>
256AbsZeroTest<armnn::DataType::Float16>(
257 armnn::IWorkloadFactory& workloadFactory,
Sadik Armagan9199e582019-09-05 17:35:31 +0100258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager);