blob: 9caae81089fb0243bef0ec676c7333333edf551c [file] [log] [blame]
Michalis Spyrou5237e012018-01-17 09:40:27 +00001/*
Michalis Spyroud175ece2020-07-30 23:39:32 +01002 * Copyright (c) 2018-2020 Arm Limited.
Michalis Spyrou5237e012018-01-17 09:40:27 +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"
25#include "arm_compute/runtime/CL/CLTensor.h"
26#include "arm_compute/runtime/CL/CLTensorAllocator.h"
27#include "arm_compute/runtime/CL/functions/CLPermute.h"
28#include "tests/CL/CLAccessor.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/PermuteFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
shubhame1a4e372019-01-07 21:37:55 +053045const auto PermuteVectors3 = framework::dataset::make("PermutationVector",
Pablo Tello35767bc2018-12-05 17:36:30 +000046{
47 PermutationVector(2U, 0U, 1U),
48 PermutationVector(1U, 2U, 0U),
shubhame1a4e372019-01-07 21:37:55 +053049 PermutationVector(0U, 1U, 2U),
50 PermutationVector(0U, 2U, 1U),
51 PermutationVector(1U, 0U, 2U),
52 PermutationVector(2U, 1U, 0U),
Pablo Tello35767bc2018-12-05 17:36:30 +000053});
shubhame1a4e372019-01-07 21:37:55 +053054const auto PermuteVectors4 = framework::dataset::make("PermutationVector",
55{
56 PermutationVector(3U, 2U, 0U, 1U),
57 PermutationVector(3U, 2U, 1U, 0U),
58 PermutationVector(2U, 3U, 1U, 0U),
59 PermutationVector(1U, 3U, 2U, 0U),
60 PermutationVector(3U, 1U, 2U, 0U),
61 PermutationVector(3U, 0U, 2U, 1U),
62 PermutationVector(0U, 3U, 2U, 1U)
63});
64const auto PermuteVectors = concat(PermuteVectors3, PermuteVectors4);
Michalis Spyrou6bff1952019-10-02 17:22:11 +010065const auto PermuteParametersSmall = concat(concat(datasets::Small2DShapes(), datasets::Small3DShapes()), datasets::Small4DShapes()) * PermuteVectors;
66const auto PermuteParametersLarge = datasets::Large4DShapes() * PermuteVectors;
Michalis Spyrou5237e012018-01-17 09:40:27 +000067} // namespace
68TEST_SUITE(CL)
69TEST_SUITE(Permute)
70
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +000071// *INDENT-OFF*
72// clang-format off
73DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
shubhame1a4e372019-01-07 21:37:55 +053074 framework::dataset::make("InputInfo",{
75 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // valid
76 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
77 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
78 TensorInfo(TensorShape(1U, 7U), 1, DataType::U8), // invalid input size
79 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // valid
80 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // valid
81 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
82 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::S16), // valid
83 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // permutation not supported
84 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // valid
85 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32) // permutation not supported
86
87 }),
88 framework::dataset::make("OutputInfo", {
89 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
90 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
91 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
92 TensorInfo(TensorShape(5U, 7U), 1, DataType::U8),
93 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
94 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
95 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
96 TensorInfo(TensorShape(3U, 5U, 7U, 7U), 1, DataType::S16),
97 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
98 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32),
99 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32)
100
101 })),
102 framework::dataset::make("PermutationVector", {
103 PermutationVector(2U, 1U, 0U),
104 PermutationVector(2U, 2U, 1U),
105 PermutationVector(1U, 1U, 1U),
106 PermutationVector(2U, 0U, 1U),
107 PermutationVector(2U, 0U, 1U),
108 PermutationVector(1U, 2U, 0U),
109 PermutationVector(3U, 2U, 0U, 1U),
110 PermutationVector(3U, 2U, 0U, 1U),
111 PermutationVector(2U, 3U, 1U, 0U),
112 PermutationVector(2U, 3U, 1U, 0U),
113 PermutationVector(0U, 0U, 0U, 1000U)
114 })),
115 framework::dataset::make("Expected", { true, false, false, false, true, true, false, true, false, true, false })),
116 input_info, output_info, perm_vect, expected)
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +0000117{
118 ARM_COMPUTE_EXPECT(bool(CLPermute::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), perm_vect)) == expected, framework::LogLevel::ERRORS);
119}
120// clang-format on
121// *INDENT-ON*
122
shubhame1a4e372019-01-07 21:37:55 +0530123#ifndef DOXYGEN_SKIP_THIS
124
Michalis Spyrou5237e012018-01-17 09:40:27 +0000125template <typename T>
126using CLPermuteFixture = PermuteValidationFixture<CLTensor, CLAccessor, CLPermute, T>;
127
128TEST_SUITE(U8)
shubhame1a4e372019-01-07 21:37:55 +0530129FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
130 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U8))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000131{
132 // Validate output
133 validate(CLAccessor(_target), _reference);
134}
shubhame1a4e372019-01-07 21:37:55 +0530135
136FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
137 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U8))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000138{
139 // Validate output
140 validate(CLAccessor(_target), _reference);
141}
shubhame1a4e372019-01-07 21:37:55 +0530142TEST_SUITE_END() // U8
Michalis Spyrou5237e012018-01-17 09:40:27 +0000143
144TEST_SUITE(U16)
shubhame1a4e372019-01-07 21:37:55 +0530145FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint16_t>, framework::DatasetMode::PRECOMMIT,
146 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U16))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000147{
148 // Validate output
149 validate(CLAccessor(_target), _reference);
150}
shubhame1a4e372019-01-07 21:37:55 +0530151FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint16_t>, framework::DatasetMode::NIGHTLY,
152 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U16))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000153{
154 // Validate output
155 validate(CLAccessor(_target), _reference);
156}
shubhame1a4e372019-01-07 21:37:55 +0530157TEST_SUITE_END() // U16
Michalis Spyrou5237e012018-01-17 09:40:27 +0000158
159TEST_SUITE(U32)
shubhame1a4e372019-01-07 21:37:55 +0530160FIXTURE_DATA_TEST_CASE(RunSmall, CLPermuteFixture<uint32_t>, framework::DatasetMode::PRECOMMIT,
161 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U32))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000162{
163 // Validate output
164 validate(CLAccessor(_target), _reference);
165}
shubhame1a4e372019-01-07 21:37:55 +0530166FIXTURE_DATA_TEST_CASE(RunLarge, CLPermuteFixture<uint32_t>, framework::DatasetMode::NIGHTLY,
167 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U32))
Michalis Spyrou5237e012018-01-17 09:40:27 +0000168{
169 // Validate output
170 validate(CLAccessor(_target), _reference);
171}
shubhame1a4e372019-01-07 21:37:55 +0530172TEST_SUITE_END() // U32
Michalis Spyrou5237e012018-01-17 09:40:27 +0000173
shubhame1a4e372019-01-07 21:37:55 +0530174#endif /* DOXYGEN_SKIP_THIS */
175
176TEST_SUITE_END() // Permute
177TEST_SUITE_END() // CL
Michalis Spyrou5237e012018-01-17 09:40:27 +0000178} // namespace validation
179} // namespace test
180} // namespace arm_compute