blob: f32d367d3753b5135f045f6b189ba268996e1a84 [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);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010041 LayerTestResult<T, NumDims> result(outputInfo);
42 result.outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010043 MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputValues, qScale, qOffset));
Aron Virginas-Tare662a942019-10-14 15:12:00 +010044
Finn Williamsc43de6a2020-08-27 11:13:25 +010045 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
46 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010047
48 armnn::WorkloadInfo info;
49
50 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
51 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
52
53 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateLogSoftmax(descriptor, info);
54
55 inputHandle->Allocate();
56 outputHandle->Allocate();
57
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010058 auto inputTensor = MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputValues, qScale, qOffset));
Aron Virginas-Tare662a942019-10-14 15:12:00 +010059 CopyDataToITensorHandle(inputHandle.get(), inputTensor.origin());
60
Keith Davis69e653f2020-07-02 11:49:26 +010061 ExecuteWorkload(*workload, memoryManager);
Aron Virginas-Tare662a942019-10-14 15:12:00 +010062
63 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
64
65 return result;
66}
67
68} // anonymous namespace
69
70template<armnn::DataType ArmnnType, typename T>
71LayerTestResult<T, 4> LogSoftmaxTest1(
72 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +010073 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
74 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +010075{
76 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
77
78 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
79 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
80
81 std::vector<float> inputValues
82 {
83 0.f, -6.f, 2.f, 4.f,
84 3.f, -2.f, 10.f, 1.f
85 };
86
87 std::vector<float> expectedOutputValues
88 {
89 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
90 -7.00104f, -12.00104f, -0.00105f, -9.00104f
91 };
92
93 armnn::LogSoftmaxQueueDescriptor descriptor;
94 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
95 descriptor.m_Parameters.m_Axis = -1; // default axis
96
97 return LogSoftmaxTestImpl<ArmnnType, 4>(
98 workloadFactory,
99 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100100 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100101 inputTensorInfo,
102 outputTensorInfo,
103 inputValues,
104 expectedOutputValues,
105 descriptor);
106}
107
108template<armnn::DataType ArmnnType, typename T>
109LayerTestResult<T, 4> LogSoftmaxTest2(
110 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100111 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
112 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100113{
114 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
115
116 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
117 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
118
119 std::vector<float> inputValues
120 {
121 0.f, -6.f, 2.f, 4.f,
122 3.f, -2.f, 10.f, 1.f
123 };
124
125 std::vector<float> expectedOutputValues
126 {
127 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
128 -7.00104f, -12.00104f, -0.00105f, -9.00104f
129 };
130
131 armnn::LogSoftmaxQueueDescriptor descriptor;
132 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
133 descriptor.m_Parameters.m_Axis = 3; // positive axis
134
135 return LogSoftmaxTestImpl<ArmnnType, 4>(
136 workloadFactory,
137 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100138 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100139 inputTensorInfo,
140 outputTensorInfo,
141 inputValues,
142 expectedOutputValues,
143 descriptor);
144}
145
146template<armnn::DataType ArmnnType, typename T>
147LayerTestResult<T, 4> LogSoftmaxTest3(
148 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100149 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
150 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100151{
152 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
153
154 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
155 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
156
157 std::vector<float> inputValues
158 {
159 0.0f, -0.6f, 0.2f, 0.4f,
160 0.3f, -0.2f, 1.0f, 0.1f
161 };
162
163 std::vector<float> expectedOutputValues
164 {
165 -4.14297f, -10.14297f, -2.14297f, -0.14297f,
166 -7.00104f, -12.00104f, -0.00105f, -9.00104f
167 };
168
169 armnn::LogSoftmaxQueueDescriptor descriptor;
170 descriptor.m_Parameters.m_Beta = 10.0f; // non-default beta
171 descriptor.m_Parameters.m_Axis = 3; // positive axis
172
173 return LogSoftmaxTestImpl<ArmnnType, 4>(
174 workloadFactory,
175 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100176 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100177 inputTensorInfo,
178 outputTensorInfo,
179 inputValues,
180 expectedOutputValues,
181 descriptor);
182}
183
184template<armnn::DataType ArmnnType, typename T>
185LayerTestResult<T, 4> LogSoftmaxTest4(
186 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100189{
190 const armnn::TensorShape inputOutputShape{1, 1, 2, 4};
191
192 armnn::TensorInfo inputTensorInfo(inputOutputShape, ArmnnType);
193 armnn::TensorInfo outputTensorInfo(inputOutputShape, ArmnnType);
194
195 std::vector<float> inputValues
196 {
197 0.f, -6.f, 2.f, 4.f,
198 3.f, -2.f, 10.f, 1.f
199 };
200
201 std::vector<float> expectedOutputValues
202 {
203 -3.048587f, -4.018149f, -8.000336f, -0.048587f,
204 -0.048587f, -0.018149f, -0.000335f, -3.048587f
205 };
206
207 armnn::LogSoftmaxQueueDescriptor descriptor;
208 descriptor.m_Parameters.m_Beta = 1.0f; // default beta
209 descriptor.m_Parameters.m_Axis = -2; // negative axis
210
211 return LogSoftmaxTestImpl<ArmnnType, 4>(
212 workloadFactory,
213 memoryManager,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100214 tensorHandleFactory,
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100215 inputTensorInfo,
216 outputTensorInfo,
217 inputValues,
218 expectedOutputValues,
219 descriptor);
220}
221
222template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
223LogSoftmaxTest1<armnn::DataType::Float32>(
224 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100225 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
226 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100227
228template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
229LogSoftmaxTest2<armnn::DataType::Float32>(
230 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100231 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
232 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100233
234template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
235LogSoftmaxTest3<armnn::DataType::Float32>(
236 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
238 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100239
240template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
241LogSoftmaxTest4<armnn::DataType::Float32>(
242 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
244 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100245
246template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
247LogSoftmaxTest1<armnn::DataType::Float16>(
248 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
250 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100251
252template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
253LogSoftmaxTest2<armnn::DataType::Float16>(
254 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100255 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
256 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100257
258template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
259LogSoftmaxTest3<armnn::DataType::Float16>(
260 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100261 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
262 const armnn::ITensorHandleFactory& tensorHandleFactory);
Aron Virginas-Tare662a942019-10-14 15:12:00 +0100263
264template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
265LogSoftmaxTest4<armnn::DataType::Float16>(
266 armnn::IWorkloadFactory& workloadFactory,
Finn Williamsc43de6a2020-08-27 11:13:25 +0100267 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268 const armnn::ITensorHandleFactory& tensorHandleFactory);