blob: 1ef47ddf7bf5de0d1650c5942e1a5ac9a6e9c07f [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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/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
Colm Donelanc42a9872022-02-02 16:35:09 +000018#include <armnnTestUtils/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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000074 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
75 descriptor, workloadInfo);
telsoa014fcda012018-03-09 14:13:49 +000076
77 inputHandle->Allocate();
78 outputHandle->Allocate();
79
Sadik Armagan483c8112021-06-01 09:24:52 +010080 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
telsoa014fcda012018-03-09 14:13:49 +000081
82 workload->Execute();
83
Sadik Armagan483c8112021-06-01 09:24:52 +010084 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +000085
Sadik Armagan483c8112021-06-01 09:24:52 +010086 return LayerTestResult<T, 4>(actualOutput,
87 outputExpectedData,
88 outputHandle->GetShape(),
89 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +000090}
91
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000092LayerTestResult<float, 4> BoundedReLuUpperAndLowerBoundTest(
93 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +010094 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
95 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +000096{
97 unsigned int inputWidth = 4u;
98 unsigned int inputHeight = 5u;
99 unsigned int inputChannels = 1u;
100 unsigned int inputBatchSize = 1;
101
102 std::vector<float> input = std::vector<float>{
103 -2.0f, 0.1f, 0.5f, 1.25f,
104 0.786f, 0.9875f, -1.5f, 0.384f,
105 1.0001f, 3.5f, 7.5f, 0.896f,
106 2.126f, 2.0f, 0.3f, 0.15f,
107 0.999f, 1.2f, 0.89f, 6.1f,
108 };
109
telsoa01c577f2c2018-08-31 09:22:23 +0100110 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000111 std::vector<float> output = std::vector<float>{
112 -1.0f, 0.1f, 0.5f, 1.0f,
113 0.786f, 0.9875f, -1.0f, 0.384f,
114 1.0f, 1.0f, 1.0f, 0.896f,
115 1.0f, 1.0f, 0.3f, 0.15f,
116 0.999f, 1.0f, 0.89f, 1.0f,
117 };
118
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000119 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100120 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000121 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000122}
123
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000124LayerTestResult<float, 4> BoundedReLuUpperBoundOnlyTest(
125 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100126 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
127 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000128{
129 unsigned int inputWidth = 4u;
130 unsigned int inputHeight = 5u;
131 unsigned int inputChannels = 1u;
132 unsigned int inputBatchSize = 1;
133
134 std::vector<float> input = std::vector<float>{
135 -1.0f, 0.1f, 0.5f, 6.25f,
136 0.786f, 5.9875f, -0.5f, 0.384f,
137 6.0001f, 3.5f, 7.5f, 0.896f,
138 2.126f, 12.0f, 0.3f, 0.15f,
139 0.999f, 1.2f, 0.89f, 6.1f,
140 };
141
David Beckac42efd2018-09-26 17:41:13 +0100142 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000143 std::vector<float> output = std::vector<float>{
144 0.0f, 0.1f, 0.5f, 6.0f,
145 0.786f, 5.9875f, 0.0f, 0.384f,
146 6.0f, 3.5f, 6.0f, 0.896f,
147 2.126f, 6.0f, 0.3f, 0.15f,
148 0.999f, 1.2f, 0.89f, 6.0f,
149 };
150
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000151 return BoundedReLuTestCommon<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +0100152 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f, 1.0f, 0, 1.0f, 0, input, output,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000153 inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000154}
155
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000156LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperBoundOnlyTest(
157 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100158 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
159 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000160{
161 unsigned int inputWidth = 3u;
162 unsigned int inputHeight = 2u;
163 unsigned int inputChannels = 1u;
164 unsigned int inputBatchSize = 1;
165
166 std::vector<uint8_t> input = std::vector<uint8_t>{
167 51, 124, 28,
168 251, 8, 92
169 };
170
David Beckac42efd2018-09-26 17:41:13 +0100171 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000172 std::vector<uint8_t> output = std::vector<uint8_t>{
173 0, 122, 0,
174 255, 0, 58
175 };
176
177 float inputScale = 12.0f / 255.0f;
178 int32_t inputOffset = 63;
179 float outputScale = 6.0f / 255.0f;
180 int32_t outputOffset = 0;
181
Derek Lambertif90c56d2020-01-10 17:14:08 +0000182 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100183 workloadFactory, memoryManager, tensorHandleFactory, 6.0f, 0.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000184 inputScale, inputOffset, outputScale, outputOffset,
185 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000186}
187
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000188LayerTestResult<uint8_t, 4> BoundedReLuUint8UpperAndLowerBoundTest(
189 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100190 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
191 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000192{
193 unsigned int inputWidth = 3u;
194 unsigned int inputHeight = 2u;
195 unsigned int inputChannels = 1u;
196 unsigned int inputBatchSize = 1;
197
198 std::vector<uint8_t> input = std::vector<uint8_t>{
199 51, 230, 28,
200 251, 8, 92
201 };
202
telsoa01c577f2c2018-08-31 09:22:23 +0100203 // Calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000204 std::vector<uint8_t> output = std::vector<uint8_t>{
205 51, 192, 32,
206 192, 32, 92
207 };
208
209 int32_t inputOffset = 112;
210 float inputScale = 0.0125f;
211
Derek Lambertif90c56d2020-01-10 17:14:08 +0000212 return BoundedReLuTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100213 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -1.0f,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000214 inputScale, inputOffset, inputScale, inputOffset, // Input/output scale & offset same.
215 input, output, inputWidth, inputHeight, inputChannels, inputBatchSize);
telsoa014fcda012018-03-09 14:13:49 +0000216}
217
218namespace
219{
220
221struct BoundedReLuRandomInputTestTraits
222{
223 constexpr static unsigned int inputHeight = 31u;
224 constexpr static unsigned int inputWidth = 19u;
225 constexpr static unsigned int inputChannels = 4u;
226 constexpr static unsigned int inputBatchSize = 2;
227
228 constexpr static unsigned int outputHeight = inputHeight;
229 constexpr static unsigned int outputWidth = inputWidth;
230 constexpr static unsigned int outputChannels = inputChannels;
231 constexpr static unsigned int outputBatchSize = inputBatchSize;
232
233 static armnn::TensorInfo GetInputTensorInfo()
234 {
235 return armnn::TensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
236 armnn::DataType::Float32);
237 }
238
239 static armnn::TensorInfo GetOutputTensorInfo()
240 {
241 return armnn::TensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
242 armnn::DataType::Float32);
243 }
244};
245
Sadik Armagan483c8112021-06-01 09:24:52 +0100246std::vector<float> BoundedReLuRandomInputTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000247 armnn::IWorkloadFactory& workloadFactory,
248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100249 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000250 float lowerBound,
251 float upperBound,
252 const armnn::ActivationDescriptor& activationDescriptor)
telsoa014fcda012018-03-09 14:13:49 +0000253{
Jan Eilers8eb25602020-03-09 12:13:48 +0000254 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000255 const armnn::TensorInfo inputTensorInfo = BoundedReLuRandomInputTestTraits::GetInputTensorInfo();
256 const armnn::TensorInfo outputTensorInfo = BoundedReLuRandomInputTestTraits::GetOutputTensorInfo();
257
telsoa01c577f2c2018-08-31 09:22:23 +0100258 // Min/max random values passed to MakeRandomTensor are purposely outside of the ReLu
259 // range [lowerBound, upperBound].
Sadik Armagan483c8112021-06-01 09:24:52 +0100260 std::vector<float> input = MakeRandomTensor<float>(inputTensorInfo, 4605828, lowerBound - 5.0f, upperBound * 2.0f);
261 std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000262
Keith Davis33a626f2020-08-27 15:38:12 +0100263 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
264 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000265
telsoa01c577f2c2018-08-31 09:22:23 +0100266 // Set up bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000267 armnn::ActivationQueueDescriptor descriptor;
268 armnn::WorkloadInfo workloadInfo;
269 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
270 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
271 descriptor.m_Parameters = activationDescriptor;
272
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000273 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
274 descriptor, workloadInfo);
telsoa014fcda012018-03-09 14:13:49 +0000275
276 inputHandle->Allocate();
277 outputHandle->Allocate();
278
Sadik Armagan483c8112021-06-01 09:24:52 +0100279 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000280
281 workload->Execute();
282
Sadik Armagan483c8112021-06-01 09:24:52 +0100283 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000284
Sadik Armagan483c8112021-06-01 09:24:52 +0100285 return actualOutput;
telsoa014fcda012018-03-09 14:13:49 +0000286}
287
288} // namespace
289
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000290LayerTestResult<float, 4> CompareBoundedReLuTest(
291 armnn::IWorkloadFactory& workloadFactory,
292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
293 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100294 const armnn::ITensorHandleFactory& tensorHandleFactory,
295 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000296 float upperBound,
297 float lowerBound)
telsoa014fcda012018-03-09 14:13:49 +0000298{
299 LayerTestResult<float, 4> result(BoundedReLuRandomInputTestTraits::GetOutputTensorInfo());
300
301 armnn::ActivationDescriptor activationDescriptor;
302 activationDescriptor.m_Function = armnn::ActivationFunction::BoundedReLu;
303 activationDescriptor.m_A = upperBound;
304 activationDescriptor.m_B = lowerBound;
305
Sadik Armagan483c8112021-06-01 09:24:52 +0100306 result.m_ActualData = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100307 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, upperBound, activationDescriptor);
Sadik Armagan483c8112021-06-01 09:24:52 +0100308 result.m_ExpectedData = BoundedReLuRandomInputTest(
Keith Davis33a626f2020-08-27 15:38:12 +0100309 refWorkloadFactory, nullptr, refTensorHandleFactory, 0.0f, upperBound, activationDescriptor);
telsoa014fcda012018-03-09 14:13:49 +0000310
311 return result;
312}
313
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000314template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Sadik Armagan483c8112021-06-01 09:24:52 +0100315LayerTestResult<T, 4> ConstantLinearActivationTestCommon(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000316 armnn::IWorkloadFactory& workloadFactory,
317 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100318 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000319 float qScale = 0.0f,
320 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000321{
Jan Eilers8eb25602020-03-09 12:13:48 +0000322 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000323 unsigned int inputHeight = 20;
324 unsigned int inputWidth = 17;
325 unsigned int inputChannels = 3;
326 unsigned int batchSize = 5;
327
328 armnn::TensorInfo inputTensorInfo;
329 armnn::TensorInfo outputTensorInfo;
330
331 unsigned int shape[] = {batchSize, inputChannels, inputHeight, inputWidth};
332
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000333 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
334 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000335
336 // Set quantization parameters if the requested type is a quantized type.
337 if(armnn::IsQuantizedType<T>())
338 {
339 inputTensorInfo.SetQuantizationScale(qScale);
340 inputTensorInfo.SetQuantizationOffset(qOffset);
341 outputTensorInfo.SetQuantizationScale(qScale);
342 outputTensorInfo.SetQuantizationOffset(qOffset);
343 }
344
Keith Davis33a626f2020-08-27 15:38:12 +0100345 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
346 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000347
telsoa01c577f2c2018-08-31 09:22:23 +0100348 // Do linear activation that should leave the tensor unchanged.
telsoa014fcda012018-03-09 14:13:49 +0000349 armnn::ActivationQueueDescriptor data;
350 armnn::WorkloadInfo info;
351 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
352 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
353 data.m_Parameters.m_A = 1.0f;
354 data.m_Parameters.m_B = 0.0f;
355 data.m_Parameters.m_Function = armnn::ActivationFunction::Linear;
356
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000357 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
358 data, info);
telsoa014fcda012018-03-09 14:13:49 +0000359
360 inputHandle->Allocate();
361 outputHandle->Allocate();
362
Sadik Armagan483c8112021-06-01 09:24:52 +0100363 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 7123561);
364 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
365
366 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000367
368 workload->Execute();
369
Sadik Armagan483c8112021-06-01 09:24:52 +0100370 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000371
Sadik Armagan483c8112021-06-01 09:24:52 +0100372 // Use input as ExpectedData as tensor doesn't change.
373 return LayerTestResult<T, 4>(actualOutput,
374 input,
375 outputHandle->GetShape(),
376 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000377}
378
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000379LayerTestResult<float, 4> ConstantLinearActivationTest(
380 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100381 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
382 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000383{
Keith Davis33a626f2020-08-27 15:38:12 +0100384 return ConstantLinearActivationTestCommon<armnn::DataType::Float32>(workloadFactory,
385 memoryManager,
386 tensorHandleFactory);
telsoa014fcda012018-03-09 14:13:49 +0000387}
388
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000389LayerTestResult<uint8_t, 4> ConstantLinearActivationUint8Test(
390 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100391 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
392 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000393{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000394 return ConstantLinearActivationTestCommon<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +0100395 workloadFactory, memoryManager, tensorHandleFactory, 4.0f, 3);
telsoa014fcda012018-03-09 14:13:49 +0000396}
397
Teresa Charlin18515e22019-04-24 10:17:46 +0100398LayerTestResult<int16_t, 4> ConstantLinearActivationInt16Test(
399 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100400 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
401 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100402{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000403 return ConstantLinearActivationTestCommon<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +0100404 workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100405}
406
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000407template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000408LayerTestResult<T, 4> SimpleActivationTest(
409 armnn::IWorkloadFactory& workloadFactory,
410 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100411 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000412 armnn::ActivationFunction activationFunction,
413 float activationParameterA,
414 float activationParameterB,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100415 float scale,
416 int32_t offset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000417 const std::vector<float>& inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100418 float outScale,
419 int32_t outOffset,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000420 const std::vector<float>& outputExpectedData)
telsoa014fcda012018-03-09 14:13:49 +0000421{
Jan Eilers8eb25602020-03-09 12:13:48 +0000422 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000423 constexpr static unsigned int inputWidth = 16u;
424 constexpr static unsigned int inputHeight = 1u;
425 constexpr static unsigned int inputChannels = 1u;
426 constexpr static unsigned int inputBatchSize = 1u;
427
428 constexpr static unsigned int outputWidth = inputWidth;
429 constexpr static unsigned int outputHeight = inputHeight;
430 constexpr static unsigned int outputChannels = inputChannels;
431 constexpr static unsigned int outputBatchSize = inputBatchSize;
432
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000433 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
434 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000435
436 // Set quantization parameters if the requested type is a quantized type.
437 if(armnn::IsQuantizedType<T>())
438 {
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100439 inputTensorInfo.SetQuantizationScale(scale);
440 inputTensorInfo.SetQuantizationOffset(offset);
441 outputTensorInfo.SetQuantizationScale(outScale);
442 outputTensorInfo.SetQuantizationOffset(outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000443 }
444
Sadik Armagan483c8112021-06-01 09:24:52 +0100445 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, scale, offset);
telsoa014fcda012018-03-09 14:13:49 +0000446
Sadik Armagan483c8112021-06-01 09:24:52 +0100447 // Calculated outputExpected manually.
448 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
449 std::vector<T> outputExpected = armnnUtils::QuantizedVector<T>(outputExpectedData, outScale, outOffset);
telsoa014fcda012018-03-09 14:13:49 +0000450
Keith Davis33a626f2020-08-27 15:38:12 +0100451 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
452 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000453
telsoa01c577f2c2018-08-31 09:22:23 +0100454 // Setup bounded ReLu.
telsoa014fcda012018-03-09 14:13:49 +0000455 armnn::ActivationQueueDescriptor descriptor;
456 armnn::WorkloadInfo workloadInfo;
457 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
458 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
459
460 descriptor.m_Parameters.m_Function = activationFunction;
461 descriptor.m_Parameters.m_A = activationParameterA;
462 descriptor.m_Parameters.m_B = activationParameterB;
463
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000464 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
465 descriptor, workloadInfo);
telsoa014fcda012018-03-09 14:13:49 +0000466
467 inputHandle->Allocate();
468 outputHandle->Allocate();
469
Sadik Armagan483c8112021-06-01 09:24:52 +0100470 CopyDataToITensorHandle(inputHandle.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000471
472 workload->Execute();
473
Sadik Armagan483c8112021-06-01 09:24:52 +0100474 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
telsoa014fcda012018-03-09 14:13:49 +0000475
Sadik Armagan483c8112021-06-01 09:24:52 +0100476 return LayerTestResult<T, 4>(actualOutput,
477 outputExpected,
478 outputHandle->GetShape(),
479 outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000480}
481
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000482template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000483LayerTestResult<T, 4> SimpleSigmoidTestCommon(
484 armnn::IWorkloadFactory& workloadFactory,
485 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100486 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000487 float qScale,
488 int32_t qOffset)
telsoa014fcda012018-03-09 14:13:49 +0000489{
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100490 std::vector<float> inputData =
491 {
telsoa014fcda012018-03-09 14:13:49 +0000492 -0.1f, -0.2f, -0.3f, -0.4f,
493 0.1f, 0.2f, 0.3f, 0.4f,
494 -1.0f, -2.0f, -3.0f, -4.0f,
495 1.0f, 2.0f, 3.0f, 4.0f
496 };
497
telsoa01c577f2c2018-08-31 09:22:23 +0100498 // Calculate output values for input.
telsoa014fcda012018-03-09 14:13:49 +0000499 auto f = [](float value)
500 {
501 return 1.0f / (1.0f + std::exp(-value));
502 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100503 std::vector<float> m_OutputExpected(inputData.size());
504 std::transform(inputData.begin(), inputData.end(), m_OutputExpected.begin(), f);
telsoa014fcda012018-03-09 14:13:49 +0000505
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000506 return SimpleActivationTest<ArmnnType>(workloadFactory,
507 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100508 tensorHandleFactory,
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000509 armnn::ActivationFunction::Sigmoid,
510 0.f,
511 0.f,
512 qScale,
513 qOffset,
514 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100515 1.f / 256.f,
516 0,
Sadik Armagan483c8112021-06-01 09:24:52 +0100517 m_OutputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000518}
519
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000520LayerTestResult<float, 4> SimpleSigmoidTest(
521 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100522 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
523 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000524{
Keith Davis33a626f2020-08-27 15:38:12 +0100525 return SimpleSigmoidTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager,
526 tensorHandleFactory, 0.0f, 0);
telsoa014fcda012018-03-09 14:13:49 +0000527}
528
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000529LayerTestResult<uint8_t, 4> SimpleSigmoidUint8Test(
530 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100531 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
532 const armnn::ITensorHandleFactory& tensorHandleFactory)
telsoa014fcda012018-03-09 14:13:49 +0000533{
Keith Davis33a626f2020-08-27 15:38:12 +0100534 return SimpleSigmoidTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
535 tensorHandleFactory, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +0000536}
537
Teresa Charlin18515e22019-04-24 10:17:46 +0100538LayerTestResult<int16_t, 4> SimpleSigmoidInt16Test(
539 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100540 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
541 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100542{
Keith Davis33a626f2020-08-27 15:38:12 +0100543 return SimpleSigmoidTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager,
544 tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100545}
546
547template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
548LayerTestResult<T, 4> ReLuTestCommon(
549 armnn::IWorkloadFactory& workloadFactory,
550 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100551 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100552 float qScale,
553 int32_t qOffset)
554{
555 std::vector<float> inputData = {
556 -0.1f, -0.2f, -0.3f, -0.4f,
557 0.1f, 0.2f, 0.3f, 0.4f,
558 -1.0f, -2.0f, -3.0f, -4.0f,
559 1.0f, 2.0f, 3.0f, 4.0f
560 };
561
562 // Calculate output values for input.
563 auto f = [](float value)
564 {
565 return std::fmax(0.0f, value);
566 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100567 std::vector<float> outputExpected(inputData.size());
568 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100569
570 return SimpleActivationTest<ArmnnType>(workloadFactory,
571 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100572 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100573 armnn::ActivationFunction::ReLu,
574 0.f,
575 0.f,
576 qScale,
577 qOffset,
578 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100579 qScale,
580 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100581 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100582}
583
584LayerTestResult<int16_t, 4> ReLuInt16Test(
585 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
587 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100588{
Keith Davis33a626f2020-08-27 15:38:12 +0100589 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100590}
591
592
konsof017f6db402019-06-07 15:15:58 +0100593LayerTestResult<uint8_t, 4> ReLuUint8Test(
594 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100595 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
596 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100597{
Keith Davis33a626f2020-08-27 15:38:12 +0100598 return ReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100599}
600
601LayerTestResult<float, 4> ReLuTest(
602 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100603 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
604 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100605{
Keith Davis33a626f2020-08-27 15:38:12 +0100606 return ReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100607}
608
609
Teresa Charlin18515e22019-04-24 10:17:46 +0100610template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
611LayerTestResult<T, 4> BoundedReLuTestCommon(
612 armnn::IWorkloadFactory& workloadFactory,
613 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100614 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100615 float qScale,
616 int32_t qOffset)
617{
618 std::vector<float> inputData = {
619 -0.1f, -0.2f, -0.3f, -0.4f,
620 0.1f, 0.2f, 0.3f, 0.4f,
621 -1.0f, -2.0f, -3.0f, -4.0f,
622 1.0f, 2.0f, 3.0f, 4.0f
623 };
624 const float a = 1.0f;
625 const float b = -1.0f;
626 // Calculate output values for input.
627 auto f = [a, b](float value)
628 {
629 return std::min(a, std::max(b, value));
630 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100631 std::vector<float> outputExpected(inputData.size());
632 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100633
634 return SimpleActivationTest<ArmnnType>(workloadFactory,
635 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100636 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100637 armnn::ActivationFunction::BoundedReLu,
638 a,
639 b,
640 qScale,
641 qOffset,
642 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100643 qScale,
644 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100645 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100646}
647
648LayerTestResult<int16_t, 4> BoundedReLuInt16Test(
649 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100650 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
651 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100652{
Keith Davis33a626f2020-08-27 15:38:12 +0100653 return ReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100654}
655
656
657
658template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
659LayerTestResult<T, 4> SoftReLuTestCommon(
660 armnn::IWorkloadFactory& workloadFactory,
661 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100662 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100663 float qScale,
664 int32_t qOffset)
665{
666 std::vector<float> inputData = {
667 -0.1f, -0.2f, -0.3f, -0.4f,
668 0.1f, 0.2f, 0.3f, 0.4f,
669 -1.0f, -2.0f, -3.0f, -4.0f,
670 1.0f, 2.0f, 3.0f, 4.0f
671 };
672
673 // Calculate output values for input.
674 auto f = [](float value)
675 {
676 return std::log(1.0f + std::exp(value));
677 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100678 std::vector<float> outputExpected(inputData.size());
679 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100680
681 return SimpleActivationTest<ArmnnType>(workloadFactory,
682 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100683 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100684 armnn::ActivationFunction::SoftReLu,
685 0.f,
686 0.f,
687 qScale,
688 qOffset,
689 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100690 qScale,
691 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100692 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100693}
694
konsof017f6db402019-06-07 15:15:58 +0100695LayerTestResult<float, 4> SoftReLuTest(
696 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100697 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
698 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100699{
Keith Davis33a626f2020-08-27 15:38:12 +0100700 return SoftReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100701}
702
703LayerTestResult<uint8_t, 4> SoftReLuUint8Test(
704 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100705 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
706 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100707{
Keith Davis33a626f2020-08-27 15:38:12 +0100708 return SoftReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
709 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100710}
711
Teresa Charlin18515e22019-04-24 10:17:46 +0100712LayerTestResult<int16_t, 4> SoftReLuInt16Test(
713 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100714 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
715 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100716{
Keith Davis33a626f2020-08-27 15:38:12 +0100717 return SoftReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100718}
719
720template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
721LayerTestResult<T, 4> LeakyReLuTestCommon(
722 armnn::IWorkloadFactory& workloadFactory,
723 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100724 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100725 float qScale,
726 int32_t qOffset)
727{
728 std::vector<float> inputData = {
729 -0.1f, -0.2f, -0.3f, -0.4f,
730 0.1f, 0.2f, 0.3f, 0.4f,
731 -1.0f, -2.0f, -3.0f, -4.0f,
732 1.0f, 2.0f, 3.0f, 4.0f
733 };
734
735 const float a = 0.01f;
736 // Calculate output values for input.
737 auto f = [a](float value)
738 {
739 return value > 0.0f ? value : (value * a);
740 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100741 std::vector<float> outputExpected(inputData.size());
742 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100743
744 return SimpleActivationTest<ArmnnType>(workloadFactory,
745 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100746 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100747 armnn::ActivationFunction::LeakyReLu,
748 a,
749 0.f,
750 qScale,
751 qOffset,
752 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100753 qScale,
754 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100755 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100756}
757
konsof017f6db402019-06-07 15:15:58 +0100758LayerTestResult<float, 4> LeakyReLuTest(
759 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100760 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
761 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100762{
Keith Davis33a626f2020-08-27 15:38:12 +0100763 return LeakyReLuTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100764}
765
766LayerTestResult<uint8_t, 4> LeakyReLuUint8Test(
767 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100768 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
769 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100770{
Keith Davis33a626f2020-08-27 15:38:12 +0100771 return LeakyReLuTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
772 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100773}
774
Teresa Charlin18515e22019-04-24 10:17:46 +0100775LayerTestResult<int16_t, 4> LeakyReLuInt16Test(
776 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100777 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
778 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100779{
Keith Davis33a626f2020-08-27 15:38:12 +0100780 return LeakyReLuTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100781}
782
783template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
784LayerTestResult<T, 4> AbsTestCommon(
785 armnn::IWorkloadFactory& workloadFactory,
786 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100787 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100788 float qScale,
789 int32_t qOffset)
790{
791 std::vector<float> inputData = {
792 -0.1f, -0.2f, -0.3f, -0.4f,
793 0.1f, 0.2f, 0.3f, 0.4f,
794 -1.0f, -2.0f, -3.0f, -4.0f,
795 1.0f, 2.0f, 3.0f, 4.0f
796 };
797
798 // Calculate output values for input.
799 auto f = [](float value)
800 {
801 return std::abs(value);
802 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100803 std::vector<float> outputExpected(inputData.size());
804 std::transform(inputData.begin(), inputData.end(), outputExpected.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100805
806 return SimpleActivationTest<ArmnnType>(workloadFactory,
807 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100808 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100809 armnn::ActivationFunction::Abs,
810 0.f,
811 0.f,
812 qScale,
813 qOffset,
814 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100815 qScale,
816 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100817 outputExpected);
Teresa Charlin18515e22019-04-24 10:17:46 +0100818}
819
konsof017f6db402019-06-07 15:15:58 +0100820LayerTestResult<float, 4> AbsTest(
821 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100822 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
823 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100824{
Keith Davis33a626f2020-08-27 15:38:12 +0100825 return AbsTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100826}
827
828LayerTestResult<uint8_t, 4> AbsUint8Test(
829 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
831 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100832{
Keith Davis33a626f2020-08-27 15:38:12 +0100833 return AbsTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100834}
835
Teresa Charlin18515e22019-04-24 10:17:46 +0100836LayerTestResult<int16_t, 4> AbsInt16Test(
837 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100838 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
839 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100840{
Keith Davis33a626f2020-08-27 15:38:12 +0100841 return AbsTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100842}
843
Sadik Armagan6095ba52019-09-13 17:07:19 +0100844LayerTestResult<float, 5> SqrtNNTest(
845 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100846 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
847 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan6095ba52019-09-13 17:07:19 +0100848{
Jan Eilers8eb25602020-03-09 12:13:48 +0000849 IgnoreUnused(memoryManager);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100850 const int inputDataSize = 120;
851 std::vector<float> inputData(inputDataSize);
852
853 for (unsigned int i = 0u; i < inputDataSize; ++i)
854 {
855 inputData[i] = static_cast<float>(i) / 10;
856 }
857
858 auto f = [](float value)
859 {
860 return std::sqrt(value);
861 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100862 std::vector<float> expectedOutput(inputDataSize);
863 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100864
865 armnn::TensorInfo inputTensorInfo(
866 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
867 armnn::TensorInfo outputTensorInfo(
868 { 1u, 2u, 3u, 4u, 5u }, armnn::DataType::Float32);
869
Sadik Armagan483c8112021-06-01 09:24:52 +0100870 std::vector<float> actualOutput(outputTensorInfo.GetNumElements());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100871
Keith Davis33a626f2020-08-27 15:38:12 +0100872 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
873 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100874
875 armnn::ActivationQueueDescriptor descriptor;
876 armnn::WorkloadInfo workloadInfo;
877 AddInputToWorkload(descriptor, workloadInfo, inputTensorInfo, inputHandle.get());
878 AddOutputToWorkload(descriptor, workloadInfo, outputTensorInfo, outputHandle.get());
879
880 descriptor.m_Parameters.m_Function = armnn::ActivationFunction::Sqrt;
881
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000882 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
883 descriptor, workloadInfo);
Sadik Armagan6095ba52019-09-13 17:07:19 +0100884
885 inputHandle->Allocate();
886 outputHandle->Allocate();
887
Sadik Armagan483c8112021-06-01 09:24:52 +0100888 CopyDataToITensorHandle(inputHandle.get(), inputData.data());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100889
890 workload->Execute();
891
Sadik Armagan483c8112021-06-01 09:24:52 +0100892 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100893
Sadik Armagan483c8112021-06-01 09:24:52 +0100894 return LayerTestResult<float, 5>(actualOutput,
895 expectedOutput,
896 outputHandle->GetShape(),
897 outputTensorInfo.GetShape());
Sadik Armagan6095ba52019-09-13 17:07:19 +0100898};
899
Teresa Charlin18515e22019-04-24 10:17:46 +0100900template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
901LayerTestResult<T, 4> SqrtTestCommon(
902 armnn::IWorkloadFactory& workloadFactory,
903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100904 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100905 float qScale,
906 int32_t qOffset)
907{
908 std::vector<float> inputData = {
909 0.1f, 0.2f, 0.3f, 0.4f,
910 0.1f, 0.2f, 0.3f, 0.4f,
911 1.0f, 2.0f, 3.0f, 4.0f,
912 1.0f, 2.0f, 3.0f, 4.0f
913 };
914
915 // Calculate output values for input.
916 auto f = [](float value)
917 {
918 return std::sqrt(value);
919 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100920 std::vector<float> expectedOutput(inputData.size());
921 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100922
923 return SimpleActivationTest<ArmnnType>(workloadFactory,
924 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100925 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100926 armnn::ActivationFunction::Sqrt,
927 0.f,
928 0.f,
929 qScale,
930 qOffset,
931 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100932 qScale,
933 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100934 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +0100935}
936
konsof017f6db402019-06-07 15:15:58 +0100937LayerTestResult<float, 4> SqrtTest(
938 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100939 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
940 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100941{
Keith Davis33a626f2020-08-27 15:38:12 +0100942 return SqrtTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +0100943}
944
945LayerTestResult<uint8_t, 4> SqrtUint8Test(
946 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100947 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
948 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +0100949{
Keith Davis33a626f2020-08-27 15:38:12 +0100950 return SqrtTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +0100951}
952
Teresa Charlin18515e22019-04-24 10:17:46 +0100953LayerTestResult<int16_t, 4> SqrtInt16Test(
954 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +0100955 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
956 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +0100957{
Keith Davis33a626f2020-08-27 15:38:12 +0100958 return SqrtTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +0100959}
960
961template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
962LayerTestResult<T, 4> SquareTestCommon(
963 armnn::IWorkloadFactory& workloadFactory,
964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100965 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100966 float qScale,
967 int32_t qOffset)
968{
969 std::vector<float> inputData = {
970 -0.1f, -0.2f, -0.3f, -0.4f,
971 0.1f, 0.2f, 0.3f, 0.4f,
972 -1.0f, -2.0f, -3.0f, -4.0f,
973 1.0f, 2.0f, 3.0f, 4.0f
974 };
975
976 // Calculate output values for input.
977 auto f = [](float value)
978 {
979 return std::pow(value,2);
980 };
Sadik Armagan483c8112021-06-01 09:24:52 +0100981 std::vector<float> expectedOutput(inputData.size());
982 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +0100983
984 return SimpleActivationTest<ArmnnType>(workloadFactory,
985 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +0100986 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +0100987 armnn::ActivationFunction::Square,
988 0.f,
989 0.f,
990 qScale,
991 qOffset,
992 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +0100993 qScale,
994 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +0100995 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +0100996}
997
konsof017f6db402019-06-07 15:15:58 +0100998LayerTestResult<float, 4> SquareTest(
999 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001000 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1001 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001002{
Keith Davis33a626f2020-08-27 15:38:12 +01001003 return SquareTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001004}
1005
1006LayerTestResult<uint8_t, 4> SquareUint8Test(
1007 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001008 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1009 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001010{
Keith Davis33a626f2020-08-27 15:38:12 +01001011 return SquareTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1012 tensorHandleFactory, 0.0625f, 64);
konsof017f6db402019-06-07 15:15:58 +01001013}
1014
Teresa Charlin18515e22019-04-24 10:17:46 +01001015LayerTestResult<int16_t, 4> SquareInt16Test(
1016 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001017 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1018 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001019{
Keith Davis33a626f2020-08-27 15:38:12 +01001020 return SquareTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001021}
1022
1023template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1024LayerTestResult<T, 4> TanhTestCommon(
1025 armnn::IWorkloadFactory& workloadFactory,
1026 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001027 const armnn::ITensorHandleFactory& tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001028 float qScale,
1029 int32_t qOffset)
1030{
1031 std::vector<float> inputData = {
1032 -0.1f, -0.2f, -0.3f, -0.4f,
1033 0.1f, 0.2f, 0.3f, 0.4f,
1034 -1.0f, -2.0f, -3.0f, -4.0f,
1035 1.0f, 2.0f, 3.0f, 4.0f
1036 };
1037
1038 const float a = 2.0f;
1039 const float b = 3.0f;
1040 // Calculate output values for input.
1041 auto f = [a, b](float value)
1042 {
1043 return a * tanhf(b * value);
1044 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001045 std::vector<float> expectedOutput(inputData.size());
1046 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Teresa Charlin18515e22019-04-24 10:17:46 +01001047
1048 return SimpleActivationTest<ArmnnType>(workloadFactory,
1049 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001050 tensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001051 armnn::ActivationFunction::TanH,
1052 a,
1053 b,
1054 qScale,
1055 qOffset,
1056 inputData,
Ferran Balaguerb2b5a262019-06-24 12:43:38 +01001057 qScale,
1058 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001059 expectedOutput);
Teresa Charlin18515e22019-04-24 10:17:46 +01001060}
1061
konsof017f6db402019-06-07 15:15:58 +01001062LayerTestResult<float, 4> TanhTest(
1063 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001064 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1065 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001066{
Keith Davis33a626f2020-08-27 15:38:12 +01001067 return TanhTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
konsof017f6db402019-06-07 15:15:58 +01001068}
1069
1070LayerTestResult<uint8_t, 4> TanhUint8Test(
1071 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1073 const armnn::ITensorHandleFactory& tensorHandleFactory)
konsof017f6db402019-06-07 15:15:58 +01001074{
Keith Davis33a626f2020-08-27 15:38:12 +01001075 return TanhTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
konsof017f6db402019-06-07 15:15:58 +01001076}
1077
Teresa Charlin18515e22019-04-24 10:17:46 +01001078LayerTestResult<int16_t, 4> TanhInt16Test(
1079 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001080 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1081 const armnn::ITensorHandleFactory& tensorHandleFactory)
Teresa Charlin18515e22019-04-24 10:17:46 +01001082{
Keith Davis33a626f2020-08-27 15:38:12 +01001083 return TanhTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001084}
1085
1086
David Monahan3b3c3812020-02-25 09:03:29 +00001087template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1088LayerTestResult<T, 4> EluTestCommon(
1089 armnn::IWorkloadFactory& workloadFactory,
1090 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001091 const armnn::ITensorHandleFactory& tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001092 float qScale,
1093 int32_t qOffset)
1094{
1095 std::vector<float> inputData = {
1096 -0.1f, -0.2f, -0.3f, -0.4f,
1097 0.1f, 0.2f, 0.3f, 0.4f,
1098 -1.0f, -2.0f, -3.0f, -4.0f,
1099 1.0f, 2.0f, 3.0f, 4.0f
1100 };
1101
1102
1103 const float a = 0.01f;
1104 // Calculate output values for input.
1105 auto f = [a](float value)
1106 {
1107 return (value >= 0) ? value : a * (expf(value) - 1);
1108 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001109 std::vector<float> expectedOutput(inputData.size());
1110 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
David Monahan3b3c3812020-02-25 09:03:29 +00001111
1112 return SimpleActivationTest<ArmnnType>(workloadFactory,
1113 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001114 tensorHandleFactory,
David Monahan3b3c3812020-02-25 09:03:29 +00001115 armnn::ActivationFunction::Elu,
1116 a,
1117 0.0f,
1118 qScale,
1119 qOffset,
1120 inputData,
1121 qScale,
1122 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001123 expectedOutput);
David Monahan3b3c3812020-02-25 09:03:29 +00001124}
1125
1126LayerTestResult<float, 4> EluTest(
1127 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1129 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001130{
Keith Davis33a626f2020-08-27 15:38:12 +01001131 return EluTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001132}
1133
1134LayerTestResult<uint8_t, 4> EluUint8Test(
1135 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001136 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1137 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001138{
Keith Davis33a626f2020-08-27 15:38:12 +01001139 return EluTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 64);
David Monahan3b3c3812020-02-25 09:03:29 +00001140}
1141
1142LayerTestResult<int16_t, 4> EluInt16Test(
1143 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001144 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1145 const armnn::ITensorHandleFactory& tensorHandleFactory)
David Monahan3b3c3812020-02-25 09:03:29 +00001146{
Keith Davis33a626f2020-08-27 15:38:12 +01001147 return EluTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
David Monahan3b3c3812020-02-25 09:03:29 +00001148}
1149
Teresa Charlin18515e22019-04-24 10:17:46 +01001150
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001151template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001152LayerTestResult<T, 4> HardSwishTestCommon(
1153 armnn::IWorkloadFactory& workloadFactory,
1154 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001155 const armnn::ITensorHandleFactory& tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001156 float qScale,
1157 int32_t qOffset)
1158{
1159 std::vector<float> inputData = {
1160 -0.1f, -0.2f, -0.3f, -0.4f,
1161 0.1f, 0.2f, 0.3f, 0.4f,
1162 -1.0f, -2.0f, -3.0f, -4.0f,
1163 1.0f, 2.0f, 3.0f, 4.0f
1164 };
1165 // Calculate output values for input.
1166 auto f = [](float x)
1167 {
1168 // Break down the calculation to help with verification.
1169 // hard_swish(x) = x * relu6(x+3) / 6
1170 // relu6(x) = min(max(x,0),6)
1171 float reLu6_step1 = std::max((x + 3),0.0f);
1172 float reLu6Complete = std::min(reLu6_step1, 6.0f);
1173 float hardSwish_step1 = x * reLu6Complete;
1174 float result = hardSwish_step1 / 6;
1175 return result;
1176 };
Sadik Armagan483c8112021-06-01 09:24:52 +01001177 std::vector<float> expectedOutput(inputData.size());
1178 std::transform(inputData.begin(), inputData.end(), expectedOutput.begin(), f);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001179
1180 return SimpleActivationTest<ArmnnType>(workloadFactory,
1181 memoryManager,
Keith Davis33a626f2020-08-27 15:38:12 +01001182 tensorHandleFactory,
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001183 armnn::ActivationFunction::HardSwish,
1184 0.f,
1185 0.f,
1186 qScale,
1187 qOffset,
1188 inputData,
1189 qScale,
1190 qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +01001191 expectedOutput);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001192}
1193
1194LayerTestResult<float, 4> HardSwishTest(
1195 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1197 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001198{
Keith Davis33a626f2020-08-27 15:38:12 +01001199 return HardSwishTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001200}
1201
1202LayerTestResult<uint8_t, 4> HardSwishUint8Test(
1203 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001204 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1205 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001206{
Keith Davis33a626f2020-08-27 15:38:12 +01001207 return HardSwishTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager,
1208 tensorHandleFactory, 0.1f, 64);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001209}
1210
1211LayerTestResult<int16_t, 4> HardSwishInt16Test(
1212 armnn::IWorkloadFactory& workloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001213 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1214 const armnn::ITensorHandleFactory& tensorHandleFactory)
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001215{
Keith Davis33a626f2020-08-27 15:38:12 +01001216 return HardSwishTestCommon<armnn::DataType::QSymmS16>(workloadFactory, memoryManager, tensorHandleFactory, 0.1f, 0);
Colm Donelan03fbeaf2020-02-26 15:39:23 +00001217}
1218
1219
1220template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Sadik Armagan483c8112021-06-01 09:24:52 +01001221LayerTestResult<T, 4> CompareActivationTestImpl(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001222 armnn::IWorkloadFactory& workloadFactory,
1223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1224 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001225 const armnn::ITensorHandleFactory& tensorHandleFactory,
1226 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001227 armnn::ActivationFunction f,
1228 unsigned int batchSize = 5,
1229 float qScale = 0.0f,
1230 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001231{
Jan Eilers8eb25602020-03-09 12:13:48 +00001232 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +00001233 unsigned int width = 17;
1234 unsigned int height = 29;
1235 unsigned int channels = 2;
1236
1237 float a = 0.234f;
1238 float b = -12.345f;
1239
1240 armnn::TensorInfo inputTensorInfo;
1241 armnn::TensorInfo outputTensorInfo;
1242
1243 unsigned int shape[] = {batchSize, channels, height, width};
1244
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001245 inputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
1246 outputTensorInfo = armnn::TensorInfo(4, shape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001247
1248 // Set quantization parameters if the requested type is a quantized type.
1249 if(armnn::IsQuantizedType<T>())
1250 {
1251 inputTensorInfo.SetQuantizationScale(qScale);
1252 inputTensorInfo.SetQuantizationOffset(qOffset);
1253 outputTensorInfo.SetQuantizationScale(qScale);
1254 outputTensorInfo.SetQuantizationOffset(qOffset);
1255 }
1256
1257 float minVal = -10.f;
1258 if (f == armnn::ActivationFunction::Sqrt)
1259 {
1260 minVal = 0.f;
1261 }
1262
Sadik Armagan483c8112021-06-01 09:24:52 +01001263 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 21453, minVal, 10.f);
1264 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
1265 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +00001266
Keith Davis33a626f2020-08-27 15:38:12 +01001267 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1268 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001269
Keith Davis33a626f2020-08-27 15:38:12 +01001270 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1271 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +00001272
1273 armnn::ActivationQueueDescriptor data;
1274 armnn::WorkloadInfo info;
1275 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1276 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1277 data.m_Parameters.m_A = a;
1278 data.m_Parameters.m_B = b;
1279 data.m_Parameters.m_Function = f;
1280
1281 armnn::ActivationQueueDescriptor refData = data;
1282 armnn::WorkloadInfo refInfo = info;
1283 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1284 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1285
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001286 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Activation,
1287 data, info);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001288 ARMNN_ASSERT(workload != nullptr);
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001289 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateWorkload(armnn::LayerType::Activation,
1290 refData, refInfo);
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +01001291 ARMNN_ASSERT(workloadRef != nullptr);
telsoa014fcda012018-03-09 14:13:49 +00001292
1293 inputHandle->Allocate();
1294 outputHandle->Allocate();
1295 inputHandleRef->Allocate();
1296 outputHandleRef->Allocate();
1297
Sadik Armagan483c8112021-06-01 09:24:52 +01001298 CopyDataToITensorHandle(inputHandle.get(), input.data());
1299 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +00001300
1301 workload->Execute();
1302 workloadRef->Execute();
1303
Sadik Armagan483c8112021-06-01 09:24:52 +01001304 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
1305 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
telsoa014fcda012018-03-09 14:13:49 +00001306
Sadik Armagan483c8112021-06-01 09:24:52 +01001307 return LayerTestResult<T, 4>(actualOutput,
1308 expectedOutput,
1309 outputHandle->GetShape(),
1310 outputTensorInfo.GetShape());
1311
telsoa014fcda012018-03-09 14:13:49 +00001312}
1313
Sadik Armagan483c8112021-06-01 09:24:52 +01001314LayerTestResult<float, 4> CompareActivationTest(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001315 armnn::IWorkloadFactory& workloadFactory,
1316 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1317 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001318 const armnn::ITensorHandleFactory& tensorHandleFactory,
1319 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001320 armnn::ActivationFunction f,
1321 unsigned int batchSize)
telsoa014fcda012018-03-09 14:13:49 +00001322{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001323 return CompareActivationTestImpl<armnn::DataType::Float32>(
Keith Davis33a626f2020-08-27 15:38:12 +01001324 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1325 refTensorHandleFactory, f, batchSize);
telsoa014fcda012018-03-09 14:13:49 +00001326}
1327
Sadik Armagan483c8112021-06-01 09:24:52 +01001328LayerTestResult<uint8_t, 4> CompareActivationUint8Test(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001329 armnn::IWorkloadFactory& workloadFactory,
1330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1331 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001332 const armnn::ITensorHandleFactory& tensorHandleFactory,
1333 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001334 armnn::ActivationFunction f)
telsoa014fcda012018-03-09 14:13:49 +00001335{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001336 return CompareActivationTestImpl<armnn::DataType::QAsymmU8>(
Keith Davis33a626f2020-08-27 15:38:12 +01001337 workloadFactory, memoryManager, refWorkloadFactory,
1338 tensorHandleFactory, refTensorHandleFactory, f, 5, 0.1f, 50);
telsoa014fcda012018-03-09 14:13:49 +00001339}
Teresa Charlin18515e22019-04-24 10:17:46 +01001340
Sadik Armagan483c8112021-06-01 09:24:52 +01001341LayerTestResult<int16_t, 4> CompareActivationInt16Test(
Teresa Charlin18515e22019-04-24 10:17:46 +01001342 armnn::IWorkloadFactory& workloadFactory,
1343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1344 armnn::IWorkloadFactory& refWorkloadFactory,
Keith Davis33a626f2020-08-27 15:38:12 +01001345 const armnn::ITensorHandleFactory& tensorHandleFactory,
1346 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Teresa Charlin18515e22019-04-24 10:17:46 +01001347 armnn::ActivationFunction f)
1348{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001349 return CompareActivationTestImpl<armnn::DataType::QSymmS16>(
Keith Davis33a626f2020-08-27 15:38:12 +01001350 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory,
1351 refTensorHandleFactory, f, 5, 0.1f, 0);
Teresa Charlin18515e22019-04-24 10:17:46 +01001352}