blob: 57687051b6df968a2e18c2aae17f72d9abc887e2 [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//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "ActivationTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010011#include <backendsCommon/test/ActivationFixture.hpp>
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnnTestUtils/WorkloadTestUtils.hpp>
Keith Davis33a626f2020-08-27 15:38:12 +010014#include <reference/test/RefWorkloadFactoryHelper.hpp>
telsoa014fcda012018-03-09 14:13:49 +000015
Matthew Sloyan171214c2020-09-09 09:07:37 +010016#include <armnn/utility/NumericCast.hpp>
17
Sadik Armagana097d2a2021-11-24 15:47:28 +000018#include <TensorHelpers.hpp>
telsoa014fcda012018-03-09 14:13:49 +000019
20#include <algorithm>
21
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000022template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000023LayerTestResult<T, 4> BoundedReLuTestCommon(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +010026 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000027 float upperBound,
28 float lowerBound,
29 float inputScale,
30 int32_t inputOffset,
31 float outputScale,
32 int32_t outputOffset,
33 const std::vector<T>& inputData,
34 const std::vector<T>& outputExpectedData,
35 unsigned int inputWidth,
36 unsigned int inputHeight,
37 unsigned int inputChannels,
38 unsigned int inputBatchSize)
telsoa014fcda012018-03-09 14:13:49 +000039{
Jan Eilers8eb25602020-03-09 12:13:48 +000040 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +000041 unsigned int outputWidth = inputWidth;
42 unsigned int outputHeight = inputHeight;
43 unsigned int outputChannels = inputChannels;
44 unsigned int outputBatchSize = inputBatchSize;
45
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000046 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000047
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000048 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000049
50 if(armnn::IsQuantizedType<T>())
51 {
52 inputTensorInfo.SetQuantizationScale(inputScale);
53 inputTensorInfo.SetQuantizationOffset(inputOffset);
54
55 outputTensorInfo.SetQuantizationScale(outputScale);
56 outputTensorInfo.SetQuantizationOffset(outputOffset);
57 }
58
Sadik Armagan483c8112021-06-01 09:24:52 +010059 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +000060
Keith Davis33a626f2020-08-27 15:38:12 +010061 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
62 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000063
telsoa01c577f2c2018-08-31 09:22:23 +010064 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +000065 armnn::ActivationQueueDescriptor descriptor;
66 armnn::WorkloadInfo workloadInfo;
67 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
68 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
69
70 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::BoundedReLu;
71 descriptor.m_Parameters.m_A = upperBound;
72 descriptor.m_Parameters.m_B = lowerBound;
73
74 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
75
76 inputHandle->Allocate();
77 outputHandle->Allocate();
78
Sadik Armagan483c8112021-06-01 09:24:52 +010079 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
telsoa014fcda012018-03-09 14:13:49 +000080
81 workload->Execute();
82
Sadik Armagan483c8112021-06-01 09:24:52 +010083 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +000084
Sadik Armagan483c8112021-06-01 09:24:52 +010085 return LayerTestResult<T, 4>(actualOutput,
86 outputExpectedData,
87 outputHandle->GetShape(),
88 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +000089}
90
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000091LayerTestResult<float, 4> BoundedReLuUpperAndLowerBoundTest(
92 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +010093 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
94 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +000095{
96 unsigned int inputWidth = 4u;
97 unsigned int inputHeight = 5u;
98 unsigned int inputChannels = 1u;
99 unsigned int inputBatchSize = 1;
100
101 std::vector<float> input = std::vector<float>{
102 -2.0f, 0.1f, 0.5f, 1.25f,
103 0.786f, 0.9875f, -1.5f, 0.384f,
104 1.0001f, 3.5f, 7.5f, 0.896f,
105 2.126f, 2.0f, 0.3f, 0.15f,
106 0.999f, 1.2f, 0.89f, 6.1f,
107 };
108
telsoa01c577f2c2018-08-31 09:22:23 +0100109 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000110 std::vector<float> output = std::vector<float>{
111 -1.0f, 0.1f, 0.5f, 1.0f,
112 0.786f, 0.9875f, -1.0f, 0.384f,
113 1.0f, 1.0f, 1.0f, 0.896f,
114 1.0f, 1.0f, 0.3f, 0.15f,
115 0.999f, 1.0f, 0.89f, 1.0f,
116 };
117
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000118 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100119 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000120 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000121}
122
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000123LayerTestResult<float, 4> BoundedReLuUpperBoundOnlyTest(
124 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100125 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
126 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000127{
128 unsigned int inputWidth = 4u;
129 unsigned int inputHeight = 5u;
130 unsigned int inputChannels = 1u;
131 unsigned int inputBatchSize = 1;
132
133 std::vector<float> input = std::vector<float>{
134 -1.0f, 0.1f, 0.5f, 6.25f,
135 0.786f, 5.9875f, -0.5f, 0.384f,
136 6.0001f, 3.5f, 7.5f, 0.896f,
137 2.126f, 12.0f, 0.3f, 0.15f,
138 0.999f, 1.2f, 0.89f, 6.1f,
139 };
140
David Beckac42efd2018-09-26 17:41:13 +0100141 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000142 std::vector<float> output = std::vector<float>{
143 0.0f, 0.1f, 0.5f, 6.0f,
144 0.786f, 5.9875f, 0.0f, 0.384f,
145 6.0f, 3.5f, 6.0f, 0.896f,
146 2.126f, 6.0f, 0.3f, 0.15f,
147 0.999f, 1.2f, 0.89f, 6.0f,
148 };
149
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000150 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100151 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000152 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000153}
154
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000155LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperBoundOnlyTest(
156 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100157 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
158 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000159{
160 unsigned int inputWidth = 3u;
161 unsigned int inputHeight = 2u;
162 unsigned int inputChannels = 1u;
163 unsigned int inputBatchSize = 1;
164
165 std::vector<uint8_t> input = std::vector<uint8_t>{
166 51, 124, 28,
167 251, 8, 92
168 };
169
David Beckac42efd2018-09-26 17:41:13 +0100170 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000171 std::vector<uint8_t> output = std::vector<uint8_t>{
172 0, 122, 0,
173 255, 0, 58
174 };
175
176 float inputScale = 12.0f / 255.0f;
177 int32_t inputOffset = 63;
178 float outputScale = 6.0f / 255.0f;
179 int32_t outputOffset = 0;
180
Derek Lambertif90c56d2020-01-10 17:14:08 +0000181 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100182 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000183 inputScale, inputOffset, outputScale, outputOffset,
184 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000185}
186
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000187LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperAndLowerBoundTest(
188 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
190 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000191{
192 unsigned int inputWidth = 3u;
193 unsigned int inputHeight = 2u;
194 unsigned int inputChannels = 1u;
195 unsigned int inputBatchSize = 1;
196
197 std::vector<uint8_t> input = std::vector<uint8_t>{
198 51, 230, 28,
199 251, 8, 92
200 };
201
telsoa01c577f2c2018-08-31 09:22:23 +0100202 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000203 std::vector<uint8_t> output = std::vector<uint8_t>{
204 51, 192, 32,
205 192, 32, 92
206 };
207
208 int32_t inputOffset = 112;
209 float inputScale = 0.0125f;
210
Derek Lambertif90c56d2020-01-10 17:14:08 +0000211 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100212 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000213 inputScale, inputOffset, inputScale, inputOffset, // Input/output scale & offset same.
214 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000215}
216
217namespace
218{
219
220struct BoundedReLuRandomInputTestTraits
221{
222 constexpr static unsigned int inputHeight = 31u;
223 constexpr static unsigned int inputWidth = 19u;
224 constexpr static unsigned int inputChannels = 4u;
225 constexpr static unsigned int inputBatchSize = 2;
226
227 constexpr static unsigned int outputHeight = inputHeight;
228 constexpr static unsigned int outputWidth = inputWidth;
229 constexpr static unsigned int outputChannels = inputChannels;
230 constexpr static unsigned int outputBatchSize = inputBatchSize;
231
232 static armnn::TensorInfo GetInputTensorInfo()
233 {
234 return armnn::TensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
235 armnn::DataType::Float32);
236 }
237
238 static armnn::TensorInfo GetOutputTensorInfo()
239 {
240 return armnn::TensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
241 armnn::DataType::Float32);
242 }
243};
244
Sadik Armagan483c8112021-06-01 09:24:52 +0100245std::vector<float> BoundedReLuRandomInputTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000246 armnn::IWorkloadFactory& workloadFactory,
247 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100248 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000249 float lowerBound,
250 float upperBound,
251 const armnn::ActivationDescriptor& activationDescriptor)
telsoa014fcda012018-03-09 14:13:49 +0000252{
Jan Eilers8eb25602020-03-09 12:13:48 +0000253 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000254 const armnn::TensorInfo inputTensorInfo = BoundedReLuRandomInputTestTraits::GetInputTensorInfo();
255 const armnn::TensorInfo outputTensorInfo = BoundedReLuRandomInputTestTraits::GetOutputTensorInfo();
256
telsoa01c577f2c2018-08-31 09:22:23 +0100257 // Min/max random values passed to MakeRandomTensor are purposely outside of the ReLu
258 // range [lowerBound, upperBound].
Sadik Armagan483c8112021-06-01 09:24:52 +0100259 std::vector<float> input = MakeRandomTensor<float>(inputTensorInfo, 4605828, lowerBound - 5.0f, upperBound * 2.0f);
260 std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000261
Keith Davis33a626f2020-08-27 15:38:12 +0100262 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
263 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000264
telsoa01c577f2c2018-08-31 09:22:23 +0100265 // Set up bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000266 armnn::ActivationQueueDescriptor descriptor;
267 armnn::WorkloadInfo workloadInfo;
268 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
269 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
270 descriptor.m_Parameters = activationDescriptor;
271
272 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
273
274 inputHandle->Allocate();
275 outputHandle->Allocate();
276
Sadik Armagan483c8112021-06-01 09:24:52 +0100277 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000278
279 workload->Execute();
280
Sadik Armagan483c8112021-06-01 09:24:52 +0100281 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000282
Sadik Armagan483c8112021-06-01 09:24:52 +0100283 return actualOutput;
telsoa014fcda012018-03-09 14:13:49 +0000284}
285
286} // namespace
287
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000288LayerTestResult<float, 4> CompareBoundedReLuTest(
289 armnn::IWorkloadFactory& workloadFactory,
290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
291 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100292 const armnn::ITensorHandleFactory& tensorHandleFactory,
293 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000294 float upperBound,
295 float lowerBound)
telsoa014fcda012018-03-09 14:13:49 +0000296{
297 LayerTestResult<float, 4> result(BoundedReLuRandomInputTestTraits::GetOutputTensorInfo());
298
299 armnn::ActivationDescriptor activationDescriptor;
300 activationDescriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
301 activationDescriptor.m_A = upperBound;
302 activationDescriptor.m_B = lowerBound;
303
Sadik Armagan483c8112021-06-01 09:24:52 +0100304 result.m_ActualData = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100305 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, upperBound, activationDescriptor);
Sadik Armagan483c8112021-06-01 09:24:52 +0100306 result.m_ExpectedData = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100307 refWorkloadFactory, nullptr, refTensorHandleFactory, 0.0f, upperBound, activationDescriptor);
telsoa014fcda012018-03-09 14:13:49 +0000308
309 return result;
310}
311
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000312template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Sadik Armagan483c8112021-06-01 09:24:52 +0100313LayerTestResult<T, 4> ConstantLinearActivationTestCommon(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000314 armnn::IWorkloadFactory& workloadFactory,
315 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100316 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000317 float qScale = 0.0f,
318 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000319{
Jan Eilers8eb25602020-03-09 12:13:48 +0000320 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000321 unsigned int inputHeight = 20;
322 unsigned int inputWidth = 17;
323 unsigned int inputChannels = 3;
324 unsigned int batchSize = 5;
325
326 armnn::TensorInfo inputTensorInfo;
327 armnn::TensorInfo outputTensorInfo;
328
329 unsigned int shape[] = {batchSize, inputChannels, inputHeight, inputWidth};
330
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000331 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
332 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000333
334 // Set quantization parameters if the requested type is a quantized type.
335 if(armnn::IsQuantizedType<T>())
336 {
337 inputTensorInfo.SetQuantizationScale(qScale);
338 inputTensorInfo.SetQuantizationOffset(qOffset);
339 outputTensorInfo.SetQuantizationScale(qScale);
340 outputTensorInfo.SetQuantizationOffset(qOffset);
341 }
342
Keith Davis33a626f2020-08-27 15:38:12 +0100343 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
344 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000345
telsoa01c577f2c2018-08-31 09:22:23 +0100346 // Do linear activation that should leave the tensor unchanged.
telsoa014fcda012018-03-09 14:13:49 +0000347 armnn::ActivationQueueDescriptor data;
348 armnn::WorkloadInfo info;
349 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
350 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
351 data.m_Parameters.m_A = 1.0f;
352 data.m_Parameters.m_B = 0.0f;
353 data.m_Parameters.m_Function = armnn::ActivationFunction::Linear;
354
355 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
356
357 inputHandle->Allocate();
358 outputHandle->Allocate();
359
Sadik Armagan483c8112021-06-01 09:24:52 +0100360 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 7123561);
361 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
362
363 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000364
365 workload->Execute();
366
Sadik Armagan483c8112021-06-01 09:24:52 +0100367 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000368
Sadik Armagan483c8112021-06-01 09:24:52 +0100369 // Use input as ExpectedData as tensor doesn't change.
370 return LayerTestResult<T, 4>(actualOutput,
371 input,
372 outputHandle->GetShape(),
373 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000374}
375
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000376LayerTestResult<float, 4> ConstantLinearActivationTest(
377 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100378 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
379 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000380{
Keith Davis33a626f2020-08-27 15:38:12 +0100381 return ConstantLinearActivationTestCommon<armnn::DataType::Float32>(workloadFactory,
382 memoryManager,
383 tensorHandleFactory);
telsoa014fcda012018-03-09 14:13:49 +0000384}
385
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000386LayerTestResult<uint8_t, 4> ConstantLinearActivationUint8Test(
387 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
389 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000390{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000391 return ConstantLinearActivationTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100392 workloadFactory, memoryManager, tensorHandleFactory, 4.0f, 3);
telsoa014fcda012018-03-09 14:13:49 +0000393}
394
Teresa Charlin18515e22019-04-24 10:17:46 +0100395LayerTestResult<int16_t, 4> ConstantLinearActivationInt16Test(
396 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
398 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100399{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000400 return ConstantLinearActivationTestCommon<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +0100401 workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100402}
403
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000404template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000405LayerTestResult<T, 4> SimpleActivationTest(
406 armnn::IWorkloadFactory& workloadFactory,
407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100408 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000409 armnn::ActivationFunction activationFunction,
410 float activationParameterA,
411 float activationParameterB,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100412 float scale,
413 int32_t offset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000414 const std::vector<float>& inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100415 float outScale,
416 int32_t outOffset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000417 const std::vector<float>& outputExpectedData)
telsoa014fcda012018-03-09 14:13:49 +0000418{
Jan Eilers8eb25602020-03-09 12:13:48 +0000419 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000420 constexpr static unsigned int inputWidth = 16u;
421 constexpr static unsigned int inputHeight = 1u;
422 constexpr static unsigned int inputChannels = 1u;
423 constexpr static unsigned int inputBatchSize = 1u;
424
425 constexpr static unsigned int outputWidth = inputWidth;
426 constexpr static unsigned int outputHeight = inputHeight;
427 constexpr static unsigned int outputChannels = inputChannels;
428 constexpr static unsigned int outputBatchSize = inputBatchSize;
429
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000430 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
431 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000432
433 // Set quantization parameters if the requested type is a quantized type.
434 if(armnn::IsQuantizedType<T>())
435 {
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100436 inputTensorInfo.SetQuantizationScale(scale);
437 inputTensorInfo.SetQuantizationOffset(offset);
438 outputTensorInfo.SetQuantizationScale(outScale);
439 outputTensorInfo.SetQuantizationOffset(outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000440 }
441
Sadik Armagan483c8112021-06-01 09:24:52 +0100442 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, scale, offset);
telsoa014fcda012018-03-09 14:13:49 +0000443
Sadik Armagan483c8112021-06-01 09:24:52 +0100444 // Calculated outputExpected manually.
445 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
446 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(outputExpectedData, outScale, outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000447
Keith Davis33a626f2020-08-27 15:38:12 +0100448 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
449 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000450
telsoa01c577f2c2018-08-31 09:22:23 +0100451 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000452 armnn::ActivationQueueDescriptor descriptor;
453 armnn::WorkloadInfo workloadInfo;
454 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
455 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
456
457 descriptor.m_Parameters.m_Function = activationFunction;
458 descriptor.m_Parameters.m_A = activationParameterA;
459 descriptor.m_Parameters.m_B = activationParameterB;
460
461 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
462
463 inputHandle->Allocate();
464 outputHandle->Allocate();
465
Sadik Armagan483c8112021-06-01 09:24:52 +0100466 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000467
468 workload->Execute();
469
Sadik Armagan483c8112021-06-01 09:24:52 +0100470 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000471
Sadik Armagan483c8112021-06-01 09:24:52 +0100472 return LayerTestResult<T, 4>(actualOutput,
473 outputExpected,
474 outputHandle->GetShape(),
475 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000476}
477
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000478template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000479LayerTestResult<T, 4> SimpleSigmoidTestCommon(
480 armnn::IWorkloadFactory& workloadFactory,
481 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100482 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000483 float qScale,
484 int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000485{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100486 std::vector<float> inputData =
487 {
telsoa014fcda012018-03-09 14:13:49 +0000488 -0.1f, -0.2f, -0.3f, -0.4f,
489 0.1f, 0.2f, 0.3f, 0.4f,
490 -1.0f, -2.0f, -3.0f, -4.0f,
491 1.0f, 2.0f, 3.0f, 4.0f
492 };
493
telsoa01c577f2c2018-08-31 09:22:23 +0100494 // Calculate output values for input.
telsoa014fcda012018-03-09 14:13:49 +0000495 auto f = [](float value)
496 {
497 return 1.0f / (1.0f + std::exp(-value));
498 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100499 std::vector<float> m_OutputExpected(inputData.size());
500 std::transform(inputData.begin(), inputData.end(), m_OutputExpected.begin(), f);
telsoa014fcda012018-03-09 14:13:49 +0000501
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000502 return SimpleActivationTest<ArmnnType>(workloadFactory,
503 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100504 tensorHandleFactory,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000505 armnn::ActivationFunction::Sigmoid,
506 0.f,
507 0.f,
508 qScale,
509 qOffset,
510 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100511 1.f / 256.f,
512 0,
Sadik Armagan483c8112021-06-01 09:24:52 +0100513 m_OutputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000514}
515
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000516LayerTestResult<float, 4> SimpleSigmoidTest(
517 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
519 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000520{
Keith Davis33a626f2020-08-27 15:38:12 +0100521 return SimpleSigmoidTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager,
522 tensorHandleFactory, 0.0f, 0);
telsoa014fcda012018-03-09 14:13:49 +0000523}
524
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000525LayerTestResult<uint8_t, 4> SimpleSigmoidUint8Test(
526 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100527 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
528 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000529{
Keith Davis33a626f2020-08-27 15:38:12 +0100530 return SimpleSigmoidTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
531 tensorHandleFactory, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +0000532}
533
Teresa Charlin18515e22019-04-24 10:17:46 +0100534LayerTestResult<int16_t, 4> SimpleSigmoidInt16Test(
535 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100536 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
537 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100538{
Keith Davis33a626f2020-08-27 15:38:12 +0100539 return SimpleSigmoidTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager,
540 tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100541}
542
543template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
544LayerTestResult<T, 4> ReLuTestCommon(
545 armnn::IWorkloadFactory& workloadFactory,
546 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100547 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100548 float qScale,
549 int32_t qOffset)
550{
551 std::vector<float> inputData = {
552 -0.1f, -0.2f, -0.3f, -0.4f,
553 0.1f, 0.2f, 0.3f, 0.4f,
554 -1.0f, -2.0f, -3.0f, -4.0f,
555 1.0f, 2.0f, 3.0f, 4.0f
556 };
557
558 // Calculate output values for input.
559 auto f = [](float value)
560 {
561 return std::fmax(0.0f, value);
562 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100563 std::vector<float> outputExpected(inputData.size());
564 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100565
566 return SimpleActivationTest<ArmnnType>(workloadFactory,
567 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100568 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100569 armnn::ActivationFunction::ReLu,
570 0.f,
571 0.f,
572 qScale,
573 qOffset,
574 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100575 qScale,
576 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100577 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100578}
579
580LayerTestResult<int16_t, 4> ReLuInt16Test(
581 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100582 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
583 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100584{
Keith Davis33a626f2020-08-27 15:38:12 +0100585 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100586}
587
588
konsof017f6db402019-06-07 15:15:58 +0100589LayerTestResult<uint8_t, 4> ReLuUint8Test(
590 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100591 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
592 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100593{
Keith Davis33a626f2020-08-27 15:38:12 +0100594 return ReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100595}
596
597LayerTestResult<float, 4> ReLuTest(
598 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100599 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
600 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100601{
Keith Davis33a626f2020-08-27 15:38:12 +0100602 return ReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100603}
604
605
Teresa Charlin18515e22019-04-24 10:17:46 +0100606template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
607LayerTestResult<T, 4> BoundedReLuTestCommon(
608 armnn::IWorkloadFactory& workloadFactory,
609 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100610 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100611 float qScale,
612 int32_t qOffset)
613{
614 std::vector<float> inputData = {
615 -0.1f, -0.2f, -0.3f, -0.4f,
616 0.1f, 0.2f, 0.3f, 0.4f,
617 -1.0f, -2.0f, -3.0f, -4.0f,
618 1.0f, 2.0f, 3.0f, 4.0f
619 };
620 const float a = 1.0f;
621 const float b = -1.0f;
622 // Calculate output values for input.
623 auto f = [a, b](float value)
624 {
625 return std::min(a, std::max(b, value));
626 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100627 std::vector<float> outputExpected(inputData.size());
628 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100629
630 return SimpleActivationTest<ArmnnType>(workloadFactory,
631 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100632 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100633 armnn::ActivationFunction::BoundedReLu,
634 a,
635 b,
636 qScale,
637 qOffset,
638 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100639 qScale,
640 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100641 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100642}
643
644LayerTestResult<int16_t, 4> BoundedReLuInt16Test(
645 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100646 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
647 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100648{
Keith Davis33a626f2020-08-27 15:38:12 +0100649 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100650}
651
652
653
654template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
655LayerTestResult<T, 4> SoftReLuTestCommon(
656 armnn::IWorkloadFactory& workloadFactory,
657 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100658 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100659 float qScale,
660 int32_t qOffset)
661{
662 std::vector<float> inputData = {
663 -0.1f, -0.2f, -0.3f, -0.4f,
664 0.1f, 0.2f, 0.3f, 0.4f,
665 -1.0f, -2.0f, -3.0f, -4.0f,
666 1.0f, 2.0f, 3.0f, 4.0f
667 };
668
669 // Calculate output values for input.
670 auto f = [](float value)
671 {
672 return std::log(1.0f + std::exp(value));
673 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100674 std::vector<float> outputExpected(inputData.size());
675 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100676
677 return SimpleActivationTest<ArmnnType>(workloadFactory,
678 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100679 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100680 armnn::ActivationFunction::SoftReLu,
681 0.f,
682 0.f,
683 qScale,
684 qOffset,
685 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100686 qScale,
687 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100688 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100689}
690
konsof017f6db402019-06-07 15:15:58 +0100691LayerTestResult<float, 4> SoftReLuTest(
692 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100693 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
694 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100695{
Keith Davis33a626f2020-08-27 15:38:12 +0100696 return SoftReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100697}
698
699LayerTestResult<uint8_t, 4> SoftReLuUint8Test(
700 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100701 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
702 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100703{
Keith Davis33a626f2020-08-27 15:38:12 +0100704 return SoftReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
705 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100706}
707
Teresa Charlin18515e22019-04-24 10:17:46 +0100708LayerTestResult<int16_t, 4> SoftReLuInt16Test(
709 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100710 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
711 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100712{
Keith Davis33a626f2020-08-27 15:38:12 +0100713 return SoftReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100714}
715
716template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
717LayerTestResult<T, 4> LeakyReLuTestCommon(
718 armnn::IWorkloadFactory& workloadFactory,
719 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100720 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100721 float qScale,
722 int32_t qOffset)
723{
724 std::vector<float> inputData = {
725 -0.1f, -0.2f, -0.3f, -0.4f,
726 0.1f, 0.2f, 0.3f, 0.4f,
727 -1.0f, -2.0f, -3.0f, -4.0f,
728 1.0f, 2.0f, 3.0f, 4.0f
729 };
730
731 const float a = 0.01f;
732 // Calculate output values for input.
733 auto f = [a](float value)
734 {
735 return value > 0.0f ? value : (value * a);
736 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100737 std::vector<float> outputExpected(inputData.size());
738 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100739
740 return SimpleActivationTest<ArmnnType>(workloadFactory,
741 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100742 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100743 armnn::ActivationFunction::LeakyReLu,
744 a,
745 0.f,
746 qScale,
747 qOffset,
748 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100749 qScale,
750 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100751 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100752}
753
konsof017f6db402019-06-07 15:15:58 +0100754LayerTestResult<float, 4> LeakyReLuTest(
755 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100756 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
757 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100758{
Keith Davis33a626f2020-08-27 15:38:12 +0100759 return LeakyReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100760}
761
762LayerTestResult<uint8_t, 4> LeakyReLuUint8Test(
763 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100764 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
765 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100766{
Keith Davis33a626f2020-08-27 15:38:12 +0100767 return LeakyReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
768 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100769}
770
Teresa Charlin18515e22019-04-24 10:17:46 +0100771LayerTestResult<int16_t, 4> LeakyReLuInt16Test(
772 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100773 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
774 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100775{
Keith Davis33a626f2020-08-27 15:38:12 +0100776 return LeakyReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100777}
778
779template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
780LayerTestResult<T, 4> AbsTestCommon(
781 armnn::IWorkloadFactory& workloadFactory,
782 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100783 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100784 float qScale,
785 int32_t qOffset)
786{
787 std::vector<float> inputData = {
788 -0.1f, -0.2f, -0.3f, -0.4f,
789 0.1f, 0.2f, 0.3f, 0.4f,
790 -1.0f, -2.0f, -3.0f, -4.0f,
791 1.0f, 2.0f, 3.0f, 4.0f
792 };
793
794 // Calculate output values for input.
795 auto f = [](float value)
796 {
797 return std::abs(value);
798 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100799 std::vector<float> outputExpected(inputData.size());
800 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100801
802 return SimpleActivationTest<ArmnnType>(workloadFactory,
803 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100804 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100805 armnn::ActivationFunction::Abs,
806 0.f,
807 0.f,
808 qScale,
809 qOffset,
810 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100811 qScale,
812 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100813 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100814}
815
konsof017f6db402019-06-07 15:15:58 +0100816LayerTestResult<float, 4> AbsTest(
817 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100818 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
819 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100820{
Keith Davis33a626f2020-08-27 15:38:12 +0100821 return AbsTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100822}
823
824LayerTestResult<uint8_t, 4> AbsUint8Test(
825 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100826 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
827 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100828{
Keith Davis33a626f2020-08-27 15:38:12 +0100829 return AbsTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100830}
831
Teresa Charlin18515e22019-04-24 10:17:46 +0100832LayerTestResult<int16_t, 4> AbsInt16Test(
833 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100834 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
835 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100836{
Keith Davis33a626f2020-08-27 15:38:12 +0100837 return AbsTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100838}
839
Sadik Armagan6095ba52019-09-13 17:07:19 +0100840LayerTestResult<float, 5> SqrtNNTest(
841 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100842 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
843 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan6095ba52019-09-13 17:07:19 +0100844{
Jan Eilers8eb25602020-03-09 12:13:48 +0000845 IgnoreUnused(memoryManager);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100846 const int inputDataSize = 120;
847 std::vector<float> inputData(inputDataSize);
848
849 for (unsigned int i = 0u; i < inputDataSize; ++i)
850 {
851 inputData[i] = static_cast<float>(i) / 10;
852 }
853
854 auto f = [](float value)
855 {
856 return std::sqrt(value);
857 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100858 std::vector<float> expectedOutput(inputDataSize);
859 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100860
861 armnn::TensorInfo inputTensorInfo(
862 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
863 armnn::TensorInfo outputTensorInfo(
864 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
865
Sadik Armagan483c8112021-06-01 09:24:52 +0100866 std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100867
Keith Davis33a626f2020-08-27 15:38:12 +0100868 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
869 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100870
871 armnn::ActivationQueueDescriptor descriptor;
872 armnn::WorkloadInfo workloadInfo;
873 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
874 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
875
876 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::Sqrt;
877
878 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(descriptor, workloadInfo);
879
880 inputHandle->Allocate();
881 outputHandle->Allocate();
882
Sadik Armagan483c8112021-06-01 09:24:52 +0100883 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100884
885 workload->Execute();
886
Sadik Armagan483c8112021-06-01 09:24:52 +0100887 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100888
Sadik Armagan483c8112021-06-01 09:24:52 +0100889 return LayerTestResult<float, 5>(actualOutput,
890 expectedOutput,
891 outputHandle->GetShape(),
892 outputTensorInfo.GetShape());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100893};
894
Teresa Charlin18515e22019-04-24 10:17:46 +0100895template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
896LayerTestResult<T, 4> SqrtTestCommon(
897 armnn::IWorkloadFactory& workloadFactory,
898 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100899 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100900 float qScale,
901 int32_t qOffset)
902{
903 std::vector<float> inputData = {
904 0.1f, 0.2f, 0.3f, 0.4f,
905 0.1f, 0.2f, 0.3f, 0.4f,
906 1.0f, 2.0f, 3.0f, 4.0f,
907 1.0f, 2.0f, 3.0f, 4.0f
908 };
909
910 // Calculate output values for input.
911 auto f = [](float value)
912 {
913 return std::sqrt(value);
914 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100915 std::vector<float> expectedOutput(inputData.size());
916 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100917
918 return SimpleActivationTest<ArmnnType>(workloadFactory,
919 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100920 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100921 armnn::ActivationFunction::Sqrt,
922 0.f,
923 0.f,
924 qScale,
925 qOffset,
926 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100927 qScale,
928 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100929 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +0100930}
931
konsof017f6db402019-06-07 15:15:58 +0100932LayerTestResult<float, 4> SqrtTest(
933 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100934 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
935 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100936{
Keith Davis33a626f2020-08-27 15:38:12 +0100937 return SqrtTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100938}
939
940LayerTestResult<uint8_t, 4> SqrtUint8Test(
941 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100942 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
943 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100944{
Keith Davis33a626f2020-08-27 15:38:12 +0100945 return SqrtTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100946}
947
Teresa Charlin18515e22019-04-24 10:17:46 +0100948LayerTestResult<int16_t, 4> SqrtInt16Test(
949 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100950 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
951 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100952{
Keith Davis33a626f2020-08-27 15:38:12 +0100953 return SqrtTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100954}
955
956template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
957LayerTestResult<T, 4> SquareTestCommon(
958 armnn::IWorkloadFactory& workloadFactory,
959 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100960 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100961 float qScale,
962 int32_t qOffset)
963{
964 std::vector<float> inputData = {
965 -0.1f, -0.2f, -0.3f, -0.4f,
966 0.1f, 0.2f, 0.3f, 0.4f,
967 -1.0f, -2.0f, -3.0f, -4.0f,
968 1.0f, 2.0f, 3.0f, 4.0f
969 };
970
971 // Calculate output values for input.
972 auto f = [](float value)
973 {
974 return std::pow(value,2);
975 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100976 std::vector<float> expectedOutput(inputData.size());
977 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100978
979 return SimpleActivationTest<ArmnnType>(workloadFactory,
980 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100981 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100982 armnn::ActivationFunction::Square,
983 0.f,
984 0.f,
985 qScale,
986 qOffset,
987 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100988 qScale,
989 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100990 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +0100991}
992
konsof017f6db402019-06-07 15:15:58 +0100993LayerTestResult<float, 4> SquareTest(
994 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100995 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
996 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100997{
Keith Davis33a626f2020-08-27 15:38:12 +0100998 return SquareTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100999}
1000
1001LayerTestResult<uint8_t, 4> SquareUint8Test(
1002 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001003 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1004 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001005{
Keith Davis33a626f2020-08-27 15:38:12 +01001006 return SquareTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1007 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +01001008}
1009
Teresa Charlin18515e22019-04-24 10:17:46 +01001010LayerTestResult<int16_t, 4> SquareInt16Test(
1011 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001012 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1013 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001014{
Keith Davis33a626f2020-08-27 15:38:12 +01001015 return SquareTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001016}
1017
1018template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1019LayerTestResult<T, 4> TanhTestCommon(
1020 armnn::IWorkloadFactory& workloadFactory,
1021 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001022 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001023 float qScale,
1024 int32_t qOffset)
1025{
1026 std::vector<float> inputData = {
1027 -0.1f, -0.2f, -0.3f, -0.4f,
1028 0.1f, 0.2f, 0.3f, 0.4f,
1029 -1.0f, -2.0f, -3.0f, -4.0f,
1030 1.0f, 2.0f, 3.0f, 4.0f
1031 };
1032
1033 const float a = 2.0f;
1034 const float b = 3.0f;
1035 // Calculate output values for input.
1036 auto f = [a, b](float value)
1037 {
1038 return a * tanhf(b * value);
1039 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001040 std::vector<float> expectedOutput(inputData.size());
1041 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +01001042
1043 return SimpleActivationTest<ArmnnType>(workloadFactory,
1044 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001045 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001046 armnn::ActivationFunction::TanH,
1047 a,
1048 b,
1049 qScale,
1050 qOffset,
1051 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +01001052 qScale,
1053 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001054 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +01001055}
1056
konsof017f6db402019-06-07 15:15:58 +01001057LayerTestResult<float, 4> TanhTest(
1058 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001059 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1060 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001061{
Keith Davis33a626f2020-08-27 15:38:12 +01001062 return TanhTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001063}
1064
1065LayerTestResult<uint8_t, 4> TanhUint8Test(
1066 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001067 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1068 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001069{
Keith Davis33a626f2020-08-27 15:38:12 +01001070 return TanhTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
konsof017f6db402019-06-07 15:15:58 +01001071}
1072
Teresa Charlin18515e22019-04-24 10:17:46 +01001073LayerTestResult<int16_t, 4> TanhInt16Test(
1074 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001075 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1076 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001077{
Keith Davis33a626f2020-08-27 15:38:12 +01001078 return TanhTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001079}
1080
1081
David Monahan3b3c3812020-02-25 09:03:29 +00001082template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1083LayerTestResult<T, 4> EluTestCommon(
1084 armnn::IWorkloadFactory& workloadFactory,
1085 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001086 const armnn::ITensorHandleFactory& tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001087 float qScale,
1088 int32_t qOffset)
1089{
1090 std::vector<float> inputData = {
1091 -0.1f, -0.2f, -0.3f, -0.4f,
1092 0.1f, 0.2f, 0.3f, 0.4f,
1093 -1.0f, -2.0f, -3.0f, -4.0f,
1094 1.0f, 2.0f, 3.0f, 4.0f
1095 };
1096
1097
1098 const float a = 0.01f;
1099 // Calculate output values for input.
1100 auto f = [a](float value)
1101 {
1102 return (value >= 0) ? value : a * (expf(value) - 1);
1103 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001104 std::vector<float> expectedOutput(inputData.size());
1105 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
David Monahan3b3c3812020-02-25 09:03:29 +00001106
1107 return SimpleActivationTest<ArmnnType>(workloadFactory,
1108 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001109 tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001110 armnn::ActivationFunction::Elu,
1111 a,
1112 0.0f,
1113 qScale,
1114 qOffset,
1115 inputData,
1116 qScale,
1117 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001118 expectedOutput);
David Monahan3b3c3812020-02-25 09:03:29 +00001119}
1120
1121LayerTestResult<float, 4> EluTest(
1122 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001123 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1124 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001125{
Keith Davis33a626f2020-08-27 15:38:12 +01001126 return EluTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001127}
1128
1129LayerTestResult<uint8_t, 4> EluUint8Test(
1130 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001131 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1132 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001133{
Keith Davis33a626f2020-08-27 15:38:12 +01001134 return EluTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
David Monahan3b3c3812020-02-25 09:03:29 +00001135}
1136
1137LayerTestResult<int16_t, 4> EluInt16Test(
1138 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001139 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1140 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001141{
Keith Davis33a626f2020-08-27 15:38:12 +01001142 return EluTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001143}
1144
Teresa Charlin18515e22019-04-24 10:17:46 +01001145
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001146template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001147LayerTestResult<T, 4> HardSwishTestCommon(
1148 armnn::IWorkloadFactory& workloadFactory,
1149 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001150 const armnn::ITensorHandleFactory& tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001151 float qScale,
1152 int32_t qOffset)
1153{
1154 std::vector<float> inputData = {
1155 -0.1f, -0.2f, -0.3f, -0.4f,
1156 0.1f, 0.2f, 0.3f, 0.4f,
1157 -1.0f, -2.0f, -3.0f, -4.0f,
1158 1.0f, 2.0f, 3.0f, 4.0f
1159 };
1160 // Calculate output values for input.
1161 auto f = [](float x)
1162 {
1163 // Break down the calculation to help with verification.
1164 // hard_swish(x) = x * relu6(x+3) / 6
1165 // relu6(x) = min(max(x,0),6)
1166 float reLu6_step1 = std::max((x + 3),0.0f);
1167 float reLu6Complete = std::min(reLu6_step1, 6.0f);
1168 float hardSwish_step1 = x * reLu6Complete;
1169 float result = hardSwish_step1 / 6;
1170 return result;
1171 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001172 std::vector<float> expectedOutput(inputData.size());
1173 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001174
1175 return SimpleActivationTest<ArmnnType>(workloadFactory,
1176 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001177 tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001178 armnn::ActivationFunction::HardSwish,
1179 0.f,
1180 0.f,
1181 qScale,
1182 qOffset,
1183 inputData,
1184 qScale,
1185 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001186 expectedOutput);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001187}
1188
1189LayerTestResult<float, 4> HardSwishTest(
1190 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1192 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001193{
Keith Davis33a626f2020-08-27 15:38:12 +01001194 return HardSwishTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001195}
1196
1197LayerTestResult<uint8_t, 4> HardSwishUint8Test(
1198 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001199 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1200 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001201{
Keith Davis33a626f2020-08-27 15:38:12 +01001202 return HardSwishTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1203 tensorHandleFactory, 0.1f, 64);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001204}
1205
1206LayerTestResult<int16_t, 4> HardSwishInt16Test(
1207 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001208 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1209 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001210{
Keith Davis33a626f2020-08-27 15:38:12 +01001211 return HardSwishTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001212}
1213
1214
1215template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Sadik Armagan483c8112021-06-01 09:24:52 +01001216LayerTestResult<T, 4> CompareActivationTestImpl(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001217 armnn::IWorkloadFactory& workloadFactory,
1218 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1219 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001220 const armnn::ITensorHandleFactory& tensorHandleFactory,
1221 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001222 armnn::ActivationFunction f,
1223 unsigned int batchSize = 5,
1224 float qScale = 0.0f,
1225 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001226{
Jan Eilers8eb25602020-03-09 12:13:48 +00001227 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +00001228 unsigned int width = 17;
1229 unsigned int height = 29;
1230 unsigned int channels = 2;
1231
1232 float a = 0.234f;
1233 float b = -12.345f;
1234
1235 armnn::TensorInfo inputTensorInfo;
1236 armnn::TensorInfo outputTensorInfo;
1237
1238 unsigned int shape[] = {batchSize, channels, height, width};
1239
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001240 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
1241 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001242
1243 // Set quantization parameters if the requested type is a quantized type.
1244 if(armnn::IsQuantizedType<T>())
1245 {
1246 inputTensorInfo.SetQuantizationScale(qScale);
1247 inputTensorInfo.SetQuantizationOffset(qOffset);
1248 outputTensorInfo.SetQuantizationScale(qScale);
1249 outputTensorInfo.SetQuantizationOffset(qOffset);
1250 }
1251
1252 float minVal = -10.f;
1253 if (f == armnn::ActivationFunction::Sqrt)
1254 {
1255 minVal = 0.f;
1256 }
1257
Sadik Armagan483c8112021-06-01 09:24:52 +01001258 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 21453, minVal, 10.f);
1259 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
1260 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +00001261
Keith Davis33a626f2020-08-27 15:38:12 +01001262 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1263 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001264
Keith Davis33a626f2020-08-27 15:38:12 +01001265 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1266 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001267
1268 armnn::ActivationQueueDescriptor data;
1269 armnn::WorkloadInfo info;
1270 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1271 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1272 data.m_Parameters.m_A = a;
1273 data.m_Parameters.m_B = b;
1274 data.m_Parameters.m_Function = f;
1275
1276 armnn::ActivationQueueDescriptor refData = data;
1277 armnn::WorkloadInfo refInfo = info;
1278 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1279 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1280
1281 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateActivation(data, info);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001282 ARMNN_ASSERT(workload != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001283 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateActivation(refData, refInfo);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001284 ARMNN_ASSERT(workloadRef != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001285
1286 inputHandle->Allocate();
1287 outputHandle->Allocate();
1288 inputHandleRef->Allocate();
1289 outputHandleRef->Allocate();
1290
Sadik Armagan483c8112021-06-01 09:24:52 +01001291 CopyDataToITensorHandle(inputHandle.get(), input.data());
1292 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +00001293
1294 workload->Execute();
1295 workloadRef->Execute();
1296
Sadik Armagan483c8112021-06-01 09:24:52 +01001297 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
1298 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
telsoa014fcda012018-03-09 14:13:49 +00001299
Sadik Armagan483c8112021-06-01 09:24:52 +01001300 return LayerTestResult<T, 4>(actualOutput,
1301 expectedOutput,
1302 outputHandle->GetShape(),
1303 outputTensorInfo.GetShape());
1304
telsoa014fcda012018-03-09 14:13:49 +00001305}
1306
Sadik Armagan483c8112021-06-01 09:24:52 +01001307LayerTestResult<float, 4> CompareActivationTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001308 armnn::IWorkloadFactory& workloadFactory,
1309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1310 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001311 const armnn::ITensorHandleFactory& tensorHandleFactory,
1312 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001313 armnn::ActivationFunction f,
1314 unsigned int batchSize)
telsoa014fcda012018-03-09 14:13:49 +00001315{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001316 return CompareActivationTestImpl<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +01001317 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1318 refTensorHandleFactory, f, batchSize);
telsoa014fcda012018-03-09 14:13:49 +00001319}
1320
Sadik Armagan483c8112021-06-01 09:24:52 +01001321LayerTestResult<uint8_t, 4> CompareActivationUint8Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001322 armnn::IWorkloadFactory& workloadFactory,
1323 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1324 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001325 const armnn::ITensorHandleFactory& tensorHandleFactory,
1326 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001327 armnn::ActivationFunction f)
telsoa014fcda012018-03-09 14:13:49 +00001328{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001329 return CompareActivationTestImpl<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +01001330 workloadFactory, memoryManager, refWorkloadFactory,
1331 tensorHandleFactory, refTensorHandleFactory, f, 5, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +00001332}
Teresa Charlin18515e22019-04-24 10:17:46 +01001333
Sadik Armagan483c8112021-06-01 09:24:52 +01001334LayerTestResult<int16_t, 4> CompareActivationInt16Test(
Teresa Charlin18515e22019-04-24 10:17:46 +01001335 armnn::IWorkloadFactory& workloadFactory,
1336 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1337 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001338 const armnn::ITensorHandleFactory& tensorHandleFactory,
1339 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001340 armnn::ActivationFunction f)
1341{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001342 return CompareActivationTestImpl<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +01001343 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1344 refTensorHandleFactory, f, 5, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001345}