blob: a5a81b7ac32eeded54997ababe87e820c50dcd46 [file] [log] [blame]
Georgios Pinitas284cfe22018-02-13 12:15:13 +00001/*
2 * Copyright (c) 2018 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 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/NEON/functions/NEPermute.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/PermuteFixture.h"
36
37namespace arm_compute
38{
39namespace test
40{
41namespace validation
42{
43namespace
44{
Pablo Tello35767bc2018-12-05 17:36:30 +000045const auto PermuteVectors3 = framework::dataset::make("PermutationVector",
46{
47 PermutationVector(2U, 0U, 1U),
48 PermutationVector(1U, 2U, 0U),
49 PermutationVector(0U, 1U, 2U),
50 PermutationVector(0U, 2U, 1U),
51 PermutationVector(1U, 0U, 2U),
52 PermutationVector(2U, 1U, 0U),
53});
54const 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);
65const auto PermuteInputLayout = framework::dataset::make("DataLayout", { DataLayout::NCHW, DataLayout::NHWC });
66const auto PermuteParametersSmall = concat(concat(datasets::Small2DShapes(), datasets::Small3DShapes()), datasets::Small4DShapes()) * PermuteInputLayout * PermuteVectors;
67const auto PermuteParametersLarge = datasets::Large4DShapes() * PermuteInputLayout * PermuteVectors;
Georgios Pinitas284cfe22018-02-13 12:15:13 +000068} // namespace
69TEST_SUITE(NEON)
70TEST_SUITE(Permute)
71
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +000072// *INDENT-OFF*
73// clang-format off
74DATA_TEST_CASE(Validate, framework::DatasetMode::ALL, zip(zip(zip(
75 framework::dataset::make("InputInfo",{
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(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
79 TensorInfo(TensorShape(1U, 7U), 1, DataType::U8), // invalid input size
80 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // valid
81 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // valid
Isabella Gottardi4ad65982018-10-25 17:42:19 +010082 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16), // permutation not supported
Pablo Tello35767bc2018-12-05 17:36:30 +000083 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::S16), // permutation not supported
Isabella Gottardi4ad65982018-10-25 17:42:19 +010084 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // permutation not supported
Pablo Tello35767bc2018-12-05 17:36:30 +000085 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32), // permutation not supported
86 TensorInfo(TensorShape(27U, 13U, 37U, 2U), 1, DataType::F32) // permutation not supported
87
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +000088 }),
89 framework::dataset::make("OutputInfo", {
90 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
91 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
92 TensorInfo(TensorShape(7U, 7U, 5U, 3U), 1, DataType::U16),
93 TensorInfo(TensorShape(5U, 7U), 1, DataType::U8),
94 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
95 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
Isabella Gottardi4ad65982018-10-25 17:42:19 +010096 TensorInfo(TensorShape(5U, 7U, 7U, 3U), 1, DataType::U16),
Pablo Tello35767bc2018-12-05 17:36:30 +000097 TensorInfo(TensorShape(3U, 5U, 7U, 7U), 1, DataType::S16),
Isabella Gottardi4ad65982018-10-25 17:42:19 +010098 TensorInfo(TensorShape(13U, 37U, 27U, 2U), 1, DataType::F32),
Pablo Tello35767bc2018-12-05 17:36:30 +000099 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32),
100 TensorInfo(TensorShape(37U, 2U, 13U, 27U), 1, DataType::F32)
101
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +0000102 })),
103 framework::dataset::make("PermutationVector", {
104 PermutationVector(2U, 1U, 0U),
105 PermutationVector(2U, 2U, 1U),
106 PermutationVector(1U, 1U, 1U),
107 PermutationVector(2U, 0U, 1U),
108 PermutationVector(2U, 0U, 1U),
109 PermutationVector(1U, 2U, 0U),
Isabella Gottardi4ad65982018-10-25 17:42:19 +0100110 PermutationVector(3U, 2U, 0U, 1U),
Pablo Tello35767bc2018-12-05 17:36:30 +0000111 PermutationVector(3U, 2U, 0U, 1U),
112 PermutationVector(2U, 3U, 1U, 0U),
113 PermutationVector(2U, 3U, 1U, 0U),
114 PermutationVector(0U, 0U, 0U, 1000U)
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +0000115 })),
Pablo Tello35767bc2018-12-05 17:36:30 +0000116 framework::dataset::make("Expected", { true, false, false, false, true, true, false,true, false, true, false })),
Isabella Gottardiaad9f2c2018-02-21 11:51:23 +0000117 input_info, output_info, perm_vect, expected)
118{
119 ARM_COMPUTE_EXPECT(bool(NEPermute::validate(&input_info.clone()->set_is_resizable(false), &output_info.clone()->set_is_resizable(false), perm_vect)) == expected, framework::LogLevel::ERRORS);
120}
121// clang-format on
122// *INDENT-ON*
123
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000124DATA_TEST_CASE(Configuration, framework::DatasetMode::ALL, combine(datasets::Small4DShapes(), framework::dataset::make("DataType", { DataType::S8, DataType::U8, DataType::S16, DataType::U16, DataType::U32, DataType::S32, DataType::F16, DataType::F32 })),
125 shape, data_type)
126{
127 // Define permutation vector
128 const PermutationVector perm(2U, 0U, 1U);
129
130 // Permute shapes
131 TensorShape output_shape = shape;
132 permute(output_shape, perm);
133
134 // Create tensors
135 Tensor ref_src = create_tensor<Tensor>(shape, data_type);
136 Tensor dst = create_tensor<Tensor>(output_shape, data_type);
137
138 // Create and Configure function
139 NEPermute perm_func;
140 perm_func.configure(&ref_src, &dst, perm);
141
142 // Validate valid region
143 const ValidRegion valid_region = shape_to_valid_region(output_shape);
144 validate(dst.info()->valid_region(), valid_region);
145}
146
147template <typename T>
148using NEPermuteFixture = PermuteValidationFixture<Tensor, Accessor, NEPermute, T>;
149
150TEST_SUITE(U8)
Pablo Tello35767bc2018-12-05 17:36:30 +0000151FIXTURE_DATA_TEST_CASE(RunSmall, NEPermuteFixture<uint8_t>, framework::DatasetMode::PRECOMMIT,
152 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U8))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000153{
154 // Validate output
155 validate(Accessor(_target), _reference);
156}
Pablo Tello35767bc2018-12-05 17:36:30 +0000157
158FIXTURE_DATA_TEST_CASE(RunLarge, NEPermuteFixture<uint8_t>, framework::DatasetMode::NIGHTLY,
159 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U8))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000160{
161 // Validate output
162 validate(Accessor(_target), _reference);
163}
164TEST_SUITE_END()
165
166TEST_SUITE(U16)
Pablo Tello35767bc2018-12-05 17:36:30 +0000167FIXTURE_DATA_TEST_CASE(RunSmall, NEPermuteFixture<uint16_t>, framework::DatasetMode::PRECOMMIT,
168 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U16))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000169{
170 // Validate output
171 validate(Accessor(_target), _reference);
172}
Pablo Tello35767bc2018-12-05 17:36:30 +0000173FIXTURE_DATA_TEST_CASE(RunLarge, NEPermuteFixture<uint16_t>, framework::DatasetMode::NIGHTLY,
174 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U16))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000175{
176 // Validate output
177 validate(Accessor(_target), _reference);
178}
179TEST_SUITE_END()
180
181TEST_SUITE(U32)
Pablo Tello35767bc2018-12-05 17:36:30 +0000182FIXTURE_DATA_TEST_CASE(RunSmall, NEPermuteFixture<uint32_t>, framework::DatasetMode::PRECOMMIT,
183 PermuteParametersSmall * framework::dataset::make("DataType", DataType::U32))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000184{
185 // Validate output
186 validate(Accessor(_target), _reference);
187}
Pablo Tello35767bc2018-12-05 17:36:30 +0000188FIXTURE_DATA_TEST_CASE(RunLarge, NEPermuteFixture<uint32_t>, framework::DatasetMode::NIGHTLY,
189 PermuteParametersLarge * framework::dataset::make("DataType", DataType::U32))
Georgios Pinitas284cfe22018-02-13 12:15:13 +0000190{
191 // Validate output
192 validate(Accessor(_target), _reference);
193}
194TEST_SUITE_END()
195
196TEST_SUITE_END()
197TEST_SUITE_END()
198} // namespace validation
199} // namespace test
200} // namespace arm_compute