blob: 3d184f13f86741f7bab212b8cb44b8abbc842659 [file] [log] [blame]
Sanghoon Lee72898fe2017-09-01 11:42:16 +01001/*
2 * Copyright (c) 2017 ARM Limited.
3 *
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 CONCLCTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEArithmeticSubtraction.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/ConvertPolicyDataset.h"
31#include "tests/datasets/ShapeDatasets.h"
32#include "tests/framework/Asserts.h"
33#include "tests/framework/Macros.h"
34#include "tests/framework/datasets/Datasets.h"
35#include "tests/validation/Validation.h"
36#include "tests/validation/fixtures/ArithmeticSubtractionFixture.h"
Sanghoon Lee72898fe2017-09-01 11:42:16 +010037
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
46/** Input data sets **/
47const auto ArithmeticSubtractionU8Dataset = combine(combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U8)),
48 framework::dataset::make("DataType",
49 DataType::U8));
50const auto ArithmeticSubtractionS16Dataset = combine(combine(framework::dataset::make("DataType", { DataType::U8, DataType::S16 }), framework::dataset::make("DataType", DataType::S16)),
51 framework::dataset::make("DataType", DataType::S16));
52const auto ArithmeticSubtractionQS8Dataset = combine(combine(framework::dataset::make("DataType", DataType::QS8), framework::dataset::make("DataType", DataType::QS8)),
53 framework::dataset::make("DataType", DataType::QS8));
54const auto ArithmeticSubtractionQS16Dataset = combine(combine(framework::dataset::make("DataType", DataType::QS16), framework::dataset::make("DataType", DataType::QS16)),
55 framework::dataset::make("DataType", DataType::QS16));
56#ifdef ARM_COMPUTE_ENABLE_FP16
57const auto ArithmeticSubtractionFP16Dataset = combine(combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F16)),
58 framework::dataset::make("DataType", DataType::F16));
59#endif /* ARM_COMPUTE_ENABLE_FP16 */
60const auto ArithmeticSubtractionFP32Dataset = combine(combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F32)),
61 framework::dataset::make("DataType", DataType::F32));
62} // namespace
63
64TEST_SUITE(NEON)
65TEST_SUITE(ArithmeticSubtraction)
66
67template <typename T>
68using NEArithmeticSubtractionFixture = ArithmeticSubtractionValidationFixture<Tensor, Accessor, NEArithmeticSubtraction, T>;
69
70TEST_SUITE(U8)
71DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
72 shape, policy)
73{
74 // Create tensors
75 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::U8);
76 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::U8);
77 Tensor dst = create_tensor<Tensor>(shape, DataType::U8);
78
79 // Create and Configure function
80 NEArithmeticSubtraction sub;
81 sub.configure(&ref_src1, &ref_src2, &dst, policy);
82
83 // Validate valid region
84 const ValidRegion valid_region = shape_to_valid_region(shape);
85 validate(dst.info()->valid_region(), valid_region);
86
87 // Validate padding
88 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
89 validate(ref_src1.info()->padding(), padding);
90 validate(ref_src2.info()->padding(), padding);
91 validate(dst.info()->padding(), padding);
92}
93
94FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticSubtractionU8Dataset),
95 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
96{
97 // Validate output
98 validate(Accessor(_target), _reference);
99}
100TEST_SUITE_END()
101
102TEST_SUITE(S16)
103DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("DataType", { DataType::U8, DataType::S16 })),
104 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
105 shape, data_type, policy)
106{
107 // Create tensors
108 Tensor ref_src1 = create_tensor<Tensor>(shape, data_type);
109 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::S16);
110 Tensor dst = create_tensor<Tensor>(shape, DataType::S16);
111
112 // Create and Configure function
113 NEArithmeticSubtraction sub;
114 sub.configure(&ref_src1, &ref_src2, &dst, policy);
115
116 // Validate valid region
117 const ValidRegion valid_region = shape_to_valid_region(shape);
118 validate(dst.info()->valid_region(), valid_region);
119
120 // Validate padding
121 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
122 validate(ref_src1.info()->padding(), padding);
123 validate(ref_src2.info()->padding(), padding);
124 validate(dst.info()->padding(), padding);
125}
126
127FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticSubtractionS16Dataset),
128 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
129{
130 // Validate output
131 validate(Accessor(_target), _reference);
132}
133
134FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticSubtractionFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticSubtractionS16Dataset),
135 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
136{
137 // Validate output
138 validate(Accessor(_target), _reference);
139}
140TEST_SUITE_END()
141
142template <typename T>
143using NEArithmeticSubtractionFixedPointFixture = ArithmeticSubtractionValidationFixedPointFixture<Tensor, Accessor, NEArithmeticSubtraction, T>;
144
145TEST_SUITE(Quantized)
146TEST_SUITE(QS8)
147FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixedPointFixture<int8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), ArithmeticSubtractionQS8Dataset),
148 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
149 framework::dataset::make("FractionalBits", 1, 7)))
150{
151 // Validate output
152 validate(Accessor(_target), _reference);
153}
154
155FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticSubtractionFixedPointFixture<int8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), ArithmeticSubtractionQS8Dataset),
156 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
157 framework::dataset::make("FractionalBits", 1, 7)))
158{
159 // Validate output
160 validate(Accessor(_target), _reference);
161}
162TEST_SUITE_END()
163
164TEST_SUITE(QS16)
165FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixedPointFixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(),
166 ArithmeticSubtractionQS16Dataset),
167 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
168 framework::dataset::make("FractionalBits", 1, 15)))
169{
170 // Validate output
171 validate(Accessor(_target), _reference);
172}
173
174FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticSubtractionFixedPointFixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), ArithmeticSubtractionQS16Dataset),
175 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
176 framework::dataset::make("FractionalBits", 1, 15)))
177{
178 // Validate output
179 validate(Accessor(_target), _reference);
180}
181TEST_SUITE_END()
182TEST_SUITE_END()
183
184TEST_SUITE(Float)
185#ifdef ARM_COMPUTE_ENABLE_FP16
186TEST_SUITE(FP16)
Georgios Pinitas583137c2017-08-31 18:12:42 +0100187FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixture<half>, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), ArithmeticSubtractionFP16Dataset),
188 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
Sanghoon Lee72898fe2017-09-01 11:42:16 +0100189{
190 // Validate output
191 validate(Accessor(_target), _reference);
192}
193TEST_SUITE_END()
194#endif /* ARM_COMPUTE_ENABLE_FP16 */
195
196TEST_SUITE(FP32)
197DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(framework::dataset::concat(datasets::SmallShapes(), datasets::LargeShapes()), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
198 shape, policy)
199{
200 // Create tensors
201 Tensor ref_src1 = create_tensor<Tensor>(shape, DataType::F32);
202 Tensor ref_src2 = create_tensor<Tensor>(shape, DataType::F32);
203 Tensor dst = create_tensor<Tensor>(shape, DataType::F32);
204
205 // Create and Configure function
206 NEArithmeticSubtraction sub;
207 sub.configure(&ref_src1, &ref_src2, &dst, policy);
208
209 // Validate valid region
210 const ValidRegion valid_region = shape_to_valid_region(shape);
211 validate(dst.info()->valid_region(), valid_region);
212
213 // Validate padding
214 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
215 validate(ref_src1.info()->padding(), padding);
216 validate(ref_src2.info()->padding(), padding);
217 validate(dst.info()->padding(), padding);
218}
219
220FIXTURE_DATA_TEST_CASE(RunSmall, NEArithmeticSubtractionFixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(datasets::SmallShapes(), ArithmeticSubtractionFP32Dataset),
221 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
222{
223 // Validate output
224 validate(Accessor(_target), _reference);
225}
226
227FIXTURE_DATA_TEST_CASE(RunLarge, NEArithmeticSubtractionFixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(datasets::LargeShapes(), ArithmeticSubtractionFP32Dataset),
228 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })))
229{
230 // Validate output
231 validate(Accessor(_target), _reference);
232}
233TEST_SUITE_END()
234TEST_SUITE_END()
235
236TEST_SUITE_END()
237TEST_SUITE_END()
238} // namespace validation
239} // namespace test
240} // namespace arm_compute