blob: 91b8128dea5bd52976fd38ce63f36610aa789296 [file] [log] [blame]
Michalis Spyrouaea14c62019-01-03 11:10:25 +00001/*
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +01002 * Copyright (c) 2018-2021, 2023 Arm Limited.
Michalis Spyrouaea14c62019-01-03 11:10:25 +00003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
Michalis Spyroub9626ab2019-05-13 17:41:01 +010025#include "arm_compute/core/utils/misc/Traits.h"
Michalis Spyrouaea14c62019-01-03 11:10:25 +000026#include "arm_compute/runtime/NEON/functions/NEArgMinMaxLayer.h"
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010027#include "arm_compute/runtime/NEON/functions/NEReductionOperation.h"
Michalis Spyrouaea14c62019-01-03 11:10:25 +000028#include "arm_compute/runtime/Tensor.h"
29#include "arm_compute/runtime/TensorAllocator.h"
30
Sang-Hoon Park2697fd82019-10-15 16:49:24 +010031#include "arm_compute/core/utils/misc/ShapeCalculator.h"
Michalis Spyrouaea14c62019-01-03 11:10:25 +000032#include "tests/NEON/Accessor.h"
33#include "tests/datasets/ShapeDatasets.h"
34#include "tests/datasets/SplitDataset.h"
35#include "tests/framework/Asserts.h"
36#include "tests/framework/Macros.h"
37#include "tests/validation/Validation.h"
38#include "tests/validation/fixtures/ArgMinMaxFixture.h"
39
40namespace arm_compute
41{
42namespace test
43{
44namespace validation
45{
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +010046namespace
47{
48const auto OpsDataset = framework::dataset::make("Operation", { ReductionOperation::ARG_IDX_MIN, ReductionOperation::ARG_IDX_MAX });
49const auto AxisDataset = framework::dataset::make("Axis", { 0, 1, 2, 3 });
50const auto QInfoDataset = framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) });
51
52const auto ArgMinMaxSmallDatasetAxis0 = framework::dataset::make("Shape",
53{
54 TensorShape{ 1U, 5U },
55 TensorShape{ 2U, 3U },
56 TensorShape{ 1U },
57 TensorShape{ 3U },
58 TensorShape{ 2U },
59 TensorShape{ 5U },
60 TensorShape{ 17U },
61 TensorShape{ 15U, 2U },
62});
63using ArgMinMaxSmallDataset = datasets::Small4DShapes;
64using ArgMinMaxLargeDataset = datasets::Large4DShapes;
65}
66
Michalis Spyrouaea14c62019-01-03 11:10:25 +000067TEST_SUITE(NEON)
68TEST_SUITE(ArgMinMax)
69
70// *INDENT-OFF*
71// clang-format off
72DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(zip(
73 framework::dataset::make("InputInfo", { TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32), // Invalid axis
74 TensorInfo(TensorShape(27U, 3U, 16U, 2U), 1, DataType::F32), // Invalid output shape
75 TensorInfo(TensorShape(32U, 16U, 16U, 2U), 1, DataType::F32),
76 TensorInfo(TensorShape(32U, 16U, 16U, 2U), 1, DataType::F32) // Invalid operation
77 }),
78 framework::dataset::make("OutputInfo", { TensorInfo(TensorShape(27U, 3U, 1U, 2U), 1, DataType::F32),
79 TensorInfo(TensorShape(27U, 3U, 1U, 2U), 1, DataType::F32),
Sang-Hoon Parkeaa01ab2019-11-11 17:33:28 +000080 TensorInfo(TensorShape(32U, 16U, 2U), 1, DataType::S32),
Michalis Spyrouaea14c62019-01-03 11:10:25 +000081 TensorInfo(TensorShape(32U, 16U, 1U, 2U), 1, DataType::F32)
82 })),
83 framework::dataset::make("Axis", { 4, 0, 2, 0 })),
84 framework::dataset::make("Operation", { ReductionOperation::ARG_IDX_MAX, ReductionOperation::ARG_IDX_MAX, ReductionOperation::ARG_IDX_MAX, ReductionOperation::MEAN_SUM })),
85 framework::dataset::make("Expected", { false, false, true, false })),
86 input_info, output_info, axis, operation, expected)
87{
88 const Status status = NEArgMinMaxLayer::validate(&input_info.clone()->set_is_resizable(false), axis, &output_info.clone()->set_is_resizable(false), operation);
89 ARM_COMPUTE_EXPECT(bool(status) == expected, framework::LogLevel::ERRORS);
90}
91// clang-format on
92// *INDENT-ON*
93
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +010094template <typename T1, typename T2>
95using NEArgMinMaxValidationFixture = ArgMinMaxValidationFixture<Tensor, Accessor, NEArgMinMaxLayer, T1, T2>;
Michalis Spyrouaea14c62019-01-03 11:10:25 +000096
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +010097using NEArgMinMaxValidationFixture_S32_S32 = NEArgMinMaxValidationFixture<int32_t, int32_t>;
98using NEArgMinMaxValidationFixture_F16_S32 = NEArgMinMaxValidationFixture<half, int32_t>;
99using NEArgMinMaxValidationFixture_F32_S32 = NEArgMinMaxValidationFixture<float, int32_t>;
Pablo Marquez Tellob1fcb412023-08-29 13:51:09 +0100100#ifdef __aarch64__
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +0100101using NEArgMinMaxValidationFixture_F32_S64 = NEArgMinMaxValidationFixture<float, int64_t>;
Pablo Marquez Tellob1fcb412023-08-29 13:51:09 +0100102#endif // __aarch64__
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +0100103
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100104TEST_SUITE(S32)
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100105FIXTURE_DATA_TEST_CASE(RunSmallAxis0,
106 NEArgMinMaxValidationFixture_S32_S32,
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100107 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100108 combine(combine(combine(combine(ArgMinMaxSmallDatasetAxis0,
109 framework::dataset::make("DataTypeIn", DataType::S32)),
110 framework::dataset::make("DataTypeOut", DataType::S32)),
111 framework::dataset::make("Axis", { 0 })),
112 OpsDataset))
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100113{
114 // Validate output
115 validate(Accessor(_target), _reference);
116}
117
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100118FIXTURE_DATA_TEST_CASE(RunSmall,
119 NEArgMinMaxValidationFixture_S32_S32,
120 framework::DatasetMode::PRECOMMIT,
121 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
122 framework::dataset::make("DataTypeIn", DataType::S32)),
123 framework::dataset::make("DataTypeOut", DataType::S32)),
124 AxisDataset),
125 OpsDataset))
126{
127 // Validate output
128 validate(Accessor(_target), _reference);
129}
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100130FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100131 NEArgMinMaxValidationFixture_S32_S32,
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100132 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100133 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
134 framework::dataset::make("DataTypeIn", DataType::S32)),
135 framework::dataset::make("DataTypeOut", DataType::S32)),
136 AxisDataset),
137 OpsDataset))
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100138{
139 // Validate output
140 validate(Accessor(_target), _reference);
141}
142TEST_SUITE_END() // S32
143
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000144TEST_SUITE(Float)
145#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
146TEST_SUITE(FP16)
147FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100148 NEArgMinMaxValidationFixture_F16_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000149 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100150 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
151 framework::dataset::make("DataTypeIn", DataType::F16)),
152 framework::dataset::make("DataTypeOut", DataType::S32)),
153 AxisDataset),
154 OpsDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000155{
156 // Validate output
157 validate(Accessor(_target), _reference);
158}
159
160FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100161 NEArgMinMaxValidationFixture_F16_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000162 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100163 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
164 framework::dataset::make("DataTypeIn", DataType::F16)),
165 framework::dataset::make("DataTypeOut", DataType::S32)),
166 AxisDataset),
167 OpsDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000168{
169 // Validate output
170 validate(Accessor(_target), _reference);
171}
172TEST_SUITE_END() // FP16
173#endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
174
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000175TEST_SUITE(FP32)
176FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100177 NEArgMinMaxValidationFixture_F32_S32,
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000178 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100179 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
180 framework::dataset::make("DataTypeIn", DataType::F32)),
181 framework::dataset::make("DataTypeOut", DataType::S32)),
182 AxisDataset),
183 OpsDataset))
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000184{
185 // Validate output
186 validate(Accessor(_target), _reference);
187}
188
Pablo Marquez Tellob1fcb412023-08-29 13:51:09 +0100189#ifdef __aarch64__
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +0100190FIXTURE_DATA_TEST_CASE(RunSmall_F32_S64,
191 NEArgMinMaxValidationFixture_F32_S64,
192 framework::DatasetMode::PRECOMMIT,
193 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
194 framework::dataset::make("DataTypeIn", DataType::F32)),
195 framework::dataset::make("DataTypeOut", DataType::S64)),
196 AxisDataset),
197 OpsDataset))
198{
199 // Validate output
200 validate(Accessor(_target), _reference);
201}
Pablo Marquez Tellob1fcb412023-08-29 13:51:09 +0100202#endif // __aarch64__
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +0100203
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000204FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100205 NEArgMinMaxValidationFixture_F32_S32,
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000206 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100207 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
208 framework::dataset::make("DataTypeIn", DataType::F32)),
209 framework::dataset::make("DataTypeOut", DataType::S32)),
210 AxisDataset),
211 OpsDataset))
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000212{
213 // Validate output
214 validate(Accessor(_target), _reference);
215}
216TEST_SUITE_END() // FP32
217TEST_SUITE_END() // Float
218
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100219template <typename T1, typename T2>
220using NEArgMinMaxQuantizedValidationFixture = ArgMinMaxValidationQuantizedFixture<Tensor, Accessor, NEArgMinMaxLayer, T1, T2>;
221
222using NEArgMinMaxQuantizedValidationFixture_U8_S32 = NEArgMinMaxQuantizedValidationFixture<uint8_t, int32_t>;
223using NEArgMinMaxQuantizedValidationFixture_S8_S32 = NEArgMinMaxQuantizedValidationFixture<int8_t, int32_t>;
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000224
225TEST_SUITE(QASYMM8)
226FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100227 NEArgMinMaxQuantizedValidationFixture_U8_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000228 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100229 combine(combine(combine(combine(combine(ArgMinMaxSmallDataset(),
230 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
231 framework::dataset::make("DataTypeOut", DataType::S32)),
232 AxisDataset),
233 OpsDataset),
234 QInfoDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000235{
236 // Validate output
237 validate(Accessor(_target), _reference);
238}
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000239FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100240 NEArgMinMaxQuantizedValidationFixture_U8_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000241 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100242 combine(combine(combine(combine(combine(ArgMinMaxLargeDataset(),
243 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
244 framework::dataset::make("DataTypeOut", DataType::S32)),
245 AxisDataset),
246 OpsDataset),
247 QInfoDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000248{
249 // Validate output
250 validate(Accessor(_target), _reference);
251}
252TEST_SUITE_END() // QASYMM8
Luca Foschianiee939fb2020-01-28 10:38:07 +0000253
254TEST_SUITE(QASYMM8_SIGNED)
255FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100256 NEArgMinMaxQuantizedValidationFixture_S8_S32,
Luca Foschianiee939fb2020-01-28 10:38:07 +0000257 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100258 combine(combine(combine(combine(combine(ArgMinMaxSmallDataset(),
259 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
260 framework::dataset::make("DataTypeOut", DataType::S32)),
261 AxisDataset),
262 OpsDataset),
263 QInfoDataset))
Luca Foschianiee939fb2020-01-28 10:38:07 +0000264{
265 // Validate output
266 validate(Accessor(_target), _reference);
267}
Luca Foschianiee939fb2020-01-28 10:38:07 +0000268FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100269 NEArgMinMaxQuantizedValidationFixture_S8_S32,
Luca Foschianiee939fb2020-01-28 10:38:07 +0000270 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100271 combine(combine(combine(combine(combine(ArgMinMaxLargeDataset(),
272 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
273 framework::dataset::make("DataTypeOut", DataType::S32)),
274 AxisDataset),
275 OpsDataset),
276 QInfoDataset))
Luca Foschianiee939fb2020-01-28 10:38:07 +0000277{
278 // Validate output
279 validate(Accessor(_target), _reference);
280}
281TEST_SUITE_END() // QASYMM8_SIGNED
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000282TEST_SUITE_END() // ArgMinMax
Sheri Zhangac6499a2021-02-10 15:32:38 +0000283TEST_SUITE_END() // Neon
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000284} // namespace validation
285} // namespace test
286} // namespace arm_compute