blob: ad23f8f3804de071b3b6d4359a41a5d0c41cfba0 [file] [log] [blame]
Aron Virginas-Tare662a942019-10-14 15:12:00 +01001//
Keith Davis69e653f2020-07-02 11:49:26 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tare662a942019-10-14 15:12:00 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "LogSoftmaxTestImpl.hpp"
7
8#include <Half.hpp>
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01009#include <QuantizeHelper.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010010#include <ResolveType.hpp>
11
Aron Virginas-Tare662a942019-10-14 15:12:00 +010012
James Conroy1f58f032021-04-27 17:13:27 +010013#include <backendsCommon/TensorHandle.hpp>
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000014#include <armnn/backends/IBackendInternal.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010015#include <backendsCommon/WorkloadFactory.hpp>
16
Aron Virginas-Tare662a942019-10-14 15:12:00 +010017#include <backendsCommon/test/TensorCopyUtils.hpp>
18#include <backendsCommon/test/WorkloadTestUtils.hpp>
19
20#include <test/TensorHelpers.hpp>
21
22namespace
23{
24
25template<armnn::DataType ArmnnType,
26 std::size_t NumDims,
27 typename T = armnn::ResolveType<ArmnnType>>
28LayerTestResult<T, NumDims> LogSoftmaxTestImpl(
29 armnn::IWorkloadFactory& workloadFactory,
30 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +010031 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +010032 const armnn::TensorInfo& inputInfo,
33 const armnn::TensorInfo& outputInfo,
34 const std::vector<float>& inputValues,
35 const std::vector<float>& expectedOutputValues,
36 armnn::LogSoftmaxQueueDescriptor descriptor,
37 float qScale = 1.0f,
38 int32_t qOffset = 0)
39{
Jan Eilers8eb25602020-03-09 12:13:48 +000040 IgnoreUnused(memoryManager);
Sadik Armagan483c8112021-06-01 09:24:52 +010041
42 auto inputTensor = armnnUtils::QuantizedVector<T>(inputValues, qScale, qOffset);
43
44 std::vector<T> actualOutput(outputInfo.GetNumElements());
45 std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(expectedOutputValues, qScale, qOffset);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010046
Finn Williamsc43de6a2020-08-27 11:13:25 +010047 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
48 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010049
50 armnn::WorkloadInfo info;
51
52 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
53 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
54
55 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateLogSoftmax(descriptor, info);
56
57 inputHandle->Allocate();
58 outputHandle->Allocate();
59
Sadik Armagan483c8112021-06-01 09:24:52 +010060 CopyDataToITensorHandle(inputHandle.get(), inputTensor.data());
Aron Virginas-Tare662a942019-10-14 15:12:00 +010061
Keith Davis69e653f2020-07-02 11:49:26 +010062 ExecuteWorkload(*workload, memoryManager);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010063
Sadik Armagan483c8112021-06-01 09:24:52 +010064 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tare662a942019-10-14 15:12:00 +010065
Sadik Armagan483c8112021-06-01 09:24:52 +010066 return LayerTestResult<T, NumDims>(actualOutput,
67 expectedOutput,
68 outputHandle->GetShape(),
69 outputInfo.GetShape());
70
Aron Virginas-Tare662a942019-10-14 15:12:00 +010071}
72
73} // anonymous namespace
74
75template<armnn::DataType ArmnnType, typename T>
76LayerTestResult<T, 4> LogSoftmaxTest1(
77 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +010078 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
79 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +010080{
81 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
82
83 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
84 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
85
86 std::vector<float> inputValues
87 {
88 0.f, -6.f, 2.f, 4.f,
89 3.f, -2.f, 10.f, 1.f
90 };
91
92 std::vector<float> expectedOutputValues
93 {
94 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
95 -7.00104f, -12.00104f, -0.00105f, -9.00104f
96 };
97
98 armnn::LogSoftmaxQueueDescriptor descriptor;
99 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
100 descriptor.m_Parameters.m_Axis = -1; // default axis
101
102 return LogSoftmaxTestImpl<ArmnnType, 4>(
103 workloadFactory,
104 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100105 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100106 inputTensorInfo,
107 outputTensorInfo,
108 inputValues,
109 expectedOutputValues,
110 descriptor);
111}
112
113template<armnn::DataType ArmnnType, typename T>
114LayerTestResult<T, 4> LogSoftmaxTest2(
115 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100116 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
117 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100118{
119 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
120
121 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
122 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
123
124 std::vector<float> inputValues
125 {
126 0.f, -6.f, 2.f, 4.f,
127 3.f, -2.f, 10.f, 1.f
128 };
129
130 std::vector<float> expectedOutputValues
131 {
132 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
133 -7.00104f, -12.00104f, -0.00105f, -9.00104f
134 };
135
136 armnn::LogSoftmaxQueueDescriptor descriptor;
137 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
138 descriptor.m_Parameters.m_Axis = 3; // positive axis
139
140 return LogSoftmaxTestImpl<ArmnnType, 4>(
141 workloadFactory,
142 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100143 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100144 inputTensorInfo,
145 outputTensorInfo,
146 inputValues,
147 expectedOutputValues,
148 descriptor);
149}
150
151template<armnn::DataType ArmnnType, typename T>
152LayerTestResult<T, 4> LogSoftmaxTest3(
153 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100154 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
155 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100156{
157 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
158
159 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
160 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
161
162 std::vector<float> inputValues
163 {
164 0.0f, -0.6f, 0.2f, 0.4f,
165 0.3f, -0.2f, 1.0f, 0.1f
166 };
167
168 std::vector<float> expectedOutputValues
169 {
170 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
171 -7.00104f, -12.00104f, -0.00105f, -9.00104f
172 };
173
174 armnn::LogSoftmaxQueueDescriptor descriptor;
175 descriptor.m_Parameters.m_Beta = 10.0f; // non-default beta
176 descriptor.m_Parameters.m_Axis = 3; // positive axis
177
178 return LogSoftmaxTestImpl<ArmnnType, 4>(
179 workloadFactory,
180 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100181 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100182 inputTensorInfo,
183 outputTensorInfo,
184 inputValues,
185 expectedOutputValues,
186 descriptor);
187}
188
189template<armnn::DataType ArmnnType, typename T>
190LayerTestResult<T, 4> LogSoftmaxTest4(
191 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100192 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
193 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100194{
195 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
196
197 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
198 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
199
200 std::vector<float> inputValues
201 {
202 0.f, -6.f, 2.f, 4.f,
203 3.f, -2.f, 10.f, 1.f
204 };
205
206 std::vector<float> expectedOutputValues
207 {
208 -3.048587f, -4.018149f, -8.000336f, -0.048587f,
209 -0.048587f, -0.018149f, -0.000335f, -3.048587f
210 };
211
212 armnn::LogSoftmaxQueueDescriptor descriptor;
213 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
214 descriptor.m_Parameters.m_Axis = -2; // negative axis
215
216 return LogSoftmaxTestImpl<ArmnnType, 4>(
217 workloadFactory,
218 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100219 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100220 inputTensorInfo,
221 outputTensorInfo,
222 inputValues,
223 expectedOutputValues,
224 descriptor);
225}
226
227template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
228LogSoftmaxTest1<armnn::DataType::Float32>(
229 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100230 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
231 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100232
233template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
234LogSoftmaxTest2<armnn::DataType::Float32>(
235 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100236 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
237 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100238
239template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
240LogSoftmaxTest3<armnn::DataType::Float32>(
241 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100242 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
243 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100244
245template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
246LogSoftmaxTest4<armnn::DataType::Float32>(
247 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
249 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100250
251template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
252LogSoftmaxTest1<armnn::DataType::Float16>(
253 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100254 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
255 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100256
257template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
258LogSoftmaxTest2<armnn::DataType::Float16>(
259 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100260 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
261 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100262
263template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
264LogSoftmaxTest3<armnn::DataType::Float16>(
265 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
267 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100268
269template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
270LogSoftmaxTest4<armnn::DataType::Float16>(
271 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100272 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
273 const armnn::ITensorHandleFactory& tensorHandleFactory);