1 /* Copyright 2019 The TensorFlow Authors. All Rights Reserved.
2
3 Licensed under the Apache License, Version 2.0 (the "License");
4 you may not use this file except in compliance with the License.
5 You may obtain a copy of the License at
6
7 http://www.apache.org/licenses/LICENSE-2.0
8
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14 ==============================================================================*/
15
16 #include "tensorflow/lite/c/builtin_op_data.h"
17 #include "tensorflow/lite/c/common.h"
18 #include "tensorflow/lite/micro/all_ops_resolver.h"
19 #include "tensorflow/lite/micro/debug_log.h"
20 #include "tensorflow/lite/micro/kernels/kernel_runner.h"
21 #include "tensorflow/lite/micro/test_helpers.h"
22 #include "tensorflow/lite/micro/testing/micro_test.h"
23
24 namespace tflite {
25 namespace testing {
26
TestSplitTwoOutputsFloat(const int * input_dims_data,const float * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const float * expected_output1_data,const int * output2_dims_data,const float * expected_output2_data,float * output1_data,float * output2_data)27 void TestSplitTwoOutputsFloat(
28 const int* input_dims_data, const float* input_data,
29 const int* axis_dims_data, const int32_t* axis_data,
30 const int* output1_dims_data, const float* expected_output1_data,
31 const int* output2_dims_data, const float* expected_output2_data,
32 float* output1_data, float* output2_data) {
33 TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
34 TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
35 TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
36 TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
37 const int output1_dims_count = ElementCount(*output1_dims);
38 const int output2_dims_count = ElementCount(*output2_dims);
39
40 constexpr int input_size = 1;
41 constexpr int output_size = 2;
42 constexpr int axis_size = 1;
43 constexpr int tensors_size = input_size + output_size + axis_size;
44 TfLiteTensor tensors[tensors_size] = {
45 CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims),
46 CreateTensor(output1_data, output1_dims),
47 CreateTensor(output2_data, output2_dims)};
48
49 // Currently only support constant axis tensor.
50 tensors[0].allocation_type = kTfLiteMmapRo;
51 // Place a unique value in the uninitialized output buffer.
52 for (int i = 0; i < output1_dims_count; ++i) {
53 output1_data[i] = 23;
54 }
55
56 for (int i = 0; i < output2_dims_count; ++i) {
57 output2_data[i] = 23;
58 }
59
60 int inputs_array_data[] = {2, 0, 1};
61 TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
62 int outputs_array_data[] = {2, 2, 3};
63 TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
64
65 const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
66 micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
67 outputs_array, nullptr);
68
69 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
70 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
71
72 for (int i = 0; i < output1_dims_count; ++i) {
73 TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f);
74 }
75
76 for (int i = 0; i < output2_dims_count; ++i) {
77 TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f);
78 }
79 }
80
TestSplitFourOutputsFloat(const int * input_dims_data,const float * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const float * expected_output1_data,const int * output2_dims_data,const float * expected_output2_data,const int * output3_dims_data,const float * expected_output3_data,const int * output4_dims_data,const float * expected_output4_data,float * output1_data,float * output2_data,float * output3_data,float * output4_data)81 void TestSplitFourOutputsFloat(
82 const int* input_dims_data, const float* input_data,
83 const int* axis_dims_data, const int32_t* axis_data,
84 const int* output1_dims_data, const float* expected_output1_data,
85 const int* output2_dims_data, const float* expected_output2_data,
86 const int* output3_dims_data, const float* expected_output3_data,
87 const int* output4_dims_data, const float* expected_output4_data,
88 float* output1_data, float* output2_data, float* output3_data,
89 float* output4_data) {
90 TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
91 TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
92 TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
93 TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
94 TfLiteIntArray* output3_dims = IntArrayFromInts(output3_dims_data);
95 TfLiteIntArray* output4_dims = IntArrayFromInts(output4_dims_data);
96 const int output1_dims_count = ElementCount(*output1_dims);
97 const int output2_dims_count = ElementCount(*output2_dims);
98 const int output3_dims_count = ElementCount(*output3_dims);
99 const int output4_dims_count = ElementCount(*output4_dims);
100
101 constexpr int input_size = 1;
102 constexpr int output_size = 4;
103 constexpr int axis_size = 1;
104 constexpr int tensors_size = input_size + output_size + axis_size;
105 TfLiteTensor tensors[tensors_size] = {
106 CreateTensor(axis_data, axis_dims),
107 CreateTensor(input_data, input_dims),
108 CreateTensor(output1_data, output1_dims),
109 CreateTensor(output2_data, output2_dims),
110 CreateTensor(output3_data, output1_dims),
111 CreateTensor(output4_data, output1_dims)};
112
113 // Currently only support constant axis tensor.
114 tensors[0].allocation_type = kTfLiteMmapRo;
115 // Place a unique value in the uninitialized output buffer.
116 for (int i = 0; i < output1_dims_count; ++i) {
117 output1_data[i] = 23;
118 }
119 for (int i = 0; i < output2_dims_count; ++i) {
120 output2_data[i] = 23;
121 }
122 for (int i = 0; i < output3_dims_count; ++i) {
123 output3_data[i] = 23;
124 }
125 for (int i = 0; i < output4_dims_count; ++i) {
126 output4_data[i] = 23;
127 }
128
129 int inputs_array_data[] = {2, 0, 1};
130 TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
131 int outputs_array_data[] = {4, 2, 3, 4, 5};
132 TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
133
134 const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
135 micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
136 outputs_array, nullptr);
137
138 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
139 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
140
141 for (int i = 0; i < output1_dims_count; ++i) {
142 TF_LITE_MICRO_EXPECT_NEAR(expected_output1_data[i], output1_data[i], 1e-5f);
143 }
144 for (int i = 0; i < output2_dims_count; ++i) {
145 TF_LITE_MICRO_EXPECT_NEAR(expected_output2_data[i], output2_data[i], 1e-5f);
146 }
147 for (int i = 0; i < output3_dims_count; ++i) {
148 TF_LITE_MICRO_EXPECT_NEAR(expected_output3_data[i], output3_data[i], 1e-5f);
149 }
150 for (int i = 0; i < output4_dims_count; ++i) {
151 TF_LITE_MICRO_EXPECT_NEAR(expected_output4_data[i], output4_data[i], 1e-5f);
152 }
153 }
154
TestSplitTwoOutputsQuantized(const int * input_dims_data,const uint8_t * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const uint8_t * expected_output1_data,const int * output2_dims_data,const uint8_t * expected_output2_data,uint8_t * output1_data,uint8_t * output2_data)155 void TestSplitTwoOutputsQuantized(
156 const int* input_dims_data, const uint8_t* input_data,
157 const int* axis_dims_data, const int32_t* axis_data,
158 const int* output1_dims_data, const uint8_t* expected_output1_data,
159 const int* output2_dims_data, const uint8_t* expected_output2_data,
160 uint8_t* output1_data, uint8_t* output2_data) {
161 TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
162 TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
163 TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
164 TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
165 const int output1_dims_count = ElementCount(*output1_dims);
166 const int output2_dims_count = ElementCount(*output2_dims);
167
168 constexpr int input_size = 1;
169 constexpr int output_size = 2;
170 constexpr int axis_size = 1;
171 constexpr int tensors_size = input_size + output_size + axis_size;
172 TfLiteTensor tensors[tensors_size] = {
173 CreateTensor(axis_data, axis_dims),
174 CreateQuantizedTensor(input_data, input_dims, 0, 10),
175 CreateQuantizedTensor(output1_data, output1_dims, 0, 10),
176 CreateQuantizedTensor(output2_data, output2_dims, 0, 10)};
177
178 // Currently only support constant axis tensor.
179 tensors[0].allocation_type = kTfLiteMmapRo;
180
181 // Place a unique value in the uninitialized output buffer.
182 for (int i = 0; i < output1_dims_count; ++i) {
183 output1_data[i] = 23;
184 }
185
186 for (int i = 0; i < output2_dims_count; ++i) {
187 output2_data[i] = 23;
188 }
189
190 int inputs_array_data[] = {2, 0, 1};
191 TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
192 int outputs_array_data[] = {2, 2, 3};
193 TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
194
195 const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
196 micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
197 outputs_array, nullptr);
198
199 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
200 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
201
202 for (int i = 0; i < output1_dims_count; ++i) {
203 TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]);
204 }
205
206 for (int i = 0; i < output2_dims_count; ++i) {
207 TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]);
208 }
209 }
210
TestSplitTwoOutputsQuantized32(const int * input_dims_data,const int32_t * input_data,const int * axis_dims_data,const int32_t * axis_data,const int * output1_dims_data,const int32_t * expected_output1_data,const int * output2_dims_data,const int32_t * expected_output2_data,int32_t * output1_data,int32_t * output2_data)211 void TestSplitTwoOutputsQuantized32(
212 const int* input_dims_data, const int32_t* input_data,
213 const int* axis_dims_data, const int32_t* axis_data,
214 const int* output1_dims_data, const int32_t* expected_output1_data,
215 const int* output2_dims_data, const int32_t* expected_output2_data,
216 int32_t* output1_data, int32_t* output2_data) {
217 TfLiteIntArray* input_dims = IntArrayFromInts(input_dims_data);
218 TfLiteIntArray* axis_dims = IntArrayFromInts(axis_dims_data);
219 TfLiteIntArray* output1_dims = IntArrayFromInts(output1_dims_data);
220 TfLiteIntArray* output2_dims = IntArrayFromInts(output2_dims_data);
221 const int output1_dims_count = ElementCount(*output1_dims);
222 const int output2_dims_count = ElementCount(*output2_dims);
223
224 constexpr int input_size = 1;
225 constexpr int output_size = 2;
226 constexpr int axis_size = 1;
227 constexpr int tensors_size = input_size + output_size + axis_size;
228 TfLiteTensor tensors[tensors_size] = {
229 CreateTensor(axis_data, axis_dims), CreateTensor(input_data, input_dims),
230 CreateTensor(output1_data, output1_dims),
231 CreateTensor(output2_data, output2_dims)};
232
233 // Currently only support constant axis tensor.
234 tensors[0].allocation_type = kTfLiteMmapRo;
235
236 // Place a unique value in the uninitialized output buffer.
237 for (int i = 0; i < output1_dims_count; ++i) {
238 output1_data[i] = 23;
239 }
240
241 for (int i = 0; i < output2_dims_count; ++i) {
242 output2_data[i] = 23;
243 }
244
245 int inputs_array_data[] = {2, 0, 1};
246 TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
247 int outputs_array_data[] = {2, 2, 3};
248 TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
249
250 const TfLiteRegistration registration = tflite::ops::micro::Register_SPLIT();
251 micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
252 outputs_array, nullptr);
253
254 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
255 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
256
257 for (int i = 0; i < output1_dims_count; ++i) {
258 TF_LITE_MICRO_EXPECT_EQ(expected_output1_data[i], output1_data[i]);
259 }
260
261 for (int i = 0; i < output2_dims_count; ++i) {
262 TF_LITE_MICRO_EXPECT_EQ(expected_output2_data[i], output2_data[i]);
263 }
264 }
265
266 } // namespace testing
267 } // namespace tflite
268
269 TF_LITE_MICRO_TESTS_BEGIN
270
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisZero)271 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisZero) {
272 const int input_shape[] = {4, 2, 2, 2, 2};
273 const float input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
274 9, 10, 11, 12, 13, 14, 15, 16};
275 const int axis_shape[] = {1, 1};
276 const int32_t axis_data[] = {0};
277 const int output1_shape[] = {4, 1, 2, 2, 2};
278 const float golden1[] = {1, 2, 3, 4, 5, 6, 7, 8};
279 const int output2_shape[] = {4, 1, 2, 2, 2};
280 const float golden2[] = {9, 10, 11, 12, 13, 14, 15, 16};
281
282 constexpr int output1_dims_count = 8;
283 constexpr int output2_dims_count = 8;
284 float output1_data[output1_dims_count];
285 float output2_data[output2_dims_count];
286 tflite::testing::TestSplitTwoOutputsFloat(
287 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
288 output2_shape, golden2, output1_data, output2_data);
289 }
290
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisOne)291 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisOne) {
292 const int input_shape[] = {4, 2, 2, 2, 2};
293 const float input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
294 9, 10, 11, 12, 13, 14, 15, 16};
295 const int axis_shape[] = {1, 1};
296 const int32_t axis_data[] = {1};
297 const int output1_shape[] = {4, 2, 1, 2, 2};
298 const float golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
299 const int output2_shape[] = {4, 2, 1, 2, 2};
300 const float golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
301
302 constexpr int output1_dims_count = 8;
303 constexpr int output2_dims_count = 8;
304 float output1_data[output1_dims_count];
305 float output2_data[output2_dims_count];
306 tflite::testing::TestSplitTwoOutputsFloat(
307 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
308 output2_shape, golden2, output1_data, output2_data);
309 }
310
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisTwo)311 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisTwo) {
312 const int input_shape[] = {4, 2, 2, 2, 2};
313 const float input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
314 9, 10, 11, 12, 13, 14, 15, 16};
315 const int axis_shape[] = {1, 1};
316 const int32_t axis_data[] = {2};
317 const int output1_shape[] = {4, 2, 2, 1, 2};
318 const float golden1[] = {1, 2, 5, 6, 9, 10, 13, 14};
319 const int output2_shape[] = {4, 2, 2, 1, 2};
320 const float golden2[] = {3, 4, 7, 8, 11, 12, 15, 16};
321
322 constexpr int output1_dims_count = 8;
323 constexpr int output2_dims_count = 8;
324 float output1_data[output1_dims_count];
325 float output2_data[output2_dims_count];
326 tflite::testing::TestSplitTwoOutputsFloat(
327 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
328 output2_shape, golden2, output1_data, output2_data);
329 }
330
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisThree)331 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalAxisThree) {
332 const int input_shape[] = {4, 2, 2, 2, 2};
333 const float input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
334 9, 10, 11, 12, 13, 14, 15, 16};
335 const int axis_shape[] = {1, 1};
336 const int32_t axis_data[] = {3};
337 const int output1_shape[] = {4, 2, 2, 2, 1};
338 const float golden1[] = {1, 3, 5, 7, 9, 11, 13, 15};
339 const int output2_shape[] = {4, 2, 2, 2, 1};
340 const float golden2[] = {2, 4, 6, 8, 10, 12, 14, 16};
341
342 constexpr int output1_dims_count = 8;
343 constexpr int output2_dims_count = 8;
344 float output1_data[output1_dims_count];
345 float output2_data[output2_dims_count];
346 tflite::testing::TestSplitTwoOutputsFloat(
347 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
348 output2_shape, golden2, output1_data, output2_data);
349 }
350
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalNegativeAxis)351 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalNegativeAxis) {
352 const int input_shape[] = {4, 2, 2, 2, 2};
353 const float input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
354 9, 10, 11, 12, 13, 14, 15, 16};
355 const int axis_shape[] = {1, 1};
356 const int32_t axis_data[] = {-4};
357 const int output1_shape[] = {4, 1, 2, 2, 2};
358 const float golden1[] = {1, 2, 3, 4, 5, 6, 7, 8};
359 const int output2_shape[] = {4, 1, 2, 2, 2};
360 const float golden2[] = {9, 10, 11, 12, 13, 14, 15, 16};
361
362 constexpr int output1_dims_count = 8;
363 constexpr int output2_dims_count = 8;
364 float output1_data[output1_dims_count];
365 float output2_data[output2_dims_count];
366 tflite::testing::TestSplitTwoOutputsFloat(
367 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
368 output2_shape, golden2, output1_data, output2_data);
369 }
370
TF_LITE_MICRO_TEST(FourSplit)371 TF_LITE_MICRO_TEST(FourSplit) {
372 const int input_shape[] = {1, 4};
373 const float input_data[] = {1, 2, 3, 4};
374 const int axis_shape[] = {1, 1};
375 const int32_t axis_data[] = {0};
376 const int output1_shape[] = {1, 1};
377 const float golden1[] = {1};
378 const int output2_shape[] = {1, 1};
379 const float golden2[] = {2};
380 const int output3_shape[] = {1, 1};
381 const float golden3[] = {3};
382 const int output4_shape[] = {1, 1};
383 const float golden4[] = {4};
384
385 constexpr int output1_dims_count = 1;
386 constexpr int output2_dims_count = 1;
387 constexpr int output3_dims_count = 1;
388 constexpr int output4_dims_count = 1;
389 float output1_data[output1_dims_count];
390 float output2_data[output2_dims_count];
391 float output3_data[output3_dims_count];
392 float output4_data[output4_dims_count];
393 tflite::testing::TestSplitFourOutputsFloat(
394 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
395 output2_shape, golden2, output3_shape, golden3, output4_shape, golden4,
396 output1_data, output2_data, output3_data, output4_data);
397 }
398
TF_LITE_MICRO_TEST(TwoSplitOneDimensional)399 TF_LITE_MICRO_TEST(TwoSplitOneDimensional) {
400 const int input_shape[] = {1, 2};
401 const float input_data[] = {1, 2};
402 const int axis_shape[] = {1, 1};
403 const int32_t axis_data[] = {0};
404 const int output1_shape[] = {1, 1};
405 const float golden1[] = {1};
406 const int output2_shape[] = {1, 1};
407 const float golden2[] = {2};
408
409 constexpr int output1_dims_count = 8;
410 constexpr int output2_dims_count = 8;
411 float output1_data[output1_dims_count];
412 float output2_data[output2_dims_count];
413 tflite::testing::TestSplitTwoOutputsFloat(
414 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
415 output2_shape, golden2, output1_data, output2_data);
416 }
417
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized)418 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized) {
419 const int input_shape[] = {4, 2, 2, 2, 2};
420 const uint8_t input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
421 9, 10, 11, 12, 13, 14, 15, 16};
422 const int axis_shape[] = {1, 1};
423 const int32_t axis_data[] = {1};
424 const int output1_shape[] = {4, 2, 1, 2, 2};
425 const uint8_t golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
426 const int output2_shape[] = {4, 2, 1, 2, 2};
427 const uint8_t golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
428
429 constexpr int output1_dims_count = 8;
430 constexpr int output2_dims_count = 8;
431 uint8_t output1_data[output1_dims_count];
432 uint8_t output2_data[output2_dims_count];
433 tflite::testing::TestSplitTwoOutputsQuantized(
434 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
435 output2_shape, golden2, output1_data, output2_data);
436 }
437
TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized32)438 TF_LITE_MICRO_TEST(TwoSplitFourDimensionalQuantized32) {
439 const int input_shape[] = {4, 2, 2, 2, 2};
440 const int32_t input_data[] = {1, 2, 3, 4, 5, 6, 7, 8,
441 9, 10, 11, 12, 13, 14, 15, 16};
442 const int axis_shape[] = {1, 1};
443 const int32_t axis_data[] = {1};
444 const int output1_shape[] = {4, 2, 1, 2, 2};
445 const int32_t golden1[] = {1, 2, 3, 4, 9, 10, 11, 12};
446 const int output2_shape[] = {4, 2, 1, 2, 2};
447 const int32_t golden2[] = {5, 6, 7, 8, 13, 14, 15, 16};
448
449 constexpr int output1_dims_count = 8;
450 constexpr int output2_dims_count = 8;
451 int32_t output1_data[output1_dims_count];
452 int32_t output2_data[output2_dims_count];
453 tflite::testing::TestSplitTwoOutputsQuantized32(
454 input_shape, input_data, axis_shape, axis_data, output1_shape, golden1,
455 output2_shape, golden2, output1_data, output2_data);
456 }
457
458 TF_LITE_MICRO_TESTS_END
459