• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright 2021 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 #include <functional>
18 #include <memory>
19 #include <random>
20 
21 #include <gtest/gtest.h>
22 #include "tensorflow/lite/delegates/xnnpack/quantized_reduce_tester.h"
23 #include "tensorflow/lite/delegates/xnnpack/xnnpack_delegate.h"
24 
25 namespace tflite {
26 namespace xnnpack {
27 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceBatchSqueezeDims)28 TEST(UnsignedQuantizedMean, DISABLED_4DReduceBatchSqueezeDims) {
29   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
30       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
31                        TfLiteXNNPackDelegateDelete);
32 
33   std::random_device random_device;
34   auto rng = std::mt19937(random_device());
35   auto shape_rng =
36       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
37   const auto batch = shape_rng();
38   const auto height = shape_rng();
39   const auto width = shape_rng();
40   const auto channels = shape_rng();
41 
42   QuantizedReduceTester()
43       .Unsigned(true)
44       .InputShape({batch, height, width, channels})
45       .Axes({0})
46       .KeepDims(false)
47       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
48 }
49 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceBatchKeepDims)50 TEST(UnsignedQuantizedMean, DISABLED_4DReduceBatchKeepDims) {
51   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
52       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
53                        TfLiteXNNPackDelegateDelete);
54 
55   std::random_device random_device;
56   auto rng = std::mt19937(random_device());
57   auto shape_rng =
58       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
59   const auto batch = shape_rng();
60   const auto height = shape_rng();
61   const auto width = shape_rng();
62   const auto channels = shape_rng();
63 
64   QuantizedReduceTester()
65       .Unsigned(true)
66       .InputShape({batch, height, width, channels})
67       .Axes({0})
68       .KeepDims(true)
69       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
70 }
71 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceHeightSqueezeDims)72 TEST(UnsignedQuantizedMean, DISABLED_4DReduceHeightSqueezeDims) {
73   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
74       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
75                        TfLiteXNNPackDelegateDelete);
76 
77   std::random_device random_device;
78   auto rng = std::mt19937(random_device());
79   auto shape_rng =
80       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
81   const auto batch = shape_rng();
82   const auto height = shape_rng();
83   const auto width = shape_rng();
84   const auto channels = shape_rng();
85 
86   QuantizedReduceTester()
87       .Unsigned(true)
88       .InputShape({batch, height, width, channels})
89       .Axes({1})
90       .KeepDims(false)
91       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
92 }
93 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceHeightKeepDims)94 TEST(UnsignedQuantizedMean, DISABLED_4DReduceHeightKeepDims) {
95   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
96       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
97                        TfLiteXNNPackDelegateDelete);
98 
99   std::random_device random_device;
100   auto rng = std::mt19937(random_device());
101   auto shape_rng =
102       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
103   const auto batch = shape_rng();
104   const auto height = shape_rng();
105   const auto width = shape_rng();
106   const auto channels = shape_rng();
107 
108   QuantizedReduceTester()
109       .Unsigned(true)
110       .InputShape({batch, height, width, channels})
111       .Axes({1})
112       .KeepDims(true)
113       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
114 }
115 
116 TEST(UnsignedQuantizedMean, 4DReduceWidthSqueezeDims) {
117   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
118       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
119                        TfLiteXNNPackDelegateDelete);
120 
121   std::random_device random_device;
122   auto rng = std::mt19937(random_device());
123   auto shape_rng =
124       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
125   const auto batch = shape_rng();
126   const auto height = shape_rng();
127   const auto width = shape_rng();
128   const auto channels = shape_rng();
129 
130   QuantizedReduceTester()
131       .Unsigned(true)
132       .InputShape({batch, height, width, channels})
133       .Axes({2})
134       .KeepDims(false)
135       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
136 }
137 
138 TEST(UnsignedQuantizedMean, 4DReduceWidthKeepDims) {
139   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
140       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
141                        TfLiteXNNPackDelegateDelete);
142 
143   std::random_device random_device;
144   auto rng = std::mt19937(random_device());
145   auto shape_rng =
146       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
147   const auto batch = shape_rng();
148   const auto height = shape_rng();
149   const auto width = shape_rng();
150   const auto channels = shape_rng();
151 
152   QuantizedReduceTester()
153       .Unsigned(true)
154       .InputShape({batch, height, width, channels})
155       .Axes({2})
156       .KeepDims(true)
157       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
158 }
159 
160 TEST(UnsignedQuantizedMean, 4DReduceHeightWidthSqueezeDims) {
161   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
162       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
163                        TfLiteXNNPackDelegateDelete);
164 
165   std::random_device random_device;
166   auto rng = std::mt19937(random_device());
167   auto shape_rng =
168       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
169   const auto batch = shape_rng();
170   const auto height = shape_rng();
171   const auto width = shape_rng();
172   const auto channels = shape_rng();
173 
174   QuantizedReduceTester()
175       .Unsigned(true)
176       .InputShape({batch, height, width, channels})
177       .Axes({1, 2})
178       .KeepDims(false)
179       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
180 
181   QuantizedReduceTester()
182       .Unsigned(true)
183       .InputShape({batch, height, width, channels})
184       .Axes({2, 1})
185       .KeepDims(false)
186       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
187 }
188 
189 TEST(UnsignedQuantizedMean, 4DReduceHeightWidthKeepDims) {
190   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
191       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
192                        TfLiteXNNPackDelegateDelete);
193 
194   std::random_device random_device;
195   auto rng = std::mt19937(random_device());
196   auto shape_rng =
197       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
198   const auto batch = shape_rng();
199   const auto height = shape_rng();
200   const auto width = shape_rng();
201   const auto channels = shape_rng();
202 
203   QuantizedReduceTester()
204       .Unsigned(true)
205       .InputShape({batch, height, width, channels})
206       .Axes({1, 2})
207       .KeepDims(true)
208       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
209 
210   QuantizedReduceTester()
211       .Unsigned(true)
212       .InputShape({batch, height, width, channels})
213       .Axes({2, 1})
214       .KeepDims(true)
215       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
216 }
217 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceChannelsSqueezeDims)218 TEST(UnsignedQuantizedMean, DISABLED_4DReduceChannelsSqueezeDims) {
219   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
220       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
221                        TfLiteXNNPackDelegateDelete);
222 
223   std::random_device random_device;
224   auto rng = std::mt19937(random_device());
225   auto shape_rng =
226       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
227   const auto batch = shape_rng();
228   const auto height = shape_rng();
229   const auto width = shape_rng();
230   const auto channels = shape_rng();
231 
232   QuantizedReduceTester()
233       .Unsigned(true)
234       .InputShape({batch, height, width, channels})
235       .Axes({3})
236       .KeepDims(false)
237       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
238 }
239 
TEST(UnsignedQuantizedMean,DISABLED_4DReduceChannelsKeepDims)240 TEST(UnsignedQuantizedMean, DISABLED_4DReduceChannelsKeepDims) {
241   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
242       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
243                        TfLiteXNNPackDelegateDelete);
244 
245   std::random_device random_device;
246   auto rng = std::mt19937(random_device());
247   auto shape_rng =
248       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
249   const auto batch = shape_rng();
250   const auto height = shape_rng();
251   const auto width = shape_rng();
252   const auto channels = shape_rng();
253 
254   QuantizedReduceTester()
255       .Unsigned(true)
256       .InputShape({batch, height, width, channels})
257       .Axes({3})
258       .KeepDims(true)
259       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
260 }
261 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceBatchSqueezeDims)262 TEST(UnsignedQuantizedMean, DISABLED_3DReduceBatchSqueezeDims) {
263   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
264       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
265                        TfLiteXNNPackDelegateDelete);
266 
267   std::random_device random_device;
268   auto rng = std::mt19937(random_device());
269   auto shape_rng =
270       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
271   const auto batch = shape_rng();
272   const auto width = shape_rng();
273   const auto channels = shape_rng();
274 
275   QuantizedReduceTester()
276       .Unsigned(true)
277       .InputShape({batch, width, channels})
278       .Axes({0})
279       .KeepDims(false)
280       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
281 }
282 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceBatchKeepDims)283 TEST(UnsignedQuantizedMean, DISABLED_3DReduceBatchKeepDims) {
284   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
285       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
286                        TfLiteXNNPackDelegateDelete);
287 
288   std::random_device random_device;
289   auto rng = std::mt19937(random_device());
290   auto shape_rng =
291       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
292   const auto batch = shape_rng();
293   const auto width = shape_rng();
294   const auto channels = shape_rng();
295 
296   QuantizedReduceTester()
297       .Unsigned(true)
298       .InputShape({batch, width, channels})
299       .Axes({0})
300       .KeepDims(true)
301       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
302 }
303 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceWidthSqueezeDims)304 TEST(UnsignedQuantizedMean, DISABLED_3DReduceWidthSqueezeDims) {
305   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
306       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
307                        TfLiteXNNPackDelegateDelete);
308 
309   std::random_device random_device;
310   auto rng = std::mt19937(random_device());
311   auto shape_rng =
312       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
313   const auto batch = shape_rng();
314   const auto width = shape_rng();
315   const auto channels = shape_rng();
316 
317   QuantizedReduceTester()
318       .Unsigned(true)
319       .InputShape({batch, width, channels})
320       .Axes({1})
321       .KeepDims(false)
322       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
323 }
324 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceWidthKeepDims)325 TEST(UnsignedQuantizedMean, DISABLED_3DReduceWidthKeepDims) {
326   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
327       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
328                        TfLiteXNNPackDelegateDelete);
329 
330   std::random_device random_device;
331   auto rng = std::mt19937(random_device());
332   auto shape_rng =
333       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
334   const auto batch = shape_rng();
335   const auto width = shape_rng();
336   const auto channels = shape_rng();
337 
338   QuantizedReduceTester()
339       .Unsigned(true)
340       .InputShape({batch, width, channels})
341       .Axes({1})
342       .KeepDims(true)
343       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
344 }
345 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceChannelsSqueezeDims)346 TEST(UnsignedQuantizedMean, DISABLED_3DReduceChannelsSqueezeDims) {
347   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
348       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
349                        TfLiteXNNPackDelegateDelete);
350 
351   std::random_device random_device;
352   auto rng = std::mt19937(random_device());
353   auto shape_rng =
354       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
355   const auto batch = shape_rng();
356   const auto width = shape_rng();
357   const auto channels = shape_rng();
358 
359   QuantizedReduceTester()
360       .Unsigned(true)
361       .InputShape({batch, width, channels})
362       .Axes({2})
363       .KeepDims(false)
364       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
365 }
366 
TEST(UnsignedQuantizedMean,DISABLED_3DReduceChannelsKeepDims)367 TEST(UnsignedQuantizedMean, DISABLED_3DReduceChannelsKeepDims) {
368   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
369       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
370                        TfLiteXNNPackDelegateDelete);
371 
372   std::random_device random_device;
373   auto rng = std::mt19937(random_device());
374   auto shape_rng =
375       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
376   const auto batch = shape_rng();
377   const auto width = shape_rng();
378   const auto channels = shape_rng();
379 
380   QuantizedReduceTester()
381       .Unsigned(true)
382       .InputShape({batch, width, channels})
383       .Axes({2})
384       .KeepDims(true)
385       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
386 }
387 
TEST(UnsignedQuantizedMean,DISABLED_2DReduceBatchSqueezeDims)388 TEST(UnsignedQuantizedMean, DISABLED_2DReduceBatchSqueezeDims) {
389   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
390       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
391                        TfLiteXNNPackDelegateDelete);
392 
393   std::random_device random_device;
394   auto rng = std::mt19937(random_device());
395   auto shape_rng =
396       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
397   const auto batch = shape_rng();
398   const auto channels = shape_rng();
399 
400   QuantizedReduceTester()
401       .Unsigned(true)
402       .InputShape({batch, channels})
403       .Axes({0})
404       .KeepDims(false)
405       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
406 }
407 
TEST(UnsignedQuantizedMean,DISABLED_2DReduceBatchKeepDims)408 TEST(UnsignedQuantizedMean, DISABLED_2DReduceBatchKeepDims) {
409   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
410       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
411                        TfLiteXNNPackDelegateDelete);
412 
413   std::random_device random_device;
414   auto rng = std::mt19937(random_device());
415   auto shape_rng =
416       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
417   const auto batch = shape_rng();
418   const auto channels = shape_rng();
419 
420   QuantizedReduceTester()
421       .Unsigned(true)
422       .InputShape({batch, channels})
423       .Axes({0})
424       .KeepDims(true)
425       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
426 }
427 
TEST(UnsignedQuantizedMean,DISABLED_2DReduceChannelsSqueezeDims)428 TEST(UnsignedQuantizedMean, DISABLED_2DReduceChannelsSqueezeDims) {
429   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
430       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
431                        TfLiteXNNPackDelegateDelete);
432 
433   std::random_device random_device;
434   auto rng = std::mt19937(random_device());
435   auto shape_rng =
436       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
437   const auto batch = shape_rng();
438   const auto channels = shape_rng();
439 
440   QuantizedReduceTester()
441       .Unsigned(true)
442       .InputShape({batch, channels})
443       .Axes({1})
444       .KeepDims(false)
445       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
446 }
447 
TEST(UnsignedQuantizedMean,DISABLED_2DReduceChannelsKeepDims)448 TEST(UnsignedQuantizedMean, DISABLED_2DReduceChannelsKeepDims) {
449   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
450       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
451                        TfLiteXNNPackDelegateDelete);
452 
453   std::random_device random_device;
454   auto rng = std::mt19937(random_device());
455   auto shape_rng =
456       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
457   const auto batch = shape_rng();
458   const auto channels = shape_rng();
459 
460   QuantizedReduceTester()
461       .Unsigned(true)
462       .InputShape({batch, channels})
463       .Axes({1})
464       .KeepDims(true)
465       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
466 }
467 
TEST(UnsignedQuantizedMean,DISABLED_1DSqueezeDims)468 TEST(UnsignedQuantizedMean, DISABLED_1DSqueezeDims) {
469   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
470       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
471                        TfLiteXNNPackDelegateDelete);
472 
473   std::random_device random_device;
474   auto rng = std::mt19937(random_device());
475   auto shape_rng =
476       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
477   const auto batch = shape_rng();
478 
479   QuantizedReduceTester().InputShape({batch}).Axes({0}).KeepDims(false).Test(
480       BuiltinOperator_MEAN, xnnpack_delegate.get());
481 }
482 
TEST(UnsignedQuantizedMean,DISABLED_1DKeepDims)483 TEST(UnsignedQuantizedMean, DISABLED_1DKeepDims) {
484   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
485       xnnpack_delegate(TfLiteXNNPackDelegateCreate(nullptr),
486                        TfLiteXNNPackDelegateDelete);
487 
488   std::random_device random_device;
489   auto rng = std::mt19937(random_device());
490   auto shape_rng =
491       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
492   const auto batch = shape_rng();
493 
494   QuantizedReduceTester()
495       .Unsigned(true)
496       .InputShape({batch})
497       .Axes({0})
498       .KeepDims(true)
499       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
500 }
501 
TEST(UnsignedQuantizedMean,MultiThreading)502 TEST(UnsignedQuantizedMean, MultiThreading) {
503   TfLiteXNNPackDelegateOptions delegate_options =
504       TfLiteXNNPackDelegateOptionsDefault();
505   delegate_options.num_threads = 2;
506   std::unique_ptr<TfLiteDelegate, decltype(&TfLiteXNNPackDelegateDelete)>
507       xnnpack_delegate(TfLiteXNNPackDelegateCreate(&delegate_options),
508                        TfLiteXNNPackDelegateDelete);
509 
510   std::random_device random_device;
511   auto rng = std::mt19937(random_device());
512   auto shape_rng =
513       std::bind(std::uniform_int_distribution<int32_t>(2, 5), std::ref(rng));
514   const auto batch = shape_rng();
515   const auto height = shape_rng();
516   const auto width = shape_rng();
517   const auto channels = shape_rng();
518 
519   QuantizedReduceTester()
520       .Unsigned(true)
521       .InputShape({batch, height, width, channels})
522       .Axes({1, 2})
523       .KeepDims(true)
524       .Test(BuiltinOperator_MEAN, xnnpack_delegate.get());
525 }
526 
527 }  // namespace xnnpack
528 }  // namespace tflite
529