blob: 11846523496864db6b243b2a5c300d7103faa315 [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>
Colm Donelanc42a9872022-02-02 16:35:09 +00009#include <armnnUtils/QuantizeHelper.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010010#include <ResolveType.hpp>
11
Aron Virginas-Tare662a942019-10-14 15:12:00 +010012
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnn/backends/TensorHandle.hpp>
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000014#include <armnn/backends/IBackendInternal.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000015#include <armnn/backends/WorkloadFactory.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010016
Sadik Armagana097d2a2021-11-24 15:47:28 +000017#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000018#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010019
Colm Donelanc42a9872022-02-02 16:35:09 +000020#include <armnnTestUtils/TensorHelpers.hpp>
Aron Virginas-Tare662a942019-10-14 15:12:00 +010021
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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000055 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::LogSoftmax,
56 descriptor,
57 info);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010058
59 inputHandle->Allocate();
60 outputHandle->Allocate();
61
Sadik Armagan483c8112021-06-01 09:24:52 +010062 CopyDataToITensorHandle(inputHandle.get(), inputTensor.data());
Aron Virginas-Tare662a942019-10-14 15:12:00 +010063
Keith Davis69e653f2020-07-02 11:49:26 +010064 ExecuteWorkload(*workload, memoryManager);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010065
Sadik Armagan483c8112021-06-01 09:24:52 +010066 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tare662a942019-10-14 15:12:00 +010067
Sadik Armagan483c8112021-06-01 09:24:52 +010068 return LayerTestResult<T, NumDims>(actualOutput,
69 expectedOutput,
70 outputHandle->GetShape(),
71 outputInfo.GetShape());
72
Aron Virginas-Tare662a942019-10-14 15:12:00 +010073}
74
75} // anonymous namespace
76
77template<armnn::DataType ArmnnType, typename T>
78LayerTestResult<T, 4> LogSoftmaxTest1(
79 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +010080 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
81 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +010082{
83 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
84
85 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
86 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
87
88 std::vector<float> inputValues
89 {
90 0.f, -6.f, 2.f, 4.f,
91 3.f, -2.f, 10.f, 1.f
92 };
93
94 std::vector<float> expectedOutputValues
95 {
96 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
97 -7.00104f, -12.00104f, -0.00105f, -9.00104f
98 };
99
100 armnn::LogSoftmaxQueueDescriptor descriptor;
101 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
102 descriptor.m_Parameters.m_Axis = -1; // default axis
103
104 return LogSoftmaxTestImpl<ArmnnType, 4>(
105 workloadFactory,
106 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100107 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100108 inputTensorInfo,
109 outputTensorInfo,
110 inputValues,
111 expectedOutputValues,
112 descriptor);
113}
114
115template<armnn::DataType ArmnnType, typename T>
116LayerTestResult<T, 4> LogSoftmaxTest2(
117 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100118 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
119 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100120{
121 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
122
123 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
124 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
125
126 std::vector<float> inputValues
127 {
128 0.f, -6.f, 2.f, 4.f,
129 3.f, -2.f, 10.f, 1.f
130 };
131
132 std::vector<float> expectedOutputValues
133 {
134 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
135 -7.00104f, -12.00104f, -0.00105f, -9.00104f
136 };
137
138 armnn::LogSoftmaxQueueDescriptor descriptor;
139 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
140 descriptor.m_Parameters.m_Axis = 3; // positive axis
141
142 return LogSoftmaxTestImpl<ArmnnType, 4>(
143 workloadFactory,
144 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100145 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100146 inputTensorInfo,
147 outputTensorInfo,
148 inputValues,
149 expectedOutputValues,
150 descriptor);
151}
152
153template<armnn::DataType ArmnnType, typename T>
154LayerTestResult<T, 4> LogSoftmaxTest3(
155 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100156 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
157 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100158{
159 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
160
161 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
162 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
163
164 std::vector<float> inputValues
165 {
166 0.0f, -0.6f, 0.2f, 0.4f,
167 0.3f, -0.2f, 1.0f, 0.1f
168 };
169
170 std::vector<float> expectedOutputValues
171 {
172 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
173 -7.00104f, -12.00104f, -0.00105f, -9.00104f
174 };
175
176 armnn::LogSoftmaxQueueDescriptor descriptor;
177 descriptor.m_Parameters.m_Beta = 10.0f; // non-default beta
178 descriptor.m_Parameters.m_Axis = 3; // positive axis
179
180 return LogSoftmaxTestImpl<ArmnnType, 4>(
181 workloadFactory,
182 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100183 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100184 inputTensorInfo,
185 outputTensorInfo,
186 inputValues,
187 expectedOutputValues,
188 descriptor);
189}
190
191template<armnn::DataType ArmnnType, typename T>
192LayerTestResult<T, 4> LogSoftmaxTest4(
193 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
195 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100196{
197 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
198
199 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
200 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
201
202 std::vector<float> inputValues
203 {
204 0.f, -6.f, 2.f, 4.f,
205 3.f, -2.f, 10.f, 1.f
206 };
207
208 std::vector<float> expectedOutputValues
209 {
210 -3.048587f, -4.018149f, -8.000336f, -0.048587f,
211 -0.048587f, -0.018149f, -0.000335f, -3.048587f
212 };
213
214 armnn::LogSoftmaxQueueDescriptor descriptor;
215 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
216 descriptor.m_Parameters.m_Axis = -2; // negative axis
217
218 return LogSoftmaxTestImpl<ArmnnType, 4>(
219 workloadFactory,
220 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100221 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100222 inputTensorInfo,
223 outputTensorInfo,
224 inputValues,
225 expectedOutputValues,
226 descriptor);
227}
228
229template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
230LogSoftmaxTest1<armnn::DataType::Float32>(
231 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
233 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100234
235template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
236LogSoftmaxTest2<armnn::DataType::Float32>(
237 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100238 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
239 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100240
241template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
242LogSoftmaxTest3<armnn::DataType::Float32>(
243 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100244 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
245 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100246
247template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
248LogSoftmaxTest4<armnn::DataType::Float32>(
249 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
251 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100252
253template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
254LogSoftmaxTest1<armnn::DataType::Float16>(
255 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
257 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100258
259template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
260LogSoftmaxTest2<armnn::DataType::Float16>(
261 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100262 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
263 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100264
265template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
266LogSoftmaxTest3<armnn::DataType::Float16>(
267 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
269 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100270
271template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
272LogSoftmaxTest4<armnn::DataType::Float16>(
273 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
275 const armnn::ITensorHandleFactory& tensorHandleFactory);