• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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