blob: 16349c554e203ea0a6f803aa8115ba5ef716e7eb [file] [log] [blame]
Narumol Prangnawarat02807852019-09-11 16:43:09 +01001//
Mike Kelly0506ef02023-01-03 16:29:44 +00002// Copyright © 2019,2021-2022 Arm Ltd and Contributors. All rights reserved.
Narumol Prangnawarat02807852019-09-11 16:43:09 +01003// SPDX-License-Identifier: MIT
4//
5
Narumol Prangnawarat02807852019-09-11 16:43:09 +01006#include <armnn/Types.hpp>
7
Matteo Martincighe011d202019-11-28 11:35:47 +00008#include <armnnUtils/TensorUtils.hpp>
9
Sadik Armagan1625efc2021-06-10 18:24:34 +010010#include <doctest/doctest.h>
Narumol Prangnawarat02807852019-09-11 16:43:09 +010011
12using namespace armnn;
13using namespace armnnUtils;
14
Sadik Armagan1625efc2021-06-10 18:24:34 +010015TEST_SUITE("TensorUtilsSuite")
16{
17TEST_CASE("ExpandDimsAxis0Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010018{
19 armnn::TensorShape inputShape({ 2, 3, 4 });
20
21 // Expand dimension 0
22 armnn::TensorShape outputShape = ExpandDims(inputShape, 0);
Sadik Armagan1625efc2021-06-10 18:24:34 +010023 CHECK(outputShape.GetNumDimensions() == 4);
24 CHECK(outputShape[0] == 1);
25 CHECK(outputShape[1] == 2);
26 CHECK(outputShape[2] == 3);
27 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010028}
29
Sadik Armagan1625efc2021-06-10 18:24:34 +010030TEST_CASE("ExpandDimsAxis1Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010031{
32 armnn::TensorShape inputShape({ 2, 3, 4 });
33
34 // Expand dimension 1
35 armnn::TensorShape outputShape = ExpandDims(inputShape, 1);
Sadik Armagan1625efc2021-06-10 18:24:34 +010036 CHECK(outputShape.GetNumDimensions() == 4);
37 CHECK(outputShape[0] == 2);
38 CHECK(outputShape[1] == 1);
39 CHECK(outputShape[2] == 3);
40 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010041}
42
Sadik Armagan1625efc2021-06-10 18:24:34 +010043TEST_CASE("ExpandDimsAxis2Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010044{
45 armnn::TensorShape inputShape({ 2, 3, 4 });
46
47 // Expand dimension 2
48 armnn::TensorShape outputShape = ExpandDims(inputShape, 2);
Sadik Armagan1625efc2021-06-10 18:24:34 +010049 CHECK(outputShape.GetNumDimensions() == 4);
50 CHECK(outputShape[0] == 2);
51 CHECK(outputShape[1] == 3);
52 CHECK(outputShape[2] == 1);
53 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010054}
55
Sadik Armagan1625efc2021-06-10 18:24:34 +010056TEST_CASE("ExpandDimsAxis3Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010057{
58 armnn::TensorShape inputShape({ 2, 3, 4 });
59
60 // Expand dimension 3
61 armnn::TensorShape outputShape = ExpandDims(inputShape, 3);
Sadik Armagan1625efc2021-06-10 18:24:34 +010062 CHECK(outputShape.GetNumDimensions() == 4);
63 CHECK(outputShape[0] == 2);
64 CHECK(outputShape[1] == 3);
65 CHECK(outputShape[2] == 4);
66 CHECK(outputShape[3] == 1);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010067}
68
Sadik Armagan1625efc2021-06-10 18:24:34 +010069TEST_CASE("ExpandDimsNegativeAxis1Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010070{
71 armnn::TensorShape inputShape({ 2, 3, 4 });
72
73 // Expand dimension -1
74 armnn::TensorShape outputShape = ExpandDims(inputShape, -1);
Sadik Armagan1625efc2021-06-10 18:24:34 +010075 CHECK(outputShape.GetNumDimensions() == 4);
76 CHECK(outputShape[0] == 2);
77 CHECK(outputShape[1] == 3);
78 CHECK(outputShape[2] == 4);
79 CHECK(outputShape[3] == 1);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010080}
81
Sadik Armagan1625efc2021-06-10 18:24:34 +010082TEST_CASE("ExpandDimsNegativeAxis2Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010083{
84 armnn::TensorShape inputShape({ 2, 3, 4 });
85
86 // Expand dimension -2
87 armnn::TensorShape outputShape = ExpandDims(inputShape, -2);
Sadik Armagan1625efc2021-06-10 18:24:34 +010088 CHECK(outputShape.GetNumDimensions() == 4);
89 CHECK(outputShape[0] == 2);
90 CHECK(outputShape[1] == 3);
91 CHECK(outputShape[2] == 1);
92 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +010093}
94
Sadik Armagan1625efc2021-06-10 18:24:34 +010095TEST_CASE("ExpandDimsNegativeAxis3Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +010096{
97 armnn::TensorShape inputShape({ 2, 3, 4 });
98
99 // Expand dimension -3
100 armnn::TensorShape outputShape = ExpandDims(inputShape, -3);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100101 CHECK(outputShape.GetNumDimensions() == 4);
102 CHECK(outputShape[0] == 2);
103 CHECK(outputShape[1] == 1);
104 CHECK(outputShape[2] == 3);
105 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100106}
107
Sadik Armagan1625efc2021-06-10 18:24:34 +0100108TEST_CASE("ExpandDimsNegativeAxis4Test")
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100109{
110 armnn::TensorShape inputShape({ 2, 3, 4 });
111
112 // Expand dimension -4
113 armnn::TensorShape outputShape = ExpandDims(inputShape, -4);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100114 CHECK(outputShape.GetNumDimensions() == 4);
115 CHECK(outputShape[0] == 1);
116 CHECK(outputShape[1] == 2);
117 CHECK(outputShape[2] == 3);
118 CHECK(outputShape[3] == 4);
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100119}
120
Sadik Armagan1625efc2021-06-10 18:24:34 +0100121TEST_CASE("ExpandDimsInvalidAxisTest")
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100122{
123 armnn::TensorShape inputShape({ 2, 3, 4 });
124
125 // Invalid expand dimension 4
Sadik Armagan1625efc2021-06-10 18:24:34 +0100126 CHECK_THROWS_AS(ExpandDims(inputShape, 4), armnn::InvalidArgumentException);
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100127}
128
Sadik Armagan1625efc2021-06-10 18:24:34 +0100129TEST_CASE("ExpandDimsInvalidNegativeAxisTest")
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100130{
131 armnn::TensorShape inputShape({ 2, 3, 4 });
132
133 // Invalid expand dimension -5
Sadik Armagan1625efc2021-06-10 18:24:34 +0100134 CHECK_THROWS_AS(ExpandDims(inputShape, -5), armnn::InvalidArgumentException);
Narumol Prangnawarat02807852019-09-11 16:43:09 +0100135}
136
Mike Kelly0506ef02023-01-03 16:29:44 +0000137TEST_CASE("ToFloatArrayInvalidDataType")
138{
139 armnn::TensorInfo info({ 2, 3, 4 }, armnn::DataType::BFloat16);
140 std::vector<uint8_t> data {1,2,3,4,5,6,7,8,9,10};
141
142 // Invalid argument
143 CHECK_THROWS_AS(ToFloatArray(data, info), armnn::InvalidArgumentException);
144}
145
146TEST_CASE("ToFloatArrayQSymmS8PerAxis")
147{
148 std::vector<float> quantizationScales { 0.1f, 0.2f, 0.3f, 0.4f };
149 unsigned int quantizationDim = 1;
150
151 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QSymmS8, quantizationScales, quantizationDim);
152 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170 ,180, 190, 200, 210, 220 };
153 float expected[] { 10.0f, 24.0f, -37.8f, -46.4f, -10.6f, -19.2f, -25.8f, -30.4f, -6.6f, -11.2f, -13.8f, -14.4f };
154
155 std::unique_ptr<float[]> result = ToFloatArray(data, info);
156
157 for (uint i = 0; i < info.GetNumElements(); ++i)
158 {
159 CHECK_EQ(result[i], doctest::Approx(expected[i]));
160 }
161}
162
163TEST_CASE("ToFloatArrayQSymmS8")
164{
165 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QSymmS8, 0.1f);
166 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170 ,180, 190, 200, 210, 220 };
167 float expected[] { 10.0f, 12.0f, -12.6f, -11.6f, -10.6f, -9.6f, -8.6f, -7.6f, -6.6f, -5.6f, -4.6f, -3.6f };
168
169 std::unique_ptr<float[]> result = ToFloatArray(data, info);
170
171 for (uint i = 0; i < info.GetNumElements(); ++i)
172 {
173 CHECK_EQ(result[i], doctest::Approx(expected[i]));
174 }
175}
176
177TEST_CASE("ToFloatArrayQAsymmS8PerAxis")
178{
179 std::vector<float> quantizationScales { 0.1f, 0.2f, 0.3f, 0.4f };
180 unsigned int quantizationDim = 1;
181
182 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QAsymmS8, quantizationScales, quantizationDim);
183 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170 ,180, 190, 200, 210, 220 };
184 float expected[] { 10.0f, 24.0f, -37.8f, -46.4f, -10.6f, -19.2f, -25.8f, -30.4f, -6.6f, -11.2f, -13.8f, -14.4f };
185
186 std::unique_ptr<float[]> result = ToFloatArray(data, info);
187
188 for (uint i = 0; i < info.GetNumElements(); ++i)
189 {
190 CHECK_EQ(result[i], doctest::Approx(expected[i]));
191 }
192}
193
194TEST_CASE("ToFloatArrayQAsymmS8")
195{
196 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QAsymmS8, 0.1f);
197 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170 ,180, 190, 200, 210, 220 };
198 float expected[] { 10.0f, 12.0f, -12.6f, -11.6f, -10.6f, -9.6f, -8.6f, -7.6f, -6.6f, -5.6f, -4.6f, -3.6f };
199
200 std::unique_ptr<float[]> result = ToFloatArray(data, info);
201
202 for (uint i = 0; i < info.GetNumElements(); ++i)
203 {
204 CHECK_EQ(result[i], doctest::Approx(expected[i]));
205 }
206}
207
208TEST_CASE("ToFloatArrayQASymmU8PerAxis")
209{
210 std::vector<float> quantizationScales { 0.1f, 0.2f, 0.3f, 0.4f };
211 unsigned int quantizationDim = 1;
212
213 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QAsymmU8, quantizationScales, quantizationDim);
214 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220 };
215 float expected[] { 10.0f, 24.0f, 39.0f, 56.0f, 15.0f, 32.0f, 51.0f, 72.0f, 19.0f, 40.0f, 63.0f, 88.0f };
216
217 std::unique_ptr<float[]> result = ToFloatArray(data, info);
218
219 for (uint i = 0; i < info.GetNumElements(); ++i)
220 {
221 CHECK_EQ(result[i], doctest::Approx(expected[i]));
222 }
223}
224
225TEST_CASE("ToFloatArrayQAsymmU8")
226{
227 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::QAsymmU8, 0.1f);
228 std::vector<uint8_t> data { 100, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220 };
229 float expected[] { 10.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f };
230
231 std::unique_ptr<float[]> result = ToFloatArray(data, info);
232
233 for (uint i = 0; i < info.GetNumElements(); ++i)
234 {
235 CHECK_EQ(result[i], doctest::Approx(expected[i]));
236 }
237}
238
239TEST_CASE("ToFloatArraySigned32PerAxis")
240{
241 std::vector<float> quantizationScales { 0.1f, 0.2f, 0.3f, 0.4f };
242 unsigned int quantizationDim = 1;
243
244 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::Signed32, quantizationScales, quantizationDim);
245 std::vector<uint8_t> data { 100, 0, 0, 0, 120, 0, 0, 0, 130, 0, 0, 0, 140, 0, 0, 0, 150, 0, 0, 0, 160, 0, 0, 0,
246 170, 0, 0, 0, 180, 0, 0, 0, 190, 0, 0, 0, 200, 0, 0, 0, 210, 0, 0, 0, 220, 0, 0, 0 };
247 float expected[] { 10.0f, 24.0f, 39.0f, 56.0f, 15.0f, 32.0f, 51.0f, 72.0f, 19.0f, 40.0f, 63.0f, 88.0f };
248
249 std::unique_ptr<float[]> result = ToFloatArray(data, info);
250
251 for (uint i = 0; i < info.GetNumElements(); ++i)
252 {
253 CHECK_EQ(result[i], doctest::Approx(expected[i]));
254 }
255}
256
257TEST_CASE("ToFloatArraySigned32")
258{
259 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::Signed32, 0.1f);
260 std::vector<uint8_t> data { 100, 0, 0, 0, 120, 0, 0, 0, 130, 0, 0, 0, 140, 0, 0, 0, 150, 0, 0, 0, 160, 0, 0, 0,
261 170, 0, 0, 0, 180, 0, 0, 0, 190, 0, 0, 0, 200, 0, 0, 0, 210, 0, 0, 0, 220, 0, 0, 0 };
262 float expected[] { 10.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f };
263
264 std::unique_ptr<float[]> result = ToFloatArray(data, info);
265
266 for (uint i = 0; i < info.GetNumElements(); ++i)
267 {
268 CHECK_EQ(result[i], doctest::Approx(expected[i]));
269 }
270}
271
272TEST_CASE("ToFloatArraySigned64PerAxis")
273{
274 std::vector<float> quantizationScales { 0.1f, 0.2f, 0.3f, 0.4f };
275 unsigned int quantizationDim = 1;
276
277 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::Signed64, quantizationScales, quantizationDim);
278 std::vector<uint8_t> data { 100, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0,
279 140, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0,
280 170, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0,
281 200, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0 };
282 float expected[] { 10.0f, 24.0f, 39.0f, 56.0f, 15.0f, 32.0f, 51.0f, 72.0f, 19.0f, 40.0f, 63.0f, 88.0f };
283
284 std::unique_ptr<float[]> result = ToFloatArray(data, info);
285
286 for (uint i = 0; i < info.GetNumElements(); ++i)
287 {
288 CHECK_EQ(result[i], doctest::Approx(expected[i]));
289 }
290}
291
292TEST_CASE("ToFloatArraySigned64")
293{
294 armnn::TensorInfo info({ 3, 4 }, armnn::DataType::Signed64, 0.1f);
295 std::vector<uint8_t> data { 100, 0, 0, 0, 0, 0, 0, 0, 120, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 0, 0, 0, 0,
296 140, 0, 0, 0, 0, 0, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0,
297 170, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 0, 0, 0,
298 200, 0, 0, 0, 0, 0, 0, 0, 210, 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0 };
299 float expected[] { 10.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f };
300
301 std::unique_ptr<float[]> result = ToFloatArray(data, info);
302
303 for (uint i = 0; i < info.GetNumElements(); ++i)
304 {
305 CHECK_EQ(result[i], doctest::Approx(expected[i]));
306 }
307}
Sadik Armagan1625efc2021-06-10 18:24:34 +0100308}