1 /*
2 * SPDX-FileCopyrightText: Copyright 2010-2024 Arm Limited and/or its affiliates <open-source-office@arm.com>
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Licensed under the Apache License, Version 2.0 (the License); you may
7 * not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
9 *
10 * www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
14 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #include <stdlib.h>
20
21 #include <arm_nnfunctions.h>
22 #include <unity.h>
23
24 #include "../TestData/transpose_3dim/test_data.h"
25 #include "../TestData/transpose_3dim2/test_data.h"
26 #include "../TestData/transpose_chwn/test_data.h"
27 #include "../TestData/transpose_default/test_data.h"
28 #include "../TestData/transpose_matrix/test_data.h"
29 #include "../TestData/transpose_nchw/test_data.h"
30 #include "../TestData/transpose_ncwh/test_data.h"
31 #include "../TestData/transpose_nhcw/test_data.h"
32 #include "../TestData/transpose_nwhc/test_data.h"
33 #include "../TestData/transpose_wchn/test_data.h"
34 #include "../Utils/validate.h"
35
transpose_default_arm_transpose_s8(void)36 void transpose_default_arm_transpose_s8(void)
37 {
38 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
39 int8_t output_data[TRANSPOSE_DEFAULT_SIZE] = {0};
40 int8_t *output_ptr = output_data;
41
42 const cmsis_nn_dims input_dims = TRANSPOSE_DEFAULT_IN_DIM;
43 const cmsis_nn_dims output_dims = TRANSPOSE_DEFAULT_OUT_DIM;
44
45 const int8_t *input_data = transpose_default_input_tensor;
46 const int8_t *const output_ref = transpose_default_output;
47 const int32_t output_ref_size = TRANSPOSE_DEFAULT_SIZE;
48
49 const uint32_t perm[TRANSPOSE_DEFAULT_PERM_SIZE] = TRANSPOSE_DEFAULT_PERM;
50 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_DEFAULT_PERM_SIZE, perm};
51
52 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
53
54 TEST_ASSERT_EQUAL(expected, result);
55 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
56 }
57
transpose_nhcw_arm_transpose_s8(void)58 void transpose_nhcw_arm_transpose_s8(void)
59 {
60 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
61 int8_t output_data[TRANSPOSE_NHCW_SIZE] = {0};
62 int8_t *output_ptr = output_data;
63
64 const cmsis_nn_dims input_dims = TRANSPOSE_NHCW_IN_DIM;
65 const cmsis_nn_dims output_dims = TRANSPOSE_NHCW_OUT_DIM;
66
67 const int8_t *input_data = transpose_nhcw_input_tensor;
68 const int8_t *const output_ref = transpose_nhcw_output;
69 const int32_t output_ref_size = TRANSPOSE_NHCW_SIZE;
70
71 const uint32_t perm[TRANSPOSE_NHCW_PERM_SIZE] = TRANSPOSE_NHCW_PERM;
72 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NHCW_PERM_SIZE, perm};
73
74 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
75
76 TEST_ASSERT_EQUAL(expected, result);
77 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
78 }
79
transpose_wchn_arm_transpose_s8(void)80 void transpose_wchn_arm_transpose_s8(void)
81 {
82 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
83 int8_t output_data[TRANSPOSE_WCHN_SIZE] = {0};
84 int8_t *output_ptr = output_data;
85
86 const cmsis_nn_dims input_dims = TRANSPOSE_WCHN_IN_DIM;
87 const cmsis_nn_dims output_dims = TRANSPOSE_WCHN_OUT_DIM;
88
89 const int8_t *input_data = transpose_wchn_input_tensor;
90 const int8_t *const output_ref = transpose_wchn_output;
91 const int32_t output_ref_size = TRANSPOSE_WCHN_SIZE;
92
93 const uint32_t perm[TRANSPOSE_WCHN_PERM_SIZE] = TRANSPOSE_WCHN_PERM;
94 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_WCHN_PERM_SIZE, perm};
95
96 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
97
98 TEST_ASSERT_EQUAL(expected, result);
99 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
100 }
101
transpose_nchw_arm_transpose_s8(void)102 void transpose_nchw_arm_transpose_s8(void)
103 {
104 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
105 int8_t output_data[TRANSPOSE_NCHW_SIZE] = {0};
106 int8_t *output_ptr = output_data;
107
108 const cmsis_nn_dims input_dims = TRANSPOSE_NCHW_IN_DIM;
109 const cmsis_nn_dims output_dims = TRANSPOSE_NCHW_OUT_DIM;
110
111 const int8_t *input_data = transpose_nchw_input_tensor;
112 const int8_t *const output_ref = transpose_nchw_output;
113 const int32_t output_ref_size = TRANSPOSE_NCHW_SIZE;
114
115 const uint32_t perm[TRANSPOSE_NCHW_PERM_SIZE] = TRANSPOSE_NCHW_PERM;
116 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NCHW_PERM_SIZE, perm};
117
118 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
119
120 TEST_ASSERT_EQUAL(expected, result);
121 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
122 }
123
transpose_chwn_arm_transpose_s8(void)124 void transpose_chwn_arm_transpose_s8(void)
125 {
126 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
127 int8_t output_data[TRANSPOSE_CHWN_SIZE] = {0};
128 int8_t *output_ptr = output_data;
129
130 const cmsis_nn_dims input_dims = TRANSPOSE_CHWN_IN_DIM;
131 const cmsis_nn_dims output_dims = TRANSPOSE_CHWN_OUT_DIM;
132
133 const int8_t *input_data = transpose_chwn_input_tensor;
134 const int8_t *const output_ref = transpose_chwn_output;
135 const int32_t output_ref_size = TRANSPOSE_CHWN_SIZE;
136
137 const uint32_t perm[TRANSPOSE_CHWN_PERM_SIZE] = TRANSPOSE_CHWN_PERM;
138 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_CHWN_PERM_SIZE, perm};
139
140 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
141
142 TEST_ASSERT_EQUAL(expected, result);
143 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
144 }
145
transpose_matrix_arm_transpose_s8(void)146 void transpose_matrix_arm_transpose_s8(void)
147 {
148 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
149 int8_t output_data[TRANSPOSE_MATRIX_SIZE] = {0};
150 int8_t *output_ptr = output_data;
151
152 const cmsis_nn_dims input_dims = TRANSPOSE_MATRIX_IN_DIM;
153 const cmsis_nn_dims output_dims = TRANSPOSE_MATRIX_OUT_DIM;
154
155 const int8_t *input_data = transpose_matrix_input_tensor;
156 const int8_t *const output_ref = transpose_matrix_output;
157 const int32_t output_ref_size = TRANSPOSE_MATRIX_SIZE;
158
159 const uint32_t perm[TRANSPOSE_MATRIX_PERM_SIZE] = TRANSPOSE_MATRIX_PERM;
160 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_MATRIX_PERM_SIZE, perm};
161
162 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
163
164 TEST_ASSERT_EQUAL(expected, result);
165 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
166 }
167
transpose_ncwh_arm_transpose_s8(void)168 void transpose_ncwh_arm_transpose_s8(void)
169 {
170 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
171 int8_t output_data[TRANSPOSE_NCWH_SIZE] = {0};
172 int8_t *output_ptr = output_data;
173
174 const cmsis_nn_dims input_dims = TRANSPOSE_NCWH_IN_DIM;
175 const cmsis_nn_dims output_dims = TRANSPOSE_NCWH_OUT_DIM;
176
177 const int8_t *input_data = transpose_ncwh_input_tensor;
178 const int8_t *const output_ref = transpose_ncwh_output;
179 const int32_t output_ref_size = TRANSPOSE_NCWH_SIZE;
180
181 const uint32_t perm[TRANSPOSE_NCWH_PERM_SIZE] = TRANSPOSE_NCWH_PERM;
182 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NCWH_PERM_SIZE, perm};
183
184 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
185
186 TEST_ASSERT_EQUAL(expected, result);
187 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
188 }
189
transpose_nwhc_arm_transpose_s8(void)190 void transpose_nwhc_arm_transpose_s8(void)
191 {
192 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
193 int8_t output_data[TRANSPOSE_NWHC_SIZE] = {0};
194 int8_t *output_ptr = output_data;
195
196 const cmsis_nn_dims input_dims = TRANSPOSE_NWHC_IN_DIM;
197 const cmsis_nn_dims output_dims = TRANSPOSE_NWHC_OUT_DIM;
198
199 const int8_t *input_data = transpose_nwhc_input_tensor;
200 const int8_t *const output_ref = transpose_nwhc_output;
201 const int32_t output_ref_size = TRANSPOSE_NWHC_SIZE;
202
203 const uint32_t perm[TRANSPOSE_NWHC_PERM_SIZE] = TRANSPOSE_NWHC_PERM;
204 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_NWHC_PERM_SIZE, perm};
205
206 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
207
208 TEST_ASSERT_EQUAL(expected, result);
209 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
210 }
211
transpose_3dim_arm_transpose_s8(void)212 void transpose_3dim_arm_transpose_s8(void)
213 {
214 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
215 int8_t output_data[TRANSPOSE_3DIM_SIZE] = {0};
216 int8_t *output_ptr = output_data;
217
218 const cmsis_nn_dims input_dims = TRANSPOSE_3DIM_IN_DIM;
219 const cmsis_nn_dims output_dims = TRANSPOSE_3DIM_OUT_DIM;
220
221 const int8_t *input_data = transpose_3dim_input_tensor;
222 const int8_t *const output_ref = transpose_3dim_output;
223 const int32_t output_ref_size = TRANSPOSE_3DIM_SIZE;
224
225 const uint32_t perm[TRANSPOSE_3DIM_PERM_SIZE] = TRANSPOSE_3DIM_PERM;
226 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_3DIM_PERM_SIZE, perm};
227
228 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
229
230 TEST_ASSERT_EQUAL(expected, result);
231 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
232 }
233
transpose_3dim2_arm_transpose_s8(void)234 void transpose_3dim2_arm_transpose_s8(void)
235 {
236 const arm_cmsis_nn_status expected = ARM_CMSIS_NN_SUCCESS;
237 int8_t output_data[TRANSPOSE_3DIM2_SIZE] = {0};
238 int8_t *output_ptr = output_data;
239
240 const cmsis_nn_dims input_dims = TRANSPOSE_3DIM2_IN_DIM;
241 const cmsis_nn_dims output_dims = TRANSPOSE_3DIM2_OUT_DIM;
242
243 const int8_t *input_data = transpose_3dim2_input_tensor;
244 const int8_t *const output_ref = transpose_3dim2_output;
245 const int32_t output_ref_size = TRANSPOSE_3DIM2_SIZE;
246
247 const uint32_t perm[TRANSPOSE_3DIM2_PERM_SIZE] = TRANSPOSE_3DIM2_PERM;
248 const cmsis_nn_transpose_params transpose_params = {TRANSPOSE_3DIM2_PERM_SIZE, perm};
249
250 arm_cmsis_nn_status result = arm_transpose_s8(input_data, output_ptr, &input_dims, &output_dims, &transpose_params);
251
252 TEST_ASSERT_EQUAL(expected, result);
253 TEST_ASSERT_TRUE(validate(output_data, output_ref, output_ref_size));
254 }
255