blob: c80c936b6d405fdb4fc0f9fc9acec1bb10a99a1b [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 Tello29e27b02023-08-03 14:47:31 +0100100using NEArgMinMaxValidationFixture_F32_S64 = NEArgMinMaxValidationFixture<float, int64_t>;
101
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100102TEST_SUITE(S32)
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100103FIXTURE_DATA_TEST_CASE(RunSmallAxis0,
104 NEArgMinMaxValidationFixture_S32_S32,
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100105 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100106 combine(combine(combine(combine(ArgMinMaxSmallDatasetAxis0,
107 framework::dataset::make("DataTypeIn", DataType::S32)),
108 framework::dataset::make("DataTypeOut", DataType::S32)),
109 framework::dataset::make("Axis", { 0 })),
110 OpsDataset))
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100111{
112 // Validate output
113 validate(Accessor(_target), _reference);
114}
115
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100116FIXTURE_DATA_TEST_CASE(RunSmall,
117 NEArgMinMaxValidationFixture_S32_S32,
118 framework::DatasetMode::PRECOMMIT,
119 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
120 framework::dataset::make("DataTypeIn", DataType::S32)),
121 framework::dataset::make("DataTypeOut", DataType::S32)),
122 AxisDataset),
123 OpsDataset))
124{
125 // Validate output
126 validate(Accessor(_target), _reference);
127}
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100128FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100129 NEArgMinMaxValidationFixture_S32_S32,
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100130 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100131 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
132 framework::dataset::make("DataTypeIn", DataType::S32)),
133 framework::dataset::make("DataTypeOut", DataType::S32)),
134 AxisDataset),
135 OpsDataset))
Michalis Spyroub9626ab2019-05-13 17:41:01 +0100136{
137 // Validate output
138 validate(Accessor(_target), _reference);
139}
140TEST_SUITE_END() // S32
141
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000142TEST_SUITE(Float)
143#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
144TEST_SUITE(FP16)
145FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100146 NEArgMinMaxValidationFixture_F16_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000147 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100148 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
149 framework::dataset::make("DataTypeIn", DataType::F16)),
150 framework::dataset::make("DataTypeOut", DataType::S32)),
151 AxisDataset),
152 OpsDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000153{
154 // Validate output
155 validate(Accessor(_target), _reference);
156}
157
158FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100159 NEArgMinMaxValidationFixture_F16_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000160 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100161 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
162 framework::dataset::make("DataTypeIn", DataType::F16)),
163 framework::dataset::make("DataTypeOut", DataType::S32)),
164 AxisDataset),
165 OpsDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000166{
167 // Validate output
168 validate(Accessor(_target), _reference);
169}
170TEST_SUITE_END() // FP16
171#endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
172
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000173TEST_SUITE(FP32)
174FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100175 NEArgMinMaxValidationFixture_F32_S32,
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000176 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100177 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
178 framework::dataset::make("DataTypeIn", DataType::F32)),
179 framework::dataset::make("DataTypeOut", DataType::S32)),
180 AxisDataset),
181 OpsDataset))
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000182{
183 // Validate output
184 validate(Accessor(_target), _reference);
185}
186
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +0100187FIXTURE_DATA_TEST_CASE(RunSmall_F32_S64,
188 NEArgMinMaxValidationFixture_F32_S64,
189 framework::DatasetMode::PRECOMMIT,
190 combine(combine(combine(combine(ArgMinMaxSmallDataset(),
191 framework::dataset::make("DataTypeIn", DataType::F32)),
192 framework::dataset::make("DataTypeOut", DataType::S64)),
193 AxisDataset),
194 OpsDataset))
195{
196 // Validate output
197 validate(Accessor(_target), _reference);
198}
199
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000200FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100201 NEArgMinMaxValidationFixture_F32_S32,
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000202 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100203 combine(combine(combine(combine(ArgMinMaxLargeDataset(),
204 framework::dataset::make("DataTypeIn", DataType::F32)),
205 framework::dataset::make("DataTypeOut", DataType::S32)),
206 AxisDataset),
207 OpsDataset))
Michalis Spyrou254a48a2019-01-14 17:27:39 +0000208{
209 // Validate output
210 validate(Accessor(_target), _reference);
211}
212TEST_SUITE_END() // FP32
213TEST_SUITE_END() // Float
214
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100215template <typename T1, typename T2>
216using NEArgMinMaxQuantizedValidationFixture = ArgMinMaxValidationQuantizedFixture<Tensor, Accessor, NEArgMinMaxLayer, T1, T2>;
217
218using NEArgMinMaxQuantizedValidationFixture_U8_S32 = NEArgMinMaxQuantizedValidationFixture<uint8_t, int32_t>;
219using NEArgMinMaxQuantizedValidationFixture_S8_S32 = NEArgMinMaxQuantizedValidationFixture<int8_t, int32_t>;
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000220
221TEST_SUITE(QASYMM8)
222FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100223 NEArgMinMaxQuantizedValidationFixture_U8_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000224 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100225 combine(combine(combine(combine(combine(ArgMinMaxSmallDataset(),
226 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
227 framework::dataset::make("DataTypeOut", DataType::S32)),
228 AxisDataset),
229 OpsDataset),
230 QInfoDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000231{
232 // Validate output
233 validate(Accessor(_target), _reference);
234}
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000235FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100236 NEArgMinMaxQuantizedValidationFixture_U8_S32,
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000237 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100238 combine(combine(combine(combine(combine(ArgMinMaxLargeDataset(),
239 framework::dataset::make("DataTypeIn", DataType::QASYMM8)),
240 framework::dataset::make("DataTypeOut", DataType::S32)),
241 AxisDataset),
242 OpsDataset),
243 QInfoDataset))
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000244{
245 // Validate output
246 validate(Accessor(_target), _reference);
247}
248TEST_SUITE_END() // QASYMM8
Luca Foschianiee939fb2020-01-28 10:38:07 +0000249
250TEST_SUITE(QASYMM8_SIGNED)
251FIXTURE_DATA_TEST_CASE(RunSmall,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100252 NEArgMinMaxQuantizedValidationFixture_S8_S32,
Luca Foschianiee939fb2020-01-28 10:38:07 +0000253 framework::DatasetMode::PRECOMMIT,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100254 combine(combine(combine(combine(combine(ArgMinMaxSmallDataset(),
255 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
256 framework::dataset::make("DataTypeOut", DataType::S32)),
257 AxisDataset),
258 OpsDataset),
259 QInfoDataset))
Luca Foschianiee939fb2020-01-28 10:38:07 +0000260{
261 // Validate output
262 validate(Accessor(_target), _reference);
263}
Luca Foschianiee939fb2020-01-28 10:38:07 +0000264FIXTURE_DATA_TEST_CASE(RunLarge,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100265 NEArgMinMaxQuantizedValidationFixture_S8_S32,
Luca Foschianiee939fb2020-01-28 10:38:07 +0000266 framework::DatasetMode::NIGHTLY,
Pablo Marquez Tello4cb0bd42023-07-27 18:02:37 +0100267 combine(combine(combine(combine(combine(ArgMinMaxLargeDataset(),
268 framework::dataset::make("DataTypeIn", DataType::QASYMM8_SIGNED)),
269 framework::dataset::make("DataTypeOut", DataType::S32)),
270 AxisDataset),
271 OpsDataset),
272 QInfoDataset))
Luca Foschianiee939fb2020-01-28 10:38:07 +0000273{
274 // Validate output
275 validate(Accessor(_target), _reference);
276}
277TEST_SUITE_END() // QASYMM8_SIGNED
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000278TEST_SUITE_END() // ArgMinMax
Sheri Zhangac6499a2021-02-10 15:32:38 +0000279TEST_SUITE_END() // Neon
Michalis Spyrouaea14c62019-01-03 11:10:25 +0000280} // namespace validation
281} // namespace test
282} // namespace arm_compute