blob: b50db3d4a317ecddda83f5d59c111945a1fb66fc [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2018-2020 Arm Limited.
giuros0192fd9432018-12-03 17:30:00 +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,
Georgios Pinitas2d6cb172018-12-24 15:00:43 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
giuros0192fd9432018-12-03 17:30:00 +000022 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEElementwiseOperations.h"
26#include "arm_compute/runtime/Tensor.h"
27#include "arm_compute/runtime/TensorAllocator.h"
28#include "tests/NEON/Accessor.h"
29#include "tests/PaddingCalculator.h"
30#include "tests/datasets/ShapeDatasets.h"
31#include "tests/framework/Asserts.h"
32#include "tests/framework/Macros.h"
33#include "tests/framework/datasets/Datasets.h"
34#include "tests/validation/Validation.h"
35#include "tests/validation/fixtures/ElementwiseOperationsFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
45RelativeTolerance<float> tolerance_fp32(0.000001f);
Georgios Pinitas2d6cb172018-12-24 15:00:43 +000046#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
47RelativeTolerance<float> tolerance_fp16(0.01f);
48#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
49
giuros0192fd9432018-12-03 17:30:00 +000050/** Input data sets **/
51const auto ElementwiseSquaredDiffQASYMM8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::QASYMM8)),
52 framework::dataset::make("DataType",
53 DataType::QASYMM8));
morgolock6427c822020-01-13 11:53:20 +000054
55const auto ElementwiseSquaredDiffQASYMM8SignedDataset = combine(combine(framework::dataset::make("DataType", DataType::QASYMM8_SIGNED), framework::dataset::make("DataType", DataType::QASYMM8_SIGNED)),
56 framework::dataset::make("DataType",
57 DataType::QASYMM8_SIGNED));
58
giuros0192fd9432018-12-03 17:30:00 +000059/** Input data sets **/
60const auto ElementwiseSquaredDiffS32Dataset = combine(combine(framework::dataset::make("DataType", DataType::S32), framework::dataset::make("DataType", DataType::S32)),
61 framework::dataset::make("DataType",
62 DataType::S32));
63const auto ElementwiseSquaredDiffS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
64 framework::dataset::make("DataType", DataType::S16));
65#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
66const auto ElementwiseSquaredDiffFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
67 framework::dataset::make("DataType", DataType::F16));
68#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
69const auto ElementwiseSquaredDiffFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
70 framework::dataset::make("DataType", DataType::F32));
71} // namespace
72
73TEST_SUITE(NEON)
74TEST_SUITE(ElementwiseSquaredDiff)
75
76template <typename T>
77using NEElementwiseSquaredDiffFixture = ElementwiseSquaredDiffValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
78
79// *INDENT-OFF*
80// clang-format off
81DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
82 framework::dataset::make("Input1Info", { TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
83 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
84 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
85 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32), // Invalid data type combination
86 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), // Mismatching shapes
morgolock6427c822020-01-13 11:53:20 +000087 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8_SIGNED), // Mismatching types
giuros0192fd9432018-12-03 17:30:00 +000088 }),
89 framework::dataset::make("Input2Info",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
90 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
91 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
92 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
93 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
morgolock6427c822020-01-13 11:53:20 +000094 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8_SIGNED),
giuros0192fd9432018-12-03 17:30:00 +000095 })),
96 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
97 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
98 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::S32),
99 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S32),
100 TensorInfo(TensorShape(48U, 11U, 2U), 1, DataType::F32),
morgolock6427c822020-01-13 11:53:20 +0000101 TensorInfo(TensorShape(1U, 1U, 2U), 1, DataType::QASYMM8, QuantizationInfo(0.3f,1)),
giuros0192fd9432018-12-03 17:30:00 +0000102 })),
morgolock6427c822020-01-13 11:53:20 +0000103 framework::dataset::make("Expected", { true, true, true, false, false, false})),
giuros0192fd9432018-12-03 17:30:00 +0000104 input1_info, input2_info, output_info, expected)
105{
106 ARM_COMPUTE_EXPECT(bool(NEElementwiseSquaredDiff::validate(&input1_info.clone()->set_is_resizable(false), &input2_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false))) == expected, framework::LogLevel::ERRORS);
107}
108// clang-format on
109// *INDENT-ON*
110
111TEST_SUITE(S32)
giuros0192fd9432018-12-03 17:30:00 +0000112FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<int32_t>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapes(), ElementwiseSquaredDiffS32Dataset))
113{
114 // Validate output
115 validate(Accessor(_target), _reference);
116}
117TEST_SUITE_END() // S32
118
119TEST_SUITE(S16)
Michalis Spyrou5ce99a22019-01-25 14:17:49 +0000120FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<int16_t>, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), ElementwiseSquaredDiffS16Dataset))
giuros0192fd9432018-12-03 17:30:00 +0000121{
122 // Validate output
123 validate(Accessor(_target), _reference);
124}
125TEST_SUITE_END() // S16
126
127template <typename T>
128using NEElementwiseSquaredDiffQuantizedFixture = ElementwiseSquaredDiffValidationQuantizedFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
129
130TEST_SUITE(Quantized)
131TEST_SUITE(QASYMM8)
giuros0192fd9432018-12-03 17:30:00 +0000132FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffQuantizedFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
133 ElementwiseSquaredDiffQASYMM8Dataset),
134 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
135 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255.f, 10) })),
136 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 5) }))
137
138 )
139{
140 // Validate output
141 validate(Accessor(_target), _reference, tolerance_fp32, 0.01);
142}
143template <typename T>
144using NEElementwiseSquaredDiffQuantizedBroadcastFixture = ElementwiseSquaredDiffQuantizedBroadcastValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
145
146FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEElementwiseSquaredDiffQuantizedBroadcastFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
147 combine(combine(combine(combine(datasets::SmallShapesBroadcast(),
148 ElementwiseSquaredDiffQASYMM8Dataset),
149 framework::dataset::make("QuantizationInfo", { QuantizationInfo(5.f / 255.f, 20) })),
150 framework::dataset::make("QuantizationInfo", { QuantizationInfo(2.f / 255.f, 10) })),
151 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f / 255.f, 5) })))
152{
153 // Validate output
154 validate(Accessor(_target), _reference);
155}
156TEST_SUITE_END()
morgolock6427c822020-01-13 11:53:20 +0000157
158TEST_SUITE(QASYMM8_SIGNED)
159FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffQuantizedFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
160 ElementwiseSquaredDiffQASYMM8SignedDataset),
161 framework::dataset::make("QuantizationInfo", { QuantizationInfo(1.f, 5) })),
162 framework::dataset::make("QuantizationInfo", { QuantizationInfo(.5f, 5) })),
163 framework::dataset::make("QuantizationInfo", { QuantizationInfo(.2f, 5) })))
164{
165 // Validate output
166 validate(Accessor(_target), _reference);
167}
168TEST_SUITE_END()
giuros0192fd9432018-12-03 17:30:00 +0000169TEST_SUITE_END()
170
171TEST_SUITE(Float)
172#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
173TEST_SUITE(F16)
174FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<half>, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), ElementwiseSquaredDiffFP16Dataset))
175{
176 // Validate output
Georgios Pinitas2d6cb172018-12-24 15:00:43 +0000177 validate(Accessor(_target), _reference, tolerance_fp16, 0.01);
giuros0192fd9432018-12-03 17:30:00 +0000178}
179TEST_SUITE_END() // F16
180#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
181
182TEST_SUITE(F32)
Michalis Spyrou5ce99a22019-01-25 14:17:49 +0000183FIXTURE_DATA_TEST_CASE(RunSmall, NEElementwiseSquaredDiffFixture<float>, framework::DatasetMode::ALL, combine(datasets::SmallShapes(), ElementwiseSquaredDiffFP32Dataset))
giuros0192fd9432018-12-03 17:30:00 +0000184{
185 // Validate output
186 validate(Accessor(_target), _reference);
187}
giuros0192fd9432018-12-03 17:30:00 +0000188template <typename T>
189using NEElementwiseSquaredDiffBroadcastFixture = ElementwiseSquaredDiffBroadcastValidationFixture<Tensor, Accessor, NEElementwiseSquaredDiff, T>;
190
191FIXTURE_DATA_TEST_CASE(RunSmallBroadcast, NEElementwiseSquaredDiffBroadcastFixture<float>, framework::DatasetMode::PRECOMMIT, combine(datasets::SmallShapesBroadcast(),
192 ElementwiseSquaredDiffFP32Dataset))
193{
194 // Validate output
195 validate(Accessor(_target), _reference);
196}
197
198FIXTURE_DATA_TEST_CASE(RunLargeBroadcast, NEElementwiseSquaredDiffBroadcastFixture<float>, framework::DatasetMode::NIGHTLY, combine(datasets::LargeShapesBroadcast(),
199 ElementwiseSquaredDiffFP32Dataset))
200{
201 // Validate output
202 validate(Accessor(_target), _reference);
203}
204TEST_SUITE_END() // F32
205TEST_SUITE_END() // Float
206
207TEST_SUITE_END() // ElementwiseSquaredDiff
208TEST_SUITE_END() // NEON
209} // namespace validation
210} // namespace test
211} // namespace arm_compute