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 <cstdint>
17
18 #include "tensorflow/lite/c/builtin_op_data.h"
19 #include "tensorflow/lite/c/common.h"
20 #include "tensorflow/lite/micro/all_ops_resolver.h"
21 #include "tensorflow/lite/micro/kernels/kernel_runner.h"
22 #include "tensorflow/lite/micro/test_helpers.h"
23 #include "tensorflow/lite/micro/testing/micro_test.h"
24
25 namespace tflite {
26 namespace testing {
27 namespace {
28
29 // Shapes and values for mixed broadcast tests.
30 const int broadcast_output_dims_count = 36;
31 const int broadcast_num_shapes = 4;
32
33 const int broadcast_input1_shape[] = {4, 2, 3, 1, 2};
34 const float broadcast_input1_values[] = {-0.3, 2.3, 0.9, 0.5, 0.8, -1.1,
35 1.2, 2.8, -1.6, 0.0, 0.7, -2.2};
36 const float broadcast_input2_values[] = {0.2, 0.3, -0.4, 0.5, 1.0, 0.9};
37 const float
38 broadcast_goldens[broadcast_num_shapes][broadcast_output_dims_count] = {
39 {-0.1, 2.6, -0.7, 2.8, 0.7, 3.2, 1.1, 0.8, 0.5, 1.0, 1.9, 1.4,
40 1.0, -0.8, 0.4, -0.6, 1.8, -0.2, 1.4, 3.1, 0.8, 3.3, 2.2, 3.7,
41 -1.4, 0.3, -2.0, 0.5, -0.6, 0.9, 0.9, -1.9, 0.3, -1.7, 1.7, -1.3},
42 {-0.1, 2.6, 0.5, 1.0, 1.8, -0.2, 1.4, 3.1, -2.0, 0.5, 1.7, -1.3},
43 {-0.1, 2.5, 0.0, 2.6, -0.7, 1.9, 1.1, 0.7, 1.2, 0.8, 0.5, 0.1,
44 1.0, -0.9, 1.1, -0.8, 0.4, -1.5, 1.7, 3.3, 2.2, 3.8, 2.1, 3.7,
45 -1.1, 0.5, -0.6, 1.0, -0.7, 0.9, 1.2, -1.7, 1.7, -1.2, 1.6, -1.3},
46 {-0.1, 2.5, 1.2, 0.8, 0.4, -1.5, 1.7, 3.3, -0.6, 1.0, 1.6, -1.3},
47 };
48
49 const int broadcast_max_shape_size = 5;
50 const int broadcast_input2_shapes[broadcast_num_shapes]
51 [broadcast_max_shape_size] = {
52 {4, 1, 1, 3, 2},
53 {4, 1, 3, 1, 2},
54 {4, 2, 1, 3, 1},
55 {4, 2, 3, 1, 1},
56 };
57 const int broadcast_output_shapes[broadcast_num_shapes]
58 [broadcast_max_shape_size] = {
59 {4, 2, 3, 3, 2},
60 {4, 2, 3, 1, 2},
61 {4, 2, 3, 3, 2},
62 {4, 2, 3, 1, 2},
63 };
64
65 template <typename T>
ValidateAddGoldens(TfLiteTensor * tensors,int tensors_size,const T * golden,T * output,int output_size,TfLiteFusedActivation activation,float tolerance=1e-5)66 void ValidateAddGoldens(TfLiteTensor* tensors, int tensors_size,
67 const T* golden, T* output, int output_size,
68 TfLiteFusedActivation activation,
69 float tolerance = 1e-5) {
70 TfLiteAddParams builtin_data;
71 builtin_data.activation = activation;
72
73 int inputs_array_data[] = {2, 0, 1};
74 TfLiteIntArray* inputs_array = IntArrayFromInts(inputs_array_data);
75 int outputs_array_data[] = {1, 2};
76 TfLiteIntArray* outputs_array = IntArrayFromInts(outputs_array_data);
77
78 const TfLiteRegistration registration = ops::micro::Register_ADD();
79 micro::KernelRunner runner(registration, tensors, tensors_size, inputs_array,
80 outputs_array, &builtin_data);
81
82 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.InitAndPrepare());
83 TF_LITE_MICRO_EXPECT_EQ(kTfLiteOk, runner.Invoke());
84
85 for (int i = 0; i < output_size; ++i) {
86 TF_LITE_MICRO_EXPECT_NEAR(golden[i], output[i], tolerance);
87 }
88 }
89
TestAddFloat(const int * input1_dims_data,const float * input1_data,const int * input2_dims_data,const float * input2_data,const int * output_dims_data,const float * expected_output,TfLiteFusedActivation activation,float * output_data)90 void TestAddFloat(const int* input1_dims_data, const float* input1_data,
91 const int* input2_dims_data, const float* input2_data,
92 const int* output_dims_data, const float* expected_output,
93 TfLiteFusedActivation activation, float* output_data) {
94 TfLiteIntArray* input1_dims = IntArrayFromInts(input1_dims_data);
95 TfLiteIntArray* input2_dims = IntArrayFromInts(input2_dims_data);
96 TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
97
98 constexpr int inputs_size = 2;
99 constexpr int outputs_size = 1;
100 constexpr int tensors_size = inputs_size + outputs_size;
101 TfLiteTensor tensors[tensors_size] = {
102 CreateTensor(input1_data, input1_dims),
103 CreateTensor(input2_data, input2_dims),
104 CreateTensor(output_data, output_dims),
105 };
106
107 ValidateAddGoldens(tensors, tensors_size, expected_output, output_data,
108 ElementCount(*output_dims), activation);
109 }
110
111 template <typename T>
TestAddQuantized(const int * input1_dims_data,const float * input1_data,T * input1_quantized,float input1_scale,int input1_zero_point,const int * input2_dims_data,const float * input2_data,T * input2_quantized,float input2_scale,int input2_zero_point,const int * output_dims_data,const float * golden,T * golden_quantized,float output_scale,int output_zero_point,TfLiteFusedActivation activation,T * output_data)112 void TestAddQuantized(const int* input1_dims_data, const float* input1_data,
113 T* input1_quantized, float input1_scale,
114 int input1_zero_point, const int* input2_dims_data,
115 const float* input2_data, T* input2_quantized,
116 float input2_scale, int input2_zero_point,
117 const int* output_dims_data, const float* golden,
118 T* golden_quantized, float output_scale,
119 int output_zero_point, TfLiteFusedActivation activation,
120 T* output_data) {
121 TfLiteIntArray* input1_dims = IntArrayFromInts(input1_dims_data);
122 TfLiteIntArray* input2_dims = IntArrayFromInts(input2_dims_data);
123 TfLiteIntArray* output_dims = IntArrayFromInts(output_dims_data);
124
125 constexpr int inputs_size = 2;
126 constexpr int outputs_size = 1;
127 constexpr int tensors_size = inputs_size + outputs_size;
128 TfLiteTensor tensors[tensors_size] = {
129 tflite::testing::CreateQuantizedTensor(input1_data, input1_quantized,
130 input1_dims, input1_scale,
131 input1_zero_point),
132 tflite::testing::CreateQuantizedTensor(input2_data, input2_quantized,
133 input2_dims, input2_scale,
134 input2_zero_point),
135 tflite::testing::CreateQuantizedTensor(output_data, output_dims,
136 output_scale, output_zero_point),
137 };
138 tflite::Quantize(golden, golden_quantized, ElementCount(*output_dims),
139 output_scale, output_zero_point);
140
141 ValidateAddGoldens(tensors, tensors_size, golden_quantized, output_data,
142 ElementCount(*output_dims), activation);
143 }
144
145 } // namespace
146 } // namespace testing
147 } // namespace tflite
148
149 TF_LITE_MICRO_TESTS_BEGIN
150
TF_LITE_MICRO_TEST(FloatAddNoActivation)151 TF_LITE_MICRO_TEST(FloatAddNoActivation) {
152 const int output_dims_count = 4;
153 const int inout_shape[] = {4, 1, 2, 2, 1};
154 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8};
155 const float input2_values[] = {0.1, 0.2, 0.3, 0.5};
156 const float golden_values[] = {-1.9, 0.4, 1.0, 1.3};
157 float output_data[output_dims_count];
158 tflite::testing::TestAddFloat(inout_shape, input1_values, inout_shape,
159 input2_values, inout_shape, golden_values,
160 kTfLiteActNone, output_data);
161 }
162
TF_LITE_MICRO_TEST(FloatAddActivationRelu1)163 TF_LITE_MICRO_TEST(FloatAddActivationRelu1) {
164 const int output_dims_count = 4;
165 const int inout_shape[] = {4, 1, 2, 2, 1};
166 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8};
167 const float input2_values[] = {0.1, 0.2, 0.3, 0.5};
168 const float golden_values[] = {-1.0, 0.4, 1.0, 1.0};
169
170 float output_data[output_dims_count];
171 tflite::testing::TestAddFloat(inout_shape, input1_values, inout_shape,
172 input2_values, inout_shape, golden_values,
173 kTfLiteActReluN1To1, output_data);
174 }
175
TF_LITE_MICRO_TEST(FloatAddVariousInputShapes)176 TF_LITE_MICRO_TEST(FloatAddVariousInputShapes) {
177 const int output_dims_count = 6;
178 float output_data[output_dims_count];
179
180 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
181 const float input2_values[] = {0.1, 0.2, 0.3, 0.5, 1.1, 0.1};
182 const float expected_output[] = {-1.9, 0.4, 1.0, 1.3, 2.2, 2.1};
183
184 constexpr int num_shapes = 4;
185 constexpr int max_shape_size = 5;
186 const int test_shapes[num_shapes][max_shape_size] = {
187 {1, 6},
188 {2, 2, 3},
189 {3, 2, 1, 3},
190 {4, 1, 3, 1, 2},
191 };
192
193 for (int i = 0; i < num_shapes; ++i) {
194 tflite::testing::TestAddFloat(test_shapes[i], input1_values, test_shapes[i],
195 input2_values, test_shapes[i],
196 expected_output, kTfLiteActNone, output_data);
197 }
198 }
199
TF_LITE_MICRO_TEST(FloatAddWithScalarBroadcast)200 TF_LITE_MICRO_TEST(FloatAddWithScalarBroadcast) {
201 const int output_dims_count = 6;
202 float output_data[output_dims_count];
203
204 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
205 const int input2_shape[] = {0};
206 const float input2_values[] = {0.1};
207 const float expected_output[] = {-1.9, 0.3, 0.8, 0.9, 1.2, 2.1};
208
209 constexpr int num_shapes = 4;
210 constexpr int max_shape_size = 5;
211 const int test_shapes[num_shapes][max_shape_size] = {
212 {1, 6},
213 {2, 2, 3},
214 {3, 2, 1, 3},
215 {4, 1, 3, 1, 2},
216 };
217
218 for (int i = 0; i < num_shapes; ++i) {
219 tflite::testing::TestAddFloat(test_shapes[i], input1_values, input2_shape,
220 input2_values, test_shapes[i],
221 expected_output, kTfLiteActNone, output_data);
222 }
223 }
224
TF_LITE_MICRO_TEST(QuantizedAddNoActivationUint8)225 TF_LITE_MICRO_TEST(QuantizedAddNoActivationUint8) {
226 const float scales[] = {0.25, 0.5, 1.0};
227 const int zero_points[] = {125, 129, 135};
228 const int output_dims_count = 4;
229 const int inout_shape[] = {4, 1, 2, 2, 1};
230 const float input1_values[] = {-2.01, -1.01, -0.01, 0.98};
231 const float input2_values[] = {1.01, 1.99, 2.99, 4.02};
232 const float golden_values[] = {-1, 1, 3, 5};
233
234 uint8_t input1_quantized[output_dims_count];
235 uint8_t input2_quantized[output_dims_count];
236 uint8_t golden_quantized[output_dims_count];
237 uint8_t output[output_dims_count];
238
239 tflite::testing::TestAddQuantized(
240 inout_shape, input1_values, input1_quantized, scales[0], zero_points[0],
241 inout_shape, input2_values, input2_quantized, scales[1], zero_points[1],
242 inout_shape, golden_values, golden_quantized, scales[2], zero_points[2],
243 kTfLiteActNone, output);
244 }
245
TF_LITE_MICRO_TEST(QuantizedAddNoActivationInt8)246 TF_LITE_MICRO_TEST(QuantizedAddNoActivationInt8) {
247 const float scales[] = {0.25, 0.5, 1.0};
248 const int zero_points[] = {-10, 4, 13};
249 const int output_dims_count = 4;
250 const int inout_shape[] = {4, 1, 2, 2, 1};
251 const float input1_values[] = {-2.01, -1.01, -0.01, 0.98};
252 const float input2_values[] = {1.01, 1.99, 2.99, 4.02};
253 const float golden_values[] = {-1, 1, 3, 5};
254
255 int8_t input1_quantized[output_dims_count];
256 int8_t input2_quantized[output_dims_count];
257 int8_t golden_quantized[output_dims_count];
258 int8_t output[output_dims_count];
259
260 tflite::testing::TestAddQuantized(
261 inout_shape, input1_values, input1_quantized, scales[0], zero_points[0],
262 inout_shape, input2_values, input2_quantized, scales[1], zero_points[1],
263 inout_shape, golden_values, golden_quantized, scales[2], zero_points[2],
264 kTfLiteActNone, output);
265 }
266
TF_LITE_MICRO_TEST(QuantizedAddActivationRelu1Uint8)267 TF_LITE_MICRO_TEST(QuantizedAddActivationRelu1Uint8) {
268 const float scales[] = {0.25, 0.5, 1.0};
269 const int zero_points[] = {125, 129, 135};
270 const int output_dims_count = 4;
271 const int inout_shape[] = {4, 1, 2, 2, 1};
272 const float input1_values[] = {-2.01, -1.01, -0.01, 0.98};
273 const float input2_values[] = {1.01, 1.99, 2.99, 4.02};
274 const float golden_values[] = {-1, 1, 1, 1};
275
276 uint8_t input1_quantized[output_dims_count];
277 uint8_t input2_quantized[output_dims_count];
278 uint8_t golden_quantized[output_dims_count];
279 uint8_t output[output_dims_count];
280
281 tflite::testing::TestAddQuantized(
282 inout_shape, input1_values, input1_quantized, scales[0], zero_points[0],
283 inout_shape, input2_values, input2_quantized, scales[1], zero_points[1],
284 inout_shape, golden_values, golden_quantized, scales[2], zero_points[2],
285 kTfLiteActReluN1To1, output);
286 }
287
TF_LITE_MICRO_TEST(QuantizedAddActivationRelu1Int8)288 TF_LITE_MICRO_TEST(QuantizedAddActivationRelu1Int8) {
289 const float scales[] = {0.25, 0.5, 1.0};
290 const int zero_points[] = {-10, 4, 13};
291 const int output_dims_count = 4;
292 const int inout_shape[] = {4, 1, 2, 2, 1};
293 const float input1_values[] = {-2.01, -1.01, -0.01, 0.98};
294 const float input2_values[] = {1.01, 1.99, 2.99, 4.02};
295 const float golden_values[] = {-1, 1, 1, 1};
296
297 int8_t input1_quantized[output_dims_count];
298 int8_t input2_quantized[output_dims_count];
299 int8_t golden_quantized[output_dims_count];
300 int8_t output[output_dims_count];
301
302 tflite::testing::TestAddQuantized(
303 inout_shape, input1_values, input1_quantized, scales[0], zero_points[0],
304 inout_shape, input2_values, input2_quantized, scales[1], zero_points[1],
305 inout_shape, golden_values, golden_quantized, scales[2], zero_points[2],
306 kTfLiteActReluN1To1, output);
307 }
308
TF_LITE_MICRO_TEST(QuantizedAddVariousInputShapesUint8)309 TF_LITE_MICRO_TEST(QuantizedAddVariousInputShapesUint8) {
310 const float scales[] = {0.1, 0.05, 0.1};
311 const int zero_points[] = {120, 130, 139};
312 const int output_dims_count = 6;
313
314 constexpr int num_shapes = 4;
315 constexpr int max_shape_size = 5;
316 const int test_shapes[num_shapes][max_shape_size] = {
317 {1, 6},
318 {2, 2, 3},
319 {3, 2, 1, 3},
320 {4, 1, 3, 1, 2},
321 };
322
323 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
324 const float input2_values[] = {0.1, 0.2, 0.3, 0.5, 1.1, 0.1};
325 const float golden_values[] = {-1.9, 0.4, 1.0, 1.3, 2.2, 2.1};
326
327 uint8_t input1_quantized[output_dims_count];
328 uint8_t input2_quantized[output_dims_count];
329 uint8_t golden_quantized[output_dims_count];
330 uint8_t output[output_dims_count];
331
332 for (int i = 0; i < num_shapes; i++) {
333 tflite::testing::TestAddQuantized(
334 test_shapes[i], input1_values, input1_quantized, scales[0],
335 zero_points[0], test_shapes[i], input2_values, input2_quantized,
336 scales[1], zero_points[1], test_shapes[i], golden_values,
337 golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output);
338 }
339 }
340
TF_LITE_MICRO_TEST(QuantizedAddVariousInputShapesInt8)341 TF_LITE_MICRO_TEST(QuantizedAddVariousInputShapesInt8) {
342 const float scales[] = {0.1, 0.05, 0.1};
343 const int zero_points[] = {-9, 5, 14};
344 const int output_dims_count = 6;
345
346 constexpr int num_shapes = 4;
347 constexpr int max_shape_size = 5;
348 const int test_shapes[num_shapes][max_shape_size] = {
349 {1, 6},
350 {2, 2, 3},
351 {3, 2, 1, 3},
352 {4, 1, 3, 1, 2},
353 };
354
355 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
356 const float input2_values[] = {0.1, 0.2, 0.3, 0.5, 1.1, 0.1};
357 const float golden_values[] = {-1.9, 0.4, 1.0, 1.3, 2.2, 2.1};
358
359 int8_t input1_quantized[output_dims_count];
360 int8_t input2_quantized[output_dims_count];
361 int8_t golden_quantized[output_dims_count];
362 int8_t output[output_dims_count];
363
364 for (int i = 0; i < num_shapes; i++) {
365 tflite::testing::TestAddQuantized(
366 test_shapes[i], input1_values, input1_quantized, scales[0],
367 zero_points[0], test_shapes[i], input2_values, input2_quantized,
368 scales[1], zero_points[1], test_shapes[i], golden_values,
369 golden_quantized, scales[2], zero_points[2], kTfLiteActNone, output);
370 }
371 }
372
TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastUint8)373 TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastUint8) {
374 const int output_dims_count = 6;
375
376 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
377 const int input2_shape[] = {0};
378 const float input2_values[] = {0.1};
379 const float golden[] = {-1.9, 0.3, 0.8, 0.9, 1.2, 2.1};
380
381 constexpr int num_shapes = 4;
382 constexpr int max_shape_size = 5;
383 const int test_shapes[num_shapes][max_shape_size] = {
384 {1, 6},
385 {2, 2, 3},
386 {3, 2, 1, 3},
387 {4, 1, 3, 1, 2},
388 };
389
390 const float scales[] = {0.1, 0.1, 0.1};
391 const int zero_points[] = {120, 131, 139};
392
393 uint8_t input1_quantized[output_dims_count];
394 uint8_t input2_quantized[output_dims_count];
395 uint8_t golden_quantized[output_dims_count];
396 uint8_t output[output_dims_count];
397
398 for (int i = 0; i < num_shapes; ++i) {
399 tflite::testing::TestAddQuantized(
400 test_shapes[i], input1_values, input1_quantized, scales[0],
401 zero_points[0], input2_shape, input2_values, input2_quantized,
402 scales[1], zero_points[1], test_shapes[i], golden, golden_quantized,
403 scales[2], zero_points[2], kTfLiteActNone, output);
404 }
405 }
TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastFloat)406 TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastFloat) {
407 float output_float[tflite::testing::broadcast_output_dims_count];
408
409 for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) {
410 tflite::testing::TestAddFloat(tflite::testing::broadcast_input1_shape,
411 tflite::testing::broadcast_input1_values,
412 tflite::testing::broadcast_input2_shapes[i],
413 tflite::testing::broadcast_input2_values,
414 tflite::testing::broadcast_output_shapes[i],
415 tflite::testing::broadcast_goldens[i],
416 kTfLiteActNone, output_float);
417 }
418 }
419
TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastInt8)420 TF_LITE_MICRO_TEST(QuantizedAddWithScalarBroadcastInt8) {
421 const int output_dims_count = 6;
422
423 const float input1_values[] = {-2.0, 0.2, 0.7, 0.8, 1.1, 2.0};
424 const int input2_shape[] = {0};
425 const float input2_values[] = {0.1};
426 const float golden[] = {-1.9, 0.3, 0.8, 0.9, 1.2, 2.1};
427
428 constexpr int num_shapes = 4;
429 constexpr int max_shape_size = 5;
430 const int test_shapes[num_shapes][max_shape_size] = {
431 {1, 6},
432 {2, 2, 3},
433 {3, 2, 1, 3},
434 {4, 1, 3, 1, 2},
435 };
436
437 const float scales[] = {0.1, 0.05, 0.05};
438 const int zero_points[] = {-8, 4, 12};
439
440 int8_t input1_quantized[output_dims_count];
441 int8_t input2_quantized[output_dims_count];
442 int8_t golden_quantized[output_dims_count];
443 int8_t output[output_dims_count];
444
445 for (int i = 0; i < num_shapes; ++i) {
446 tflite::testing::TestAddQuantized(
447 test_shapes[i], input1_values, input1_quantized, scales[0],
448 zero_points[0], input2_shape, input2_values, input2_quantized,
449 scales[1], zero_points[1], test_shapes[i], golden, golden_quantized,
450 scales[2], zero_points[2], kTfLiteActNone, output);
451 }
452 }
453
TF_LITE_MICRO_TEST(QuantizedAddWithMixedBroadcastUint8)454 TF_LITE_MICRO_TEST(QuantizedAddWithMixedBroadcastUint8) {
455 const float scales[] = {0.1, 0.05, 0.1};
456 const int zero_points[] = {127, 131, 139};
457 uint8_t input1_quantized[tflite::testing::broadcast_output_dims_count];
458 uint8_t input2_quantized[tflite::testing::broadcast_output_dims_count];
459 uint8_t golden_quantized[tflite::testing::broadcast_output_dims_count];
460 uint8_t output[tflite::testing::broadcast_output_dims_count];
461
462 for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) {
463 tflite::testing::TestAddQuantized(
464 tflite::testing::broadcast_input1_shape,
465 tflite::testing::broadcast_input1_values, input1_quantized, scales[0],
466 zero_points[0], tflite::testing::broadcast_input2_shapes[i],
467 tflite::testing::broadcast_input2_values, input2_quantized, scales[1],
468 zero_points[1], tflite::testing::broadcast_output_shapes[i],
469 tflite::testing::broadcast_goldens[i], golden_quantized, scales[2],
470 zero_points[2], kTfLiteActNone, output);
471 }
472 }
473
TF_LITE_MICRO_TEST(QuantizedAddWithMixedBroadcastInt8)474 TF_LITE_MICRO_TEST(QuantizedAddWithMixedBroadcastInt8) {
475 const float scales[] = {0.1, 0.05, 0.1};
476 const int zero_points[] = {-10, -5, 7};
477 int8_t input1_quantized[tflite::testing::broadcast_output_dims_count];
478 int8_t input2_quantized[tflite::testing::broadcast_output_dims_count];
479 int8_t golden_quantized[tflite::testing::broadcast_output_dims_count];
480 int8_t output[tflite::testing::broadcast_output_dims_count];
481
482 for (int i = 0; i < tflite::testing::broadcast_num_shapes; ++i) {
483 tflite::testing::TestAddQuantized(
484 tflite::testing::broadcast_input1_shape,
485 tflite::testing::broadcast_input1_values, input1_quantized, scales[0],
486 zero_points[0], tflite::testing::broadcast_input2_shapes[i],
487 tflite::testing::broadcast_input2_values, input2_quantized, scales[1],
488 zero_points[1], tflite::testing::broadcast_output_shapes[i],
489 tflite::testing::broadcast_goldens[i], golden_quantized, scales[2],
490 zero_points[2], kTfLiteActNone, output);
491 }
492 }
493
494 TF_LITE_MICRO_TESTS_END
495