blob: cee7bdedc26374728f010f8b2275b3aba85bc66f [file] [log] [blame]
Giorgio Arena04a8f8c2017-11-23 11:45:24 +00001/*
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +00002 * Copyright (c) 2017-2019 ARM Limited.
Giorgio Arena04a8f8c2017-11-23 11:45:24 +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,
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000021 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
Giorgio Arena04a8f8c2017-11-23 11:45:24 +000022 * SOFTWARE.
23 */
24#include "arm_compute/core/Types.h"
25#include "arm_compute/runtime/NEON/functions/NEDepthConvertLayer.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/DepthConvertLayerFixture.h"
37
38namespace arm_compute
39{
40namespace test
41{
42namespace validation
43{
44namespace
45{
46/** Input data sets **/
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000047const auto DepthConvertLayerQASYMM8toF16Dataset = combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::F16));
48const auto DepthConvertLayerQASYMM8toF32Dataset = combine(framework::dataset::make("DataType", DataType::QASYMM8), framework::dataset::make("DataType", DataType::F32));
49const auto DepthConvertLayerU8toU16Dataset = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::U16));
50const auto DepthConvertLayerU8toS16Dataset = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::S16));
51const auto DepthConvertLayerU8toS32Dataset = combine(framework::dataset::make("DataType", DataType::U8), framework::dataset::make("DataType", DataType::S32));
52const auto DepthConvertLayerU16toU8Dataset = combine(framework::dataset::make("DataType", DataType::U16), framework::dataset::make("DataType", DataType::U8));
53const auto DepthConvertLayerU16toU32Dataset = combine(framework::dataset::make("DataType", DataType::U16), framework::dataset::make("DataType", DataType::U32));
54const auto DepthConvertLayerS16toU8Dataset = combine(framework::dataset::make("DataType", DataType::S16), framework::dataset::make("DataType", DataType::U8));
55const auto DepthConvertLayerS16toS32Dataset = combine(framework::dataset::make("DataType", DataType::S16), framework::dataset::make("DataType", DataType::S32));
56const auto DepthConvertLayerF16toF32Dataset = combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::F32));
57const auto DepthConvertLayerF32toF16Dataset = combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::F16));
58const auto DepthConvertLayerF16toQASYMM8Dataset = combine(framework::dataset::make("DataType", DataType::F16), framework::dataset::make("DataType", DataType::QASYMM8));
59const auto DepthConvertLayerF32toQASYMM8Dataset = combine(framework::dataset::make("DataType", DataType::F32), framework::dataset::make("DataType", DataType::QASYMM8));
60const auto DepthConvertLayerShiftDatasetNightly = framework::dataset::make("Shift", 0, 7);
61const auto DepthConvertLayerShiftDatasetPrecommit = framework::dataset::make("Shift", { 0, 3, 6 });
62const auto DepthConvertLayerZeroShiftDataset = framework::dataset::make("Shift", 0);
Michalis Spyroue2588182018-12-13 18:31:18 +000063
64constexpr AbsoluteTolerance<uint8_t> tolerance_qasymm8(1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +000065} // namespace
66
67TEST_SUITE(NEON)
68TEST_SUITE(DepthConvertLayer)
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +000069
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(32U, 13U, 2U), 1, DataType::QASYMM8), // Invalid data type combination
74 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Invalid data type combination
75 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U16), // Invalid data type combination
76 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16), // Invalid data type combination
77 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32), // Invalid data type combination
78 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F16), // Invalid data type combination
79 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8), // Mismatching shapes
80 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Invalid shift
81 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8), // Valid
82 }),
83 framework::dataset::make("OutputInfo",{ TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::S16),
84 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
85 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
86 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::F32),
87 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
88 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
89 TensorInfo(TensorShape(32U, 13U, 2U), 1, DataType::U8),
90 TensorInfo(TensorShape(27U, 13U, 2U), 1, DataType::U8),
91 })),
92 framework::dataset::make("Policy",{ ConvertPolicy::WRAP,
93 ConvertPolicy::WRAP,
94 ConvertPolicy::WRAP,
95 ConvertPolicy::WRAP,
96 ConvertPolicy::WRAP,
97 ConvertPolicy::WRAP,
98 ConvertPolicy::WRAP,
99 })),
100 framework::dataset::make("Shift",{ 1, 1, 1, 1, 1, 1, 8, 1,
101 })),
102 framework::dataset::make("Expected", { false, false, false, false, false, false, false, true})),
103 input_info, output_info, policy, shift, expected)
104{
105 ARM_COMPUTE_EXPECT(bool(NEDepthConvertLayer::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), policy, shift)) == expected, framework::LogLevel::ERRORS);
106}
107// clang-format on
108// *INDENT-ON*
109
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000110template <typename T>
111using NEDepthConvertLayerToU16Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, uint16_t>;
112template <typename T>
113using NEDepthConvertLayerToS16Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, int16_t>;
114template <typename T>
115using NEDepthConvertLayerToS32Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, int32_t>;
116template <typename T>
117using NEDepthConvertLayerToU8Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, uint8_t>;
118template <typename T>
119using NEDepthConvertLayerToU32Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, uint32_t>;
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100120template <typename T>
121using NEDepthConvertLayerToF16Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, half>;
122template <typename T>
123using NEDepthConvertLayerToF32Fixture = DepthConvertLayerValidationFixture<Tensor, Accessor, NEDepthConvertLayer, T, float>;
Michalis Spyroue2588182018-12-13 18:31:18 +0000124template <typename T>
125using NEDepthConvertLayerToQASYMM8Fixture = DepthConvertLayerValidationQuantizedFixture<Tensor, Accessor, NEDepthConvertLayer, T, uint8_t>;
126template <typename T>
127using NEDepthConvertLayerQuantizedToF16Fixture = DepthConvertLayerValidationQuantizedFixture<Tensor, Accessor, NEDepthConvertLayer, T, half>;
128template <typename T>
129using NEDepthConvertLayerQuantizedToF32Fixture = DepthConvertLayerValidationQuantizedFixture<Tensor, Accessor, NEDepthConvertLayer, T, float>;
130
131TEST_SUITE(QASYMM8_to_F32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000132DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyroue2588182018-12-13 18:31:18 +0000133 DepthConvertLayerZeroShiftDataset),
134 shape, policy, shift)
135{
136 // Create tensors
137 Tensor src = create_tensor<Tensor>(shape, DataType::QASYMM8, 1);
138 Tensor dst = create_tensor<Tensor>(shape, DataType::F32, 1);
139
140 // Create and Configure function
141 NEDepthConvertLayer depth_convert;
142 depth_convert.configure(&src, &dst, policy, shift);
143
144 // Validate valid region
145 const ValidRegion valid_region = shape_to_valid_region(shape);
146 validate(dst.info()->valid_region(), valid_region);
147
148 // Validate padding
149 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
150 validate(src.info()->padding(), padding);
151 validate(dst.info()->padding(), padding);
152}
153
154FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerQuantizedToF32Fixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
155 DepthConvertLayerQASYMM8toF32Dataset),
156 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
157 DepthConvertLayerZeroShiftDataset),
158 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
159{
160 // Validate output
161 validate(Accessor(_target), _reference);
162}
163FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerQuantizedToF32Fixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(datasets::LargeShapes(),
164 DepthConvertLayerQASYMM8toF32Dataset),
165 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
166 DepthConvertLayerZeroShiftDataset),
167 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
168{
169 // Validate output
170 validate(Accessor(_target), _reference);
171}
172TEST_SUITE_END() // QASYMM8_to_F32
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000173
174TEST_SUITE(U8_to_U16)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000175DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000176 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000177 shape, policy, shift)
178{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000179 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100180 Tensor src = create_tensor<Tensor>(shape, DataType::U8, 1);
181 Tensor dst = create_tensor<Tensor>(shape, DataType::U16, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000182
183 // Create and Configure function
184 NEDepthConvertLayer depth_convert;
185 depth_convert.configure(&src, &dst, policy, shift);
186
187 // Validate valid region
188 const ValidRegion valid_region = shape_to_valid_region(shape);
189 validate(dst.info()->valid_region(), valid_region);
190
191 // Validate padding
192 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
193 validate(src.info()->padding(), padding);
194 validate(dst.info()->padding(), padding);
195}
196
197FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToU16Fixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerU8toU16Dataset),
198 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000199 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000200{
201 // Validate output
202 validate(Accessor(_target), _reference);
203}
204
205FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToU16Fixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerU8toU16Dataset),
206 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000207 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000208{
209 // Validate output
210 validate(Accessor(_target), _reference);
211}
Michalis Spyroue2588182018-12-13 18:31:18 +0000212TEST_SUITE_END() // U8_to_U16
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000213
214TEST_SUITE(U8_to_S16)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000215DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000216 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000217 shape, policy, shift)
218{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000219 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100220 Tensor src = create_tensor<Tensor>(shape, DataType::U8, 1);
221 Tensor dst = create_tensor<Tensor>(shape, DataType::S16, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000222
223 // Create and Configure function
224 NEDepthConvertLayer depth_convert;
225 depth_convert.configure(&src, &dst, policy, shift);
226
227 // Validate valid region
228 const ValidRegion valid_region = shape_to_valid_region(shape);
229 validate(dst.info()->valid_region(), valid_region);
230
231 // Validate padding
232 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
233 validate(src.info()->padding(), padding);
234 validate(dst.info()->padding(), padding);
235}
236
237FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToS16Fixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerU8toS16Dataset),
238 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000239 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000240{
241 // Validate output
242 validate(Accessor(_target), _reference);
243}
244
245FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToS16Fixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerU8toS16Dataset),
246 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000247 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000248{
249 // Validate output
250 validate(Accessor(_target), _reference);
251}
Michalis Spyroue2588182018-12-13 18:31:18 +0000252TEST_SUITE_END() // U8_to_S16
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000253TEST_SUITE(U8_to_S32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000254DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000255 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000256 shape, policy, shift)
257{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000258 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100259 Tensor src = create_tensor<Tensor>(shape, DataType::U8, 1);
260 Tensor dst = create_tensor<Tensor>(shape, DataType::S32, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000261
262 // Create and Configure function
263 NEDepthConvertLayer depth_convert;
264 depth_convert.configure(&src, &dst, policy, shift);
265
266 // Validate valid region
267 const ValidRegion valid_region = shape_to_valid_region(shape);
268 validate(dst.info()->valid_region(), valid_region);
269
270 // Validate padding
271 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
272 validate(src.info()->padding(), padding);
273 validate(dst.info()->padding(), padding);
274}
275
276FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToS32Fixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerU8toS32Dataset),
277 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000278 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000279{
280 // Validate output
281 validate(Accessor(_target), _reference);
282}
283
284FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToS32Fixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerU8toS32Dataset),
285 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000286 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000287{
288 // Validate output
289 validate(Accessor(_target), _reference);
290}
Michalis Spyroue2588182018-12-13 18:31:18 +0000291TEST_SUITE_END() // U8_to_S32
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000292
293TEST_SUITE(U16_to_U8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000294DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000295 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000296 shape, policy, shift)
297{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000298 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100299 Tensor src = create_tensor<Tensor>(shape, DataType::U16, 1);
300 Tensor dst = create_tensor<Tensor>(shape, DataType::U8, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000301
302 // Create and Configure function
303 NEDepthConvertLayer depth_convert;
304 depth_convert.configure(&src, &dst, policy, shift);
305
306 // Validate valid region
307 const ValidRegion valid_region = shape_to_valid_region(shape);
308 validate(dst.info()->valid_region(), valid_region);
309
310 // Validate padding
311 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
312 validate(src.info()->padding(), padding);
313 validate(dst.info()->padding(), padding);
314}
315
316FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToU8Fixture<uint16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerU16toU8Dataset),
317 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000318 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000319{
320 // Validate output
321 validate(Accessor(_target), _reference);
322}
323FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToU8Fixture<uint16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerU16toU8Dataset),
324 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000325 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000326{
327 // Validate output
328 validate(Accessor(_target), _reference);
329}
Michalis Spyroue2588182018-12-13 18:31:18 +0000330TEST_SUITE_END() // U16_to_U8
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000331
332TEST_SUITE(U16_to_U32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000333DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000334 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000335 shape, policy, shift)
336{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000337 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100338 Tensor src = create_tensor<Tensor>(shape, DataType::U16, 1);
339 Tensor dst = create_tensor<Tensor>(shape, DataType::U32, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000340
341 // Create and Configure function
342 NEDepthConvertLayer depth_convert;
343 depth_convert.configure(&src, &dst, policy, shift);
344
345 // Validate valid region
346 const ValidRegion valid_region = shape_to_valid_region(shape);
347 validate(dst.info()->valid_region(), valid_region);
348
349 // Validate padding
350 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
351 validate(src.info()->padding(), padding);
352 validate(dst.info()->padding(), padding);
353}
354
355FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToU32Fixture<uint16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerU16toU32Dataset),
356 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000357 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000358{
359 // Validate output
360 validate(Accessor(_target), _reference);
361}
362FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToU32Fixture<uint16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerU16toU32Dataset),
363 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000364 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000365{
366 // Validate output
367 validate(Accessor(_target), _reference);
368}
Michalis Spyroue2588182018-12-13 18:31:18 +0000369TEST_SUITE_END() // U16_to_U32
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000370
371TEST_SUITE(S16_to_U8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000372DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000373 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000374 shape, policy, shift)
375{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000376 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100377 Tensor src = create_tensor<Tensor>(shape, DataType::S16, 1);
378 Tensor dst = create_tensor<Tensor>(shape, DataType::U8, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000379
380 // Create and Configure function
381 NEDepthConvertLayer depth_convert;
382 depth_convert.configure(&src, &dst, policy, shift);
383
384 // Validate valid region
385 const ValidRegion valid_region = shape_to_valid_region(shape);
386 validate(dst.info()->valid_region(), valid_region);
387
388 // Validate padding
389 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
390 validate(src.info()->padding(), padding);
391 validate(dst.info()->padding(), padding);
392}
393
394FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToU8Fixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerS16toU8Dataset),
395 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000396 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000397{
398 // Validate output
399 validate(Accessor(_target), _reference);
400}
401FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToU8Fixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerS16toU8Dataset),
402 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000403 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000404{
405 // Validate output
406 validate(Accessor(_target), _reference);
407}
Michalis Spyroue2588182018-12-13 18:31:18 +0000408TEST_SUITE_END() // S16_to_U8
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000409
410TEST_SUITE(S16_to_S32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000411DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000412 DepthConvertLayerShiftDatasetNightly),
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000413 shape, policy, shift)
414{
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000415 // Create tensors
Vidhya Sudhan Loganathan014333d2018-07-02 09:13:49 +0100416 Tensor src = create_tensor<Tensor>(shape, DataType::S16, 1);
417 Tensor dst = create_tensor<Tensor>(shape, DataType::S32, 1);
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000418
419 // Create and Configure function
420 NEDepthConvertLayer depth_convert;
421 depth_convert.configure(&src, &dst, policy, shift);
422
423 // Validate valid region
424 const ValidRegion valid_region = shape_to_valid_region(shape);
425 validate(dst.info()->valid_region(), valid_region);
426
427 // Validate padding
428 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
429 validate(src.info()->padding(), padding);
430 validate(dst.info()->padding(), padding);
431}
432
433FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToS32Fixture<int16_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerS16toS32Dataset),
434 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000435 DepthConvertLayerShiftDatasetPrecommit))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000436{
437 // Validate output
438 validate(Accessor(_target), _reference);
439}
440FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToS32Fixture<int16_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerS16toS32Dataset),
441 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyrouaeebe4a2019-01-09 14:21:03 +0000442 DepthConvertLayerShiftDatasetNightly))
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000443{
444 // Validate output
445 validate(Accessor(_target), _reference);
446}
Michalis Spyroue2588182018-12-13 18:31:18 +0000447TEST_SUITE_END() // S16_to_S32
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000448
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100449#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Michalis Spyroue2588182018-12-13 18:31:18 +0000450TEST_SUITE(F16_to_QASYMM8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000451DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
Michalis Spyroue2588182018-12-13 18:31:18 +0000452 DepthConvertLayerZeroShiftDataset),
453 shape, policy, shift)
454{
455 // Create tensors
456 Tensor src = create_tensor<Tensor>(shape, DataType::F16, 1);
457 Tensor dst = create_tensor<Tensor>(shape, DataType::QASYMM8, 1);
458
459 // Create and Configure function
460 NEDepthConvertLayer depth_convert;
461 depth_convert.configure(&src, &dst, policy, shift);
462
463 // Validate valid region
464 const ValidRegion valid_region = shape_to_valid_region(shape);
465 validate(dst.info()->valid_region(), valid_region);
466
467 // Validate padding
468 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
469 validate(src.info()->padding(), padding);
470 validate(dst.info()->padding(), padding);
471}
472
473FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToQASYMM8Fixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
474 DepthConvertLayerF16toQASYMM8Dataset),
475 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
476 DepthConvertLayerZeroShiftDataset),
477 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
478{
479 // Validate output
480 validate(Accessor(_target), _reference, tolerance_qasymm8);
481}
482FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToQASYMM8Fixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(datasets::LargeShapes(),
483 DepthConvertLayerF16toQASYMM8Dataset),
484 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
485 DepthConvertLayerZeroShiftDataset),
486 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
487{
488 // Validate output
489 validate(Accessor(_target), _reference, tolerance_qasymm8);
490}
491TEST_SUITE_END() // F16_to_QASYMM8
492
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100493TEST_SUITE(F16_to_F32)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000494DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000495 DepthConvertLayerZeroShiftDataset),
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100496 shape, policy, shift)
497{
498 // Create tensors
499 Tensor src = create_tensor<Tensor>(shape, DataType::F16, 1);
500 Tensor dst = create_tensor<Tensor>(shape, DataType::F32, 1);
501
502 // Create and Configure function
503 NEDepthConvertLayer depth_convert;
504 depth_convert.configure(&src, &dst, policy, shift);
505
506 // Validate valid region
507 const ValidRegion valid_region = shape_to_valid_region(shape);
508 validate(dst.info()->valid_region(), valid_region);
509
510 // Validate padding
511 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
512 validate(src.info()->padding(), padding);
513 validate(dst.info()->padding(), padding);
514}
515
516FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToF32Fixture<half>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerF16toF32Dataset),
517 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000518 DepthConvertLayerZeroShiftDataset))
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100519{
520 // Validate output
521 validate(Accessor(_target), _reference);
522}
523FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToF32Fixture<half>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerF16toF32Dataset),
524 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000525 DepthConvertLayerZeroShiftDataset))
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100526{
527 // Validate output
528 validate(Accessor(_target), _reference);
529}
Michalis Spyroue2588182018-12-13 18:31:18 +0000530TEST_SUITE_END() // F16_to_F32
531
532TEST_SUITE(QASYMM8_to_F16)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000533DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyroue2588182018-12-13 18:31:18 +0000534 DepthConvertLayerZeroShiftDataset),
535 shape, policy, shift)
536{
537 // Create tensors
538 Tensor src = create_tensor<Tensor>(shape, DataType::QASYMM8, 1);
539 Tensor dst = create_tensor<Tensor>(shape, DataType::F16, 1);
540
541 // Create and Configure function
542 NEDepthConvertLayer depth_convert;
543 depth_convert.configure(&src, &dst, policy, shift);
544
545 // Validate valid region
546 const ValidRegion valid_region = shape_to_valid_region(shape);
547 validate(dst.info()->valid_region(), valid_region);
548
549 // Validate padding
550 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
551 validate(src.info()->padding(), padding);
552 validate(dst.info()->padding(), padding);
553}
554
555FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerQuantizedToF16Fixture<uint8_t>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
556 DepthConvertLayerQASYMM8toF16Dataset),
557 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
558 DepthConvertLayerZeroShiftDataset),
559 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
560{
561 // Validate output
562 validate(Accessor(_target), _reference);
563}
564FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerQuantizedToF16Fixture<uint8_t>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(datasets::LargeShapes(),
565 DepthConvertLayerQASYMM8toF16Dataset),
566 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
567 DepthConvertLayerZeroShiftDataset),
568 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
569{
570 // Validate output
571 validate(Accessor(_target), _reference);
572}
573TEST_SUITE_END() // QASYMM8_to_F16
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100574
575TEST_SUITE(F32_to_F16)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000576DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000577 DepthConvertLayerZeroShiftDataset),
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100578 shape, policy, shift)
579{
580 // Create tensors
581 Tensor src = create_tensor<Tensor>(shape, DataType::F32, 1);
582 Tensor dst = create_tensor<Tensor>(shape, DataType::F16, 1);
583
584 // Create and Configure function
585 NEDepthConvertLayer depth_convert;
586 depth_convert.configure(&src, &dst, policy, shift);
587
588 // Validate valid region
589 const ValidRegion valid_region = shape_to_valid_region(shape);
590 validate(dst.info()->valid_region(), valid_region);
591
592 // Validate padding
593 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
594 validate(src.info()->padding(), padding);
595 validate(dst.info()->padding(), padding);
596}
597
598FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToF16Fixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(datasets::SmallShapes(), DepthConvertLayerF32toF16Dataset),
599 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000600 DepthConvertLayerZeroShiftDataset))
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100601{
602 // Validate output
603 validate(Accessor(_target), _reference);
604}
605FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToF16Fixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(datasets::LargeShapes(), DepthConvertLayerF32toF16Dataset),
606 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Georgios Pinitas6a468ef2018-12-04 13:46:48 +0000607 DepthConvertLayerZeroShiftDataset))
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100608{
609 // Validate output
610 validate(Accessor(_target), _reference);
611}
Michalis Spyroue2588182018-12-13 18:31:18 +0000612TEST_SUITE_END() // F32_to_F16
613#endif /* __ARM_FEATURE_FP16_VECTOR_ARITHMETIC */
Michele Di Giorgio3e570db2018-08-24 18:28:48 +0100614
Michalis Spyroue2588182018-12-13 18:31:18 +0000615TEST_SUITE(F32_to_QASYMM8)
Michalis Spyrou5c9f0c42019-01-16 14:48:48 +0000616DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(combine(datasets::SmallShapes(), framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE, ConvertPolicy::WRAP })),
Michalis Spyroue2588182018-12-13 18:31:18 +0000617 DepthConvertLayerZeroShiftDataset),
618 shape, policy, shift)
619{
620 // Create tensors
621 Tensor src = create_tensor<Tensor>(shape, DataType::F32, 1);
622 Tensor dst = create_tensor<Tensor>(shape, DataType::QASYMM8, 1);
623
624 // Create and Configure function
625 NEDepthConvertLayer depth_convert;
626 depth_convert.configure(&src, &dst, policy, shift);
627
628 // Validate valid region
629 const ValidRegion valid_region = shape_to_valid_region(shape);
630 validate(dst.info()->valid_region(), valid_region);
631
632 // Validate padding
633 const PaddingSize padding = PaddingCalculator(shape.x(), 16).required_padding();
634 validate(src.info()->padding(), padding);
635 validate(dst.info()->padding(), padding);
636}
637
638FIXTURE_DATA_TEST_CASE(RunSmall, NEDepthConvertLayerToQASYMM8Fixture<float>, framework::DatasetMode::PRECOMMIT, combine(combine(combine(combine(datasets::SmallShapes(),
639 DepthConvertLayerF32toQASYMM8Dataset),
640 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
641 DepthConvertLayerZeroShiftDataset),
642 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
643{
644 // Validate output
645 validate(Accessor(_target), _reference, tolerance_qasymm8);
646}
647FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthConvertLayerToQASYMM8Fixture<float>, framework::DatasetMode::NIGHTLY, combine(combine(combine(combine(datasets::LargeShapes(),
648 DepthConvertLayerF32toQASYMM8Dataset),
649 framework::dataset::make("ConvertPolicy", { ConvertPolicy::SATURATE })),
650 DepthConvertLayerZeroShiftDataset),
651 framework::dataset::make("QuantizationInfo", { QuantizationInfo(0.5f, 10) })))
652{
653 // Validate output
654 validate(Accessor(_target), _reference, tolerance_qasymm8);
655}
656TEST_SUITE_END() // F32_to_QASYMM8
657TEST_SUITE_END() // DepthConvertLayer
658TEST_SUITE_END() // NEON
Giorgio Arena04a8f8c2017-11-23 11:45:24 +0000659} // namespace validation
660} // namespace test
661} // namespace arm_compute