From d29c1b044652b26c8a9002138c17dc4c4b52f5bc Mon Sep 17 00:00:00 2001 From: QingChuanWS <2754693100@qq.com> Date: Wed, 27 Jan 2021 00:55:04 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E5=88=A0=E9=99=A4m55=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84md=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...TFlite_Micro_Demo移植参考指南(Keil版).md | 4 +- .../TencentOS-tiny Person Detection Demo.md | 23 - .../TencentOS_tiny.uvoptx | 1179 ++ .../TencentOS_tiny.uvprojx | 49 +- .../ai/tflite_micro/ARM_CortexM55_lib/LICENSE | 203 - .../tensorflow/core/public/version.h | 139 - .../tensorflow/lite/c/builtin_op_data.h | 472 - .../tensorflow/lite/c/common.h | 936 - .../tensorflow/lite/core/api/error_reporter.h | 59 - .../lite/core/api/flatbuffer_conversions.h | 253 - .../tensorflow/lite/core/api/op_resolver.h | 48 - .../tensorflow/lite/core/api/profiler.h | 194 - .../tensorflow/lite/core/api/tensor_utils.h | 28 - .../tensorflow/lite/kernels/internal/common.h | 956 - .../lite/kernels/internal/compatibility.h | 112 - .../lite/kernels/internal/cppmath.h | 40 - .../tensorflow/lite/kernels/internal/max.h | 35 - .../tensorflow/lite/kernels/internal/min.h | 35 - .../kernels/internal/optimized/neon_check.h | 40 - .../lite/kernels/internal/quantization_util.h | 292 - .../lite/kernels/internal/reference/add.h | 454 - .../kernels/internal/reference/arg_min_max.h | 68 - .../internal/reference/binary_function.h | 84 - .../lite/kernels/internal/reference/ceil.h | 37 - .../kernels/internal/reference/comparisons.h | 334 - .../internal/reference/concatenation.h | 140 - .../lite/kernels/internal/reference/conv.h | 262 - .../internal/reference/depthwiseconv_float.h | 100 - .../internal/reference/depthwiseconv_uint8.h | 297 - .../kernels/internal/reference/dequantize.h | 78 - .../lite/kernels/internal/reference/floor.h | 39 - .../internal/reference/fully_connected.h | 320 - .../kernels/internal/reference/hard_swish.h | 166 - .../internal/reference/integer_ops/add.h | 145 - .../internal/reference/integer_ops/conv.h | 217 - .../reference/integer_ops/depthwise_conv.h | 289 - .../reference/integer_ops/fully_connected.h | 108 - .../reference/integer_ops/l2normalization.h | 65 - .../internal/reference/integer_ops/logistic.h | 99 - .../internal/reference/integer_ops/mul.h | 131 - .../internal/reference/integer_ops/pooling.h | 258 - .../internal/reference/integer_ops/tanh.h | 106 - .../internal/reference/l2normalization.h | 90 - .../kernels/internal/reference/logistic.h | 132 - .../internal/reference/maximum_minimum.h | 64 - .../lite/kernels/internal/reference/mul.h | 166 - .../lite/kernels/internal/reference/neg.h | 37 - .../lite/kernels/internal/reference/pad.h | 162 - .../lite/kernels/internal/reference/pooling.h | 297 - .../lite/kernels/internal/reference/prelu.h | 109 - .../reference/process_broadcast_shapes.h | 138 - .../kernels/internal/reference/quantize.h | 55 - .../lite/kernels/internal/reference/reduce.h | 405 - .../kernels/internal/reference/requantize.h | 67 - .../reference/resize_nearest_neighbor.h | 101 - .../lite/kernels/internal/reference/round.h | 51 - .../lite/kernels/internal/reference/softmax.h | 228 - .../internal/reference/strided_slice.h | 94 - .../lite/kernels/internal/reference/sub.h | 516 - .../lite/kernels/internal/reference/tanh.h | 129 - .../kernels/internal/strided_slice_logic.h | 204 - .../tensorflow/lite/kernels/internal/tensor.h | 147 - .../lite/kernels/internal/tensor_ctypes.h | 47 - .../tensorflow/lite/kernels/internal/types.h | 1153 -- .../tensorflow/lite/kernels/kernel_util.h | 196 - .../tensorflow/lite/kernels/op_macros.h | 83 - .../tensorflow/lite/kernels/padding.h | 80 - .../tensorflow/lite/micro/all_ops_resolver.h | 35 - .../benchmarks/keyword_scrambled_model_data.h | 22 - .../tensorflow/lite/micro/compatibility.h | 32 - .../tensorflow/lite/micro/debug_log.h | 23 - .../detection_responder.h | 34 - .../image_provider.h | 40 - .../main_functions.h | 30 - .../model_settings.h | 35 - .../person_detect_model_data.h | 27 - .../lite/micro/kernels/activation_utils.h | 57 - .../lite/micro/kernels/kernel_runner.h | 83 - .../lite/micro/kernels/kernel_util.h | 83 - .../tensorflow/lite/micro/kernels/micro_ops.h | 92 - .../lite/micro/kernels/micro_utils.h | 37 - .../tensorflow/lite/micro/memory_helpers.h | 59 - .../memory_planner/greedy_memory_planner.h | 163 - .../memory_planner/linear_memory_planner.h | 50 - .../micro/memory_planner/memory_planner.h | 71 - .../tensorflow/lite/micro/micro_allocator.h | 250 - .../lite/micro/micro_error_reporter.h | 36 - .../tensorflow/lite/micro/micro_interpreter.h | 208 - .../lite/micro/micro_mutable_op_resolver.h | 458 - .../tensorflow/lite/micro/micro_op_resolver.h | 73 - .../lite/micro/micro_optional_debug_tools.h | 30 - .../tensorflow/lite/micro/micro_profiler.h | 71 - .../tensorflow/lite/micro/micro_string.h | 33 - .../tensorflow/lite/micro/micro_time.h | 31 - .../tensorflow/lite/micro/micro_utils.h | 110 - .../lite/micro/recording_micro_allocator.h | 120 - .../lite/micro/recording_micro_interpreter.h | 65 - .../micro/recording_simple_memory_allocator.h | 64 - .../lite/micro/simple_memory_allocator.h | 99 - .../tensorflow/lite/micro/test_helpers.h | 186 - .../lite/micro/testing/micro_test.h | 241 - .../lite/micro/testing/test_conv_model.h | 23 - .../lite/micro/testing/test_utils.h | 116 - .../CMSIS/DSP/Include/arm_common_tables.h | 528 - .../CMSIS/DSP/Include/arm_helium_utils.h | 371 - .../cmsis/CMSIS/DSP/Include/arm_math.h | 8955 --------- .../cmsis/CMSIS/DSP/Include/cmsis_armclang.h | 1467 -- .../cmsis/CMSIS/DSP/Include/cmsis_compiler.h | 283 - .../cmsis/CMSIS/NN/Include/arm_nn_tables.h | 56 - .../cmsis/CMSIS/NN/Include/arm_nn_types.h | 120 - .../cmsis/CMSIS/NN/Include/arm_nnfunctions.h | 2068 -- .../CMSIS/NN/Include/arm_nnsupportfunctions.h | 905 - .../arm_nn_activations_q15.c | 97 - .../arm_nn_activations_q7.c | 90 - .../Source/ActivationFunctions/arm_relu6_s8.c | 65 - .../Source/ActivationFunctions/arm_relu_q15.c | 104 - .../Source/ActivationFunctions/arm_relu_q7.c | 109 - .../arm_elementwise_add_s8.c | 252 - .../arm_elementwise_mul_s8.c | 202 - .../arm_concatenation_s8_w.c | 65 - .../arm_concatenation_s8_x.c | 74 - .../arm_concatenation_s8_y.c | 75 - .../arm_concatenation_s8_z.c | 74 - .../arm_convolve_1_x_n_s8.c | 199 - .../arm_convolve_1x1_HWC_q7_fast_nonsquare.c | 236 - .../arm_convolve_1x1_s8_fast.c | 182 - .../arm_convolve_HWC_q15_basic.c | 207 - .../arm_convolve_HWC_q15_fast.c | 255 - .../arm_convolve_HWC_q15_fast_nonsquare.c | 265 - .../arm_convolve_HWC_q7_RGB.c | 279 - .../arm_convolve_HWC_q7_basic.c | 231 - .../arm_convolve_HWC_q7_basic_nonsquare.c | 229 - .../arm_convolve_HWC_q7_fast.c | 408 - .../arm_convolve_HWC_q7_fast_nonsquare.c | 379 - .../ConvolutionFunctions/arm_convolve_s8.c | 372 - .../arm_convolve_wrapper_s8.c | 148 - .../arm_depthwise_conv_3x3_s8.c | 213 - .../arm_depthwise_conv_s8.c | 249 - .../arm_depthwise_conv_s8_opt.c | 425 - .../arm_depthwise_conv_u8_basic_ver1.c | 294 - .../arm_depthwise_conv_wrapper_s8.c | 133 - .../arm_depthwise_separable_conv_HWC_q7.c | 418 - ...epthwise_separable_conv_HWC_q7_nonsquare.c | 413 - .../arm_nn_depthwise_conv_s8_core.c | 219 - .../arm_nn_mat_mult_kernel_q7_q15.c | 179 - .../arm_nn_mat_mult_kernel_q7_q15_reordered.c | 129 - .../arm_nn_mat_mult_kernel_s8_s16.c | 391 - .../arm_nn_mat_mult_kernel_s8_s16_reordered.c | 201 - .../ConvolutionFunctions/arm_nn_mat_mult_s8.c | 173 - .../arm_fully_connected_mat_q7_vec_q15.c | 199 - .../arm_fully_connected_mat_q7_vec_q15_opt.c | 404 - .../arm_fully_connected_q15.c | 193 - .../arm_fully_connected_q15_opt.c | 332 - .../arm_fully_connected_q7.c | 198 - .../arm_fully_connected_q7_opt.c | 484 - .../arm_fully_connected_s8.c | 97 - .../arm_nn_accumulate_q7_to_q15.c | 81 - .../Source/NNSupportFunctions/arm_nn_add_q7.c | 82 - .../arm_nn_depthwise_conv_nt_t_padded_s8.c | 169 - .../arm_nn_depthwise_conv_nt_t_s8.c | 171 - .../arm_nn_mat_mul_core_1x_s8.c | 91 - .../arm_nn_mat_mul_core_4x_s8.c | 118 - .../arm_nn_mat_mult_nt_t_s8.c | 579 - .../NNSupportFunctions/arm_nn_mult_q15.c | 145 - .../NNSupportFunctions/arm_nn_mult_q7.c | 118 - .../arm_nn_vec_mat_mult_t_s8.c | 462 - .../Source/NNSupportFunctions/arm_nntables.c | 297 - .../arm_q7_to_q15_no_shift.c | 122 - .../arm_q7_to_q15_reordered_no_shift.c | 144 - .../arm_q7_to_q15_reordered_with_offset.c | 100 - .../arm_q7_to_q15_with_offset.c | 117 - .../Source/PoolingFunctions/arm_avgpool_s8.c | 361 - .../Source/PoolingFunctions/arm_max_pool_s8.c | 235 - .../Source/PoolingFunctions/arm_pool_q7_HWC.c | 454 - .../Source/ReshapeFunctions/arm_reshape_s8.c | 58 - .../Source/SoftmaxFunctions/arm_softmax_q15.c | 119 - .../Source/SoftmaxFunctions/arm_softmax_q7.c | 108 - .../Source/SoftmaxFunctions/arm_softmax_s8.c | 257 - .../Source/SoftmaxFunctions/arm_softmax_u8.c | 101 - .../arm_softmax_with_batch_q7.c | 75 - .../tensorflow/lite/schema/schema_generated.h | 16299 ---------------- .../tensorflow/lite/string_type.h | 27 - .../tensorflow/lite/string_util.h | 109 - .../tensorflow/lite/type_to_tflitetype.h | 70 - .../tensorflow/lite/version.h | 29 - .../tensorflow_lite_micro_M55.lib | Bin 14265788 -> 0 bytes .../third_party/flatbuffers/LICENSE.txt | 202 - .../flatbuffers/include/flatbuffers/base.h | 398 - .../include/flatbuffers/flatbuffers.h | 2783 --- .../include/flatbuffers/stl_emulation.h | 307 - .../third_party/gemmlowp/LICENSE | 202 - .../gemmlowp/fixedpoint/fixedpoint.h | 900 - .../gemmlowp/fixedpoint/fixedpoint_sse.h | 384 - .../gemmlowp/internal/detect_platform.h | 166 - .../third_party/kissfft/COPYING | 11 - .../third_party/kissfft/_kiss_fft_guts.h | 164 - .../third_party/kissfft/kiss_fft.h | 131 - .../third_party/kissfft/tools/kiss_fftr.h | 46 - .../ruy/ruy/profiler/instrumentation.h | 203 - components/ai/tflite_micro/readme.md | 30 +- 200 files changed, 1225 insertions(+), 67326 deletions(-) delete mode 100644 board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS-tiny Person Detection Demo.md create mode 100644 board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvoptx delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/LICENSE delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/core/public/version.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/builtin_op_data.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/common.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/error_reporter.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/flatbuffer_conversions.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/op_resolver.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/profiler.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/tensor_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/common.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/compatibility.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/cppmath.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/max.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/min.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/optimized/neon_check.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/quantization_util.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/add.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/arg_min_max.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/binary_function.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/ceil.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/comparisons.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/concatenation.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/conv.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/dequantize.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/floor.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/fully_connected.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/hard_swish.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/add.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/l2normalization.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/logistic.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/maximum_minimum.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/mul.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/neg.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pad.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pooling.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/prelu.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/quantize.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/reduce.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/requantize.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/round.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/softmax.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/strided_slice.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/sub.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/tanh.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/strided_slice_logic.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor_ctypes.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/types.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/kernel_util.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/op_macros.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/padding.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/all_ops_resolver.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/compatibility.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/debug_log.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/detection_responder.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/image_provider.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/model_settings.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/person_detect_model_data.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/activation_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_runner.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_util.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_ops.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_helpers.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/linear_memory_planner.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/memory_planner.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_allocator.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_error_reporter.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_interpreter.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_mutable_op_resolver.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_op_resolver.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_optional_debug_tools.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_profiler.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_string.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_time.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_allocator.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_interpreter.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_simple_memory_allocator.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/simple_memory_allocator.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/test_helpers.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/micro_test.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_conv_model.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_common_tables.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_helium_utils.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_math.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_armclang.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_compiler.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_tables.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_types.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnfunctions.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu6_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_add_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_mul_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_w.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_x.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_y.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_z.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1_x_n_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_HWC_q7_fast_nonsquare.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_s8_fast.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_basic.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast_nonsquare.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_RGB.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic_nonsquare.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast_nonsquare.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_wrapper_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_3x3_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8_opt.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_u8_basic_ver1.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_wrapper_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7_nonsquare.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_depthwise_conv_s8_core.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15_reordered.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16_reordered.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15_opt.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15_opt.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7_opt.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_accumulate_q7_to_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_add_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_padded_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_1x_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_4x_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nntables.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_no_shift.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_no_shift.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_with_offset.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_with_offset.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_avgpool_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_max_pool_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_pool_q7_HWC.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ReshapeFunctions/arm_reshape_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q15.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_s8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_u8.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_with_batch_q7.c delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/schema/schema_generated.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_type.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_util.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/type_to_tflitetype.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/version.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow_lite_micro_M55.lib delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/flatbuffers/LICENSE.txt delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/flatbuffers/include/flatbuffers/base.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/flatbuffers/include/flatbuffers/flatbuffers.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/flatbuffers/include/flatbuffers/stl_emulation.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/gemmlowp/LICENSE delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/gemmlowp/fixedpoint/fixedpoint.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/gemmlowp/fixedpoint/fixedpoint_sse.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/gemmlowp/internal/detect_platform.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/kissfft/COPYING delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/kissfft/_kiss_fft_guts.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/kissfft/kiss_fft.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/kissfft/tools/kiss_fftr.h delete mode 100644 components/ai/tflite_micro/ARM_CortexM55_lib/third_party/ruy/ruy/profiler/instrumentation.h diff --git a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TFlite_Micro_Demo移植参考指南(Keil版).md b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TFlite_Micro_Demo移植参考指南(Keil版).md index 5049e6e5..1867c5af 100644 --- a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TFlite_Micro_Demo移植参考指南(Keil版).md +++ b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TFlite_Micro_Demo移植参考指南(Keil版).md @@ -191,7 +191,7 @@ void task1(void *arg) ### 1. tflite_micro组件加入到keil工程 -由于NUCLEO-L496ZG芯片中的内核为ARM Cortex M4,所以本次我们可以直接使用ARM Cortex M4版本的tensorflow_lite_micro.lib库来简化tflite_micro搭建流程。 +由于 NUCLEO-L496ZG 芯片中的内核为 ARM Cortex M4,所以本次我们可以直接使用 ARM Cortex M4 版本的tensorflow_lite_micro.lib 库来简化 tflite_micro 搭建流程。 #### 1.1 在project中加入新的文件夹tensorflow @@ -237,7 +237,7 @@ TencentOS-tiny\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow\lite\micro -其中宏`NUCLEO_STM32L496ZG`是指定Nucleo STM32L496的hlpuart1为系统printf函数的输出串口,具体定义在Nucleo STM32L496的BSP文件夹中的`mcu_init.c`中。 +其中宏`NUCLEO_STM32L496ZG`是指定 Nucleo STM32L496 的 hlpuart1 为系统 printf 函数的输出串口,具体定义在 Nucleo STM32L496 的 BSP 文件夹中的`mcu_init.c`中。 ### 2. 编写Person_Detection 任务函数 diff --git a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS-tiny Person Detection Demo.md b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS-tiny Person Detection Demo.md deleted file mode 100644 index 8c487e88..00000000 --- a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS-tiny Person Detection Demo.md +++ /dev/null @@ -1,23 +0,0 @@ -## TencentOS-tiny_Person_Detection_Demo - -### 1. 目录结构: - -- TencentOS-tiny\board\NUCLEO_STM32L496ZG\BSP\Hardware : **外设驱动代码** -- TencentOS-tiny\examples\tflitemicro_person_detection : **Demo任务函数** -- TencentOS-tiny\board\NUCLEO_STM32L496ZG\KEIL\tflitemicro_person_detection : **keil工程** -- TencentOS-tiny\components\tflite_micro\tensorflow : **tflite_micro代码** - -### 2. 完成的工作: - -- 使用STM32CubeMX,选择与TOS同版本的固件库重新生成外设初始化代码; -- TOS、摄像头和LCD工作都正常工作; -- tflite_micro 以component的形式加到工程 -- retarget.c引入工程,并通过宏进行选择 -- example中行人检测demo已经可以正常工作 - -### 3. 未完成的工作: - -- 变量名、函数名还没有按照TOS的风格完全统一 -- keil移植指南 -- tflite_micro用户指南 - diff --git a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvoptx b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvoptx new file mode 100644 index 00000000..205a4f04 --- /dev/null +++ b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvoptx @@ -0,0 +1,1179 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp;*.cc + 0 + + + + 0 + 0 + + + + TencentOS_tiny + 0x4 + ARM-ADS + + 8000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + + + + + + + + + + + BIN\UL2CM3.DLL + + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_1024 -FS08000000 -FL0100000 -FP0($$Device:STM32L496ZGTx$CMSIS\Flash\STM32L4xx_1024.FLM)) + + + + + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 1 + 1 + 0 + 2 + 10000000 + + + + + + Application/MDK-ARM + 0 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + startup_stm32l496xx.s + startup_stm32l496xx.s + 0 + 0 + + + + + Application/User + 0 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\main.c + main.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\gpio.c + gpio.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\stm32l4xx_it.c + stm32l4xx_it.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\sys.c + sys.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\usart.c + usart.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\mcu_init.c + mcu_init.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\dcmi.c + dcmi.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\dma.c + dma.c + 0 + 0 + + + 2 + 11 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\i2c.c + i2c.c + 0 + 0 + + + 2 + 12 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\spi.c + spi.c + 0 + 0 + + + 2 + 13 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\tim.c + tim.c + 0 + 0 + + + + + Drivers/STM32L4xx_HAL_Driver + 0 + 0 + 0 + 0 + + 3 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 3 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 3 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 3 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + stm32l4xx_hal_i2c.c + 0 + 0 + + + 3 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + stm32l4xx_hal_i2c_ex.c + 0 + 0 + + + 3 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 3 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 3 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + stm32l4xx_hal_flash.c + 0 + 0 + + + 3 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + stm32l4xx_hal_flash_ex.c + 0 + 0 + + + 3 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + stm32l4xx_hal_flash_ramfunc.c + 0 + 0 + + + 3 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 3 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 3 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 3 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 3 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 3 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 3 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_exti.c + stm32l4xx_hal_exti.c + 0 + 0 + + + 3 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + stm32l4xx_hal_tim.c + 0 + 0 + + + 3 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + stm32l4xx_hal_tim_ex.c + 0 + 0 + + + 3 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dcmi.c + stm32l4xx_hal_dcmi.c + 0 + 0 + + + 3 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + stm32l4xx_hal_spi.c + 0 + 0 + + + 3 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + stm32l4xx_hal_spi_ex.c + 0 + 0 + + + + + Drivers/CMSIS + 0 + 0 + 0 + 0 + + 4 + 36 + 1 + 0 + 0 + 0 + ..\..\BSP\Src\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + + + tos/arch + 0 + 0 + 0 + 0 + + 5 + 37 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + tos_cpu.c + 0 + 0 + + + 5 + 38 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c + port_c.c + 0 + 0 + + + 5 + 39 + 2 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S + port_s.S + 0 + 0 + + + + + tos/kernel + 0 + 0 + 0 + 0 + + 6 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_binary_heap.c + tos_binary_heap.c + 0 + 0 + + + 6 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_char_fifo.c + tos_char_fifo.c + 0 + 0 + + + 6 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_completion.c + tos_completion.c + 0 + 0 + + + 6 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_countdownlatch.c + tos_countdownlatch.c + 0 + 0 + + + 6 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_event.c + tos_event.c + 0 + 0 + + + 6 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_global.c + tos_global.c + 0 + 0 + + + 6 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mail_queue.c + tos_mail_queue.c + 0 + 0 + + + 6 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_message_queue.c + tos_message_queue.c + 0 + 0 + + + 6 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmblk.c + tos_mmblk.c + 0 + 0 + + + 6 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmheap.c + tos_mmheap.c + 0 + 0 + + + 6 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mutex.c + tos_mutex.c + 0 + 0 + + + 6 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_pend.c + tos_pend.c + 0 + 0 + + + 6 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_mail_queue.c + tos_priority_mail_queue.c + 0 + 0 + + + 6 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_message_queue.c + tos_priority_message_queue.c + 0 + 0 + + + 6 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_queue.c + tos_priority_queue.c + 0 + 0 + + + 6 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_ring_queue.c + tos_ring_queue.c + 0 + 0 + + + 6 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_robin.c + tos_robin.c + 0 + 0 + + + 6 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sched.c + tos_sched.c + 0 + 0 + + + 6 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sem.c + tos_sem.c + 0 + 0 + + + 6 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sys.c + tos_sys.c + 0 + 0 + + + 6 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_task.c + tos_task.c + 0 + 0 + + + 6 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_tick.c + tos_tick.c + 0 + 0 + + + 6 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_time.c + tos_time.c + 0 + 0 + + + 6 + 63 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_timer.c + tos_timer.c + 0 + 0 + + + + + tos/cmsis_os + 0 + 0 + 0 + 0 + + 7 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\osal\cmsis_os\cmsis_os.c + cmsis_os.c + 0 + 0 + + + + + hal + 0 + 0 + 0 + 0 + + 8 + 65 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\Src\delay.c + delay.c + 0 + 0 + + + 8 + 66 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\Src\lcd_2inch4.c + lcd_2inch4.c + 0 + 0 + + + 8 + 67 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\Src\lcd_config.c + lcd_config.c + 0 + 0 + + + 8 + 68 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\Src\ov2640.c + ov2640.c + 0 + 0 + + + 8 + 69 + 1 + 0 + 0 + 0 + ..\..\BSP\Hardware\Src\sccb.c + sccb.c + 0 + 0 + + + + + examples + 0 + 0 + 0 + 0 + + 9 + 70 + 1 + 0 + 0 + 0 + ..\..\..\..\examples\tflitemicro_person_detection\tflitemicro_person_detection.c + tflitemicro_person_detection.c + 0 + 0 + + + + + tensorflow + 0 + 0 + 0 + 0 + + 10 + 71 + 4 + 0 + 0 + 0 + ..\..\..\..\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow_lite_micro_M4.lib + tensorflow_lite_micro_M4.lib + 0 + 0 + + + 10 + 72 + 8 + 0 + 0 + 0 + .\tflu_person_detection\detection_responder.cc + detection_responder.cc + 0 + 0 + + + 10 + 73 + 8 + 0 + 0 + 0 + .\tflu_person_detection\image_provider.cc + image_provider.cc + 0 + 0 + + + 10 + 74 + 8 + 0 + 0 + 0 + .\tflu_person_detection\main_functions.cc + main_functions.cc + 0 + 0 + + + 10 + 75 + 8 + 0 + 0 + 0 + .\tflu_person_detection\model_settings.cc + model_settings.cc + 0 + 0 + + + 10 + 76 + 8 + 0 + 0 + 0 + .\tflu_person_detection\person_detect_model_data.cc + person_detect_model_data.cc + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvprojx b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvprojx index 21576550..a1efeae7 100644 --- a/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvprojx +++ b/board/NUCLEO_STM32L496ZG/KEIL/tflitemicro_person_detection/TencentOS_tiny.uvprojx @@ -16,8 +16,8 @@ STM32L496ZGTx STMicroelectronics - Keil.STM32L4xx_DFP.2.4.0 - http://www.keil.com/pack/ + Keil.STM32L4xx_DFP.2.5.0 + https://www.keil.com/pack/ IRAM(0x20000000-0x2004FFFF) IROM(0x8000000-0x80FFFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4") @@ -137,7 +137,7 @@ 4107 1 - STLink\ST-LINKIII-KEIL_SWO.dll + BIN\UL2CM3.DLL @@ -779,24 +779,9 @@ tensorflow - person_detect_model_data.cc - 8 - .\tflu_person_detection\person_detect_model_data.cc - - - model_settings.cc - 8 - .\tflu_person_detection\model_settings.cc - - - main_functions.cc - 8 - .\tflu_person_detection\main_functions.cc - - - image_provider.cc - 8 - .\tflu_person_detection\image_provider.cc + tensorflow_lite_micro_M4.lib + 4 + ..\..\..\..\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow_lite_micro_M4.lib detection_responder.cc @@ -804,14 +789,24 @@ .\tflu_person_detection\detection_responder.cc - retarget.c - 1 - ..\..\..\..\components\ai\tflite_micro\KEIL\retarget.c + image_provider.cc + 8 + .\tflu_person_detection\image_provider.cc - tensorflow_lite_micro_M4.lib - 4 - ..\..\..\..\components\ai\tflite_micro\ARM_CortexM4_lib\tensorflow_lite_micro_M4.lib + main_functions.cc + 8 + .\tflu_person_detection\main_functions.cc + + + model_settings.cc + 8 + .\tflu_person_detection\model_settings.cc + + + person_detect_model_data.cc + 8 + .\tflu_person_detection\person_detect_model_data.cc diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/LICENSE b/components/ai/tflite_micro/ARM_CortexM55_lib/LICENSE deleted file mode 100644 index 40f8c347..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/LICENSE +++ /dev/null @@ -1,203 +0,0 @@ -Copyright 2019 The TensorFlow Authors. All rights reserved. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/core/public/version.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/core/public/version.h deleted file mode 100644 index 431784a5..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/core/public/version.h +++ /dev/null @@ -1,139 +0,0 @@ -/* Copyright 2015 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_CORE_PUBLIC_VERSION_H_ -#define TENSORFLOW_CORE_PUBLIC_VERSION_H_ - -// TensorFlow uses semantic versioning, see http://semver.org/. - -// Also update tensorflow/tensorflow.bzl and -// tensorflow/tools/pip_package/setup.py -#define TF_MAJOR_VERSION 2 -#define TF_MINOR_VERSION 4 -#define TF_PATCH_VERSION 0 - -// TF_VERSION_SUFFIX is non-empty for pre-releases (e.g. "-alpha", "-alpha.1", -// "-beta", "-rc", "-rc.1") -#define TF_VERSION_SUFFIX "" - -#define TF_STR_HELPER(x) #x -#define TF_STR(x) TF_STR_HELPER(x) - -// e.g. "0.5.0" or "0.6.0-alpha". -#define TF_VERSION_STRING \ - (TF_STR(TF_MAJOR_VERSION) "." TF_STR(TF_MINOR_VERSION) "." TF_STR( \ - TF_PATCH_VERSION) TF_VERSION_SUFFIX) - -// GraphDef compatibility versions (the versions field in graph.proto). -// -// Each graph has producer and min_consumer versions, and each -// consumer has its own version and a min_producer. In addition, graphs can -// mark specific consumer versions as bad (to prevent bugs from executing). -// A consumer will execute a graph if the consumer's version is at least the -// graph's min_consumer, the graph's producer version is at least the consumer's -// min_producer, and the consumer version isn't specifically disallowed by the -// graph. -// -// By default, newly created graphs have producer version TF_GRAPH_DEF_VERSION -// min_consumer TF_GRAPH_DEF_MIN_CONSUMER, and no other bad consumer versions. -// -// Version history: -// -// 0. Graphs created before GraphDef versioning -// 1. First real version (2dec2015) -// 2. adjust_contrast only takes float, doesn't perform clamping (11dec2015) -// 3. Remove TileGrad, since it was equivalent to reduce_sum (30dec2015) -// 4. When support for this version is removed, we can safely make AttrValue -// parsing more strict with respect to empty list values (see -// 111635679, 7jan2016). -// 5. Graphs are wholly-validated during Session::Create() (7jan2016). -// 6. TensorFlow is scalar strict within Google (27jan2016). -// 7. Remove TopK in favor of TopKV2 (5feb2016). -// 8. Replace RandomCrop from C++ with pure Python (5feb2016). -// 9. Deprecate batch_norm_with_global_normalization (16feb2016). -// 10. Deprecate conv3d_backprop_{filter,input} (10jun2016). -// 11. Deprecate {batch}_self_adjoint_eig (3aug2016). -// 12. Graph consumers understand the node_def field of FunctionDef (22aug2016). -// 13. Deprecate multiple batch linear algebra ops (9sep2016). -// 14. Deprecate batch_matrix_* ops. (10sep2016). -// 15. Deprecate batch_fft_* ops. (14sep2016). -// 16. Deprecate tensor_array (v1) ops in favor of v2 (10nov2016). -// 17. Deprecate inv (11nov2016). -// 17. Expose reverse_v2 (10nov2016) -// 18. Add VariableV2 (30nov2016) -// 19. Deprecated ops created by models moved out of core SkipGram, NegTrain. -// (08dec2016) -// 20. Catch all version 1.0 changes to Python API generation. SplitV is now -// used for tf.split, ReverseV2 is now used by tf.reverse, ConcatV2 is -// now used by tf.concat. Graphs use flooring -// division and mod semantics. TensorArrayV3. (12dec2016) -// Also considered the version for when it is required for reduction -// ops' indices to be scalar or vector, and not higher rank. -// Some earlier graph def versions allowed this. -// 21. Dropped FunctionDef.Node support, switched to node_def introduced -// in version 12. (11jan2017) -// 22. Placeholder now can specify and enforce scalar and partial -// shapes, particularly when restoring a graph from GraphDef -// produced at version 22 or later. (04/10/2016) -// 23. Remove NonMaxSuppression in favor of NonMaxSuppressionV2. -// 24. Deprecate lookup ops (v1) ops in favor of v2 (30may2017) -// 25. Deprecate stack (v1) ops in favor of v2 (2017/6/15). -// 25. Deprecate RandomPoisson (v1) ops in favor of v2 (2017/10/25). -// 26. Add a bool 'stripped_default_attrs' to MetaInfoDef indicating -// whether default-valued attrs have been stripped from the nodes in the -// GraphDef. (7dec2017) -// 27. Deprecate TensorArray ops v2 in favor of v3 and deprecated io_ops -// deprecated in favor of V2 ops. (2018/01/23) -// 28. Deprecate MatrixExponential op in favor of Python implementation. -// (2018/08/21). -// (2019/02/15). Added `control_ret` field to FunctionDef proto, and -// `control_output` field to OpDef proto. -// 29. Deprecate StatefulStandardNormal op in favor of StatefulStandardNormalV2. -// (2019/03/25). -// (2019/04/17). Added `arg_attr` field to FunctionDefProto. -// 30. (2019/05/09) First date based GraphDef version. GraphDef -// versions advance by 1 each day after this point. - -#define TF_GRAPH_DEF_VERSION_MIN_PRODUCER 0 -#define TF_GRAPH_DEF_VERSION_MIN_CONSUMER 0 -#define TF_GRAPH_DEF_VERSION 485 // Updated: 2020/8/6 - -// Checkpoint compatibility versions (the versions field in SavedSliceMeta). -// -// The checkpoint versions have the same semantics as GraphDef versions, but the -// numbering scheme is separate. We have no plans to ever deprecate checkpoint -// versions, but it's good to have this in place in case we ever need to. -// -// Version history: -// -// 0. Checkpoints saved before checkpoint versioning. -// 1. First real version (10feb2015). -#define TF_CHECKPOINT_VERSION_MIN_PRODUCER 0 -#define TF_CHECKPOINT_VERSION_MIN_CONSUMER 0 -#define TF_CHECKPOINT_VERSION 1 - -/// Version query functions (defined in generated version_info.cc) - -// Host compiler version (declared elsewhere to be __VERSION__) -extern const char* tf_compiler_version(); -// The git commit designator when tensorflow was built -// If no git repository, this will be "internal". -extern const char* tf_git_version(); -// Value of the _GLIBCXX_USE_CXX11_ABI flag, or 0 if it's not set. -extern int tf_cxx11_abi_flag(); -// Returns 1 if build is monolithic, or 0 otherwise. -extern int tf_monolithic_build(); - -#endif // TENSORFLOW_CORE_PUBLIC_VERSION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/builtin_op_data.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/builtin_op_data.h deleted file mode 100644 index e205f075..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/builtin_op_data.h +++ /dev/null @@ -1,472 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ -#define TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ - -#include - -#include "tensorflow/lite/c/common.h" - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -// TfLiteReshapeParams can't have dynamic data so we fix the maximum possible -// number of dimensions. -#define TFLITE_RESHAPE_PARAMS_MAX_DIMENSION_COUNT 8 - -// TODO(aselle): Consider using "if this then that" for testing. - -// Useful placeholder to put in otherwise empty structs to avoid size warnings. -typedef struct { - char dummy; -} EmptyStructPlaceholder; - -// IMPORTANT: All new members of structs must be added at the end to ensure -// backwards compatibility. - -// Possible padding types (for convolutions) -typedef enum { - kTfLitePaddingUnknown = 0, - kTfLitePaddingSame, - kTfLitePaddingValid, -} TfLitePadding; - -typedef enum { - kTfLiteMirrorPaddingUnknown = 0, - kTfLiteMirrorPaddingReflect, - kTfLiteMirrorPaddingSymmetric, -} TfLiteMirrorPaddingMode; - -// TODO(b/130259536): We should move this out of builtin_op_data. -typedef struct { - int width; - int height; - int width_offset; - int height_offset; -} TfLitePaddingValues; - -typedef struct { - TfLiteMirrorPaddingMode mode; -} TfLiteMirrorPaddingParams; - -// Possible fused activation functions. -// TODO(aselle): rename to TfLiteActivation -typedef enum { - kTfLiteActNone = 0, - kTfLiteActRelu, - kTfLiteActReluN1To1, // min(max(-1, x), 1) - kTfLiteActRelu1 = kTfLiteActReluN1To1, // kTfLiteActRelu1 will be deprecated. - kTfLiteActRelu6, // min(max(0, x), 6) - kTfLiteActTanh, - kTfLiteActSignBit, - kTfLiteActSigmoid, -} TfLiteFusedActivation; - -typedef struct { - // Parameters for CONV_2D version 1. - TfLitePadding padding; - int stride_width; - int stride_height; - TfLiteFusedActivation activation; - - // Parameters for CONV_2D version 2. - // Note: Version 2 supports dilation values not equal to 1. - int dilation_width_factor; - int dilation_height_factor; -} TfLiteConvParams; - -typedef struct { - TfLitePadding padding; - int stride_width; - int stride_height; - int filter_width; - int filter_height; - TfLiteFusedActivation activation; - struct { - TfLitePaddingValues padding; - } computed; -} TfLitePoolParams; - -typedef struct { - // Parameters for DepthwiseConv version 1 or above. - TfLitePadding padding; - int stride_width; - int stride_height; - // `depth_multiplier` is redundant. It's used by CPU kernels in - // TensorFlow 2.0 or below, but ignored in versions above. - // - // The information can be deduced from the shape of input and the shape of - // weights. Since the TFLiteConverter toolchain doesn't support partially - // specified shapes, relying on `depth_multiplier` stops us from supporting - // graphs with dynamic shape tensors. - // - // Note: Some of the delegates (e.g. NNAPI, GPU) are still relying on this - // field. - int depth_multiplier; - TfLiteFusedActivation activation; - // Parameters for DepthwiseConv version 2 or above. - int dilation_width_factor; - int dilation_height_factor; -} TfLiteDepthwiseConvParams; - -typedef struct { - int rank; - TfLiteFusedActivation activation; - - // Parameter for SVDF version 4. - bool asymmetric_quantize_inputs; -} TfLiteSVDFParams; - -typedef struct { - TfLiteFusedActivation activation; - - // Parameter for RNN version 3. - bool asymmetric_quantize_inputs; -} TfLiteRNNParams; - -typedef struct { - bool time_major; - TfLiteFusedActivation activation; - - // Parameter for Sequence RNN version 3. - bool asymmetric_quantize_inputs; -} TfLiteSequenceRNNParams; - -typedef struct { - bool time_major; - TfLiteFusedActivation activation; - bool merge_outputs; - - // Parameter for Bidirectional RNN verison 3. - bool asymmetric_quantize_inputs; -} TfLiteBidirectionalSequenceRNNParams; - -typedef enum { - kTfLiteFullyConnectedWeightsFormatDefault = 0, - kTfLiteFullyConnectedWeightsFormatShuffled4x16Int8 = 1, -} TfLiteFullyConnectedWeightsFormat; - -typedef struct { - // Parameters for FullyConnected version 1 or above. - TfLiteFusedActivation activation; - - // Parameters for FullyConnected version 2 or above. - TfLiteFullyConnectedWeightsFormat weights_format; - - // Parameters for FullyConnected version 5 or above. - // If set to true, then the number of dimensions in the input and the output - // tensors are the same. Furthermore, all but the last dimension of the input - // and output shapes will be equal. - bool keep_num_dims; - - // Parameters for FullyConnected version 7 or above. - // If set to true and the weights are quantized, then non constant inputs - // are quantized at evaluation time with asymmetric quantization. - bool asymmetric_quantize_inputs; -} TfLiteFullyConnectedParams; - -typedef enum { - kTfLiteLshProjectionUnknown = 0, - kTfLiteLshProjectionSparse = 1, - kTfLiteLshProjectionDense = 2, -} TfLiteLSHProjectionType; - -typedef struct { - TfLiteLSHProjectionType type; -} TfLiteLSHProjectionParams; - -typedef struct { - float beta; -} TfLiteSoftmaxParams; - -typedef struct { - int axis; - TfLiteFusedActivation activation; -} TfLiteConcatenationParams; - -typedef struct { - TfLiteFusedActivation activation; - // Parameter added for the version 4. - bool pot_scale_int16; -} TfLiteAddParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteSpaceToBatchNDParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteBatchToSpaceNDParams; - -typedef struct { - bool adj_x; - bool adj_y; -} TfLiteBatchMatMulParams; - -typedef struct { - TfLiteFusedActivation activation; -} TfLiteMulParams; - -typedef struct { - TfLiteFusedActivation activation; - // Parameter added for the version 5. - bool pot_scale_int16; -} TfLiteSubParams; - -typedef struct { - TfLiteFusedActivation activation; -} TfLiteDivParams; - -typedef struct { - TfLiteFusedActivation activation; -} TfLiteL2NormParams; - -typedef struct { - int radius; - float bias; - float alpha; - float beta; -} TfLiteLocalResponseNormParams; - -typedef enum { - kTfLiteLSTMFullKernel = 0, - kTfLiteLSTMBasicKernel -} TfLiteLSTMKernelType; - -typedef struct { - // Parameters for LSTM version 1. - TfLiteFusedActivation activation; - float cell_clip; - float proj_clip; - - // Parameters for LSTM version 2. - // kTfLiteLSTMBasicKernel is only supported in version 2 or above. - TfLiteLSTMKernelType kernel_type; - - // Parameters for LSTM version 4. - bool asymmetric_quantize_inputs; -} TfLiteLSTMParams; - -typedef struct { - // Parameters needed for the underlying LSTM. - TfLiteFusedActivation activation; - float cell_clip; - float proj_clip; - - // If set to true then the first dimension is time, otherwise batch. - bool time_major; - - // Parameter for unidirectional sequence RNN version 3. - bool asymmetric_quantize_inputs; -} TfLiteUnidirectionalSequenceLSTMParams; - -typedef struct { - // Parameters supported by version 1: - // Parameters inherited for the LSTM kernel. - TfLiteFusedActivation activation; - float cell_clip; - float proj_clip; - - // If true, store the outputs of both directions in the first output. - bool merge_outputs; - - // Parameters supported by version 2: - // If set to true then the first dimension is time, otherwise batch. - bool time_major; - - // Parameters supported by version 4: - // If set to true, then hybrid ops use asymmetric quantization for inputs. - bool asymmetric_quantize_inputs; -} TfLiteBidirectionalSequenceLSTMParams; - -typedef struct { - bool align_corners; - // half_pixel_centers assumes pixels are of half the actual dimensions, and - // yields more accurate resizes. Corresponds to the same argument for the - // original TensorFlow op in TF2.0. - bool half_pixel_centers; -} TfLiteResizeBilinearParams; - -typedef struct { - bool align_corners; - bool half_pixel_centers; -} TfLiteResizeNearestNeighborParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLitePadParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLitePadV2Params; - -typedef struct { - // TODO(ahentz): We can't have dynamic data in this struct, at least not yet. - // For now we will fix the maximum possible number of dimensions. - int shape[TFLITE_RESHAPE_PARAMS_MAX_DIMENSION_COUNT]; - int num_dimensions; -} TfLiteReshapeParams; - -typedef struct { - int ngram_size; - int max_skip_size; - bool include_all_ngrams; -} TfLiteSkipGramParams; - -typedef struct { - int block_size; -} TfLiteSpaceToDepthParams; - -typedef struct { - int block_size; -} TfLiteDepthToSpaceParams; - -typedef struct { - TfLiteType in_data_type; - TfLiteType out_data_type; -} TfLiteCastParams; - -typedef enum { - kTfLiteCombinerTypeSum = 0, - kTfLiteCombinerTypeMean = 1, - kTfLiteCombinerTypeSqrtn = 2, -} TfLiteCombinerType; - -typedef struct { - TfLiteCombinerType combiner; -} TfLiteEmbeddingLookupSparseParams; - -typedef struct { - int axis; -} TfLiteGatherParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteTransposeParams; - -typedef struct { - bool keep_dims; -} TfLiteReducerParams; - -typedef struct { - int num_splits; -} TfLiteSplitParams; - -typedef struct { - int num_splits; -} TfLiteSplitVParams; - -typedef struct { - // TODO(ahentz): We can't have dynamic data in this struct, at least not yet. - // For now we will fix the maximum possible number of dimensions. - int squeeze_dims[8]; - int num_squeeze_dims; -} TfLiteSqueezeParams; - -typedef struct { - int begin_mask; - int end_mask; - int ellipsis_mask; - int new_axis_mask; - int shrink_axis_mask; -} TfLiteStridedSliceParams; - -typedef struct { - TfLiteType output_type; -} TfLiteArgMaxParams; - -typedef struct { - TfLiteType output_type; -} TfLiteArgMinParams; - -typedef struct { - TfLitePadding padding; - int stride_width; - int stride_height; -} TfLiteTransposeConvParams; - -typedef struct { - bool validate_indices; -} TfLiteSparseToDenseParams; - -typedef struct { - TfLiteType out_type; -} TfLiteShapeParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteRankParams; - -typedef struct { - // Parameters supported by version 1: - float min; - float max; - int num_bits; - - // Parameters supported by version 2: - bool narrow_range; -} TfLiteFakeQuantParams; - -typedef struct { - int values_count; - int axis; -} TfLitePackParams; - -typedef struct { - int axis; -} TfLiteOneHotParams; - -typedef struct { - int num; - int axis; -} TfLiteUnpackParams; - -typedef struct { - float alpha; -} TfLiteLeakyReluParams; - -typedef struct { - TfLiteType index_out_type; -} TfLiteUniqueParams; - -typedef struct { - int seq_dim; - int batch_dim; -} TfLiteReverseSequenceParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteMatrixDiagParams; - -typedef struct { - EmptyStructPlaceholder placeholder; -} TfLiteMatrixSetDiagParams; - -typedef struct { - int then_subgraph_index; - int else_subgraph_index; -} TfLiteIfParams; - -typedef struct { - int cond_subgraph_index; - int body_subgraph_index; -} TfLiteWhileParams; - -#ifdef __cplusplus -} // extern "C" -#endif // __cplusplus - -#endif // TENSORFLOW_LITE_C_BUILTIN_OP_DATA_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/common.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/common.h deleted file mode 100644 index 7ef173c7..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/c/common.h +++ /dev/null @@ -1,936 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -// This file defines common C types and APIs for implementing operations, -// delegates and other constructs in TensorFlow Lite. The actual operations and -// delegates can be defined using C++, but the interface between the interpreter -// and the operations are C. -// -// Summary of abstractions -// TF_LITE_ENSURE - Self-sufficient error checking -// TfLiteStatus - Status reporting -// TfLiteIntArray - stores tensor shapes (dims), -// TfLiteContext - allows an op to access the tensors -// TfLiteTensor - tensor (a multidimensional array) -// TfLiteNode - a single node or operation -// TfLiteRegistration - the implementation of a conceptual operation. -// TfLiteDelegate - allows delegation of nodes to alternative backends. -// -// Some abstractions in this file are created and managed by Interpreter. -// -// NOTE: The order of values in these structs are "semi-ABI stable". New values -// should be added only to the end of structs and never reordered. - -#ifndef TENSORFLOW_LITE_C_COMMON_H_ -#define TENSORFLOW_LITE_C_COMMON_H_ - -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif // __cplusplus - -typedef enum TfLiteStatus { - kTfLiteOk = 0, - kTfLiteError = 1, - kTfLiteDelegateError = 2 -} TfLiteStatus; - -// The list of external context types known to TF Lite. This list exists solely -// to avoid conflicts and to ensure ops can share the external contexts they -// need. Access to the external contexts is controlled by one of the -// corresponding support files. -typedef enum TfLiteExternalContextType { - kTfLiteEigenContext = 0, // include eigen_support.h to use. - kTfLiteGemmLowpContext = 1, // include gemm_support.h to use. - kTfLiteEdgeTpuContext = 2, // Placeholder for Edge TPU support. - kTfLiteCpuBackendContext = 3, // include cpu_backend_context.h to use. - kTfLiteMaxExternalContexts = 4 -} TfLiteExternalContextType; - -// Forward declare so dependent structs and methods can reference these types -// prior to the struct definitions. -struct TfLiteContext; -struct TfLiteDelegate; -struct TfLiteRegistration; - -// An external context is a collection of information unrelated to the TF Lite -// framework, but useful to a subset of the ops. TF Lite knows very little -// about about the actual contexts, but it keeps a list of them, and is able to -// refresh them if configurations like the number of recommended threads -// change. -typedef struct TfLiteExternalContext { - TfLiteExternalContextType type; - TfLiteStatus (*Refresh)(struct TfLiteContext* context); -} TfLiteExternalContext; - -#define kTfLiteOptionalTensor (-1) - -// Fixed size list of integers. Used for dimensions and inputs/outputs tensor -// indices -typedef struct TfLiteIntArray { - int size; -// gcc 6.1+ have a bug where flexible members aren't properly handled -// https://github.com/google/re2/commit/b94b7cd42e9f02673cd748c1ac1d16db4052514c -#if (!defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && \ - __GNUC_MINOR__ >= 1) || \ - defined(HEXAGON) - int data[0]; -#else - int data[]; -#endif -} TfLiteIntArray; - -// Given the size (number of elements) in a TfLiteIntArray, calculate its size -// in bytes. -int TfLiteIntArrayGetSizeInBytes(int size); - -#ifndef TF_LITE_STATIC_MEMORY -// Create a array of a given `size` (uninitialized entries). -// This returns a pointer, that you must free using TfLiteIntArrayFree(). -TfLiteIntArray* TfLiteIntArrayCreate(int size); -#endif - -// Check if two intarrays are equal. Returns 1 if they are equal, 0 otherwise. -int TfLiteIntArrayEqual(const TfLiteIntArray* a, const TfLiteIntArray* b); - -// Check if an intarray equals an array. Returns 1 if equals, 0 otherwise. -int TfLiteIntArrayEqualsArray(const TfLiteIntArray* a, int b_size, - const int b_data[]); - -#ifndef TF_LITE_STATIC_MEMORY -// Create a copy of an array passed as `src`. -// You are expected to free memory with TfLiteIntArrayFree -TfLiteIntArray* TfLiteIntArrayCopy(const TfLiteIntArray* src); - -// Free memory of array `a`. -void TfLiteIntArrayFree(TfLiteIntArray* a); -#endif // TF_LITE_STATIC_MEMORY - -// Fixed size list of floats. Used for per-channel quantization. -typedef struct TfLiteFloatArray { - int size; -// gcc 6.1+ have a bug where flexible members aren't properly handled -// https://github.com/google/re2/commit/b94b7cd42e9f02673cd748c1ac1d16db4052514c -// This also applies to the toolchain used for Qualcomm Hexagon DSPs. -#if !defined(__clang__) && defined(__GNUC__) && __GNUC__ == 6 && \ - __GNUC_MINOR__ >= 1 - float data[0]; -#else - float data[]; -#endif -} TfLiteFloatArray; - -// Given the size (number of elements) in a TfLiteFloatArray, calculate its size -// in bytes. -int TfLiteFloatArrayGetSizeInBytes(int size); - -#ifndef TF_LITE_STATIC_MEMORY -// Create a array of a given `size` (uninitialized entries). -// This returns a pointer, that you must free using TfLiteFloatArrayFree(). -TfLiteFloatArray* TfLiteFloatArrayCreate(int size); - -// Free memory of array `a`. -void TfLiteFloatArrayFree(TfLiteFloatArray* a); -#endif // TF_LITE_STATIC_MEMORY - -// Since we must not depend on any libraries, define a minimal subset of -// error macros while avoiding names that have pre-conceived meanings like -// assert and check. - -// Try to make all reporting calls through TF_LITE_KERNEL_LOG rather than -// calling the context->ReportError function directly, so that message strings -// can be stripped out if the binary size needs to be severely optimized. -#ifndef TF_LITE_STRIP_ERROR_STRINGS -#define TF_LITE_KERNEL_LOG(context, ...) \ - do { \ - (context)->ReportError((context), __VA_ARGS__); \ - } while (false) - -#define TF_LITE_MAYBE_KERNEL_LOG(context, ...) \ - do { \ - if ((context) != nullptr) { \ - (context)->ReportError((context), __VA_ARGS__); \ - } \ - } while (false) -#else // TF_LITE_STRIP_ERROR_STRINGS -#define TF_LITE_KERNEL_LOG(context, ...) -#define TF_LITE_MAYBE_KERNEL_LOG(context, ...) -#endif // TF_LITE_STRIP_ERROR_STRINGS - -// Check whether value is true, and if not return kTfLiteError from -// the current function (and report the error string msg). -#define TF_LITE_ENSURE_MSG(context, value, msg) \ - do { \ - if (!(value)) { \ - TF_LITE_KERNEL_LOG((context), __FILE__ " " msg); \ - return kTfLiteError; \ - } \ - } while (0) - -// Check whether the value `a` is true, and if not return kTfLiteError from -// the current function, while also reporting the location of the error. -#define TF_LITE_ENSURE(context, a) \ - do { \ - if (!(a)) { \ - TF_LITE_KERNEL_LOG((context), "%s:%d %s was not true.", __FILE__, \ - __LINE__, #a); \ - return kTfLiteError; \ - } \ - } while (0) - -#define TF_LITE_ENSURE_STATUS(a) \ - do { \ - const TfLiteStatus s = (a); \ - if (s != kTfLiteOk) { \ - return s; \ - } \ - } while (0) - -// Check whether the value `a == b` is true, and if not return kTfLiteError from -// the current function, while also reporting the location of the error. -// `a` and `b` may be evaluated more than once, so no side effects or -// extremely expensive computations should be done. -// NOTE: Use TF_LITE_ENSURE_TYPES_EQ if comparing TfLiteTypes. -#define TF_LITE_ENSURE_EQ(context, a, b) \ - do { \ - if ((a) != (b)) { \ - TF_LITE_KERNEL_LOG((context), "%s:%d %s != %s (%d != %d)", __FILE__, \ - __LINE__, #a, #b, (a), (b)); \ - return kTfLiteError; \ - } \ - } while (0) - -#define TF_LITE_ENSURE_TYPES_EQ(context, a, b) \ - do { \ - if ((a) != (b)) { \ - TF_LITE_KERNEL_LOG((context), "%s:%d %s != %s (%s != %s)", __FILE__, \ - __LINE__, #a, #b, TfLiteTypeGetName(a), \ - TfLiteTypeGetName(b)); \ - return kTfLiteError; \ - } \ - } while (0) - -#define TF_LITE_ENSURE_OK(context, status) \ - do { \ - const TfLiteStatus s = (status); \ - if ((s) != kTfLiteOk) { \ - return s; \ - } \ - } while (0) - -// Define TFL_CAPI_EXPORT macro to export a function properly with a shared -// library. -#ifdef SWIG -#define TFL_CAPI_EXPORT -#else -#if defined(_WIN32) -#ifdef TFL_COMPILE_LIBRARY -#define TFL_CAPI_EXPORT __declspec(dllexport) -#else -#define TFL_CAPI_EXPORT __declspec(dllimport) -#endif // TFL_COMPILE_LIBRARY -#else -#define TFL_CAPI_EXPORT __attribute__((visibility("default"))) -#endif // _WIN32 -#endif // SWIG - -// Single-precision complex data type compatible with the C99 definition. -typedef struct TfLiteComplex64 { - float re, im; // real and imaginary parts, respectively. -} TfLiteComplex64; - -// Double-precision complex data type compatible with the C99 definition. -typedef struct TfLiteComplex128 { - double re, im; // real and imaginary parts, respectively. -} TfLiteComplex128; - -// Half precision data type compatible with the C99 definition. -typedef struct TfLiteFloat16 { - uint16_t data; -} TfLiteFloat16; - -// Types supported by tensor -typedef enum { - kTfLiteNoType = 0, - kTfLiteFloat32 = 1, - kTfLiteInt32 = 2, - kTfLiteUInt8 = 3, - kTfLiteInt64 = 4, - kTfLiteString = 5, - kTfLiteBool = 6, - kTfLiteInt16 = 7, - kTfLiteComplex64 = 8, - kTfLiteInt8 = 9, - kTfLiteFloat16 = 10, - kTfLiteFloat64 = 11, - kTfLiteComplex128 = 12, -} TfLiteType; - -// Return the name of a given type, for error reporting purposes. -const char* TfLiteTypeGetName(TfLiteType type); - -// SupportedQuantizationTypes. -typedef enum TfLiteQuantizationType { - // No quantization. - kTfLiteNoQuantization = 0, - // Affine quantization (with support for per-channel quantization). - // Corresponds to TfLiteAffineQuantization. - kTfLiteAffineQuantization = 1, -} TfLiteQuantizationType; - -// Structure specifying the quantization used by the tensor, if-any. -typedef struct TfLiteQuantization { - // The type of quantization held by params. - TfLiteQuantizationType type; - // Holds a reference to one of the quantization param structures specified - // below. - void* params; -} TfLiteQuantization; - -// Legacy. Will be deprecated in favor of TfLiteAffineQuantization. -// If per-layer quantization is specified this field will still be populated in -// addition to TfLiteAffineQuantization. -// Parameters for asymmetric quantization. Quantized values can be converted -// back to float using: -// real_value = scale * (quantized_value - zero_point) -typedef struct TfLiteQuantizationParams { - float scale; - int32_t zero_point; -} TfLiteQuantizationParams; - -// Parameters for asymmetric quantization across a dimension (i.e per output -// channel quantization). -// quantized_dimension specifies which dimension the scales and zero_points -// correspond to. -// For a particular value in quantized_dimension, quantized values can be -// converted back to float using: -// real_value = scale * (quantized_value - zero_point) -typedef struct TfLiteAffineQuantization { - TfLiteFloatArray* scale; - TfLiteIntArray* zero_point; - int32_t quantized_dimension; -} TfLiteAffineQuantization; - -/* A union of pointers that points to memory for a given tensor. */ -typedef union TfLitePtrUnion { - /* Do not access these members directly, if possible, use - * GetTensorData(tensor) instead, otherwise only access .data, as other - * members are deprecated. */ - int32_t* i32; - int64_t* i64; - float* f; - TfLiteFloat16* f16; - double* f64; - char* raw; - const char* raw_const; - uint8_t* uint8; - bool* b; - int16_t* i16; - TfLiteComplex64* c64; - TfLiteComplex128* c128; - int8_t* int8; - /* Only use this member. */ - void* data; -} TfLitePtrUnion; - -// Memory allocation strategies. -// * kTfLiteMmapRo: Read-only memory-mapped data, or data externally allocated. -// * kTfLiteArenaRw: Arena allocated with no guarantees about persistence, -// and available during eval. -// * kTfLiteArenaRwPersistent: Arena allocated but persistent across eval, and -// only available during eval. -// * kTfLiteDynamic: Allocated during eval, or for string tensors. -// * kTfLitePersistentRo: Allocated and populated during prepare. This is -// useful for tensors that can be computed during prepare and treated -// as constant inputs for downstream ops (also in prepare). -typedef enum TfLiteAllocationType { - kTfLiteMemNone = 0, - kTfLiteMmapRo, - kTfLiteArenaRw, - kTfLiteArenaRwPersistent, - kTfLiteDynamic, - kTfLitePersistentRo, -} TfLiteAllocationType; - -// The delegates should use zero or positive integers to represent handles. -// -1 is reserved from unallocated status. -typedef int TfLiteBufferHandle; -enum { - kTfLiteNullBufferHandle = -1, -}; - -// Storage format of each dimension in a sparse tensor. -typedef enum TfLiteDimensionType { - kTfLiteDimDense = 0, - kTfLiteDimSparseCSR, -} TfLiteDimensionType; - -// Metadata to encode each dimension in a sparse tensor. -typedef struct TfLiteDimensionMetadata { - TfLiteDimensionType format; - int dense_size; - TfLiteIntArray* array_segments; - TfLiteIntArray* array_indices; -} TfLiteDimensionMetadata; - -// Parameters used to encode a sparse tensor. For detailed explanation of each -// field please refer to lite/schema/schema.fbs. -typedef struct TfLiteSparsity { - TfLiteIntArray* traversal_order; - TfLiteIntArray* block_map; - TfLiteDimensionMetadata* dim_metadata; - int dim_metadata_size; -} TfLiteSparsity; - -// An tensor in the interpreter system which is a wrapper around a buffer of -// data including a dimensionality (or NULL if not currently defined). -#ifndef TF_LITE_STATIC_MEMORY -typedef struct TfLiteTensor { - // The data type specification for data stored in `data`. This affects - // what member of `data` union should be used. - TfLiteType type; - // A union of data pointers. The appropriate type should be used for a typed - // tensor based on `type`. - TfLitePtrUnion data; - // A pointer to a structure representing the dimensionality interpretation - // that the buffer should have. NOTE: the product of elements of `dims` - // and the element datatype size should be equal to `bytes` below. - TfLiteIntArray* dims; - // Quantization information. - TfLiteQuantizationParams params; - // How memory is mapped - // kTfLiteMmapRo: Memory mapped read only. - // i.e. weights - // kTfLiteArenaRw: Arena allocated read write memory - // (i.e. temporaries, outputs). - TfLiteAllocationType allocation_type; - // The number of bytes required to store the data of this Tensor. I.e. - // (bytes of each element) * dims[0] * ... * dims[n-1]. For example, if - // type is kTfLiteFloat32 and dims = {3, 2} then - // bytes = sizeof(float) * 3 * 2 = 4 * 3 * 2 = 24. - size_t bytes; - - // An opaque pointer to a tflite::MMapAllocation - const void* allocation; - - // Null-terminated name of this tensor. - const char* name; - - // The delegate which knows how to handle `buffer_handle`. - // WARNING: This is an experimental interface that is subject to change. - struct TfLiteDelegate* delegate; - - // An integer buffer handle that can be handled by `delegate`. - // The value is valid only when delegate is not null. - // WARNING: This is an experimental interface that is subject to change. - TfLiteBufferHandle buffer_handle; - - // If the delegate uses its own buffer (e.g. GPU memory), the delegate is - // responsible to set data_is_stale to true. - // `delegate->CopyFromBufferHandle` can be called to copy the data from - // delegate buffer. - // WARNING: This is an // experimental interface that is subject to change. - bool data_is_stale; - - // True if the tensor is a variable. - bool is_variable; - - // Quantization information. Replaces params field above. - TfLiteQuantization quantization; - - // Parameters used to encode a sparse tensor. - // This is optional. The field is NULL if a tensor is dense. - // WARNING: This is an experimental interface that is subject to change. - TfLiteSparsity* sparsity; - - // Optional. Encodes shapes with unknown dimensions with -1. This field is - // only populated when unknown dimensions exist in a read-write tensor (i.e. - // an input or output tensor). (e.g. `dims` contains [1, 1, 1, 3] and - // `dims_signature` contains [1, -1, -1, 3]). - const TfLiteIntArray* dims_signature; -} TfLiteTensor; - -// A structure representing an instance of a node. -// This structure only exhibits the inputs, outputs and user defined data, not -// other features like the type. -typedef struct TfLiteNode { - // Inputs to this node expressed as indices into the simulator's tensors. - TfLiteIntArray* inputs; - - // Outputs to this node expressed as indices into the simulator's tensors. - TfLiteIntArray* outputs; - - // intermediate tensors to this node expressed as indices into the simulator's - // tensors. - TfLiteIntArray* intermediates; - - // Temporary tensors uses during the computations. This usually contains no - // tensors, but ops are allowed to change that if they need scratch space of - // any sort. - TfLiteIntArray* temporaries; - - // Opaque data provided by the node implementer through `Registration.init`. - void* user_data; - - // Opaque data provided to the node if the node is a builtin. This is usually - // a structure defined in builtin_op_data.h - void* builtin_data; - - // Custom initial data. This is the opaque data provided in the flatbuffer. - // WARNING: This is an experimental interface that is subject to change. - const void* custom_initial_data; - int custom_initial_data_size; - - // The pointer to the delegate. This is non-null only when the node is - // created by calling `interpreter.ModifyGraphWithDelegate`. - // WARNING: This is an experimental interface that is subject to change. - struct TfLiteDelegate* delegate; -} TfLiteNode; -#else // defined(TF_LITE_STATIC_MEMORY)? -// NOTE: This flag is opt-in only at compile time. -// -// Specific reduced TfLiteTensor struct for TF Micro runtime. This struct -// contains only the minimum fields required to initialize and prepare a micro -// inference graph. The fields in this struct have been ordered from -// largest-to-smallest for optimal struct sizeof. -// -// This struct does not use: -// - allocation -// - buffer_handle -// - data_is_stale -// - delegate -// - dims_signature -// - name -// - sparsity -typedef struct TfLiteTensor { - // TODO(b/155784997): Consider consolidating these quantization fields: - // Quantization information. Replaces params field above. - TfLiteQuantization quantization; - - // Quantization information. - TfLiteQuantizationParams params; - - // A union of data pointers. The appropriate type should be used for a typed - // tensor based on `type`. - TfLitePtrUnion data; - - // A pointer to a structure representing the dimensionality interpretation - // that the buffer should have. NOTE: the product of elements of `dims` - // and the element datatype size should be equal to `bytes` below. - TfLiteIntArray* dims; - - // The number of bytes required to store the data of this Tensor. I.e. - // (bytes of each element) * dims[0] * ... * dims[n-1]. For example, if - // type is kTfLiteFloat32 and dims = {3, 2} then - // bytes = sizeof(float) * 3 * 2 = 4 * 3 * 2 = 24. - size_t bytes; - - // The data type specification for data stored in `data`. This affects - // what member of `data` union should be used. - TfLiteType type; - - // How memory is mapped - // kTfLiteMmapRo: Memory mapped read only. - // i.e. weights - // kTfLiteArenaRw: Arena allocated read write memory - // (i.e. temporaries, outputs). - TfLiteAllocationType allocation_type; - - // True if the tensor is a variable. - bool is_variable; -} TfLiteTensor; - -// Specific reduced TfLiteNode struct for TF Micro runtime. This struct contains -// only the minimum fields required to represent a node. -// -// This struct does not use: -// - delegate -// - intermediates -// - temporaries -typedef struct TfLiteNode { - // Inputs to this node expressed as indices into the simulator's tensors. - TfLiteIntArray* inputs; - - // Outputs to this node expressed as indices into the simulator's tensors. - TfLiteIntArray* outputs; - - // Opaque data provided by the node implementer through `Registration.init`. - void* user_data; - - // Opaque data provided to the node if the node is a builtin. This is usually - // a structure defined in builtin_op_data.h - void* builtin_data; - - // Custom initial data. This is the opaque data provided in the flatbuffer. - // WARNING: This is an experimental interface that is subject to change. - const void* custom_initial_data; - int custom_initial_data_size; -} TfLiteNode; -#endif // TF_LITE_STATIC_MEMORY - -// Light-weight tensor struct for TF Micro runtime. Provides the minimal amount -// of information required for a kernel to run during TfLiteRegistration::Eval. -// TODO(b/160955687): Move this field into TF_LITE_STATIC_MEMORY when TFLM -// builds with this flag by default internally. -typedef struct TfLiteEvalTensor { - // A union of data pointers. The appropriate type should be used for a typed - // tensor based on `type`. - TfLitePtrUnion data; - - // A pointer to a structure representing the dimensionality interpretation - // that the buffer should have. - TfLiteIntArray* dims; - - // The data type specification for data stored in `data`. This affects - // what member of `data` union should be used. - TfLiteType type; -} TfLiteEvalTensor; - -#ifndef TF_LITE_STATIC_MEMORY -// Free data memory of tensor `t`. -void TfLiteTensorDataFree(TfLiteTensor* t); - -// Free quantization data. -void TfLiteQuantizationFree(TfLiteQuantization* quantization); - -// Free sparsity parameters. -void TfLiteSparsityFree(TfLiteSparsity* sparsity); - -// Free memory of tensor `t`. -void TfLiteTensorFree(TfLiteTensor* t); - -// Set all of a tensor's fields (and free any previously allocated data). -void TfLiteTensorReset(TfLiteType type, const char* name, TfLiteIntArray* dims, - TfLiteQuantizationParams quantization, char* buffer, - size_t size, TfLiteAllocationType allocation_type, - const void* allocation, bool is_variable, - TfLiteTensor* tensor); - -// Resize the allocated data of a (dynamic) tensor. Tensors with allocation -// types other than kTfLiteDynamic will be ignored. -void TfLiteTensorRealloc(size_t num_bytes, TfLiteTensor* tensor); -#endif // TF_LITE_STATIC_MEMORY - -// WARNING: This is an experimental interface that is subject to change. -// -// Currently, TfLiteDelegateParams has to be allocated in a way that it's -// trivially destructable. It will be stored as `builtin_data` field in -// `TfLiteNode` of the delegate node. -// -// See also the `CreateDelegateParams` function in `interpreter.cc` details. -typedef struct TfLiteDelegateParams { - struct TfLiteDelegate* delegate; - TfLiteIntArray* nodes_to_replace; - TfLiteIntArray* input_tensors; - TfLiteIntArray* output_tensors; -} TfLiteDelegateParams; - -typedef struct TfLiteContext { - // Number of tensors in the context. - size_t tensors_size; - - // The execution plan contains a list of the node indices in execution - // order. execution_plan->size is the current number of nodes. And, - // execution_plan->data[0] is the first node that needs to be run. - // TfLiteDelegates can traverse the current execution plan by iterating - // through each member of this array and using GetNodeAndRegistration() to - // access details about a node. i.e. - // TfLiteIntArray* execution_plan; - // TF_LITE_ENSURE_STATUS(context->GetExecutionPlan(context, &execution_plan)); - // for (int exec_index = 0; exec_index < execution_plan->size; exec_index++) { - // int node_index = execution_plan->data[exec_index]; - // TfLiteNode* node; - // TfLiteRegistration* reg; - // context->GetNodeAndRegistration(context, node_index, &node, ®); - // } - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*GetExecutionPlan)(struct TfLiteContext* context, - TfLiteIntArray** execution_plan); - - // An array of tensors in the interpreter context (of length `tensors_size`) - TfLiteTensor* tensors; - - // opaque full context ptr (an opaque c++ data structure) - void* impl_; - - // Request memory pointer be resized. Updates dimensions on the tensor. - // NOTE: ResizeTensor takes ownership of newSize. - TfLiteStatus (*ResizeTensor)(struct TfLiteContext*, TfLiteTensor* tensor, - TfLiteIntArray* new_size); - // Request that an error be reported with format string msg. - void (*ReportError)(struct TfLiteContext*, const char* msg, ...); - - // Add `tensors_to_add` tensors, preserving pre-existing Tensor entries. If - // non-null, the value pointed to by `first_new_tensor_index` will be set to - // the index of the first new tensor. - TfLiteStatus (*AddTensors)(struct TfLiteContext*, int tensors_to_add, - int* first_new_tensor_index); - - // Get a Tensor node by node_index. - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*GetNodeAndRegistration)( - struct TfLiteContext*, int node_index, TfLiteNode** node, - struct TfLiteRegistration** registration); - - // Replace ops with one or more stub delegate operations. This function - // does not take ownership of `nodes_to_replace`. - TfLiteStatus (*ReplaceNodeSubsetsWithDelegateKernels)( - struct TfLiteContext*, struct TfLiteRegistration registration, - const TfLiteIntArray* nodes_to_replace, struct TfLiteDelegate* delegate); - - // Number of threads that are recommended to subsystems like gemmlowp and - // eigen. - int recommended_num_threads; - - // Access external contexts by type. - // WARNING: This is an experimental interface that is subject to change. - TfLiteExternalContext* (*GetExternalContext)(struct TfLiteContext*, - TfLiteExternalContextType); - // Set the value of a external context. Does not take ownership of the - // pointer. - // WARNING: This is an experimental interface that is subject to change. - void (*SetExternalContext)(struct TfLiteContext*, TfLiteExternalContextType, - TfLiteExternalContext*); - - // Flag for allowing float16 precision for FP32 calculation. - // default: false. - // WARNING: This is an experimental API and subject to change. - bool allow_fp32_relax_to_fp16; - - // Pointer to the op-level profiler, if set; nullptr otherwise. - void* profiler; - - // Allocate persistent buffer which has the same life time as the interpreter. - // Returns nullptr on failure. - // The memory is allocated from heap for TFL, and from tail in TFLM. - // This method is only available in Init or Prepare stage. - // WARNING: This is an experimental interface that is subject to change. - void* (*AllocatePersistentBuffer)(struct TfLiteContext* ctx, size_t bytes); - - // Allocate a buffer which will be deallocated right after invoke phase. - // The memory is allocated from heap in TFL, and from volatile arena in TFLM. - // This method is only available in invoke stage. - // NOTE: If possible use RequestScratchBufferInArena method to avoid memory - // allocation during inference time. - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*AllocateBufferForEval)(struct TfLiteContext* ctx, size_t bytes, - void** ptr); - - // Request a scratch buffer in the arena through static memory planning. - // This method is only available in Prepare stage and the buffer is allocated - // by the interpreter between Prepare and Eval stage. In Eval stage, - // GetScratchBuffer API can be used to fetch the address. - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*RequestScratchBufferInArena)(struct TfLiteContext* ctx, - size_t bytes, int* buffer_idx); - - // Get the scratch buffer pointer. - // This method is only available in Eval stage. - // WARNING: This is an experimental interface that is subject to change. - void* (*GetScratchBuffer)(struct TfLiteContext* ctx, int buffer_idx); - - // Resize the memory pointer of the `tensor`. This method behaves the same as - // `ResizeTensor`, except that it makes a copy of the shape array internally - // so the shape array could be deallocated right afterwards. - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*ResizeTensorExplicit)(struct TfLiteContext* ctx, - TfLiteTensor* tensor, int dims, - const int* shape); - - // This method provides a preview of post-delegation partitioning. Each - // TfLiteDelegateParams in the referenced array corresponds to one instance of - // the delegate kernel. - // Example usage: - // - // TfLiteIntArray* nodes_to_replace = ...; - // TfLiteDelegateParams* params_array; - // int num_partitions = 0; - // TF_LITE_ENSURE_STATUS(context->PreviewDelegatePartitioning( - // context, delegate, nodes_to_replace, ¶ms_array, &num_partitions)); - // for (int idx = 0; idx < num_partitions; idx++) { - // const auto& partition_params = params_array[idx]; - // ... - // } - // - // NOTE: The context owns the memory referenced by partition_params_array. It - // will be cleared with another call to PreviewDelegateParitioning, or after - // TfLiteDelegateParams::Prepare returns. - // - // WARNING: This is an experimental interface that is subject to change. - TfLiteStatus (*PreviewDelegatePartitioning)( - struct TfLiteContext* context, const TfLiteIntArray* nodes_to_replace, - TfLiteDelegateParams** partition_params_array, int* num_partitions); - - // Returns a TfLiteTensor struct for a given index. - // WARNING: This is an experimental interface that is subject to change. - // WARNING: This method may not be available on all platforms. - TfLiteTensor* (*GetTensor)(const struct TfLiteContext* context, - int tensor_idx); - - // Returns a TfLiteEvalTensor struct for a given index. - // WARNING: This is an experimental interface that is subject to change. - // WARNING: This method may not be available on all platforms. - TfLiteEvalTensor* (*GetEvalTensor)(const struct TfLiteContext* context, - int tensor_idx); -} TfLiteContext; - -typedef struct TfLiteRegistration { - // Initializes the op from serialized data. - // If a built-in op: - // `buffer` is the op's params data (TfLiteLSTMParams*). - // `length` is zero. - // If custom op: - // `buffer` is the op's `custom_options`. - // `length` is the size of the buffer. - // - // Returns a type-punned (i.e. void*) opaque data (e.g. a primitive pointer - // or an instance of a struct). - // - // The returned pointer will be stored with the node in the `user_data` field, - // accessible within prepare and invoke functions below. - // NOTE: if the data is already in the desired format, simply implement this - // function to return `nullptr` and implement the free function to be a no-op. - void* (*init)(TfLiteContext* context, const char* buffer, size_t length); - - // The pointer `buffer` is the data previously returned by an init invocation. - void (*free)(TfLiteContext* context, void* buffer); - - // prepare is called when the inputs this node depends on have been resized. - // context->ResizeTensor() can be called to request output tensors to be - // resized. - // - // Returns kTfLiteOk on success. - TfLiteStatus (*prepare)(TfLiteContext* context, TfLiteNode* node); - - // Execute the node (should read node->inputs and output to node->outputs). - // Returns kTfLiteOk on success. - TfLiteStatus (*invoke)(TfLiteContext* context, TfLiteNode* node); - - // profiling_string is called during summarization of profiling information - // in order to group executions together. Providing a value here will cause a - // given op to appear multiple times is the profiling report. This is - // particularly useful for custom ops that can perform significantly - // different calculations depending on their `user-data`. - const char* (*profiling_string)(const TfLiteContext* context, - const TfLiteNode* node); - - // Builtin codes. If this kernel refers to a builtin this is the code - // of the builtin. This is so we can do marshaling to other frameworks like - // NN API. - // Note: It is the responsibility of the registration binder to set this - // properly. - int32_t builtin_code; - - // Custom op name. If the op is a builtin, this will be null. - // Note: It is the responsibility of the registration binder to set this - // properly. - // WARNING: This is an experimental interface that is subject to change. - const char* custom_name; - - // The version of the op. - // Note: It is the responsibility of the registration binder to set this - // properly. - int version; -} TfLiteRegistration; - -// The flags used in `TfLiteDelegate`. Note that this is a bitmask, so the -// values should be 1, 2, 4, 8, ...etc. -typedef enum TfLiteDelegateFlags { - kTfLiteDelegateFlagsNone = 0, - // The flag is set if the delegate can handle dynamic sized tensors. - // For example, the output shape of a `Resize` op with non-constant shape - // can only be inferred when the op is invoked. - // In this case, the Delegate is responsible for calling - // `SetTensorToDynamic` to mark the tensor as a dynamic tensor, and calling - // `ResizeTensor` when invoking the op. - // - // If the delegate isn't capable to handle dynamic tensors, this flag need - // to be set to false. - kTfLiteDelegateFlagsAllowDynamicTensors = 1, - - // This flag can be used by delegates (that allow dynamic tensors) to ensure - // applicable tensor shapes are automatically propagated in the case of tensor - // resizing. - // This means that non-dynamic (allocation_type != kTfLiteDynamic) I/O tensors - // of a delegate kernel will have correct shapes before its Prepare() method - // is called. The runtime leverages TFLite builtin ops in the original - // execution plan to propagate shapes. - // - // A few points to note: - // 1. This requires kTfLiteDelegateFlagsAllowDynamicTensors. If that flag is - // false, this one is redundant since the delegate kernels are re-initialized - // every time tensors are resized. - // 2. Enabling this flag adds some overhead to AllocateTensors(), since extra - // work is required to prepare the original execution plan. - // 3. This flag requires that the original execution plan only have ops with - // valid registrations (and not 'dummy' custom ops like with Flex). - // WARNING: This feature is experimental and subject to change. - kTfLiteDelegateFlagsRequirePropagatedShapes = 2 -} TfLiteDelegateFlags; - -// WARNING: This is an experimental interface that is subject to change. -typedef struct TfLiteDelegate { - // Data that delegate needs to identify itself. This data is owned by the - // delegate. The delegate is owned in the user code, so the delegate is - // responsible for doing this when it is destroyed. - void* data_; - - // Invoked by ModifyGraphWithDelegate. This prepare is called, giving the - // delegate a view of the current graph through TfLiteContext*. It typically - // will look at the nodes and call ReplaceNodeSubsetsWithDelegateKernels() - // to ask the TensorFlow lite runtime to create macro-nodes to represent - // delegated subgraphs of the original graph. - TfLiteStatus (*Prepare)(TfLiteContext* context, - struct TfLiteDelegate* delegate); - - // Copy the data from delegate buffer handle into raw memory of the given - // 'tensor'. Note that the delegate is allowed to allocate the raw bytes as - // long as it follows the rules for kTfLiteDynamic tensors, in which case this - // cannot be null. - TfLiteStatus (*CopyFromBufferHandle)(TfLiteContext* context, - struct TfLiteDelegate* delegate, - TfLiteBufferHandle buffer_handle, - TfLiteTensor* tensor); - - // Copy the data from raw memory of the given 'tensor' to delegate buffer - // handle. This can be null if the delegate doesn't use its own buffer. - TfLiteStatus (*CopyToBufferHandle)(TfLiteContext* context, - struct TfLiteDelegate* delegate, - TfLiteBufferHandle buffer_handle, - TfLiteTensor* tensor); - - // Free the Delegate Buffer Handle. Note: This only frees the handle, but - // this doesn't release the underlying resource (e.g. textures). The - // resources are either owned by application layer or the delegate. - // This can be null if the delegate doesn't use its own buffer. - void (*FreeBufferHandle)(TfLiteContext* context, - struct TfLiteDelegate* delegate, - TfLiteBufferHandle* handle); - - // Bitmask flags. See the comments in `TfLiteDelegateFlags`. - int64_t flags; -} TfLiteDelegate; - -// Build a 'null' delegate, with all the fields properly set to their default -// values. -TfLiteDelegate TfLiteDelegateCreate(); - -#ifdef __cplusplus -} // extern "C" -#endif // __cplusplus -#endif // TENSORFLOW_LITE_C_COMMON_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/error_reporter.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/error_reporter.h deleted file mode 100644 index 05839a61..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/error_reporter.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ -#define TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ - -#include - -namespace tflite { - -/// A functor that reports error to supporting system. Invoked similar to -/// printf. -/// -/// Usage: -/// ErrorReporter foo; -/// foo.Report("test %d", 5); -/// or -/// va_list args; -/// foo.Report("test %d", args); // where args is va_list -/// -/// Subclass ErrorReporter to provide another reporting destination. -/// For example, if you have a GUI program, you might redirect to a buffer -/// that drives a GUI error log box. -class ErrorReporter { - public: - virtual ~ErrorReporter() {} - virtual int Report(const char* format, va_list args) = 0; - int Report(const char* format, ...); - int ReportError(void*, const char* format, ...); -}; - -} // namespace tflite - -// You should not make bare calls to the error reporter, instead use the -// TF_LITE_REPORT_ERROR macro, since this allows message strings to be -// stripped when the binary size has to be optimized. If you are looking to -// reduce binary size, define TF_LITE_STRIP_ERROR_STRINGS when compiling and -// every call will be stubbed out, taking no memory. -#ifndef TF_LITE_STRIP_ERROR_STRINGS -#define TF_LITE_REPORT_ERROR(reporter, ...) \ - do { \ - static_cast(reporter)->Report(__VA_ARGS__); \ - } while (false) -#else // TF_LITE_STRIP_ERROR_STRINGS -#define TF_LITE_REPORT_ERROR(reporter, ...) -#endif // TF_LITE_STRIP_ERROR_STRINGS - -#endif // TENSORFLOW_LITE_CORE_API_ERROR_REPORTER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/flatbuffer_conversions.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/flatbuffer_conversions.h deleted file mode 100644 index aaeb98c0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/flatbuffer_conversions.h +++ /dev/null @@ -1,253 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ -#define TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ - -// These functions transform codes and data structures that are defined in the -// flatbuffer serialization format into in-memory values that are used by the -// runtime API and interpreter. - -#include -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -// Interface class for builtin data allocations. -class BuiltinDataAllocator { - public: - virtual void* Allocate(size_t size, size_t alignment_hint) = 0; - virtual void Deallocate(void* data) = 0; - - // Allocate a structure, but make sure it is a POD structure that doesn't - // require constructors to run. The reason we do this, is that Interpreter's C - // extension part will take ownership so destructors will not be run during - // deallocation. - template - T* AllocatePOD() { - // TODO(b/154346074): Change this to is_trivially_destructible when all - // platform targets support that properly. - static_assert(std::is_pod::value, "Builtin data structure must be POD."); - void* allocated_memory = this->Allocate(sizeof(T), alignof(T)); - return new (allocated_memory) T; - } - - virtual ~BuiltinDataAllocator() {} -}; - -// Parse the appropriate data out of the op. -// -// This handles builtin data explicitly as there are flatbuffer schemas. -// If it returns kTfLiteOk, it passes the data out with `builtin_data`. The -// calling function has to pass in an allocator object, and this allocator -// will be called to reserve space for the output data. If the calling -// function's allocator reserves memory on the heap, then it's the calling -// function's responsibility to free it. -// If it returns kTfLiteError, `builtin_data` will be `nullptr`. -TfLiteStatus ParseOpData(const Operator* op, BuiltinOperator op_type, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -// Converts the tensor data type used in the flat buffer to the representation -// used by the runtime. -TfLiteStatus ConvertTensorType(TensorType tensor_type, TfLiteType* type, - ErrorReporter* error_reporter); - -TfLiteStatus ParseAbs(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseAdd(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseArgMax(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseArgMin(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseCeil(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseConcatenation(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseConv2D(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseCos(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseDepthwiseConv2D(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseDequantize(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseEqual(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseFloor(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseFullyConnected(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseGreater(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseGreaterEqual(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseHardSwish(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseL2Normalization(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseLess(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseLessEqual(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseLog(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseLogicalAnd(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseLogicalNot(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseLogicalOr(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseLogistic(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseMaximum(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseMinimum(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseMul(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseNeg(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseNotEqual(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParsePack(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParsePad(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParsePadV2(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParsePool(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParsePrelu(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseQuantize(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseReducer(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseRelu(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseRelu6(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseReshape(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseResizeNearestNeighbor(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseRound(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseRsqrt(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSin(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSoftmax(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSplit(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSqrt(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSquare(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseStridedSlice(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - -TfLiteStatus ParseSub(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseSvdf(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseTanh(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -TfLiteStatus ParseUnpack(const Operator* op, ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, void** builtin_data); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_CORE_API_FLATBUFFER_CONVERSIONS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/op_resolver.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/op_resolver.h deleted file mode 100644 index 1294b7b8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/op_resolver.h +++ /dev/null @@ -1,48 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ -#define TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -/// Abstract interface that returns TfLiteRegistrations given op codes or custom -/// op names. This is the mechanism that ops being referenced in the flatbuffer -/// model are mapped to executable function pointers (TfLiteRegistrations). -class OpResolver { - public: - /// Finds the op registration for a builtin operator by enum code. - virtual const TfLiteRegistration* FindOp(tflite::BuiltinOperator op, - int version) const = 0; - /// Finds the op registration of a custom operator by op name. - virtual const TfLiteRegistration* FindOp(const char* op, - int version) const = 0; - virtual ~OpResolver() {} -}; - -// Handles the logic for converting between an OperatorCode structure extracted -// from a flatbuffer and information about a registered operator -// implementation. -TfLiteStatus GetRegistrationFromOpCode(const OperatorCode* opcode, - const OpResolver& op_resolver, - ErrorReporter* error_reporter, - const TfLiteRegistration** registration); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_CORE_API_OP_RESOLVER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/profiler.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/profiler.h deleted file mode 100644 index 897efbe1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/profiler.h +++ /dev/null @@ -1,194 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_CORE_API_PROFILER_H_ -#define TENSORFLOW_LITE_CORE_API_PROFILER_H_ - -#include - -namespace tflite { - -// A simple utility for enabling profiled event tracing in TensorFlow Lite. -class Profiler { - public: - // As certain Profiler instance might be only interested in certain event - // types, we define each event type value to allow a Profiler to use - // bitmasking bitwise operations to determine whether an event should be - // recorded or not. - enum class EventType { - // Default event type, the metadata field has no special significance. - DEFAULT = 1, - - // The event is an operator invocation and the event_metadata field is the - // index of operator node. - OPERATOR_INVOKE_EVENT = 2, - - // The event is an invocation for an internal operator of a TFLite delegate. - // The event_metadata field is the index of operator node that's specific to - // the delegate. - DELEGATE_OPERATOR_INVOKE_EVENT = 4, - - // The event is a recording of runtime instrumentation such as the overall - // TFLite runtime status, the TFLite delegate status (if a delegate - // is applied), and the overall model inference latency etc. - // Note, the delegate status and overall status are stored as separate - // event_metadata fields. In particular, the delegate status is encoded - // as DelegateStatus::full_status(). - GENERAL_RUNTIME_INSTRUMENTATION_EVENT = 8, - }; - - virtual ~Profiler() {} - - // Signals the beginning of an event and returns a handle to the profile - // event. The `event_metadata1` and `event_metadata2` have different - // interpretations based on the actual Profiler instance and the `event_type`. - // For example, as for the 'SubgraphAwareProfiler' defined in - // lite/core/subgraph.h, when the event_type is OPERATOR_INVOKE_EVENT, - // `event_metadata1` represents the index of a TFLite node, and - // `event_metadata2` represents the index of the subgraph that this event - // comes from. - virtual uint32_t BeginEvent(const char* tag, EventType event_type, - int64_t event_metadata1, - int64_t event_metadata2) = 0; - // Similar w/ the above, but `event_metadata2` defaults to 0. - uint32_t BeginEvent(const char* tag, EventType event_type, - int64_t event_metadata) { - return BeginEvent(tag, event_type, event_metadata, /*event_metadata2*/ 0); - } - - // Signals an end to the specified profile event with 'event_metadata's, This - // is useful when 'event_metadata's are not available when the event begins - // or when one wants to overwrite the 'event_metadata's set at the beginning. - virtual void EndEvent(uint32_t event_handle, int64_t event_metadata1, - int64_t event_metadata2) {} - // Signals an end to the specified profile event. - virtual void EndEvent(uint32_t event_handle) = 0; - - // Appends an event of type 'event_type' with 'tag' and 'event_metadata' - // which started at 'start' and ended at 'end' - // Note: - // In cases were ProfileSimmarizer and tensorflow::StatsCalculator are used - // they assume the value is in "usec", if in any case subclasses - // didn't put usec, then the values are not meaningful. - // TODO karimnosseir: Revisit and make the function more clear. - void AddEvent(const char* tag, EventType event_type, uint64_t start, - uint64_t end, int64_t event_metadata) { - AddEvent(tag, event_type, start, end, event_metadata, - /*event_metadata2*/ 0); - } - - virtual void AddEvent(const char* tag, EventType event_type, uint64_t start, - uint64_t end, int64_t event_metadata1, - int64_t event_metadata2) {} - - protected: - friend class ScopedProfile; -}; - -// Adds a profile event to `profiler` that begins with the construction -// of the object and ends when the object goes out of scope. -// The lifetime of tag should be at least the lifetime of `profiler`. -// `profiler` may be null, in which case nothing is profiled. -class ScopedProfile { - public: - ScopedProfile(Profiler* profiler, const char* tag, - Profiler::EventType event_type = Profiler::EventType::DEFAULT, - int64_t event_metadata = 0) - : profiler_(profiler), event_handle_(0) { - if (profiler) { - event_handle_ = profiler_->BeginEvent(tag, event_type, event_metadata); - } - } - - ~ScopedProfile() { - if (profiler_) { - profiler_->EndEvent(event_handle_); - } - } - - protected: - Profiler* profiler_; - uint32_t event_handle_; -}; - -class ScopedOperatorProfile : public ScopedProfile { - public: - ScopedOperatorProfile(Profiler* profiler, const char* tag, int node_index) - : ScopedProfile(profiler, tag, Profiler::EventType::OPERATOR_INVOKE_EVENT, - static_cast(node_index)) {} -}; - -class ScopedDelegateOperatorProfile : public ScopedProfile { - public: - ScopedDelegateOperatorProfile(Profiler* profiler, const char* tag, - int node_index) - : ScopedProfile(profiler, tag, - Profiler::EventType::DELEGATE_OPERATOR_INVOKE_EVENT, - static_cast(node_index)) {} -}; - -class ScopedRuntimeInstrumentationProfile : public ScopedProfile { - public: - ScopedRuntimeInstrumentationProfile(Profiler* profiler, const char* tag) - : ScopedProfile( - profiler, tag, - Profiler::EventType::GENERAL_RUNTIME_INSTRUMENTATION_EVENT, -1) {} - - void set_runtime_status(int64_t delegate_status, int64_t interpreter_status) { - if (profiler_) { - delegate_status_ = delegate_status; - interpreter_status_ = interpreter_status; - } - } - - ~ScopedRuntimeInstrumentationProfile() { - if (profiler_) { - profiler_->EndEvent(event_handle_, delegate_status_, interpreter_status_); - } - } - - private: - int64_t delegate_status_; - int64_t interpreter_status_; -}; - -} // namespace tflite - -#define TFLITE_VARNAME_UNIQ_IMPL(name, ctr) name##ctr -#define TFLITE_VARNAME_UNIQ(name, ctr) TFLITE_VARNAME_UNIQ_IMPL(name, ctr) - -#define TFLITE_SCOPED_TAGGED_DEFAULT_PROFILE(profiler, tag) \ - tflite::ScopedProfile TFLITE_VARNAME_UNIQ(_profile_, __COUNTER__)( \ - (profiler), (tag)) - -#define TFLITE_SCOPED_TAGGED_OPERATOR_PROFILE(profiler, tag, node_index) \ - tflite::ScopedOperatorProfile TFLITE_VARNAME_UNIQ(_profile_, __COUNTER__)( \ - (profiler), (tag), (node_index)) - -#define TFLITE_SCOPED_DELEGATE_OPERATOR_PROFILE(profiler, tag, node_index) \ - tflite::ScopedDelegateOperatorProfile TFLITE_VARNAME_UNIQ( \ - _profile_, __COUNTER__)((profiler), (tag), (node_index)) - -#define TFLITE_ADD_RUNTIME_INSTRUMENTATION_EVENT( \ - profiler, tag, delegate_status, interpreter_status) \ - do { \ - if (!profiler) { \ - const auto handle = profiler->BeginEvent( \ - tag, Profiler::EventType::GENERAL_RUNTIME_INSTRUMENTATION_EVENT, \ - delegate_status, interpreter_status); \ - profiler->EndEvent(handle); \ - } \ - } while (false); - -#endif // TENSORFLOW_LITE_CORE_API_PROFILER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/tensor_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/tensor_utils.h deleted file mode 100644 index 9f1cf94a..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/core/api/tensor_utils.h +++ /dev/null @@ -1,28 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ -#define TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ - -#include "tensorflow/lite/c/common.h" - -namespace tflite { - -// Resets a variable tensor to the default value. -TfLiteStatus ResetVariableTensor(TfLiteTensor* tensor); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_CORE_API_TENSOR_UTILS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/common.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/common.h deleted file mode 100644 index 66a2d977..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/common.h +++ /dev/null @@ -1,956 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ - -#ifndef ALLOW_SLOW_GENERIC_DEPTHWISECONV_FALLBACK -#ifdef GEMMLOWP_ALLOW_SLOW_SCALAR_FALLBACK -#define ALLOW_SLOW_GENERIC_DEPTHWISECONV_FALLBACK -#endif -#endif - -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/optimized/neon_check.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -constexpr int kReverseShift = -1; - -inline void GetActivationMinMax(FusedActivationFunctionType ac, - float* output_activation_min, - float* output_activation_max) { - switch (ac) { - case FusedActivationFunctionType::kNone: - *output_activation_min = std::numeric_limits::lowest(); - *output_activation_max = std::numeric_limits::max(); - break; - case FusedActivationFunctionType::kRelu: - *output_activation_min = 0.f; - *output_activation_max = std::numeric_limits::max(); - break; - case FusedActivationFunctionType::kRelu1: - *output_activation_min = -1.f; - *output_activation_max = 1.f; - break; - case FusedActivationFunctionType::kRelu6: - *output_activation_min = 0.f; - *output_activation_max = 6.f; - break; - } -} - -template -inline T ActivationFunctionWithMinMax(T x, T output_activation_min, - T output_activation_max) { - using std::max; - using std::min; - return min(max(x, output_activation_min), output_activation_max); -} - -// Legacy function, left for compatibility only. -template -float ActivationFunction(float x) { - float output_activation_min, output_activation_max; - GetActivationMinMax(Ac, &output_activation_min, &output_activation_max); - return ActivationFunctionWithMinMax(x, output_activation_min, - output_activation_max); -} - -inline void BiasAndClamp(float clamp_min, float clamp_max, int bias_size, - const float* bias_data, int array_size, - float* array_data) { - // Note: see b/132215220: in May 2019 we thought it would be OK to replace - // this with the Eigen one-liner: - // return (array.colwise() + bias).cwiseMin(clamp_max).cwiseMin(clamp_max). - // This turned out to severely regress performance: +4ms (i.e. 8%) on - // MobileNet v2 / 1.0 / 224. So we keep custom NEON code for now. - TFLITE_DCHECK_EQ((array_size % bias_size), 0); -#ifdef USE_NEON - float* array_ptr = array_data; - float* array_end_ptr = array_ptr + array_size; - const auto clamp_min_vec = vdupq_n_f32(clamp_min); - const auto clamp_max_vec = vdupq_n_f32(clamp_max); - for (; array_ptr != array_end_ptr; array_ptr += bias_size) { - int i = 0; - for (; i <= bias_size - 16; i += 16) { - auto b0 = vld1q_f32(bias_data + i); - auto b1 = vld1q_f32(bias_data + i + 4); - auto b2 = vld1q_f32(bias_data + i + 8); - auto b3 = vld1q_f32(bias_data + i + 12); - auto a0 = vld1q_f32(array_ptr + i); - auto a1 = vld1q_f32(array_ptr + i + 4); - auto a2 = vld1q_f32(array_ptr + i + 8); - auto a3 = vld1q_f32(array_ptr + i + 12); - auto x0 = vaddq_f32(a0, b0); - auto x1 = vaddq_f32(a1, b1); - auto x2 = vaddq_f32(a2, b2); - auto x3 = vaddq_f32(a3, b3); - x0 = vmaxq_f32(clamp_min_vec, x0); - x1 = vmaxq_f32(clamp_min_vec, x1); - x2 = vmaxq_f32(clamp_min_vec, x2); - x3 = vmaxq_f32(clamp_min_vec, x3); - x0 = vminq_f32(clamp_max_vec, x0); - x1 = vminq_f32(clamp_max_vec, x1); - x2 = vminq_f32(clamp_max_vec, x2); - x3 = vminq_f32(clamp_max_vec, x3); - vst1q_f32(array_ptr + i, x0); - vst1q_f32(array_ptr + i + 4, x1); - vst1q_f32(array_ptr + i + 8, x2); - vst1q_f32(array_ptr + i + 12, x3); - } - for (; i <= bias_size - 4; i += 4) { - auto b = vld1q_f32(bias_data + i); - auto a = vld1q_f32(array_ptr + i); - auto x = vaddq_f32(a, b); - x = vmaxq_f32(clamp_min_vec, x); - x = vminq_f32(clamp_max_vec, x); - vst1q_f32(array_ptr + i, x); - } - for (; i < bias_size; i++) { - array_ptr[i] = ActivationFunctionWithMinMax(array_ptr[i] + bias_data[i], - clamp_min, clamp_max); - } - } -#else // not NEON - for (int array_offset = 0; array_offset < array_size; - array_offset += bias_size) { - for (int i = 0; i < bias_size; i++) { - array_data[array_offset + i] = ActivationFunctionWithMinMax( - array_data[array_offset + i] + bias_data[i], clamp_min, clamp_max); - } - } -#endif -} - -inline int32_t MultiplyByQuantizedMultiplierSmallerThanOneExp( - int32_t x, int32_t quantized_multiplier, int left_shift) { - using gemmlowp::RoundingDivideByPOT; - using gemmlowp::SaturatingRoundingDoublingHighMul; - return RoundingDivideByPOT( - SaturatingRoundingDoublingHighMul(x, quantized_multiplier), -left_shift); -} - -inline int32_t MultiplyByQuantizedMultiplierGreaterThanOne( - int32_t x, int32_t quantized_multiplier, int left_shift) { - using gemmlowp::SaturatingRoundingDoublingHighMul; - return SaturatingRoundingDoublingHighMul(x * (1 << left_shift), - quantized_multiplier); -} - -inline int32_t MultiplyByQuantizedMultiplier(int32_t x, - int32_t quantized_multiplier, - int shift) { - using gemmlowp::RoundingDivideByPOT; - using gemmlowp::SaturatingRoundingDoublingHighMul; - int left_shift = shift > 0 ? shift : 0; - int right_shift = shift > 0 ? 0 : -shift; - return RoundingDivideByPOT(SaturatingRoundingDoublingHighMul( - x * (1 << left_shift), quantized_multiplier), - right_shift); -} - -inline int32_t MultiplyByQuantizedMultiplier(int64_t x, - int32_t quantized_multiplier, - int shift) { - // Inputs: - // - quantized_multiplier has fixed point at bit 31 - // - shift is -31 to +7 (negative for right shift) - // - // Assumptions: The following input ranges are assumed - // - quantize_scale>=0 (the usual range is (1<<30) to (1>>31)-1) - // - scaling is chosen so final scaled result fits in int32_t - // - input x is in the range -(1<<47) <= x < (1<<47) - assert(quantized_multiplier >= 0); - assert(shift >= -31 && shift < 8); - - int32_t reduced_multiplier = (quantized_multiplier + (1 << 15)) >> 16; - int total_shift = 15 - shift; - x = (x * (int64_t)reduced_multiplier) + ((int64_t)1 << (total_shift - 1)); - int32_t result = x >> total_shift; - return result; -} - -template -int CountLeadingZeros(T integer_input) { - static_assert(std::is_unsigned::value, - "Only unsigned integer types handled."); -#if defined(__GNUC__) - return integer_input ? __builtin_clz(integer_input) - : std::numeric_limits::digits; -#else - if (integer_input == 0) { - return std::numeric_limits::digits; - } - - const T one_in_leading_positive = static_cast(1) - << (std::numeric_limits::digits - 1); - int leading_zeros = 0; - while (integer_input < one_in_leading_positive) { - integer_input <<= 1; - ++leading_zeros; - } - return leading_zeros; -#endif -} - -template -inline int CountLeadingSignBits(T integer_input) { - static_assert(std::is_signed::value, "Only signed integer types handled."); -#if defined(__GNUC__) && !defined(__clang__) - return integer_input ? __builtin_clrsb(integer_input) - : std::numeric_limits::digits; -#else - using U = typename std::make_unsigned::type; - return integer_input >= 0 - ? CountLeadingZeros(static_cast(integer_input)) - 1 - : integer_input != std::numeric_limits::min() - ? CountLeadingZeros(2 * static_cast(-integer_input) - 1) - : 0; -#endif -} - -// Use "count leading zeros" helper functions to do a fast Floor(log_2(x)). -template -inline Integer FloorLog2(Integer n) { - static_assert(std::is_integral::value, ""); - static_assert(std::is_signed::value, ""); - static_assert(sizeof(Integer) == 4 || sizeof(Integer) == 8, ""); - TFLITE_CHECK_GT(n, 0); - if (sizeof(Integer) == 4) { - return 30 - CountLeadingSignBits(n); - } else { - return 62 - CountLeadingSignBits(n); - } -} - -// generate INT16 LUT for function(), e.g., table exp(x) and 1/(1+x) used in -// softmax -inline void gen_lut(const std::function& func, double min, - double max, int16_t* table, const int num) { - // size of table should equal to num + 1 - // last element only for slope calculation - double step = (max - min) / (num - 1); - double half_step = step / 2.0; - for (int i = 0; i < num - 1; i++) { - double sample_val = TfLiteRound(func(min + i * step) * 32768.0); - double midpoint_interp_val = - TfLiteRound((func(min + (i + 1) * step) * 32768.0 + - TfLiteRound(func(min + i * step) * 32768.0)) / - 2.0); - double midpoint_val = - TfLiteRound(func(min + i * step + half_step) * 32768.0); - double midpoint_err = midpoint_interp_val - midpoint_val; - double bias = TfLiteRound(midpoint_err / 2.0); - table[i] = std::min(std::max(sample_val - bias, -32768.0), 32767.0); - } - table[num - 1] = - std::min(std::max(TfLiteRound(func(max) * 32768.0), -32768.0), 32767.0); -} - -// int16_t func table lookup, e.g., lookup exp() and 1/(1+x) used in softmax -inline int16_t generic_int16_table_lookup(int16_t value, const int16_t* lut) { - // 512 base value, lut[513] only for calculate slope - uint16_t index = static_cast(256 + (value >> 7)); - assert(index < 512 && "LUT index out of range."); - int16_t offset = value & 0x7f; - - // base and slope are Q0.15 - int16_t base = lut[index]; - int16_t slope = lut[index + 1] - lut[index]; - - // Q0.15 * Q0.7 = Q0.22 - // Round and convert from Q0.22 to Q0.15 - int32_t delta = (static_cast(slope) * offset + 64) >> 7; - - // Q0.15 + Q0.15 - return base + delta; -} - -// Table of sigmoid(i/24) at 0.16 format - 256 elements. - -// We use combined sigmoid and tanh look-up table, since -// tanh(x) = 2*sigmoid(2*x) -1. -// Both functions are symmetric, so the LUT table is only needed -// for the absolute value of the input. -static const uint16_t sigmoid_table_uint16[256] = { - 32768, 33451, 34133, 34813, 35493, 36169, 36843, 37513, 38180, 38841, 39498, - 40149, 40794, 41432, 42064, 42688, 43304, 43912, 44511, 45102, 45683, 46255, - 46817, 47369, 47911, 48443, 48964, 49475, 49975, 50464, 50942, 51409, 51865, - 52311, 52745, 53169, 53581, 53983, 54374, 54755, 55125, 55485, 55834, 56174, - 56503, 56823, 57133, 57433, 57724, 58007, 58280, 58544, 58800, 59048, 59288, - 59519, 59743, 59959, 60168, 60370, 60565, 60753, 60935, 61110, 61279, 61441, - 61599, 61750, 61896, 62036, 62172, 62302, 62428, 62549, 62666, 62778, 62886, - 62990, 63090, 63186, 63279, 63368, 63454, 63536, 63615, 63691, 63765, 63835, - 63903, 63968, 64030, 64090, 64148, 64204, 64257, 64308, 64357, 64405, 64450, - 64494, 64536, 64576, 64614, 64652, 64687, 64721, 64754, 64786, 64816, 64845, - 64873, 64900, 64926, 64950, 64974, 64997, 65019, 65039, 65060, 65079, 65097, - 65115, 65132, 65149, 65164, 65179, 65194, 65208, 65221, 65234, 65246, 65258, - 65269, 65280, 65291, 65301, 65310, 65319, 65328, 65337, 65345, 65352, 65360, - 65367, 65374, 65381, 65387, 65393, 65399, 65404, 65410, 65415, 65420, 65425, - 65429, 65433, 65438, 65442, 65445, 65449, 65453, 65456, 65459, 65462, 65465, - 65468, 65471, 65474, 65476, 65479, 65481, 65483, 65485, 65488, 65489, 65491, - 65493, 65495, 65497, 65498, 65500, 65501, 65503, 65504, 65505, 65507, 65508, - 65509, 65510, 65511, 65512, 65513, 65514, 65515, 65516, 65517, 65517, 65518, - 65519, 65520, 65520, 65521, 65522, 65522, 65523, 65523, 65524, 65524, 65525, - 65525, 65526, 65526, 65526, 65527, 65527, 65528, 65528, 65528, 65529, 65529, - 65529, 65529, 65530, 65530, 65530, 65530, 65531, 65531, 65531, 65531, 65531, - 65532, 65532, 65532, 65532, 65532, 65532, 65533, 65533, 65533, 65533, 65533, - 65533, 65533, 65533, 65534, 65534, 65534, 65534, 65534, 65534, 65534, 65534, - 65534, 65534, 65535}; - -// TODO(b/77858996): Add these to gemmlowp. -template -IntegerType SaturatingAddNonGemmlowp(IntegerType a, IntegerType b) { - static_assert(std::is_same::value, "unimplemented"); - return a; -} - -template <> -inline std::int32_t SaturatingAddNonGemmlowp(std::int32_t a, std::int32_t b) { - std::int64_t a64 = a; - std::int64_t b64 = b; - std::int64_t sum = a64 + b64; - return static_cast(std::min( - static_cast(std::numeric_limits::max()), - std::max( - static_cast(std::numeric_limits::min()), - sum))); -} - -template -gemmlowp::FixedPoint SaturatingAddNonGemmlowp( - gemmlowp::FixedPoint a, - gemmlowp::FixedPoint b) { - return gemmlowp::FixedPoint::FromRaw( - SaturatingAddNonGemmlowp(a.raw(), b.raw())); -} - -template -IntegerType SaturatingSub(IntegerType a, IntegerType b) { - static_assert(std::is_same::value, "unimplemented"); - return a; -} - -template <> -inline std::int16_t SaturatingSub(std::int16_t a, std::int16_t b) { - std::int32_t a32 = a; - std::int32_t b32 = b; - std::int32_t diff = a32 - b32; - return static_cast( - std::min(static_cast(32767), - std::max(static_cast(-32768), diff))); -} - -template <> -inline std::int32_t SaturatingSub(std::int32_t a, std::int32_t b) { - std::int64_t a64 = a; - std::int64_t b64 = b; - std::int64_t diff = a64 - b64; - return static_cast(std::min( - static_cast(std::numeric_limits::max()), - std::max( - static_cast(std::numeric_limits::min()), - diff))); -} - -template -gemmlowp::FixedPoint SaturatingSub( - gemmlowp::FixedPoint a, - gemmlowp::FixedPoint b) { - return gemmlowp::FixedPoint::FromRaw( - SaturatingSub(a.raw(), b.raw())); -} -// End section to be moved to gemmlowp. - -template -IntegerType SaturatingRoundingMultiplyByPOTParam(IntegerType x, int exponent) { - if (exponent == 0) { - return x; - } - using ScalarIntegerType = - typename gemmlowp::FixedPointRawTypeTraits::ScalarRawType; - const IntegerType min = - gemmlowp::Dup(std::numeric_limits::min()); - const IntegerType max = - gemmlowp::Dup(std::numeric_limits::max()); - const int ScalarIntegerTypeBits = 8 * sizeof(ScalarIntegerType); - - const std::int32_t threshold = - ((1 << (ScalarIntegerTypeBits - 1 - exponent)) - 1); - const IntegerType positive_mask = - gemmlowp::MaskIfGreaterThan(x, gemmlowp::Dup(threshold)); - const IntegerType negative_mask = - gemmlowp::MaskIfLessThan(x, gemmlowp::Dup(-threshold)); - - IntegerType result = gemmlowp::ShiftLeft(x, exponent); - result = gemmlowp::SelectUsingMask(positive_mask, max, result); - result = gemmlowp::SelectUsingMask(negative_mask, min, result); - return result; -} - -// If we want to leave IntegerBits fixed, then multiplication -// by a power of two has to be saturating/rounding, not exact anymore. -template -gemmlowp::FixedPoint -SaturatingRoundingMultiplyByPOTParam( - gemmlowp::FixedPoint a, int exponent) { - return gemmlowp::FixedPoint::FromRaw( - SaturatingRoundingMultiplyByPOTParam(a.raw(), exponent)); -} - -// Convert int32_t multiplier to int16_t with rounding. -inline void DownScaleInt32ToInt16Multiplier(int32_t multiplier_int32_t, - int16_t* multiplier_int16_t) { - TFLITE_DCHECK_GE(multiplier_int32_t, 0); - static constexpr int32_t kRoundingOffset = 1 << 15; - if (multiplier_int32_t >= - std::numeric_limits::max() - kRoundingOffset) { - *multiplier_int16_t = std::numeric_limits::max(); - return; - } - const int32_t result = (multiplier_int32_t + kRoundingOffset) >> 16; - TFLITE_DCHECK_LE(result << 16, multiplier_int32_t + kRoundingOffset); - TFLITE_DCHECK_GT(result << 16, multiplier_int32_t - kRoundingOffset); - *multiplier_int16_t = result; - TFLITE_DCHECK_EQ(*multiplier_int16_t, result); -} - -// Minimum output bits to accommodate log of maximum input range. It actually -// does not matter if one considers, say, [-64,64] or [-64,64). -// -// For example, run this through Octave: -// [0:127; ... -// ceil(log(abs( log(2.^(0:127))+1 ))/log(2)); ... -// ceil(log(abs( log(2.^(0:127))+1 ))/log(2))] -constexpr int min_log_x_output_bits(int input_bits) { - return input_bits > 90 ? 7 - : input_bits > 44 ? 6 - : input_bits > 21 ? 5 - : input_bits > 10 ? 4 - : input_bits > 4 ? 3 - : input_bits > 1 ? 2 - : 1; -} - -// Although currently the name of this function says that it cannot handle -// values less than 1, in practice it can handle as low as 1/x_max, where -// x_max is the largest representable input. In other words, the output range -// is symmetric. -template -inline gemmlowp::FixedPoint -log_x_for_x_greater_than_or_equal_to_1_impl( - gemmlowp::FixedPoint input_val) { - // assert(__builtin_clz(0u) >= std::numeric_limits::digits - 1); - // assert(__builtin_clz(0u) <= std::numeric_limits::digits); - using FixedPoint0 = gemmlowp::FixedPoint; - // The reason for accumulating the result with an extra bit of headroom is - // that z_pow_2_adj * log_2 might be saturated, and adding num_scaled * - // recip_denom will otherwise introduce an error. - static constexpr int kAccumIntegerBits = OutputIntegerBits + 1; - using FixedPointAccum = gemmlowp::FixedPoint; - - const FixedPoint0 log_2 = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 1488522236, std::log(2.0)); - const FixedPoint0 sqrt_sqrt_half = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 1805811301, std::sqrt(std::sqrt(0.5))); - const FixedPoint0 sqrt_half = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 1518500250, std::sqrt(0.5)); - const FixedPoint0 one_quarter = - GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(FixedPoint0, 536870912, 1.0 / 4.0); - - const FixedPoint0 alpha_n = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 117049297, 11.0 / 240.0 * std::sqrt(std::sqrt(2.0))); - const FixedPoint0 alpha_d = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 127690142, 1.0 / 20.0 * std::sqrt(std::sqrt(2.0))); - const FixedPoint0 alpha_i = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 1057819769, - 2.0 / std::sqrt(std::sqrt(2.0)) - std::sqrt(std::sqrt(2.0))); - const FixedPoint0 alpha_f = GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT( - FixedPoint0, 638450708, 1.0 / 4.0 * std::sqrt(std::sqrt(2.0))); - - const FixedPointAccum shifted_quarter = - gemmlowp::Rescale(one_quarter); - - // Reinterpret the input value as Q0.31, because we will figure out the - // required shift "ourselves" instead of using, say, Rescale. - FixedPoint0 z_a = FixedPoint0::FromRaw(input_val.raw()); - // z_a_pow_2 = input_integer_bits - z_a_headroom; - int z_a_headroom_plus_1 = CountLeadingZeros(static_cast(z_a.raw())); - FixedPoint0 r_a_tmp = - SaturatingRoundingMultiplyByPOTParam(z_a, (z_a_headroom_plus_1 - 1)); - const int32_t r_a_raw = - SaturatingRoundingMultiplyByPOTParam((r_a_tmp * sqrt_half).raw(), 1); - // z_pow_2_adj = max(z_pow_2_a - 0.75, z_pow_2_b - 0.25); - // z_pow_2_adj = max(InputIntegerBits - z_a_headroom_plus_1 + 0.25, - // InputIntegerBits - z_b_headroom - 0.25); - const FixedPointAccum z_a_pow_2_adj = SaturatingAddNonGemmlowp( - FixedPointAccum::FromRaw(SaturatingRoundingMultiplyByPOTParam( - InputIntegerBits - z_a_headroom_plus_1, 31 - kAccumIntegerBits)), - shifted_quarter); - - // z_b is treated like z_a, but premultiplying by sqrt(0.5). - FixedPoint0 z_b = z_a * sqrt_half; - int z_b_headroom = CountLeadingZeros(static_cast(z_b.raw())) - 1; - const int32_t r_b_raw = - SaturatingRoundingMultiplyByPOTParam(z_a.raw(), z_b_headroom); - const FixedPointAccum z_b_pow_2_adj = SaturatingSub( - FixedPointAccum::FromRaw(SaturatingRoundingMultiplyByPOTParam( - InputIntegerBits - z_b_headroom, 31 - kAccumIntegerBits)), - shifted_quarter); - - const FixedPoint0 r = FixedPoint0::FromRaw(std::min(r_a_raw, r_b_raw)); - const FixedPointAccum z_pow_2_adj = FixedPointAccum::FromRaw( - std::max(z_a_pow_2_adj.raw(), z_b_pow_2_adj.raw())); - - const FixedPoint0 p = gemmlowp::RoundingHalfSum(r, sqrt_sqrt_half); - FixedPoint0 q = r - sqrt_sqrt_half; - q = q + q; - - const FixedPoint0 common_sq = q * q; - const FixedPoint0 num = q * r + q * common_sq * alpha_n; - const FixedPoint0 denom_minus_one_0 = - p * (alpha_i + q + alpha_d * common_sq) + alpha_f * q; - const FixedPoint0 recip_denom = - one_over_one_plus_x_for_x_in_0_1(denom_minus_one_0); - - const FixedPointAccum num_scaled = gemmlowp::Rescale(num); - return gemmlowp::Rescale(z_pow_2_adj * log_2 + - num_scaled * recip_denom); -} - -template -inline gemmlowp::FixedPoint -log_x_for_x_greater_than_or_equal_to_1( - gemmlowp::FixedPoint input_val) { - static_assert( - OutputIntegerBits >= min_log_x_output_bits(InputIntegerBits), - "Output integer bits must be sufficient to accommodate logs of inputs."); - return log_x_for_x_greater_than_or_equal_to_1_impl( - input_val); -} - -inline int32_t GetReciprocal(int32_t x, int x_integer_digits, - int* num_bits_over_unit) { - int headroom_plus_one = CountLeadingZeros(static_cast(x)); - // This is the number of bits to the left of the binary point above 1.0. - // Consider x=1.25. In that case shifted_scale=0.8 and - // no later adjustment will be needed. - *num_bits_over_unit = x_integer_digits - headroom_plus_one; - const int32_t shifted_sum_minus_one = - static_cast((static_cast(x) << headroom_plus_one) - - (static_cast(1) << 31)); - - gemmlowp::FixedPoint shifted_scale = - gemmlowp::one_over_one_plus_x_for_x_in_0_1( - gemmlowp::FixedPoint::FromRaw(shifted_sum_minus_one)); - return shifted_scale.raw(); -} - -inline void GetInvSqrtQuantizedMultiplierExp(int32_t input, int reverse_shift, - int32_t* output_inv_sqrt, - int* output_shift) { - TFLITE_DCHECK_GE(input, 0); - if (input <= 1) { - // Handle the input value 1 separately to avoid overflow in that case - // in the general computation below (b/143972021). Also handle 0 as if it - // were a 1. 0 is an invalid input here (divide by zero) and 1 is a valid - // but rare/unrealistic input value. We can expect both to occur in some - // incompletely trained models, but probably not in fully trained models. - *output_inv_sqrt = std::numeric_limits::max(); - *output_shift = 0; - return; - } - TFLITE_DCHECK_GT(input, 1); - *output_shift = 11; - while (input >= (1 << 29)) { - input /= 4; - ++*output_shift; - } - const unsigned max_left_shift_bits = - CountLeadingZeros(static_cast(input)) - 1; - const unsigned max_left_shift_bit_pairs = max_left_shift_bits / 2; - const unsigned left_shift_bit_pairs = max_left_shift_bit_pairs - 1; - *output_shift -= left_shift_bit_pairs; - input <<= 2 * left_shift_bit_pairs; - TFLITE_DCHECK_GE(input, (1 << 27)); - TFLITE_DCHECK_LT(input, (1 << 29)); - using gemmlowp::FixedPoint; - using gemmlowp::Rescale; - using gemmlowp::SaturatingRoundingMultiplyByPOT; - // Using 3 integer bits gives us enough room for the internal arithmetic in - // this Newton-Raphson iteration. - using F3 = FixedPoint; - using F0 = FixedPoint; - const F3 fixedpoint_input = F3::FromRaw(input >> 1); - const F3 fixedpoint_half_input = - SaturatingRoundingMultiplyByPOT<-1>(fixedpoint_input); - const F3 fixedpoint_half_three = - GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F3, (1 << 28) + (1 << 27), 1.5); - // Newton-Raphson iteration - // Naive unoptimized starting guess: x = 1 - F3 x = F3::One(); - // Naive unoptimized number of iterations: 5 - for (int i = 0; i < 5; i++) { - const F3 x3 = Rescale<3>(x * x * x); - x = Rescale<3>(fixedpoint_half_three * x - fixedpoint_half_input * x3); - } - const F0 fixedpoint_half_sqrt_2 = - GEMMLOWP_CHECKED_FIXEDPOINT_CONSTANT(F0, 1518500250, std::sqrt(2.) / 2.); - x = x * fixedpoint_half_sqrt_2; - *output_inv_sqrt = x.raw(); - if (*output_shift < 0) { - *output_inv_sqrt <<= -*output_shift; - *output_shift = 0; - } - // Convert right shift (right is positive) to left shift. - *output_shift *= reverse_shift; -} - -// DO NOT USE THIS STRUCT FOR NEW FUNCTIONALITY BEYOND IMPLEMENTING -// BROADCASTING. -// -// NdArrayDesc describes the shape and memory layout of an N-dimensional -// rectangular array of numbers. -// -// NdArrayDesc is basically identical to Dims defined in types.h. -// However, as Dims is to be deprecated, this class exists as an adaptor -// to enable simple unoptimized implementations of element-wise broadcasting -// operations. -template -struct NdArrayDesc { - // The "extent" of each dimension. Indices along dimension d must be in the - // half-open interval [0, extents[d]). - int extents[N]; - - // The number of *elements* (not bytes) between consecutive indices of each - // dimension. - int strides[N]; -}; - -// DO NOT USE THIS FUNCTION FOR NEW FUNCTIONALITY BEYOND IMPLEMENTING -// BROADCASTING. -// -// Same as Offset(), except takes as NdArrayDesc instead of Dims. -inline int SubscriptToIndex(const NdArrayDesc<4>& desc, int i0, int i1, int i2, - int i3) { - TFLITE_DCHECK(i0 >= 0 && i0 < desc.extents[0]); - TFLITE_DCHECK(i1 >= 0 && i1 < desc.extents[1]); - TFLITE_DCHECK(i2 >= 0 && i2 < desc.extents[2]); - TFLITE_DCHECK(i3 >= 0 && i3 < desc.extents[3]); - return i0 * desc.strides[0] + i1 * desc.strides[1] + i2 * desc.strides[2] + - i3 * desc.strides[3]; -} - -inline int SubscriptToIndex(const NdArrayDesc<5>& desc, int indexes[5]) { - return indexes[0] * desc.strides[0] + indexes[1] * desc.strides[1] + - indexes[2] * desc.strides[2] + indexes[3] * desc.strides[3] + - indexes[4] * desc.strides[4]; -} - -// Given the dimensions of the operands for an element-wise binary broadcast, -// adjusts them so that they can be directly iterated over with simple loops. -// Returns the adjusted dims as instances of NdArrayDesc in 'desc0_out' and -// 'desc1_out'. 'desc0_out' and 'desc1_out' cannot be nullptr. -// -// This function assumes that the two input shapes are compatible up to -// broadcasting and the shorter one has already been prepended with 1s to be the -// same length. E.g., if shape0 is (1, 16, 16, 64) and shape1 is (1, 64), -// shape1 must already have been prepended to be (1, 1, 1, 64). Recall that -// Dims refer to shapes in reverse order. In this case, input0_dims will be -// (64, 16, 16, 1) and input1_dims will be (64, 1, 1, 1). -// -// When two shapes are compatible up to broadcasting, for each dimension d, -// the input extents are either equal, or one of them is 1. -// -// This function performs the following for each dimension d: -// - If the extents are equal, then do nothing since the loop that walks over -// both of the input arrays is correct. -// - Otherwise, one (and only one) of the extents must be 1. Say extent0 is 1 -// and extent1 is e1. Then set extent0 to e1 and stride0 *to 0*. This allows -// array0 to be referenced *at any index* in dimension d and still access the -// same slice. -template -inline void NdArrayDescsForElementwiseBroadcast(const Dims& input0_dims, - const Dims& input1_dims, - NdArrayDesc* desc0_out, - NdArrayDesc* desc1_out) { - TFLITE_DCHECK(desc0_out != nullptr); - TFLITE_DCHECK(desc1_out != nullptr); - - // Copy dims to desc. - for (int i = 0; i < N; ++i) { - desc0_out->extents[i] = input0_dims.sizes[i]; - desc0_out->strides[i] = input0_dims.strides[i]; - desc1_out->extents[i] = input1_dims.sizes[i]; - desc1_out->strides[i] = input1_dims.strides[i]; - } - - // Walk over each dimension. If the extents are equal do nothing. - // Otherwise, set the desc with extent 1 to have extent equal to the other and - // stride 0. - for (int i = 0; i < N; ++i) { - const int extent0 = ArraySize(input0_dims, i); - const int extent1 = ArraySize(input1_dims, i); - if (extent0 != extent1) { - if (extent0 == 1) { - desc0_out->strides[i] = 0; - desc0_out->extents[i] = extent1; - } else { - TFLITE_DCHECK_EQ(extent1, 1); - desc1_out->strides[i] = 0; - desc1_out->extents[i] = extent0; - } - } - } -} - -// Copies dims to desc, calculating strides. -template -inline void CopyDimsToDesc(const RuntimeShape& input_shape, - NdArrayDesc* desc_out) { - int desc_stride = 1; - for (int i = N - 1; i >= 0; --i) { - desc_out->extents[i] = input_shape.Dims(i); - desc_out->strides[i] = desc_stride; - desc_stride *= input_shape.Dims(i); - } -} - -template -inline void NdArrayDescsForElementwiseBroadcast( - const RuntimeShape& input0_shape, const RuntimeShape& input1_shape, - NdArrayDesc* desc0_out, NdArrayDesc* desc1_out) { - TFLITE_DCHECK(desc0_out != nullptr); - TFLITE_DCHECK(desc1_out != nullptr); - - auto extended_input0_shape = RuntimeShape::ExtendedShape(N, input0_shape); - auto extended_input1_shape = RuntimeShape::ExtendedShape(N, input1_shape); - - // Copy dims to desc, calculating strides. - CopyDimsToDesc(extended_input0_shape, desc0_out); - CopyDimsToDesc(extended_input1_shape, desc1_out); - - // Walk over each dimension. If the extents are equal do nothing. - // Otherwise, set the desc with extent 1 to have extent equal to the other and - // stride 0. - for (int i = 0; i < N; ++i) { - const int extent0 = extended_input0_shape.Dims(i); - const int extent1 = extended_input1_shape.Dims(i); - if (extent0 != extent1) { - if (extent0 == 1) { - desc0_out->strides[i] = 0; - desc0_out->extents[i] = extent1; - } else { - TFLITE_DCHECK_EQ(extent1, 1); - desc1_out->strides[i] = 0; - desc1_out->extents[i] = extent0; - } - } - } -} - -template -inline void NdArrayDescsForElementwiseBroadcast( - const RuntimeShape& input0_shape, const RuntimeShape& input1_shape, - const RuntimeShape& input2_shape, NdArrayDesc* desc0_out, - NdArrayDesc* desc1_out, NdArrayDesc* desc2_out) { - TFLITE_DCHECK(desc0_out != nullptr); - TFLITE_DCHECK(desc1_out != nullptr); - TFLITE_DCHECK(desc2_out != nullptr); - - auto extended_input0_shape = RuntimeShape::ExtendedShape(N, input0_shape); - auto extended_input1_shape = RuntimeShape::ExtendedShape(N, input1_shape); - auto extended_input2_shape = RuntimeShape::ExtendedShape(N, input2_shape); - - // Copy dims to desc, calculating strides. - CopyDimsToDesc(extended_input0_shape, desc0_out); - CopyDimsToDesc(extended_input1_shape, desc1_out); - CopyDimsToDesc(extended_input2_shape, desc2_out); - - // Walk over each dimension. If the extents are equal do nothing. - // Otherwise, set the desc with extent 1 to have extent equal to the other and - // stride 0. - for (int i = 0; i < N; ++i) { - const int extent0 = extended_input0_shape.Dims(i); - const int extent1 = extended_input1_shape.Dims(i); - const int extent2 = extended_input2_shape.Dims(i); - - int extent = extent0; - if (extent1 != 1) extent = extent1; - if (extent2 != 1) extent = extent2; - - TFLITE_DCHECK(extent0 == 1 || extent0 == extent); - TFLITE_DCHECK(extent1 == 1 || extent1 == extent); - TFLITE_DCHECK(extent2 == 1 || extent2 == extent); - - if (!(extent0 == extent1 && extent1 == extent2)) { - if (extent0 == 1) { - desc0_out->strides[i] = 0; - desc0_out->extents[i] = extent; - } - if (extent1 == 1) { - desc1_out->strides[i] = 0; - desc1_out->extents[i] = extent; - } - if (extent2 == 1) { - desc2_out->strides[i] = 0; - desc2_out->extents[i] = extent; - } - } - } -} - -// Detailed implementation of NDOpsHelper, the indexes must be a zero array. -// This implementation is equivalent to N nested loops. Ex, if N=4, it can be -// re-writen as: -// for (int b = 0; b < output.extents[0]; ++b) { -// for (int y = 0; y < output.extents[1]; ++y) { -// for (int x = 0; x < output.extents[2]; ++x) { -// for (int c = 0; c < output.extents[3]; ++c) { -// calc({b,y,x,c}); -// } -// } -// } -// } -template -typename std::enable_if::type NDOpsHelperImpl( - const NdArrayDesc& output, const Calc& calc, int indexes[N]) { - for (indexes[DIM] = 0; indexes[DIM] < output.extents[DIM]; ++indexes[DIM]) { - NDOpsHelperImpl(output, calc, indexes); - } -} - -template -typename std::enable_if::type NDOpsHelperImpl( - const NdArrayDesc& output, const Calc& calc, int indexes[N]) { - for (indexes[DIM] = 0; indexes[DIM] < output.extents[DIM]; ++indexes[DIM]) { - calc(indexes); - } -} - -// Execute the calc function in the innermost iteration based on the shape of -// the output. The calc function should take a single argument of type int[N]. -template -inline void NDOpsHelper(const NdArrayDesc& output, const Calc& calc) { - int indexes[N] = {0}; - NDOpsHelperImpl(output, calc, indexes); -} -// Copied from gemmlowp::RoundDown when we dropped direct dependency on -// gemmlowp. -// -// Returns the runtime argument rounded down to the nearest multiple of -// the fixed Modulus. -template -Integer RoundDown(Integer i) { - return i - (i % Modulus); -} - -// Copied from gemmlowp::RoundUp when we dropped direct dependency on -// gemmlowp. -// -// Returns the runtime argument rounded up to the nearest multiple of -// the fixed Modulus. -template -Integer RoundUp(Integer i) { - return RoundDown(i + Modulus - 1); -} - -// Copied from gemmlowp::CeilQuotient when we dropped direct dependency on -// gemmlowp. -// -// Returns the quotient a / b rounded up ('ceil') to the nearest integer. -template -Integer CeilQuotient(Integer a, Integer b) { - return (a + b - 1) / b; -} - -// This function is a copy of gemmlowp::HowManyThreads, copied when we dropped -// the direct dependency of internal/optimized/ on gemmlowp. -// -// It computes a reasonable number of threads to use for a GEMM of shape -// (rows, cols, depth). -// -// TODO(b/131910176): get rid of this function by switching each call site -// to its own more sensible logic for its own workload. -template -inline int LegacyHowManyThreads(int max_num_threads, int rows, int cols, - int depth) { - // Early-exit in the default case where multi-threading is disabled. - if (max_num_threads == 1) { - return 1; - } - - // Ensure that each thread has KernelRows rows to process, if at all possible. - int thread_count = std::min(max_num_threads, rows / KernelRows); - - // Limit the number of threads according to the overall size of the problem. - if (thread_count > 1) { - // Empirically determined value. - static constexpr std::uint64_t min_cubic_size_per_thread = 64 * 1024; - - // We can only multiply two out of three sizes without risking overflow - const std::uint64_t cubic_size = - std::uint64_t(rows) * std::uint64_t(cols) * std::uint64_t(depth); - - thread_count = std::min( - thread_count, static_cast(cubic_size / min_cubic_size_per_thread)); - } - - if (thread_count < 1) { - thread_count = 1; - } - - assert(thread_count > 0 && thread_count <= max_num_threads); - return thread_count; -} - -template -void optimized_ops_preload_l1_stream(const T* ptr) { -#ifdef __GNUC__ - // builtin offered by GCC-compatible compilers including clang - __builtin_prefetch(ptr, /* 0 means read */ 0, /* 0 means no locality */ 0); -#else - (void)ptr; -#endif -} - -template -void optimized_ops_preload_l1_keep(const T* ptr) { -#ifdef __GNUC__ - // builtin offered by GCC-compatible compilers including clang - __builtin_prefetch(ptr, /* 0 means read */ 0, /* 3 means high locality */ 3); -#else - (void)ptr; -#endif -} - -template -void optimized_ops_prefetch_write_l1_keep(const T* ptr) { -#ifdef __GNUC__ - // builtin offered by GCC-compatible compilers including clang - __builtin_prefetch(ptr, /* 1 means write */ 1, /* 3 means high locality */ 3); -#else - (void)ptr; -#endif -} - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_COMMON_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/compatibility.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/compatibility.h deleted file mode 100644 index 61becad3..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/compatibility.h +++ /dev/null @@ -1,112 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ - -#include - -#include "tensorflow/lite/kernels/op_macros.h" - -#ifndef TFLITE_DCHECK -#define TFLITE_DCHECK(condition) (condition) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_EQ -#define TFLITE_DCHECK_EQ(x, y) ((x) == (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_NE -#define TFLITE_DCHECK_NE(x, y) ((x) != (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_GE -#define TFLITE_DCHECK_GE(x, y) ((x) >= (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_GT -#define TFLITE_DCHECK_GT(x, y) ((x) > (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_LE -#define TFLITE_DCHECK_LE(x, y) ((x) <= (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -#ifndef TFLITE_DCHECK_LT -#define TFLITE_DCHECK_LT(x, y) ((x) < (y)) ? (void)0 : TFLITE_ASSERT_FALSE -#endif - -// TODO(ahentz): Clean up: We should stick to the DCHECK versions. -#ifndef TFLITE_CHECK -#define TFLITE_CHECK(condition) (condition) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_EQ -#define TFLITE_CHECK_EQ(x, y) ((x) == (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_NE -#define TFLITE_CHECK_NE(x, y) ((x) != (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_GE -#define TFLITE_CHECK_GE(x, y) ((x) >= (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_GT -#define TFLITE_CHECK_GT(x, y) ((x) > (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_LE -#define TFLITE_CHECK_LE(x, y) ((x) <= (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TFLITE_CHECK_LT -#define TFLITE_CHECK_LT(x, y) ((x) < (y)) ? (void)0 : TFLITE_ABORT -#endif - -#ifndef TF_LITE_STATIC_MEMORY -// TODO(b/162019032): Consider removing these type-aliases. -using int8 = std::int8_t; -using uint8 = std::uint8_t; -using int16 = std::int16_t; -using uint16 = std::uint16_t; -using int32 = std::int32_t; -using uint32 = std::uint32_t; -#endif // !defined(TF_LITE_STATIC_MEMORY) - -// TFLITE_DEPRECATED() -// -// Duplicated from absl/base/macros.h to avoid pulling in that library. -// Marks a deprecated class, struct, enum, function, method and variable -// declarations. The macro argument is used as a custom diagnostic message (e.g. -// suggestion of a better alternative). -// -// Example: -// -// class TFLITE_DEPRECATED("Use Bar instead") Foo {...}; -// TFLITE_DEPRECATED("Use Baz instead") void Bar() {...} -// -// Every usage of a deprecated entity will trigger a warning when compiled with -// clang's `-Wdeprecated-declarations` option. This option is turned off by -// default, but the warnings will be reported by clang-tidy. -#if defined(__clang__) && __cplusplus >= 201103L -#define TFLITE_DEPRECATED(message) __attribute__((deprecated(message))) -#endif - -#ifndef TFLITE_DEPRECATED -#define TFLITE_DEPRECATED(message) -#endif - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_COMPATIBILITY_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/cppmath.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/cppmath.h deleted file mode 100644 index 24a3aec8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/cppmath.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ - -#include - -namespace tflite { - -#if defined(TF_LITE_USE_GLOBAL_CMATH_FUNCTIONS) || \ - (defined(__ANDROID__) && !defined(__NDK_MAJOR__)) || defined(ARDUINO) || \ - defined(__ZEPHYR__) -#define TF_LITE_GLOBAL_STD_PREFIX -#else -#define TF_LITE_GLOBAL_STD_PREFIX std -#endif - -#define DECLARE_STD_GLOBAL_SWITCH1(tf_name, std_name) \ - template \ - inline T tf_name(const T x) { \ - return TF_LITE_GLOBAL_STD_PREFIX::std_name(x); \ - } - -DECLARE_STD_GLOBAL_SWITCH1(TfLiteRound, round); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_CPPMATH_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/max.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/max.h deleted file mode 100644 index c1810027..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/max.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ - -#include - -namespace tflite { - -#if defined(TF_LITE_USE_GLOBAL_MAX) || defined(__ZEPHYR__) -inline float TfLiteMax(const float& x, const float& y) { - return std::max(x, y); -} -#else -template -inline T TfLiteMax(const T& x, const T& y) { - return std::fmax(x, y); -} -#endif - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_MAX_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/min.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/min.h deleted file mode 100644 index 62035dcc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/min.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ - -#include - -namespace tflite { - -#if defined(TF_LITE_USE_GLOBAL_MIN) || defined(__ZEPHYR__) -inline float TfLiteMin(const float& x, const float& y) { - return std::min(x, y); -} -#else -template -inline T TfLiteMin(const T& x, const T& y) { - return std::fmin(x, y); -} -#endif - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_MIN_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/optimized/neon_check.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/optimized/neon_check.h deleted file mode 100644 index bbf745ce..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/optimized/neon_check.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ - -#if defined(__ARM_NEON__) || defined(__ARM_NEON) -#define USE_NEON -#include -#endif - -#if defined __GNUC__ && defined __SSE4_1__ && !defined TF_LITE_DISABLE_X86_NEON -#define USE_NEON -#include "NEON_2_SSE.h" -#endif - -// NEON_OR_PORTABLE(SomeFunc, args) calls NeonSomeFunc(args) if USE_NEON is -// defined, PortableSomeFunc(args) otherwise. -#ifdef USE_NEON -// Always use Neon code -#define NEON_OR_PORTABLE(funcname, ...) Neon##funcname(__VA_ARGS__) - -#else -// No NEON available: Use Portable code -#define NEON_OR_PORTABLE(funcname, ...) Portable##funcname(__VA_ARGS__) - -#endif // defined(USE_NEON) - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_OPTIMIZED_NEON_CHECK_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/quantization_util.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/quantization_util.h deleted file mode 100644 index 0ee914b0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/quantization_util.h +++ /dev/null @@ -1,292 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ - -#include -#include -#include - -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -// Given the min and max values of a float array, return -// reasonable quantization parameters to use for this array. -template -QuantizationParams ChooseQuantizationParams(double rmin, double rmax, - bool narrow_range) { - const T qmin = std::numeric_limits::min() + (narrow_range ? 1 : 0); - const T qmax = std::numeric_limits::max(); - const double qmin_double = qmin; - const double qmax_double = qmax; - // 0 should always be a representable value. Let's assume that the initial - // min,max range contains 0. - TFLITE_CHECK_LE(rmin, 0.); - TFLITE_CHECK_GE(rmax, 0.); - if (rmin == rmax) { - // Special case where the min,max range is a point. Should be {0}. - TFLITE_CHECK_EQ(rmin, 0.); - TFLITE_CHECK_EQ(rmax, 0.); - QuantizationParams quantization_params; - quantization_params.zero_point = 0; - quantization_params.scale = 0.; - return quantization_params; - } - - // General case. - // - // First determine the scale. - const double scale = (rmax - rmin) / (qmax_double - qmin_double); - - // Zero-point computation. - // First the initial floating-point computation. The zero-point can be - // determined from solving an affine equation for any known pair - // (real value, corresponding quantized value). - // We know two such pairs: (rmin, qmin) and (rmax, qmax). - // The arithmetic error on the zero point computed from either pair - // will be roughly machine_epsilon * (sum of absolute values of terms) - // so we want to use the variant that adds the smaller terms. - const double zero_point_from_min = qmin_double - rmin / scale; - const double zero_point_from_max = qmax_double - rmax / scale; - const double zero_point_from_min_error = - std::abs(qmin_double) + std::abs(rmin / scale); - const double zero_point_from_max_error = - std::abs(qmax_double) + std::abs(rmax / scale); - - const double zero_point_double = - zero_point_from_min_error < zero_point_from_max_error - ? zero_point_from_min - : zero_point_from_max; - - // Now we need to nudge the zero point to be an integer - // (our zero points are integer, and this is motivated by the requirement - // to be able to represent the real value "0" exactly as a quantized value, - // which is required in multiple places, for example in Im2col with SAME - // padding). - T nudged_zero_point = 0; - if (zero_point_double < qmin_double) { - nudged_zero_point = qmin; - } else if (zero_point_double > qmax_double) { - nudged_zero_point = qmax; - } else { - nudged_zero_point = static_cast(round(zero_point_double)); - } - // The zero point should always be in the range of quantized value, - // [qmin, qmax]. - TFLITE_CHECK_GE(nudged_zero_point, qmin); - TFLITE_CHECK_LE(nudged_zero_point, qmax); - - // Finally, store the result nudged quantization params. - QuantizationParams quantization_params; - quantization_params.zero_point = nudged_zero_point; - quantization_params.scale = scale; - return quantization_params; -} - -template -QuantizationParams ChooseQuantizationParams(double rmin, double rmax) { - return ChooseQuantizationParams(rmin, rmax, false); -} - -// Converts a floating-point number to an integer. For all inputs x where -// static_cast(x) is legal according to the C++ standard, the result -// is identical to that cast (i.e. the result is x with its fractional part -// truncated whenever that is representable as IntOut). -// -// static_cast would cause undefined behavior for the following cases, which -// have well-defined behavior for this function: -// -// 1. If x is NaN, the result is zero. -// -// 2. If the truncated form of x is above the representable range of IntOut, -// the result is std::numeric_limits::max(). -// -// 3. If the truncated form of x is below the representable range of IntOut, -// the result is std::numeric_limits::min(). -// -// Note that cases #2 and #3 cover infinities as well as finite numbers. -// -// The range of FloatIn must include the range of IntOut, otherwise -// the results are undefined. -// TODO(sfeuz): Replace by absl::SafeCast once available. -template -IntOut SafeCast(FloatIn x) { - static_assert(!std::numeric_limits::is_integer, - "FloatIn is integer"); - static_assert(std::numeric_limits::is_integer, - "IntOut is not integer"); - static_assert(std::numeric_limits::radix == 2, "IntOut is base 2"); - - // Special case NaN, for which the logic below doesn't work. - if (std::isnan(x)) { - return 0; - } - - // Negative values all clip to zero for unsigned results. - if (!std::numeric_limits::is_signed && x < 0) { - return 0; - } - - // Handle infinities. - if (std::isinf(x)) { - return x < 0 ? std::numeric_limits::min() - : std::numeric_limits::max(); - } - - // Set exp such that x == f * 2^exp for some f with |f| in [0.5, 1.0), - // unless x is zero in which case exp == 0. Note that this implies that the - // magnitude of x is strictly less than 2^exp. - int exp = 0; - std::frexp(x, &exp); - - // Let N be the number of non-sign bits in the representation of IntOut. If - // the magnitude of x is strictly less than 2^N, the truncated version of x - // is representable as IntOut. The only representable integer for which this - // is not the case is kMin for signed types (i.e. -2^N), but that is covered - // by the fall-through below. - if (exp <= std::numeric_limits::digits) { - return x; - } - - // Handle numbers with magnitude >= 2^N. - return x < 0 ? std::numeric_limits::min() - : std::numeric_limits::max(); -} - -// Decompose a double multiplier into a Q0.31 int32 representation of its -// significand, and shift representation of NEGATIVE its exponent --- -// this is intended as a RIGHT-shift. -// -// Restricted to the case where the multiplier < 1 (and non-negative). -void QuantizeMultiplierSmallerThanOneExp(double double_multiplier, - int32_t* quantized_multiplier, - int* left_shift); - -// Decompose a double multiplier into a Q0.31 int32 representation of its -// significand, and shift representation of its exponent. -// -// Restricted to the case where the multiplier > 1. -void QuantizeMultiplierGreaterThanOne(double double_multiplier, - int32_t* quantized_multiplier, - int* left_shift); - -// Decompose a double multiplier into a Q0.31 int32 representation of its -// significand, and shift representation of its exponent. -// -// Handles an arbitrary positive multiplier. The 'shift' output-value is -// basically the 'floating-point exponent' of the multiplier: -// Negative for a right-shift (when the multiplier is <1), positive for a -// left-shift (when the multiplier is >1) -void QuantizeMultiplier(double double_multiplier, int32_t* quantized_multiplier, - int* shift); - -// Splits a double input value into a returned fraction, and a shift value from -// the exponent, using only bitwise and integer operations to support -// microcontrollers and other environments without floating-point support. -// -// This is designed to be a replacement for how std::frexp() is used within the -// QuantizeMultiplier() function, and so has a different signature than the -// standard version, returning a 64-bit integer rather than a double. This -// result has a maximum value of 1<<31, with the fraction expressed as a -// proportion of that maximum. -// -// std::frexp() returns NaNs and infinities unmodified, but since we're -// returning integers that can't represent those values, instead we return -// a shift of std::numeric_limits::max() for all bad numbers, with an int64 -// result of 0 for NaNs, std:numeric_limits::max() for +INFINITY, and -// std::numeric_limits::min() for -INFINITY. Denormalized inputs will -// result in return values that end up truncating some bits at the end, -// reflecting the loss of precision inherent in denormalization. -int64_t IntegerFrExp(double input, int* shift); - -// Converts an integer fraction in the format produced by IntegerFrExp (where -// 0x40000000 is 1.0) and an exponent shift (between -1022 and +1022) into an -// IEEE binary64 double format result. The implementation uses only integer and -// bitwise operators, so no floating point hardware support or emulation is -// needed. This is here so quantized operations can run non-time-critical -// preparation calculations on microcontrollers and other platforms without -// float support. -double DoubleFromFractionAndShift(int64_t fraction, int shift); - -// Performs a multiplication of two numbers in double format, using only integer -// and bitwise instructions. This is aimed at supporting housekeeping functions -// for quantized operations on microcontrollers without floating-point hardware. -double IntegerDoubleMultiply(double a, double b); - -// Returns -1 if a is less than b, 0 if a and b are equal, and +1 if a is -// greater than b. It is implemented using only integer and logical instructions -// so that it can be easily run on microcontrollers for quantized operations. -int IntegerDoubleCompare(double a, double b); - -// This first creates a multiplier in a double equivalent of -// Q(input_integer_bits).(31-input_integer_bits) representation, with extra -// precision in the double's fractional bits. It then splits the result into -// significand and exponent. -void PreprocessSoftmaxScaling(double beta, double input_scale, - int input_integer_bits, - int32_t* quantized_multiplier, int* left_shift); -// Like PreprocessSoftmaxScaling, but inverse scaling factors also calculated. -void PreprocessLogSoftmaxScalingExp(double beta, double input_scale, - int input_integer_bits, - int32_t* quantized_multiplier, - int* left_shift, - int32_t* reverse_scaling_divisor, - int* reverse_scaling_left_shift); -// Calculate the largest input that will result in a within-bounds intermediate -// result within MultiplyByQuantizedMultiplierGreaterThanOne. In other words, -// it must not overflow before we reduce the value by multiplication by the -// input multiplier. The negative radius is used as the minimum difference in -// Softmax. -int CalculateInputRadius(int input_integer_bits, int input_left_shift, - int total_signed_bits = 31); - -// Nudges a min/max quantization range to ensure zero is zero. -// Gymnastics with nudged zero point is to ensure that real zero maps to -// an integer, which is required for e.g. zero-padding in convolutional layers. -// Outputs nudged_min, nudged_max, nudged_scale. -void NudgeQuantizationRange(const float min, const float max, - const int quant_min, const int quant_max, - float* nudged_min, float* nudged_max, - float* nudged_scale); - -// Fake quantizes (quantizes and dequantizes) input_data using the scale, -// nudged_min, and nudged_max from NudgeQuantizationRange. This matches the code -// in TensorFlow's FakeQuantizeWithMinMaxVarsFunctor. -void FakeQuantizeArray(const float nudged_scale, const float nudged_min, - const float nudged_max, const float* input_data, - float* output_data, const float size); - -// If x is approximately a power of two (with any positive or negative -// exponent), stores that exponent (i.e. log2(x)) in *log2_result, otherwise -// returns false. -bool CheckedLog2(const float x, int* log2_result); - -// Decomposes an array of double multipliers into a Q0.31 int32 representation -// of its significand, and shift representation of its exponent. -// -// Handles an arbitrary multiplier. The 'shift' output-value is -// basically the 'floating-point exponent' of the multiplier: -// Negative for a right-shift (when the multiplier is <1), positive for a -// left-shift (when the multiplier is >1) -void QuantizeMultiplierArray(const double* effective_scales, size_t size, - int32_t* effective_scale_significand, - int* effective_shift); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_QUANTIZATION_UTIL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/add.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/add.h deleted file mode 100644 index 5be7ab4d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/add.h +++ /dev/null @@ -1,454 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { - -namespace reference_ops { - -template -inline void Add(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const T* input1_data, - const RuntimeShape& input2_shape, const T* input2_data, - const RuntimeShape& output_shape, T* output_data) { - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = ActivationFunctionWithMinMax( - input1_data[i] + input2_data[i], params.quantized_activation_min, - params.quantized_activation_max); - } -} - -inline void Add(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const float* input1_data, - const RuntimeShape& input2_shape, const float* input2_data, - const RuntimeShape& output_shape, float* output_data) { - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; i++) { - auto x = input1_data[i] + input2_data[i]; - output_data[i] = ActivationFunctionWithMinMax( - x, params.float_activation_min, params.float_activation_max); - } -} - -// Element-wise add that can often be used for inner loop of broadcast add as -// well as the non-broadcast add. - -// This function is used for 8-bit as well as for 16-bit, but the accumulator -// is 32-bit for both cases. The overflow does not happen due to the -// choice of the shift (20 or 15, accordingly - see add.cc for more comments). -template -inline void AddElementwise(int size, const ArithmeticParams& params, - const T* input1_data, const T* input2_data, - T* output_data) { - TFLITE_DCHECK_GT(params.input1_offset, -std::numeric_limits::max()); - TFLITE_DCHECK_GT(params.input2_offset, -std::numeric_limits::max()); - TFLITE_DCHECK_LT(params.input1_offset, std::numeric_limits::max()); - TFLITE_DCHECK_LT(params.input2_offset, std::numeric_limits::max()); - - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sum = scaled_input1_val + scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[i] = static_cast(clamped_output); - } -} - -// Scalar-broadcast add that can be used for inner loop of more general -// broadcast add, so that, for example, scalar-broadcast with batch will still -// be fast. -inline void AddScalarBroadcast(int size, const ArithmeticParams& params, - uint8_t input1_data, const uint8_t* input2_data, - uint8_t* output_data) { - TFLITE_DCHECK_GT(params.input1_offset, -256); - TFLITE_DCHECK_GT(params.input2_offset, -256); - TFLITE_DCHECK_LT(params.input1_offset, 256); - TFLITE_DCHECK_LT(params.input2_offset, 256); - - const int32_t input1_val = params.input1_offset + input1_data; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - for (int i = 0; i < size; ++i) { - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sum = scaled_input1_val + scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[i] = static_cast(clamped_output); - } -} - -inline void Add(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const uint8_t* input1_data, - const RuntimeShape& input2_shape, const uint8_t* input2_data, - const RuntimeShape& output_shape, uint8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - TFLITE_DCHECK_GT(params.input1_offset, -256); - TFLITE_DCHECK_GT(params.input2_offset, -256); - TFLITE_DCHECK_LT(params.input1_offset, 256); - TFLITE_DCHECK_LT(params.input2_offset, 256); - AddElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -inline void AddGeneralParamScale(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int16_t* input1_data, - const RuntimeShape& input2_shape, - const int16_t* input2_data, - const RuntimeShape& output_shape, - int16_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - int max_value = std::numeric_limits::max(); - - TFLITE_DCHECK_GT(params.input1_offset, -max_value); - TFLITE_DCHECK_GT(params.input2_offset, -max_value); - TFLITE_DCHECK_LT(params.input1_offset, max_value); - TFLITE_DCHECK_LT(params.input2_offset, max_value); - AddElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -inline void Add(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const int16_t* input1_data, - const RuntimeShape& input2_shape, const int16_t* input2_data, - const RuntimeShape& output_shape, int16_t* output_data, - bool pot_scale = true) { - if (!pot_scale) { - AddGeneralParamScale(params, input1_shape, input1_data, input2_shape, - input2_data, output_shape, output_data); - return; - } - - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - - const int input1_shift = params.input1_shift; - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - const int16_t output_activation_min = params.quantized_activation_min; - const int16_t output_activation_max = params.quantized_activation_max; - - TFLITE_DCHECK(input1_shift == 0 || params.input2_shift == 0); - TFLITE_DCHECK_LE(input1_shift, 0); - TFLITE_DCHECK_LE(params.input2_shift, 0); - const int16_t* not_shift_input = - input1_shift == 0 ? input1_data : input2_data; - const int16_t* shift_input = input1_shift == 0 ? input2_data : input1_data; - const int input_right_shift = - input1_shift == 0 ? -params.input2_shift : -input1_shift; - - for (int i = 0; i < flat_size; i++) { - // F0 uses 0 integer bits, range [-1, 1]. - using F0 = gemmlowp::FixedPoint; - - F0 input_ready_scaled = F0::FromRaw(not_shift_input[i]); - F0 scaled_input = F0::FromRaw( - gemmlowp::RoundingDivideByPOT(shift_input[i], input_right_shift)); - F0 result = gemmlowp::SaturatingAdd(scaled_input, input_ready_scaled); - const int16_t raw_output = result.raw(); - const int16_t clamped_output = std::min( - output_activation_max, std::max(output_activation_min, raw_output)); - output_data[i] = clamped_output; - } -} - -// TODO(jiawen): We can implement BroadcastAdd on buffers of arbitrary -// dimensionality if the runtime code does a single loop over one dimension -// that handles broadcasting as the base case. The code generator would then -// generate max(D1, D2) nested for loops. -// TODO(benoitjacob): BroadcastAdd is intentionally duplicated from -// reference_ops.h. Once an optimized version is implemented and NdArrayDesc -// is no longer referenced in this file, move NdArrayDesc from types.h to -// reference_ops.h. -inline void BroadcastAdd4DSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const float* input1_data, - const RuntimeShape& input2_shape, - const float* input2_data, - const RuntimeShape& output_shape, - float* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - output_data[Offset(extended_output_shape, b, y, x, c)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, b, y, x, c)] + - input2_data[SubscriptToIndex(desc2, b, y, x, c)], - params.float_activation_min, params.float_activation_max); - } - } - } - } -} - -inline void BroadcastAdd4DSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int32_t* input1_data, - const RuntimeShape& input2_shape, - const int32_t* input2_data, - const RuntimeShape& output_shape, - int32_t* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - output_data[Offset(extended_output_shape, b, y, x, c)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, b, y, x, c)] + - input2_data[SubscriptToIndex(desc2, b, y, x, c)], - params.quantized_activation_min, - params.quantized_activation_max); - } - } - } - } -} - -// This function is used for 8-bit as well as for 16-bit, but the accumulator -// is 32-bit for both cases. The overflow does not happen due to the -// choice of the shift (20 or 15, accordingly - see add.cc for more comments). -template -inline void BroadcastAdd4DSlow( - const ArithmeticParams& params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, T* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - const int32_t input1_val = - params.input1_offset + - input1_data[SubscriptToIndex(desc1, b, y, x, c)]; - const int32_t input2_val = - params.input2_offset + - input2_data[SubscriptToIndex(desc2, b, y, x, c)]; - const int32_t shifted_input1_val = - input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = - input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, - params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, - params.input2_shift); - const int32_t raw_sum = scaled_input1_val + scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[Offset(extended_output_shape, b, y, x, c)] = - static_cast(clamped_output); - } - } - } - } -} - -inline void BroadcastAddFivefold(const ArithmeticParams& unswitched_params, - const RuntimeShape& unswitched_input1_shape, - const uint8_t* unswitched_input1_data, - const RuntimeShape& unswitched_input2_shape, - const uint8_t* unswitched_input2_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - ArithmeticParams switched_params = unswitched_params; - switched_params.input1_offset = unswitched_params.input2_offset; - switched_params.input1_multiplier = unswitched_params.input2_multiplier; - switched_params.input1_shift = unswitched_params.input2_shift; - switched_params.input2_offset = unswitched_params.input1_offset; - switched_params.input2_multiplier = unswitched_params.input1_multiplier; - switched_params.input2_shift = unswitched_params.input1_shift; - - const bool use_unswitched = - unswitched_params.broadcast_category == - tflite::BroadcastableOpCategory::kFirstInputBroadcastsFast; - - const ArithmeticParams& params = - use_unswitched ? unswitched_params : switched_params; - const uint8_t* input1_data = - use_unswitched ? unswitched_input1_data : unswitched_input2_data; - const uint8_t* input2_data = - use_unswitched ? unswitched_input2_data : unswitched_input1_data; - - // Fivefold nested loops. The second input resets its position for each - // iteration of the second loop. The first input resets its position at the - // beginning of the fourth loop. The innermost loop is an elementwise add of - // sections of the arrays. - uint8_t* output_data_ptr = output_data; - const uint8_t* input1_data_ptr = input1_data; - const uint8_t* input2_data_reset = input2_data; - // In the fivefold pattern, y0, y2 and y4 are not broadcast, and so shared - // between input shapes. y3 for input 1 is always broadcast, and so the - // dimension there is 1, whereas optionally y1 might be broadcast for input 2. - // Put another way, - // input1.shape.FlatSize = y0 * y1 * y2 * y4, - // input2.shape.FlatSize = y0 * y2 * y3 * y4. - int y0 = params.broadcast_shape[0]; - int y1 = params.broadcast_shape[1]; - int y2 = params.broadcast_shape[2]; - int y3 = params.broadcast_shape[3]; - int y4 = params.broadcast_shape[4]; - if (y4 > 1) { - // General fivefold pattern, with y4 > 1 so there is a non-broadcast inner - // dimension. - for (int i0 = 0; i0 < y0; ++i0) { - const uint8_t* input2_data_ptr; - for (int i1 = 0; i1 < y1; ++i1) { - input2_data_ptr = input2_data_reset; - for (int i2 = 0; i2 < y2; ++i2) { - for (int i3 = 0; i3 < y3; ++i3) { - AddElementwise(y4, params, input1_data_ptr, input2_data_ptr, - output_data_ptr); - input2_data_ptr += y4; - output_data_ptr += y4; - } - // We have broadcast y4 of input1 data y3 times, and now move on. - input1_data_ptr += y4; - } - } - // We have broadcast y2*y3*y4 of input2 data y1 times, and now move on. - input2_data_reset = input2_data_ptr; - } - } else { - // Special case of y4 == 1, in which the innermost loop is a single element - // and can be combined with the next (y3) as an inner broadcast. - // - // Note that this handles the case of pure scalar broadcast when - // y0 == y1 == y2 == 1. With low overhead it handles cases such as scalar - // broadcast with batch (as y2 > 1). - // - // NOTE The process is the same as the above general case except simplified - // for y4 == 1 and the loop over y3 is contained within the - // AddScalarBroadcast function. - for (int i0 = 0; i0 < y0; ++i0) { - const uint8_t* input2_data_ptr; - for (int i1 = 0; i1 < y1; ++i1) { - input2_data_ptr = input2_data_reset; - for (int i2 = 0; i2 < y2; ++i2) { - AddScalarBroadcast(y3, params, *input1_data_ptr, input2_data_ptr, - output_data_ptr); - input2_data_ptr += y3; - output_data_ptr += y3; - input1_data_ptr += 1; - } - } - input2_data_reset = input2_data_ptr; - } - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ADD_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/arg_min_max.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/arg_min_max.h deleted file mode 100644 index e6f34fd7..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/arg_min_max.h +++ /dev/null @@ -1,68 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -template -void ArgMinMax(const RuntimeShape& input1_shape, const T1* input1_data, - const T3* input2_data, const RuntimeShape& output_shape, - T2* output_data, const Cmp& cmp) { - TFLITE_DCHECK_GT(input1_shape.DimensionsCount(), 0); - TFLITE_DCHECK_EQ(input1_shape.DimensionsCount() - 1, - output_shape.DimensionsCount()); - int axis = input2_data[0]; - if (axis < 0) { - axis += input1_shape.DimensionsCount(); - } - const int axis_size = input1_shape.Dims(axis); - - int outer_size = 1; - for (int i = 0; i < axis; ++i) { - TFLITE_DCHECK_EQ(input1_shape.Dims(i), output_shape.Dims(i)); - outer_size *= input1_shape.Dims(i); - } - - int inner_size = 1; - const int dims_count = input1_shape.DimensionsCount(); - for (int i = axis + 1; i < dims_count; ++i) { - TFLITE_DCHECK_EQ(input1_shape.Dims(i), output_shape.Dims(i - 1)); - inner_size *= input1_shape.Dims(i); - } - for (int outer = 0; outer < outer_size; ++outer) { - for (int inner = 0; inner < inner_size; ++inner) { - auto min_max_value = input1_data[outer * axis_size * inner_size + inner]; - T2 min_max_index = 0; - for (int i = 1; i < axis_size; ++i) { - const auto& curr_value = - input1_data[(outer * axis_size + i) * inner_size + inner]; - if (cmp(curr_value, min_max_value)) { - min_max_value = curr_value; - min_max_index = static_cast(i); - } - } - output_data[outer * inner_size + inner] = min_max_index; - } - } -} -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ARG_MIN_MAX_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/binary_function.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/binary_function.h deleted file mode 100644 index 51d9e2b7..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/binary_function.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// TODO(ycling): Refactoring. Remove BroadcastLogical and use the more -// generalized and efficient BroadcastBinaryFunction. -// -// Also appears to duplicate MinimumMaximum. -// -// R: Result type. T1: Input 1 type. T2: Input 2 type. -template -inline void BroadcastBinaryFunction4DSlow( - const RuntimeShape& unextended_input1_shape, const T1* input1_data, - const RuntimeShape& unextended_input2_shape, const T2* input2_data, - const RuntimeShape& unextended_output_shape, R* output_data, - R (*func)(T1, T2)) { - TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(4, unextended_output_shape); - - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, - unextended_input2_shape, &desc1, &desc2); - - for (int b = 0; b < output_shape.Dims(0); ++b) { - for (int y = 0; y < output_shape.Dims(1); ++y) { - for (int x = 0; x < output_shape.Dims(2); ++x) { - for (int c = 0; c < output_shape.Dims(3); ++c) { - auto out_idx = Offset(output_shape, b, y, x, c); - auto in1_idx = SubscriptToIndex(desc1, b, y, x, c); - auto in2_idx = SubscriptToIndex(desc2, b, y, x, c); - auto in1_val = input1_data[in1_idx]; - auto in2_val = input2_data[in2_idx]; - output_data[out_idx] = func(in1_val, in2_val); - } - } - } - } -} - -// R: Result type. T1: Input 1 type. T2: Input 2 type. -// TODO(renjieliu): Refactor other binary functions to use this one. -template -inline void BinaryFunction(const RuntimeShape& input1_shape, - const T1* input1_data, - const RuntimeShape& input2_shape, - const T2* input2_data, - const RuntimeShape& output_shape, R* output_data, - R (*func)(T1, T2)) { - const int flat_size = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = func(input1_data[i], input2_data[i]); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_BINARY_FUNCTION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/ceil.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/ceil.h deleted file mode 100644 index 66d1dc35..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/ceil.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ - -#include - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline void Ceil(const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; ++i) { - output_data[i] = std::ceil(input_data[i]); - } -} - -} // namespace reference_ops -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CEIL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/comparisons.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/comparisons.h deleted file mode 100644 index 49844ab1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/comparisons.h +++ /dev/null @@ -1,334 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/string_util.h" - -namespace tflite { - -namespace reference_ops { - -template -inline bool EqualFn(T lhs, T rhs) { - return lhs == rhs; -} - -template -inline bool NotEqualFn(T lhs, T rhs) { - return lhs != rhs; -} - -template -inline bool GreaterFn(T lhs, T rhs) { - return lhs > rhs; -} -template -inline bool GreaterEqualFn(T lhs, T rhs) { - return lhs >= rhs; -} -template -inline bool LessFn(T lhs, T rhs) { - return lhs < rhs; -} -template -inline bool LessEqualFn(T lhs, T rhs) { - return lhs <= rhs; -} - -inline bool StringRefEqualFn(const StringRef& lhs, const StringRef& rhs) { - if (lhs.len != rhs.len) return false; - for (int i = 0; i < lhs.len; ++i) { - if (lhs.str[i] != rhs.str[i]) return false; - } - return true; -} - -inline bool StringRefNotEqualFn(const StringRef& lhs, const StringRef& rhs) { - return !StringRefEqualFn(lhs, rhs); -} - -template -using ComparisonFn = bool (*)(T, T); - -template F> -inline void ComparisonImpl( - const ComparisonParams& op_params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, bool* output_data) { - const int64_t flatsize = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - for (int64_t i = 0; i < flatsize; ++i) { - output_data[i] = F(input1_data[i], input2_data[i]); - } -} - -inline void ComparisonStringImpl(bool (*F)(const StringRef&, const StringRef&), - const RuntimeShape& input1_shape, - const TfLiteTensor* input1, - const RuntimeShape& input2_shape, - const TfLiteTensor* input2, - const RuntimeShape& output_shape, - bool* output_data) { - const int64_t flatsize = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - for (int64_t i = 0; i < flatsize; ++i) { - const auto lhs = GetString(input1, i); - const auto rhs = GetString(input2, i); - output_data[i] = F(lhs, rhs); - } -} - -template F> -inline void Comparison(const ComparisonParams& op_params, - const RuntimeShape& input1_shape, - const float* input1_data, - const RuntimeShape& input2_shape, - const float* input2_data, - const RuntimeShape& output_shape, bool* output_data) { - ComparisonImpl(op_params, input1_shape, input1_data, input2_shape, - input2_data, output_shape, output_data); -} - -template F> -inline void ComparisonWithScaling( - const ComparisonParams& op_params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, bool* output_data) { - int left_shift = op_params.left_shift; - int32_t input1_offset = op_params.input1_offset; - int32_t input1_multiplier = op_params.input1_multiplier; - int input1_shift = op_params.input1_shift; - int32_t input2_offset = op_params.input2_offset; - int32_t input2_multiplier = op_params.input2_multiplier; - int input2_shift = op_params.input2_shift; - - const int64_t flatsize = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - for (int64_t i = 0; i < flatsize; ++i) { - const int32_t input1_val = input1_offset + input1_data[i]; - const int32_t input2_val = input2_offset + input2_data[i]; - const int32_t shifted_input1_val = input1_val * (1 << left_shift); - const int32_t shifted_input2_val = input2_val * (1 << left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, input1_multiplier, input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, input2_multiplier, input2_shift); - output_data[i] = F(scaled_input1_val, scaled_input2_val); - } -} - -struct BroadcastComparison4DSlowCommon { - const RuntimeShape output_shape; - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; -}; - -inline BroadcastComparison4DSlowCommon BroadcastComparison4DSlowPreprocess( - const RuntimeShape& unextended_input1_shape, - const RuntimeShape& unextended_input2_shape, - const RuntimeShape& unextended_output_shape) { - TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, - unextended_input2_shape, &desc1, &desc2); - return {RuntimeShape::ExtendedShape(4, unextended_output_shape), desc1, - desc2}; -} - -template F> -inline void BroadcastComparison4DSlowImpl( - const ComparisonParams& op_params, - const RuntimeShape& unextended_input1_shape, const T* input1_data, - const RuntimeShape& unextended_input2_shape, const T* input2_data, - const RuntimeShape& unextended_output_shape, bool* output_data) { - const BroadcastComparison4DSlowCommon dims = - BroadcastComparison4DSlowPreprocess(unextended_input1_shape, - unextended_input2_shape, - unextended_output_shape); - - for (int b = 0; b < dims.output_shape.Dims(0); ++b) { - for (int y = 0; y < dims.output_shape.Dims(1); ++y) { - for (int x = 0; x < dims.output_shape.Dims(2); ++x) { - for (int c = 0; c < dims.output_shape.Dims(3); ++c) { - output_data[Offset(dims.output_shape, b, y, x, c)] = - F(input1_data[SubscriptToIndex(dims.desc1, b, y, x, c)], - input2_data[SubscriptToIndex(dims.desc2, b, y, x, c)]); - } - } - } - } -} - -inline void BroadcastComparison4DSlowStringImpl( - bool (*F)(const StringRef&, const StringRef&), - const RuntimeShape& unextended_input1_shape, const TfLiteTensor* input1, - const RuntimeShape& unextended_input2_shape, const TfLiteTensor* input2, - const RuntimeShape& unextended_output_shape, bool* output_data) { - const BroadcastComparison4DSlowCommon dims = - BroadcastComparison4DSlowPreprocess(unextended_input1_shape, - unextended_input2_shape, - unextended_output_shape); - - for (int b = 0; b < dims.output_shape.Dims(0); ++b) { - for (int y = 0; y < dims.output_shape.Dims(1); ++y) { - for (int x = 0; x < dims.output_shape.Dims(2); ++x) { - for (int c = 0; c < dims.output_shape.Dims(3); ++c) { - const auto lhs = - GetString(input1, SubscriptToIndex(dims.desc1, b, y, x, c)); - const auto rhs = - GetString(input2, SubscriptToIndex(dims.desc2, b, y, x, c)); - output_data[Offset(dims.output_shape, b, y, x, c)] = F(lhs, rhs); - } - } - } - } -} - -template F> -inline void BroadcastComparison4DSlow(const ComparisonParams& op_params, - const RuntimeShape& input1_shape, - const float* input1_data, - const RuntimeShape& input2_shape, - const float* input2_data, - const RuntimeShape& output_shape, - bool* output_data) { - BroadcastComparison4DSlowImpl(op_params, input1_shape, input1_data, - input2_shape, input2_data, - output_shape, output_data); -} - -template F> -inline void BroadcastComparison4DSlowWithScaling( - const ComparisonParams& op_params, - const RuntimeShape& unextended_input1_shape, const T* input1_data, - const RuntimeShape& unextended_input2_shape, const T* input2_data, - const RuntimeShape& unextended_output_shape, bool* output_data) { - const BroadcastComparison4DSlowCommon dims = - BroadcastComparison4DSlowPreprocess(unextended_input1_shape, - unextended_input2_shape, - unextended_output_shape); - - int left_shift = op_params.left_shift; - int32_t input1_offset = op_params.input1_offset; - int32_t input1_multiplier = op_params.input1_multiplier; - int input1_shift = op_params.input1_shift; - int32_t input2_offset = op_params.input2_offset; - int32_t input2_multiplier = op_params.input2_multiplier; - int input2_shift = op_params.input2_shift; - - for (int b = 0; b < dims.output_shape.Dims(0); ++b) { - for (int y = 0; y < dims.output_shape.Dims(1); ++y) { - for (int x = 0; x < dims.output_shape.Dims(2); ++x) { - for (int c = 0; c < dims.output_shape.Dims(3); ++c) { - const int32_t input1_val = - input1_offset + - input1_data[SubscriptToIndex(dims.desc1, b, y, x, c)]; - const int32_t input2_val = - input2_offset + - input2_data[SubscriptToIndex(dims.desc2, b, y, x, c)]; - const int32_t shifted_input1_val = input1_val * (1 << left_shift); - const int32_t shifted_input2_val = input2_val * (1 << left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, input1_multiplier, input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, input2_multiplier, input2_shift); - output_data[Offset(dims.output_shape, b, y, x, c)] = - F(scaled_input1_val, scaled_input2_val); - } - } - } - } -} - -#define TFLITE_COMPARISON_OP(name) \ - inline void name(const ComparisonParams& op_params, \ - const RuntimeShape& input1_shape, const float* input1_data, \ - const RuntimeShape& input2_shape, const float* input2_data, \ - const RuntimeShape& output_shape, bool* output_data) { \ - Comparison(op_params, input1_shape, input1_data, input2_shape, \ - input2_data, output_shape, output_data); \ - } \ - template \ - inline void name##NoScaling( \ - const ComparisonParams& op_params, const RuntimeShape& input1_shape, \ - const T* input1_data, const RuntimeShape& input2_shape, \ - const T* input2_data, const RuntimeShape& output_shape, \ - bool* output_data) { \ - ComparisonImpl(op_params, input1_shape, input1_data, \ - input2_shape, input2_data, output_shape, \ - output_data); \ - } \ - template \ - inline void name##WithScaling( \ - const ComparisonParams& op_params, const RuntimeShape& input1_shape, \ - const T* input1_data, const RuntimeShape& input2_shape, \ - const T* input2_data, const RuntimeShape& output_shape, \ - bool* output_data) { \ - ComparisonWithScaling(op_params, input1_shape, input1_data, \ - input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name##NoScaling( \ - const ComparisonParams& op_params, const RuntimeShape& input1_shape, \ - const T* input1_data, const RuntimeShape& input2_shape, \ - const T* input2_data, const RuntimeShape& output_shape, \ - bool* output_data) { \ - BroadcastComparison4DSlowImpl( \ - op_params, input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - inline void Broadcast4DSlow##name( \ - const ComparisonParams& op_params, const RuntimeShape& input1_shape, \ - const float* input1_data, const RuntimeShape& input2_shape, \ - const float* input2_data, const RuntimeShape& output_shape, \ - bool* output_data) { \ - BroadcastComparison4DSlow(op_params, input1_shape, input1_data, \ - input2_shape, input2_data, \ - output_shape, output_data); \ - } \ - template \ - inline void Broadcast4DSlow##name##WithScaling( \ - const ComparisonParams& op_params, const RuntimeShape& input1_shape, \ - const T* input1_data, const RuntimeShape& input2_shape, \ - const T* input2_data, const RuntimeShape& output_shape, \ - bool* output_data) { \ - BroadcastComparison4DSlowWithScaling( \ - op_params, input1_shape, input1_data, input2_shape, input2_data, \ - output_shape, output_data); \ - } -TFLITE_COMPARISON_OP(Equal); -TFLITE_COMPARISON_OP(NotEqual); -TFLITE_COMPARISON_OP(Greater); -TFLITE_COMPARISON_OP(GreaterEqual); -TFLITE_COMPARISON_OP(Less); -TFLITE_COMPARISON_OP(LessEqual); -#undef TFLITE_COMPARISON_OP - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_COMPARISONS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/concatenation.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/concatenation.h deleted file mode 100644 index 25959793..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/concatenation.h +++ /dev/null @@ -1,140 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -template -inline void Concatenation(const ConcatenationParams& params, - const RuntimeShape* const* input_shapes, - const Scalar* const* input_data, - const RuntimeShape& output_shape, - Scalar* output_data) { - int axis = params.axis; - int inputs_count = params.inputs_count; - const int concat_dimensions = output_shape.DimensionsCount(); - TFLITE_DCHECK_LT(axis, concat_dimensions); - - int64_t concat_size = 0; - for (int i = 0; i < inputs_count; i++) { - TFLITE_DCHECK_EQ(input_shapes[i]->DimensionsCount(), concat_dimensions); - for (int j = 0; j < concat_dimensions; j++) { - if (j != axis) { - MatchingDim(*input_shapes[i], j, output_shape, j); - } - } - concat_size += input_shapes[i]->Dims(axis); - } - TFLITE_DCHECK_EQ(concat_size, output_shape.Dims(axis)); - int64_t outer_size = 1; - for (int i = 0; i < axis; ++i) { - outer_size *= output_shape.Dims(i); - } - // For all input arrays, - // FlatSize() = outer_size * Dims(axis) * base_inner_size; - int64_t base_inner_size = 1; - for (int i = axis + 1; i < concat_dimensions; ++i) { - base_inner_size *= output_shape.Dims(i); - } - - Scalar* output_ptr = output_data; - for (int k = 0; k < outer_size; k++) { - for (int i = 0; i < inputs_count; ++i) { - const int copy_size = input_shapes[i]->Dims(axis) * base_inner_size; - const Scalar* input_ptr = input_data[i] + k * copy_size; - memcpy(output_ptr, input_ptr, copy_size * sizeof(Scalar)); - output_ptr += copy_size; - } - } -} - -// TODO(prabhumk): This is the same as the optimized implementation. -// TODO(prabhumk): The quantized implementation of concatentation isn't fully -// quantized as it takes scale as a floating point value. This should be fixed -// when optimizng this routine further. -inline void ConcatenationWithScaling(const ConcatenationParams& params, - const RuntimeShape* const* input_shapes, - const uint8_t* const* input_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - int axis = params.axis; - const int32_t* input_zeropoint = params.input_zeropoint; - const float* input_scale = params.input_scale; - int inputs_count = params.inputs_count; - const int32_t output_zeropoint = params.output_zeropoint; - const float output_scale = params.output_scale; - - const int concat_dimensions = output_shape.DimensionsCount(); - TFLITE_DCHECK_LT(axis, concat_dimensions); - - int64_t concat_size = 0; - for (int i = 0; i < inputs_count; i++) { - TFLITE_DCHECK_EQ(input_shapes[i]->DimensionsCount(), concat_dimensions); - for (int j = 0; j < concat_dimensions; j++) { - if (j != axis) { - MatchingDim(*input_shapes[i], j, output_shape, j); - } - } - concat_size += input_shapes[i]->Dims(axis); - } - TFLITE_DCHECK_EQ(concat_size, output_shape.Dims(axis)); - int64_t outer_size = 1; - for (int i = 0; i < axis; ++i) { - outer_size *= output_shape.Dims(i); - } - // For all input arrays, - // FlatSize() = outer_size * Dims(axis) * base_inner_size; - int64_t base_inner_size = 1; - for (int i = axis + 1; i < concat_dimensions; ++i) { - base_inner_size *= output_shape.Dims(i); - } - - const float inverse_output_scale = 1.f / output_scale; - uint8_t* output_ptr = output_data; - for (int k = 0; k < outer_size; k++) { - for (int i = 0; i < inputs_count; ++i) { - const int copy_size = input_shapes[i]->Dims(axis) * base_inner_size; - const uint8_t* input_ptr = input_data[i] + k * copy_size; - if (input_zeropoint[i] == output_zeropoint && - input_scale[i] == output_scale) { - memcpy(output_ptr, input_ptr, copy_size); - } else { - const float scale = input_scale[i] * inverse_output_scale; - const float bias = -input_zeropoint[i] * scale; - for (int j = 0; j < copy_size; ++j) { - const int32_t value = static_cast(tflite::TfLiteRound( - input_ptr[j] * scale + bias)) + - output_zeropoint; - output_ptr[j] = static_cast( - std::max(std::min(255, value), 0)); - } - } - output_ptr += copy_size; - } - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONCATENATION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/conv.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/conv.h deleted file mode 100644 index d4bf46a8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/conv.h +++ /dev/null @@ -1,262 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ - -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/kernels/internal/common.h" - - - -namespace tflite { - -namespace reference_ops { - - -inline void Conv(const ConvParams& params, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& filter_shape, - const float* filter_data, const RuntimeShape& bias_shape, - const float* bias_data, const RuntimeShape& output_shape, - float* output_data, const RuntimeShape& im2col_shape, - float* im2col_data) { - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - (void)im2col_data; // only used in optimized code. - (void)im2col_shape; // only used in optimized code. - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); - const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); - if (bias_data) { - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - } - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int out_channel = 0; out_channel < output_depth; ++out_channel) { - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - float total = 0.f; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height)) { - float input_value = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - float filter_value = - filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; - total += (input_value * filter_value); - } - } - } - } - float bias_value = 0.0f; - if (bias_data) { - bias_value = bias_data[out_channel]; - } - output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - ActivationFunctionWithMinMax(total + bias_value, - output_activation_min, - output_activation_max); - } - } - } - } -} - -inline void Conv(const ConvParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& filter_shape, - const uint8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - uint8_t* output_data, const RuntimeShape& im2col_shape, - uint8_t* im2col_data, void* cpu_backend_context) { - (void)cpu_backend_context; // only used in optimized code. - (void)im2col_data; // only used in optimized code. - (void)im2col_shape; // only used in optimized code. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int32_t input_offset = params.input_offset; - const int32_t filter_offset = params.weights_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); - const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); - if (bias_data) { - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - } - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int out_channel = 0; out_channel < output_depth; ++out_channel) { - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height)) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = - filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; - acc += - (filter_val + filter_offset) * (input_val + input_offset); - } - } - } - } - if (bias_data) { - acc += bias_data[out_channel]; - } - acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, - output_shift); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - static_cast(acc); - } - } - } - } -} - -inline void HybridConvPerChannel( - const ConvParams& params, float* scaling_factors_ptr, - const RuntimeShape& input_shape, const int8_t* input_data, - const RuntimeShape& filter_shape, const int8_t* filter_data, - const RuntimeShape& bias_shape, const float* bias_data, - const RuntimeShape& output_shape, float* output_data, - const RuntimeShape& im2col_shape, int8_t* im2col_data, - const float* per_channel_scale, int32_t* input_offset) { - (void)im2col_data; // only used in optimized code. - (void)im2col_shape; // only used in optimized code. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); - const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); - if (bias_data) { - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - } - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int out_channel = 0; out_channel < output_depth; ++out_channel) { - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height)) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = - filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; - acc += filter_val * (input_val - input_offset[batch]); - } - } - } - } - float acc_float = - acc * per_channel_scale[out_channel] * scaling_factors_ptr[batch]; - if (bias_data) { - acc_float += bias_data[out_channel]; - } - output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - ActivationFunctionWithMinMax(acc_float, output_activation_min, - output_activation_max); - } - } - } - } -} - -} // namespace reference_ops -} // namespace tflite - - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h deleted file mode 100644 index 0cecb16b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_float.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -inline void DepthwiseConv( - const DepthwiseParams& params, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& filter_shape, - const float* filter_data, const RuntimeShape& bias_shape, - const float* bias_data, const RuntimeShape& output_shape, - float* output_data) { - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - - for (int b = 0; b < batches; ++b) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int ic = 0; ic < input_depth; ++ic) { - for (int m = 0; m < depth_multiplier; m++) { - const int oc = m + ic * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - float total = 0.f; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height)) { - float input_value = - input_data[Offset(input_shape, b, in_y, in_x, ic)]; - float filter_value = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, oc)]; - total += (input_value * filter_value); - } - } - } - float bias_value = 0.0f; - if (bias_data) { - bias_value = bias_data[oc]; - } - output_data[Offset(output_shape, b, out_y, out_x, oc)] = - ActivationFunctionWithMinMax(total + bias_value, - output_activation_min, - output_activation_max); - } - } - } - } - } -} - -} // end namespace reference_ops -} // end namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_FLOAT_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h deleted file mode 100644 index 20bf83df..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h +++ /dev/null @@ -1,297 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ - -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -// Used in tests and template parameters to control which version of depthwise -// convolution is called. Primarily for reference code, and specializations -// forced in tests. -enum class DepthwiseConvImplementation { - // Run all tests against kUseStandardEntry even if also testing another - // kernel, since we need to be sure that the main DepthwiseConv() function in - // optimized_ops.h dispatches to a correctly-executing kernel. - kNone = 0, // The "default" option: use the normal - // DepthwiseConv kernel (entry) function. - kUseGenericKernel, // Forced use of generic kernel. - kUseNeon3x3, // 3x3 kernel that uses NEON when available. - kUseNeon3x3DotProduct, // 3x3 kernel that uses dot-product enabled NEON - // when available. - kUseCModel3x3DotProduct, // 3x3 kernel, reference C model that is intended - // to match overall design NEON code. - kUseUnwound3x3DotProduct, // 3x3 kernel, reference C model with unwound loops - // and some arrays. - kUseIntrinsics3x3DotProduct, // 3x3 kernel using NEON intrinsics. -}; - -// Category of depthwise convolution output rounding. -enum class DepthwiseConvOutputRounding { - kNone = 0, // Invalid: specific method must be specified. - kAwayFromZero, // Original method: exact halves rounded away from zero. - kUpward, // Halves towards +infinity: adds 0.5 before truncate. - // This is where a future kNearestEven would be placed. -}; - -// Category of depthwise convolution depth multiplication. -enum class DepthwiseConvDepthMultiplication { - kNoMultiplication = 0, // Depth multiplier = 1. - kUnitInputDepth, // Input depth = 1, output depth = depth multiplier. -}; - -namespace reference_ops { -namespace depthwise_conv { - -template -inline int32_t DepthwiseConvRound(int32_t x, int32_t quantized_multiplier, - int shift) { - TFLITE_DCHECK_NE(output_rounding, DepthwiseConvOutputRounding::kNone); - return MultiplyByQuantizedMultiplier(x, quantized_multiplier, shift); -} - -template <> -inline int32_t DepthwiseConvRound( - int32_t x, int32_t quantized_multiplier, int shift) { - return MultiplyByQuantizedMultiplier(x, quantized_multiplier, shift); -} - -template <> -inline int32_t DepthwiseConvRound( - int32_t x, int32_t quantized_multiplier, int shift) { - using gemmlowp::SaturatingRoundingDoublingHighMul; - const int left_shift = shift > 0 ? shift : 0; - const int right_shift = shift > 0 ? 0 : -shift; - const int rounding_offset = right_shift > 0 ? 1 << (right_shift - 1) : 0; - return (SaturatingRoundingDoublingHighMul(x * (1 << left_shift), - quantized_multiplier) + - rounding_offset) >> - right_shift; -} - -template -struct DepthwiseConvBasicKernel { - static inline void Run( - const DepthwiseParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& filter_shape, - const uint8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - uint8_t* output_data) { - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - const int32_t input_offset = params.input_offset; - const int32_t filter_offset = params.weights_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - - for (int b = 0; b < batches; ++b) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int ic = 0; ic < input_depth; ++ic) { - for (int m = 0; m < depth_multiplier; m++) { - const int oc = m + ic * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = - in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // If the location is outside the bounds of the input image, - // use zero as a default value. - if ((in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height)) { - int32_t input_val = - input_data[Offset(input_shape, b, in_y, in_x, ic)]; - int32_t filter_val = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, oc)]; - acc += (filter_val + filter_offset) * - (input_val + input_offset); - } - } - } - if (bias_data) { - acc += bias_data[oc]; - } - acc = DepthwiseConvRound(acc, output_multiplier, - output_shift); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[Offset(output_shape, b, out_y, out_x, oc)] = - static_cast(acc); - } - } - } - } - } - } - - // TODO(b/148596273): Reconcile reference versions, perhaps with common - // MultiplyByQuantizedMultiplier or DepthwiseConvRound function. - static inline void RunPerChannel( - const DepthwiseParams& params, const RuntimeShape& input_shape, - const int8_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int8_t* output_data) { - // Get parameters. - // TODO(b/141565753): Re-introduce ScopedProfilingLabel on Micro. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const int32_t input_offset = params.input_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - const int32_t* output_multiplier = params.output_multiplier_per_channel; - const int32_t* output_shift = params.output_shift_per_channel; - - // Check dimensions of the tensors. - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - for (int m = 0; m < depth_multiplier; ++m) { - const int output_channel = m + in_channel * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = - in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, output_channel)]; - // Accumulate with 32 bits accumulator. - // In the nudging process during model quantization, we - // force real value of 0.0 be represented by a quantized - // value. This guarantees that the input_offset is a int8_t, - // even though it is represented using int32_t. int32_t += - // int8_t - // * (int8_t - int8_t) so the highest value we can get from - // each accumulation is [-127, 127] * ([-128, 127] - - // [-128, 127]), which is [-32512, 32512]. log2(32512) - // = 14.98, which means we can accumulate at least 2^16 - // multiplications without overflow. The accumulator is - // applied to a filter so the accumulation logic will hold - // as long as the filter size (filter_y * filter_x * - // in_channel) does not exceed 2^16, which is the case in - // all the models we have seen so far. - acc += filter_val * (input_val + input_offset); - } - } - } - if (bias_data) { - acc += bias_data[output_channel]; - } - acc = DepthwiseConvRound( - acc, output_multiplier[output_channel], - output_shift[output_channel]); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, - output_channel)] = static_cast(acc); - } - } - } - } - } - } -}; - -} // namespace depthwise_conv - -inline void DepthwiseConv( - const DepthwiseParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& filter_shape, - const uint8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - uint8_t* output_data) { - return depthwise_conv::DepthwiseConvBasicKernel< - DepthwiseConvOutputRounding::kAwayFromZero>::Run(params, input_shape, - input_data, filter_shape, - filter_data, bias_shape, - bias_data, output_shape, - output_data); -} - -} // namespace reference_ops -} // end namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEPTHWISECONV_UINT8_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/dequantize.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/dequantize.h deleted file mode 100644 index b90951f9..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/dequantize.h +++ /dev/null @@ -1,78 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ - -#include - -#include - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// Dequantizes into a float without rounding. -template -inline void Dequantize(const tflite::DequantizationParams& op_params, - const RuntimeShape& input_shape, - const InputT* input_data, - const RuntimeShape& output_shape, OutputT* output_data) { - int32_t zero_point = op_params.zero_point; - const double scale = op_params.scale; - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - const int32_t val = input_data[i]; - const OutputT result = static_cast(scale * (val - zero_point)); - output_data[i] = result; - } -} - -// Dequantizes per-channel quantized tensor to float. -template -inline void PerChannelDequantize( - const tflite::PerChannelDequantizationParams& op_params, - const RuntimeShape& input_shape, const T* input_data, - const RuntimeShape& output_shape, float* output_data) { - // Ensure flat size is same. - MatchingFlatSize(input_shape, output_shape); - - const int32_t* zero_point = op_params.zero_point; - const float* scale = op_params.scale; - const int32_t quantized_dimension = op_params.quantized_dimension; - const int32_t num_dims = input_shape.DimensionsCount(); - const int32_t* dims_data = input_shape.DimsData(); - std::vector current_dim(num_dims, 0); - - do { - size_t offset = - ReducedOutputOffset(num_dims, reinterpret_cast(dims_data), - current_dim.data(), 0, nullptr); - const int channel = current_dim[quantized_dimension]; - const int32_t val = input_data[offset]; - const float result = - static_cast(scale[channel] * (val - zero_point[channel])); - output_data[offset] = result; - } while (NextIndex(num_dims, reinterpret_cast(dims_data), - current_dim.data())); -} - -} // namespace reference_ops - -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_DEQUANTIZE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/floor.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/floor.h deleted file mode 100644 index 0693fd42..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/floor.h +++ /dev/null @@ -1,39 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ - -#include - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline void Floor(const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - int offset = i; - output_data[offset] = std::floor(input_data[offset]); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FLOOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/fully_connected.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/fully_connected.h deleted file mode 100644 index 39a9cd02..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/fully_connected.h +++ /dev/null @@ -1,320 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/quantization_util.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -inline void FullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& weights_shape, - const float* weights_data, const RuntimeShape& bias_shape, - const float* bias_data, const RuntimeShape& output_shape, - float* output_data) { - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; - // TODO(benoitjacob): This really should be: - // const int batches = ArraySize(output_dims, 1); - // but the current --variable_batch hack consists in overwriting the 3rd - // dimension with the runtime batch size, as we don't keep track for each - // array of which dimension is the batch dimension in it. - const int output_dims_count = output_shape.DimensionsCount(); - const int weights_dims_count = weights_shape.DimensionsCount(); - const int batches = FlatSizeSkipDim(output_shape, output_dims_count - 1); - const int output_depth = MatchingDim(weights_shape, weights_dims_count - 2, - output_shape, output_dims_count - 1); - const int accum_depth = weights_shape.Dims(weights_dims_count - 1); - for (int b = 0; b < batches; ++b) { - for (int out_c = 0; out_c < output_depth; ++out_c) { - float total = 0.f; - for (int d = 0; d < accum_depth; ++d) { - total += input_data[b * accum_depth + d] * - weights_data[out_c * accum_depth + d]; - } - float bias_value = 0.0f; - if (bias_data) { - bias_value = bias_data[out_c]; - } - output_data[out_c + output_depth * b] = ActivationFunctionWithMinMax( - total + bias_value, output_activation_min, output_activation_max); - } - } -} - -inline void FullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& filter_shape, - const uint8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - uint8_t* output_data) { - const int32_t input_offset = params.input_offset; - const int32_t filter_offset = params.weights_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); - TFLITE_DCHECK_GE(output_shape.DimensionsCount(), 1); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - // TODO(benoitjacob): This really should be: - // const int batches = ArraySize(output_dims, 1); - // but the current --variable_batch hack consists in overwriting the 3rd - // dimension with the runtime batch size, as we don't keep track for each - // array of which dimension is the batch dimension in it. - const int output_dim_count = output_shape.DimensionsCount(); - const int filter_dim_count = filter_shape.DimensionsCount(); - const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); - const int output_depth = MatchingDim(filter_shape, filter_dim_count - 2, - output_shape, output_dim_count - 1); - const int accum_depth = filter_shape.Dims(filter_dim_count - 1); - for (int b = 0; b < batches; ++b) { - for (int out_c = 0; out_c < output_depth; ++out_c) { - int32_t acc = 0; - for (int d = 0; d < accum_depth; ++d) { - int32_t input_val = input_data[b * accum_depth + d]; - int32_t filter_val = filter_data[out_c * accum_depth + d]; - acc += (filter_val + filter_offset) * (input_val + input_offset); - } - if (bias_data) { - acc += bias_data[out_c]; - } - acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[out_c + output_depth * b] = static_cast(acc); - } - } -} - -inline void FullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& filter_shape, - const uint8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int16_t* output_data) { - const int32_t input_offset = params.input_offset; - const int32_t filter_offset = params.weights_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - TFLITE_DCHECK_EQ(output_offset, 0); - // TODO(benoitjacob): This really should be: - // const int batches = ArraySize(output_dims, 1); - // but the current --variable_batch hack consists in overwriting the 3rd - // dimension with the runtime batch size, as we don't keep track for each - // array of which dimension is the batch dimension in it. - const int output_dim_count = output_shape.DimensionsCount(); - const int filter_dim_count = filter_shape.DimensionsCount(); - const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); - const int output_depth = MatchingDim(filter_shape, filter_dim_count - 2, - output_shape, output_dim_count - 1); - const int accum_depth = filter_shape.Dims(filter_dim_count - 1); - for (int b = 0; b < batches; ++b) { - for (int out_c = 0; out_c < output_depth; ++out_c) { - // Internal accumulation. - // Initialize accumulator with the bias-value. - int32_t accum = bias_data[out_c]; - // Accumulation loop. - for (int d = 0; d < accum_depth; ++d) { - int16_t input_val = input_data[b * accum_depth + d] + input_offset; - int16_t filter_val = - filter_data[out_c * accum_depth + d] + filter_offset; - accum += filter_val * input_val; - } - // Down-scale the final int32_t accumulator to the scale used by our - // (16-bit, typically 3 integer bits) fixed-point format. The quantized - // multiplier and shift here have been pre-computed offline - // (e.g. by toco). - accum = - MultiplyByQuantizedMultiplier(accum, output_multiplier, output_shift); - // Saturate, cast to int16_t, and store to output array. - accum = std::max(accum, output_activation_min - output_offset); - accum = std::min(accum, output_activation_max - output_offset); - accum += output_offset; - output_data[out_c + output_depth * b] = accum; - } - } -} - -inline void ShuffledFullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& weights_shape, - const uint8_t* shuffled_weights_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int16_t* output_data, uint8_t* shuffled_input_workspace_data) { - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - - TFLITE_DCHECK_GE(input_shape.DimensionsCount(), 1); - TFLITE_DCHECK_GE(weights_shape.DimensionsCount(), 2); - TFLITE_DCHECK_GE(output_shape.DimensionsCount(), 1); - // TODO(benoitjacob): This really should be: - // const int batches = ArraySize(output_dims, 1); - // but the current --variable_batch hack consists in overwriting the 3rd - // dimension with the runtime batch size, as we don't keep track for each - // array of which dimension is the batch dimension in it. - const int output_dim_count = output_shape.DimensionsCount(); - const int weights_dim_count = weights_shape.DimensionsCount(); - const int batches = FlatSizeSkipDim(output_shape, output_dim_count - 1); - const int output_depth = MatchingDim(weights_shape, weights_dim_count - 2, - output_shape, output_dim_count - 1); - const int accum_depth = weights_shape.Dims(weights_dim_count - 1); - TFLITE_DCHECK((accum_depth % 16) == 0); - TFLITE_DCHECK((output_depth % 4) == 0); - - // Shuffling and xoring of input activations into the workspace buffer - uint8_t* shuffled_input_workspace_ptr = shuffled_input_workspace_data; - if (batches == 1) { - for (int i = 0; i < accum_depth; i++) { - shuffled_input_workspace_data[i] = input_data[i] ^ 0x80; - } - } else if (batches == 4) { - for (int c = 0; c < accum_depth; c += 16) { - for (int b = 0; b < 4; b++) { - const uint8_t* src_data_ptr = input_data + b * accum_depth + c; - for (int j = 0; j < 16; j++) { - uint8_t src_val = *src_data_ptr++; - // Flip the sign bit, so that the kernel will only need to - // reinterpret these uint8_t values as int8_t, getting for free the - // subtraction of the zero_point value 128. - uint8_t dst_val = src_val ^ 0x80; - *shuffled_input_workspace_ptr++ = dst_val; - } - } - } - } else { - TFLITE_DCHECK(false); - return; - } - - // Actual computation - if (batches == 1) { - int16_t* output_ptr = output_data; - // Shuffled weights have had their sign bit (0x80) pre-flipped (xor'd) - // so that just reinterpreting them as int8_t values is equivalent to - // subtracting 128 from them, thus implementing for free the subtraction of - // the zero_point value 128. - const int8_t* shuffled_weights_ptr = - reinterpret_cast(shuffled_weights_data); - // Likewise, we preshuffled and pre-xored the input data above. - const int8_t* shuffled_input_data = - reinterpret_cast(shuffled_input_workspace_data); - for (int c = 0; c < output_depth; c += 4) { - // Internal accumulation. - // Initialize accumulator with the bias-value. - int32_t accum[4] = {0}; - // Accumulation loop. - for (int d = 0; d < accum_depth; d += 16) { - for (int i = 0; i < 4; i++) { - for (int j = 0; j < 16; j++) { - int8_t input_val = shuffled_input_data[d + j]; - int8_t weights_val = *shuffled_weights_ptr++; - accum[i] += weights_val * input_val; - } - } - } - for (int i = 0; i < 4; i++) { - // Add bias value - int32_t acc = accum[i] + bias_data[c + i]; - // Down-scale the final int32_t accumulator to the scale used by our - // (16-bit, typically 3 integer bits) fixed-point format. The quantized - // multiplier and shift here have been pre-computed offline - // (e.g. by toco). - acc = - MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); - // Saturate, cast to int16_t, and store to output array. - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_ptr[c + i] = acc; - } - } - } else if (batches == 4) { - int16_t* output_ptr = output_data; - // Shuffled weights have had their sign bit (0x80) pre-flipped (xor'd) - // so that just reinterpreting them as int8_t values is equivalent to - // subtracting 128 from them, thus implementing for free the subtraction of - // the zero_point value 128. - const int8_t* shuffled_weights_ptr = - reinterpret_cast(shuffled_weights_data); - // Likewise, we preshuffled and pre-xored the input data above. - const int8_t* shuffled_input_data = - reinterpret_cast(shuffled_input_workspace_data); - for (int c = 0; c < output_depth; c += 4) { - const int8_t* shuffled_input_ptr = shuffled_input_data; - // Accumulation loop. - // Internal accumulation. - // Initialize accumulator with the bias-value. - int32_t accum[4][4]; - for (int i = 0; i < 4; i++) { - for (int b = 0; b < 4; b++) { - accum[i][b] = 0; - } - } - for (int d = 0; d < accum_depth; d += 16) { - for (int i = 0; i < 4; i++) { - for (int b = 0; b < 4; b++) { - for (int j = 0; j < 16; j++) { - int8_t input_val = shuffled_input_ptr[16 * b + j]; - int8_t weights_val = shuffled_weights_ptr[16 * i + j]; - accum[i][b] += weights_val * input_val; - } - } - } - shuffled_input_ptr += 64; - shuffled_weights_ptr += 64; - } - for (int i = 0; i < 4; i++) { - for (int b = 0; b < 4; b++) { - // Add bias value - int32_t acc = accum[i][b] + bias_data[c + i]; - // Down-scale the final int32_t accumulator to the scale used by our - // (16-bit, typically 3 integer bits) fixed-point format. The - // quantized multiplier and shift here have been pre-computed offline - // (e.g. by toco). - acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, - output_shift); - // Saturate, cast to int16_t, and store to output array. - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_ptr[b * output_depth + c + i] = acc; - } - } - } - } else { - TFLITE_DCHECK(false); - return; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_FULLY_CONNECTED_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/hard_swish.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/hard_swish.h deleted file mode 100644 index cda1b5cf..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/hard_swish.h +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ACTIVATIONS_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ACTIVATIONS_H_ - -#include "ruy/profiler/instrumentation.h" // from @ruy -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -inline int16_t SaturatingLeftShift(int16_t value, int amount) { - int32_t result = static_cast(value) * (1 << amount); - result = std::min(result, std::numeric_limits::max()); - result = std::max(result, std::numeric_limits::min()); - return result; -} - -// Similar to ARM instruction SQDMULH. -// Similar to gemmlowp::SaturatingRoundingDoublingHighMul except -// rounding to zero instead of to nearest (SQRDMULH). -inline std::int16_t SaturatingDoublingHighMul(std::int16_t a, std::int16_t b) { - bool overflow = a == b && a == std::numeric_limits::min(); - std::int32_t a_32(a); - std::int32_t b_32(b); - std::int32_t ab_32 = a_32 * b_32; - std::int16_t ab_x2_high16 = static_cast((ab_32) / (1 << 15)); - return overflow ? std::numeric_limits::max() : ab_x2_high16; -} - -template -inline void HardSwish(const RuntimeShape& input_shape, const T* input_data, - const RuntimeShape& output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("ReferenceHardSwish/Float"); - auto matching_size = MatchingFlatSize(input_shape, output_shape); - const T* in_end = input_data + matching_size; - for (; input_data < in_end; input_data++, output_data++) { - const float in = *input_data; - *output_data = - in * std::min(static_cast(6), std::max(static_cast(0), in + 3)) / - 6; - } -} - -template -inline void HardSwish(const HardSwishParams& params, - const RuntimeShape& input_shape, const T* input_data, - const RuntimeShape& output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("ReferenceHardSwish/Quantized"); - - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - const int16_t input_value = input_data[i] - params.input_zero_point; - // Left-shift as much as we can without overflow/saturation to put - // significant bits in the high bits of our 16-bit fixedpoint values, so - // that fixed-point approximate computations below are as accurate as - // possible. - const int16_t input_value_on_hires_input_scale = input_value * (1 << 7); - // Compute the input value on essentially the output scale, just not - // right-shifted yet. This is the value that we'll use in the (x >= +3) - // case, and that in the general case we'll multiply against the "relu-ish" - // fixed-point multiplier in [0, 1]. - const int16_t input_value_on_preshift_output_scale = - gemmlowp::SaturatingRoundingDoublingHighMul( - input_value_on_hires_input_scale, - params.output_multiplier_fixedpoint_int16); - // Now compute the "relu-ish multiplier". In the (-3 <= x <= +3) case, that - // is just an affine rescaling of x from [-3, 3] to [0, 1]. In the general - // case, it is just that plus saturation at the boundaries of [-3, 3]. - // First, we rescale from [-3, 3] to [-1, 1], saturating. - // That is done by rescaling the input value with a fixed-point multiplier - // (reluish_multiplier_fixedpoint) and bit-shift such that we represent - // that input value on the scale where the real value 3.0f is represented - // by the quantized value 32768. (+32768 is actually not representable as - // int16_t, so this saturates at +32767, and that is seen empirically to be - // a negligible contribution to numerical error/bias). - // - // This code is careful to correctly implement any magnitude of multiplier, - // involving either a right shift or a left shift, with correct saturation - // behavior in the left-shift case. This forces this code to be more - // complicated, but is necessary for real applications: a partially - // trained quantized MobileNet v3-small model that motivated this code - // exhibits some large [min, max] range boundaries, of the order of - // magnitude of 10 or 100 depending on layers. - // - // The next few lines are basically just an ordinary - // MultiplyByQuantizedMultiplier, except that we are more careful here - // about the fine details of saturation when left-shifting, because here - // overflow in left-shift is a common case, not an anomaly as - // MultiplyByQuantizedMultiplier assumes. - int16_t reluish_value = input_value_on_hires_input_scale; - // Shift left, saturating, as much as we can while ensuring that this - // saturation will not contribute to the result. That is, left shift amount - // reduced by 1. - if (params.reluish_multiplier_exponent > 0) { - reluish_value = SaturatingLeftShift( - reluish_value, params.reluish_multiplier_exponent - 1); - } - // Apply the fixed-point multiplier, dividing the value by a divisor - // ranging in [1, 2]. - reluish_value = gemmlowp::SaturatingRoundingDoublingHighMul( - reluish_value, params.reluish_multiplier_fixedpoint_int16); - // Apply the last bit of left-shift. Thus, in the left-shifting case, if - // any saturation affects the result, it is happening here --- any - // saturation having occurred above is overwritten here, not affecting the - // result. - if (params.reluish_multiplier_exponent > 0) { - reluish_value = SaturatingLeftShift(reluish_value, 1); - } - // Shift right, in the right-shifting case. - if (params.reluish_multiplier_exponent < 0) { - reluish_value = gemmlowp::RoundingDivideByPOT( - reluish_value, -params.reluish_multiplier_exponent); - } - // At this point we have rescaled the value into a 16bit fixedpoint - // reluish_value in [-1, 1]. - // We now convert that to a 16bit fixedpoint value in [0, 1]. - reluish_value = (reluish_value + (1 << 15)) >> 1; - // Use of SaturatingDoublingHighMul here is important to cancel the biases - // from the above SaturatingRoundingDoublingHighMul. - // - // On a partially trained MobileNet-v3-small, - // - // | bias on | ImageNet - // | quantized | Top-1 - // Operation used here | values | accuracy (50k) - // --------------------------------------+------------+----------- - // SaturatingDoublingHighMul | -0.0024 | 58.920 - // SaturatingRoundingDoublingHighMul | -0.0067 | 58.064 - // - // In activations_test, this is covered by this testcase: - // QuantizedActivationsOpTest.HardSwishBias - // - const int16_t preshift_output_value = SaturatingDoublingHighMul( - reluish_value, input_value_on_preshift_output_scale); - // We were so far operating on the pre-shift output scale. Now we finally - // apply that output shift, arriving at the final output scale. - int16_t output_value = gemmlowp::RoundingDivideByPOT( - preshift_output_value, -params.output_multiplier_exponent); - output_value += params.output_zero_point; - output_value = - std::min(output_value, std::numeric_limits::max()); - output_value = - std::max(output_value, std::numeric_limits::min()); - output_data[i] = output_value; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_CONV_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/add.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/add.h deleted file mode 100644 index 2af6f373..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/add.h +++ /dev/null @@ -1,145 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ - -#include - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void CheckArithmeticParams(const ArithmeticParams& params) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - // Input offset is negative input zero point. Activation tensors are - // asymmetric quantized so they span the full int8 range. - TFLITE_DCHECK_GE(-params.input1_offset, std::numeric_limits::min()); - TFLITE_DCHECK_GE(-params.input2_offset, std::numeric_limits::min()); - TFLITE_DCHECK_LE(-params.input1_offset, std::numeric_limits::max()); - TFLITE_DCHECK_LE(-params.input2_offset, std::numeric_limits::max()); -} - -// Element-wise add that can often be used for inner loop of broadcast add as -// well as the non-broadcast add. -inline void AddElementwise(int size, const ArithmeticParams& params, - const int8_t* input1_data, const int8_t* input2_data, - int8_t* output_data) { - CheckArithmeticParams(params); - - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sum = scaled_input1_val + scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[i] = static_cast(clamped_output); - } -} - -inline void Add(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const int8_t* input1_data, - const RuntimeShape& input2_shape, const int8_t* input2_data, - const RuntimeShape& output_shape, int8_t* output_data) { - CheckArithmeticParams(params); - - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - AddElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -inline void BroadcastAdd4DSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int8_t* input1_data, - const RuntimeShape& input2_shape, - const int8_t* input2_data, - const RuntimeShape& output_shape, - int8_t* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - const int32_t input1_val = - params.input1_offset + - input1_data[SubscriptToIndex(desc1, b, y, x, c)]; - const int32_t input2_val = - params.input2_offset + - input2_data[SubscriptToIndex(desc2, b, y, x, c)]; - const int32_t shifted_input1_val = - input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = - input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, - params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, - params.input2_shift); - const int32_t raw_sum = scaled_input1_val + scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sum, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[Offset(extended_output_shape, b, y, x, c)] = - static_cast(clamped_output); - } - } - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_ADD_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h deleted file mode 100644 index f4bcb2bd..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/conv.h +++ /dev/null @@ -1,217 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ - -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -// Fixed-point per-channel-quantization convolution reference kernel. -inline void ConvPerChannel( - const ConvParams& params, const int32_t* output_multiplier, - const int32_t* output_shift, const RuntimeShape& input_shape, - const int8_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int8_t* output_data) { - // Get parameters. - const int32_t input_offset = params.input_offset; // r = s(q - Z) - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int32_t output_offset = params.output_offset; - - // Set min and max value of the output. - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - - // Consistency check. - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); - const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); - if (bias_data) { - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - } - - // Check dimensions of the tensors. - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int out_channel = 0; out_channel < output_depth; ++out_channel) { - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = - filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; - // Accumulate with 32 bits accumulator. - // In the nudging process during model quantization, we force - // real value of 0.0 be represented by a quantized value. This - // guarantees that the input_offset is a int8_t, even though - // it is represented using int32_t. int32_t += int8_t * - // (int8_t - int8_t) so the highest value we can get from each - // accumulation is [-127, 127] * ([-128, 127] - - // [-128, 127]), which is [-32512, 32512]. log2(32512) - // = 14.98, which means we can accumulate at least 2^16 - // multiplications without overflow. The accumulator is - // applied to a filter so the accumulation logic will hold as - // long as the filter size (filter_y * filter_x * in_channel) - // does not exceed 2^16, which is the case in all the models - // we have seen so far. - // TODO(jianlijianli): Add a check to make sure the - // accumulator depth is smaller than 2^16. - acc += filter_val * (input_val + input_offset); - } - } - } - } - - if (bias_data) { - acc += bias_data[out_channel]; - } - acc = MultiplyByQuantizedMultiplier( - acc, output_multiplier[out_channel], output_shift[out_channel]); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - static_cast(acc); - } - } - } - } -} - -// Fixed-point per-channel-quantization convolution reference kernel. -// 16-bit data and 8-bit filter -inline void ConvPerChannel( - const ConvParams& params, const int32_t* output_multiplier, - const int32_t* output_shift, const RuntimeShape& input_shape, - const int16_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const std::int64_t* bias_data, const RuntimeShape& output_shape, - int16_t* output_data) { - // Get parameters. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - - // Set min and max value of the output. - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - - // Consistency check. - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int input_depth = MatchingDim(input_shape, 3, filter_shape, 3); - const int output_depth = MatchingDim(filter_shape, 0, output_shape, 3); - if (bias_data) { - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - } - - // Check dimensions of the tensors. - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int out_channel = 0; out_channel < output_depth; ++out_channel) { - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - std::int64_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = - filter_data[Offset(filter_shape, out_channel, filter_y, - filter_x, in_channel)]; - // Accumulate with 64 bits accumulator. - // int64_t += int8_t * int16_t so the highest value we can - // get from each accumulation is [-127, 127] * ([-32768, - // 32767] - - // [-32768, 32767]), which is [-8322945, 8322945]. - // log2(8322945) = 22.99. - acc += filter_val * input_val; - } - } - } - } - if (bias_data) { - acc += bias_data[out_channel]; - } - int32_t scaled_acc = MultiplyByQuantizedMultiplier( - acc, output_multiplier[out_channel], output_shift[out_channel]); - scaled_acc = std::max(scaled_acc, output_activation_min); - scaled_acc = std::min(scaled_acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, out_channel)] = - static_cast(scaled_acc); - } - } - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_CONV_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h deleted file mode 100644 index 6f54e47f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/depthwise_conv.h +++ /dev/null @@ -1,289 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ - -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { -inline void DepthwiseConvPerChannel( - const DepthwiseParams& params, const int32_t* output_multiplier, - const int32_t* output_shift, const RuntimeShape& input_shape, - const int8_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int8_t* output_data) { - // Get parameters. - // TODO(b/141565753): Re-introduce ScopedProfilingLabel on Micro. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const int32_t input_offset = params.input_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - - // Check dimensions of the tensors. - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - for (int m = 0; m < depth_multiplier; ++m) { - const int output_channel = m + in_channel * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, output_channel)]; - // Accumulate with 32 bits accumulator. - // In the nudging process during model quantization, we force - // real value of 0.0 be represented by a quantized value. This - // guarantees that the input_offset is a int8_t, even though - // it is represented using int32_t. int32_t += int8_t * - // (int8_t - int8_t) so the highest value we can get from each - // accumulation is [-127, 127] * ([-128, 127] - - // [-128, 127]), which is [-32512, 32512]. log2(32512) - // = 14.98, which means we can accumulate at least 2^16 - // multiplications without overflow. The accumulator is - // applied to a filter so the accumulation logic will hold as - // long as the filter size (filter_y * filter_x * in_channel) - // does not exceed 2^16, which is the case in all the models - // we have seen so far. - // TODO(jianlijianli): Add a check to make sure the - // accumulator depth is smaller than 2^16. - acc += filter_val * (input_val + input_offset); - } - } - } - if (bias_data) { - acc += bias_data[output_channel]; - } - acc = MultiplyByQuantizedMultiplier( - acc, output_multiplier[output_channel], - output_shift[output_channel]); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, - output_channel)] = static_cast(acc); - } - } - } - } - } -} - -inline void DepthwiseConvPerChannel( - const DepthwiseParams& params, const int32_t* output_multiplier, - const int32_t* output_shift, const RuntimeShape& input_shape, - const int16_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const std::int64_t* bias_data, const RuntimeShape& output_shape, - int16_t* output_data) { - // Get parameters. - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - - // Check dimensions of the tensors. - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_shape.FlatSize(), output_depth); - - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - for (int m = 0; m < depth_multiplier; ++m) { - const int output_channel = m + in_channel * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - std::int64_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, output_channel)]; - // Accumulate with 64 bits accumulator. - // We assume maximum of 2^16 accumulations as with the 8-bit - // case so actually the value in the accumulator should not - // exceed 40 bits - acc += static_cast(filter_val) * - static_cast(input_val); - } - } - } - if (bias_data) { - acc += bias_data[output_channel]; - } - int32_t scaled_acc = MultiplyByQuantizedMultiplier( - acc, output_multiplier[output_channel], - output_shift[output_channel]); - scaled_acc = std::max(scaled_acc, output_activation_min); - scaled_acc = std::min(scaled_acc, output_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, - output_channel)] = - static_cast(scaled_acc); - } - } - } - } - } -} - -inline void DepthwiseConvHybridPerChannel( - const DepthwiseParams& params, float* scaling_factors_ptr, - const RuntimeShape& input_shape, const int8_t* input_data, - const RuntimeShape& filter_shape, const int8_t* filter_data, - const RuntimeShape& bias_shape, const float* bias_data, - const RuntimeShape& output_shape, float* output_data, - const float* per_channel_scale, int32_t* input_offset) { - const int stride_width = params.stride_width; - const int stride_height = params.stride_height; - const int dilation_width_factor = params.dilation_width_factor; - const int dilation_height_factor = params.dilation_height_factor; - const int pad_width = params.padding_values.width; - const int pad_height = params.padding_values.height; - const int depth_multiplier = params.depth_multiplier; - const float output_activation_min = params.float_activation_min; - const float output_activation_max = params.float_activation_max; - // Check dimensions of the tensors. - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(filter_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int output_depth = MatchingDim(filter_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int input_depth = input_shape.Dims(3); - const int filter_height = filter_shape.Dims(1); - const int filter_width = filter_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int bias_depth = bias_shape.FlatSize(); - TFLITE_DCHECK_EQ(output_depth, input_depth * depth_multiplier); - TFLITE_DCHECK_EQ(bias_depth, output_depth); - - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int in_channel = 0; in_channel < input_depth; ++in_channel) { - for (int m = 0; m < depth_multiplier; ++m) { - const int output_channel = m + in_channel * depth_multiplier; - const int in_x_origin = (out_x * stride_width) - pad_width; - const int in_y_origin = (out_y * stride_height) - pad_height; - int32_t acc = 0; - for (int filter_y = 0; filter_y < filter_height; ++filter_y) { - for (int filter_x = 0; filter_x < filter_width; ++filter_x) { - const int in_x = in_x_origin + dilation_width_factor * filter_x; - const int in_y = - in_y_origin + dilation_height_factor * filter_y; - // Zero padding by omitting the areas outside the image. - const bool is_point_inside_image = - (in_x >= 0) && (in_x < input_width) && (in_y >= 0) && - (in_y < input_height); - if (is_point_inside_image) { - int32_t input_val = input_data[Offset( - input_shape, batch, in_y, in_x, in_channel)]; - int32_t filter_val = filter_data[Offset( - filter_shape, 0, filter_y, filter_x, output_channel)]; - acc += filter_val * (input_val - input_offset[batch]); - } - } - } - float acc_float = static_cast(acc); - acc_float *= - per_channel_scale[output_channel] * scaling_factors_ptr[batch]; - if (bias_data && output_channel < bias_depth) { - acc_float += bias_data[output_channel]; - } - output_data[Offset(output_shape, batch, out_y, out_x, - output_channel)] = - ActivationFunctionWithMinMax(acc_float, output_activation_min, - output_activation_max); - } - } - } - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_DEPTHWISE_CONV_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h deleted file mode 100644 index 2bc3e794..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/fully_connected.h +++ /dev/null @@ -1,108 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ - -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void FullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const int8_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const int32_t* bias_data, const RuntimeShape& output_shape, - int8_t* output_data) { - const int32_t input_offset = params.input_offset; - const int32_t filter_offset = params.weights_offset; - const int32_t output_offset = params.output_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 2); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int filter_dim_count = filter_shape.DimensionsCount(); - const int batches = output_shape.Dims(0); - const int output_depth = output_shape.Dims(1); - TFLITE_DCHECK_LE(output_depth, filter_shape.Dims(filter_dim_count - 2)); - const int accum_depth = filter_shape.Dims(filter_dim_count - 1); - for (int b = 0; b < batches; ++b) { - for (int out_c = 0; out_c < output_depth; ++out_c) { - int32_t acc = 0; - for (int d = 0; d < accum_depth; ++d) { - int32_t input_val = input_data[b * accum_depth + d]; - int32_t filter_val = filter_data[out_c * accum_depth + d]; - acc += (filter_val + filter_offset) * (input_val + input_offset); - } - if (bias_data) { - acc += bias_data[out_c]; - } - acc = MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); - acc += output_offset; - acc = std::max(acc, output_activation_min); - acc = std::min(acc, output_activation_max); - output_data[out_c + output_depth * b] = static_cast(acc); - } - } -} - -inline void FullyConnected( - const FullyConnectedParams& params, const RuntimeShape& input_shape, - const int16_t* input_data, const RuntimeShape& filter_shape, - const int8_t* filter_data, const RuntimeShape& bias_shape, - const int64_t* bias_data, const RuntimeShape& output_shape, - int16_t* output_data) { - const int32_t filter_offset = params.weights_offset; - const int32_t output_multiplier = params.output_multiplier; - const int output_shift = params.output_shift; - const int32_t output_activation_min = params.quantized_activation_min; - const int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_GE(filter_shape.DimensionsCount(), 2); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 2); - - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - const int filter_dim_count = filter_shape.DimensionsCount(); - const int batches = output_shape.Dims(0); - const int output_depth = output_shape.Dims(1); - TFLITE_DCHECK_LE(output_depth, filter_shape.Dims(filter_dim_count - 2)); - const int accum_depth = filter_shape.Dims(filter_dim_count - 1); - for (int b = 0; b < batches; ++b) { - for (int out_c = 0; out_c < output_depth; ++out_c) { - int64_t acc = 0; - for (int d = 0; d < accum_depth; ++d) { - int32_t input_val = input_data[b * accum_depth + d]; - int32_t filter_val = filter_data[out_c * accum_depth + d]; - acc += (filter_val + filter_offset) * input_val; - } - if (bias_data) { - acc += bias_data[out_c]; - } - int32_t acc_scaled = - MultiplyByQuantizedMultiplier(acc, output_multiplier, output_shift); - acc_scaled = std::max(acc_scaled, output_activation_min); - acc_scaled = std::min(acc_scaled, output_activation_max); - output_data[out_c + output_depth * b] = static_cast(acc_scaled); - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_FULLY_CONNECTED_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h deleted file mode 100644 index 31f2de98..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/l2normalization.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ - -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void L2Normalization(int32_t input_zero_point, int32_t outer_size, - int32_t depth, const int8_t* input_data, - int8_t* output_data) { - static constexpr int8_t kMinInt8 = std::numeric_limits::min(); - static constexpr int8_t kMaxInt8 = std::numeric_limits::max(); - // The output scale must be in sync with Prepare(). - // Output is in 1/128 scale so the actual output range is nudged from [-1, 1] - // to [-1, 127/128]. - static constexpr int32_t kOutputScale = 7; - for (int outer_index = 0; outer_index < outer_size; ++outer_index) { - // int32_t = (int8_t - int8_t) ^ 2. - // ([-128, 127] - [-128, 127]) ^ 2 = [0, (2^8 - 1)^2] so the accumulator is - // safe from overflowing in at least 2^16 steps. - int32_t acc = 0; - for (int inner_index = 0; inner_index < depth; ++inner_index) { - int32_t input = - input_data[depth * outer_index + inner_index] - input_zero_point; - acc += input * input; - } - int32_t inv_l2norm_multiplier; - int inv_l2norm_shift; - GetInvSqrtQuantizedMultiplierExp(acc, kReverseShift, &inv_l2norm_multiplier, - &inv_l2norm_shift); - - for (int inner_index = 0; inner_index < depth; ++inner_index) { - int32_t input = - input_data[depth * outer_index + inner_index] - input_zero_point; - - // Rescale and downcast. Rescale is folded into the division. - int32_t output_in_q24 = MultiplyByQuantizedMultiplier( - input, inv_l2norm_multiplier, inv_l2norm_shift + kOutputScale); - output_in_q24 = - std::min(static_cast(kMaxInt8), - std::max(static_cast(kMinInt8), output_in_q24)); - output_data[depth * outer_index + inner_index] = - static_cast(output_in_q24); - } - } -} -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_L2NORMALIZATION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h deleted file mode 100644 index e315683c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/logistic.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ - -#include -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void Logistic(int32_t input_zero_point, int32_t input_range_radius, - int32_t input_multiplier, int32_t input_left_shift, - int32_t input_size, const int8_t* input_data, - int8_t* output_data) { - // Integer bits must be in sync with Prepare() function. - static constexpr int32_t kInputIntegerBits = 4; - static constexpr int32_t kOutputIntegerBits = 8; - static constexpr int8_t kMinInt8 = std::numeric_limits::min(); - static constexpr int8_t kMaxInt8 = std::numeric_limits::max(); - static constexpr int32_t kOutputZeroPoint = -128; - - for (int i = 0; i < input_size; ++i) { - const int32_t input = - static_cast(input_data[i]) - input_zero_point; - if (input <= -input_range_radius) { - output_data[i] = kMinInt8; - } else if (input >= input_range_radius) { - output_data[i] = kMaxInt8; - } else { - const int32_t input_in_q4 = MultiplyByQuantizedMultiplier( - input, input_multiplier, input_left_shift); - using FixedPoint4 = gemmlowp::FixedPoint; - const int32_t output_in_q0 = - gemmlowp::logistic(FixedPoint4::FromRaw(input_in_q4)).raw(); - - // Rescale and downcast. - using gemmlowp::RoundingDivideByPOT; - int32_t output_in_q23 = - RoundingDivideByPOT(output_in_q0, 31 - kOutputIntegerBits); - output_in_q23 = std::min(std::max(output_in_q23 + kOutputZeroPoint, - static_cast(kMinInt8)), - static_cast(kMaxInt8)); - output_data[i] = static_cast(output_in_q23); - } - } -} - -inline void Logistic(int32_t input_multiplier, int32_t input_size, - const int16_t* ptr_input_data, int16_t* ptr_output_data) { - // We use the LUT for sigmoid and take into account, that - // tanh(x) = 2*sigmoid(2*x) - 1 - - int32_t input_data_mul = (input_multiplier > 0) ? input_multiplier : 1; - - for (int i = 0; i < input_size; ++i, ptr_input_data++, ptr_output_data++) { - int32_t input_data = (*ptr_input_data) * input_data_mul; - - // Scale by 3/4 to expand range [-8,8]->[-10.7,10.7] and - // we do interpolation on unsigned values. - uint32_t abs_input_data = 3 * abs(input_data); - - // We divide by 2 power of 9, because - // we need to divide by 2 in power of 7 for - // the input conversion + 1/4 from the scale above. - uint8_t uh = abs_input_data >> 9; - uint32_t ua = sigmoid_table_uint16[uh]; - uint32_t ub = sigmoid_table_uint16[uh + 1]; - uint32_t ut = abs_input_data & 0x1ff; - - // Interpolation is done using the fractional bit. - uint32_t result = (ua << 9) + ut * (ub - ua); - - result = (input_data >= 0) ? (result + (1 << 9)) - : ((1 << (16 + 9)) - result + (1 << 9) - 1); - - // Back to 16-bit. - result >>= 10; - - *ptr_output_data = result; - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_LOGISTIC_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h deleted file mode 100644 index b80838aa..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/mul.h +++ /dev/null @@ -1,131 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ - -#include "fixedpoint/fixedpoint.h" -#include "ruy/profiler/instrumentation.h" // from @ruy -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -template -inline void MulElementwise(int size, const ArithmeticParams& params, - const T* input1_data, const T* input2_data, - T* output_data) { - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t unclamped_result = - params.output_offset + - MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, unclamped_result)); - output_data[i] = static_cast(clamped_output); - } -} - -template -inline void Mul(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const T* input1_data, - const RuntimeShape& input2_shape, const T* input2_data, - const RuntimeShape& output_shape, T* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - ruy::profiler::ScopeLabel label("Mul/8bit"); - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - MulElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -// Mul with 16 bit inputs and int8_t outputs. -inline void Mul(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const int16_t* input1_data, - const RuntimeShape& input2_shape, const int16_t* input2_data, - const RuntimeShape& output_shape, int8_t* output_data) { - ruy::profiler::ScopeLabel label("Mul/Int16Int8"); - int32_t output_offset = params.output_offset; - int32_t output_activation_min = params.quantized_activation_min; - int32_t output_activation_max = params.quantized_activation_max; - TFLITE_DCHECK_LE(output_activation_min, output_activation_max); - - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - // F0 uses 0 integer bits, range [-1, 1]. - using F0 = gemmlowp::FixedPoint; - - F0 unclamped_result = - F0::FromRaw(input1_data[i]) * F0::FromRaw(input2_data[i]); - int16_t rescaled_result = - gemmlowp::RoundingDivideByPOT(unclamped_result.raw(), 8); - int16_t clamped_result = std::min( - output_activation_max - output_offset, rescaled_result); - clamped_result = std::max(output_activation_min - output_offset, - clamped_result); - output_data[i] = output_offset + clamped_result; - } -} - -template -inline void BroadcastMul4DSlow( - const ArithmeticParams& params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("BroadcastMul4DSlow"); - - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - // The input shapes are extended as part of NdArrayDesc initialization. - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - const int32_t input1_val = - params.input1_offset + - input1_data[SubscriptToIndex(desc1, b, y, x, c)]; - const int32_t input2_val = - params.input2_offset + - input2_data[SubscriptToIndex(desc2, b, y, x, c)]; - const int32_t unclamped_result = - params.output_offset + - MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); - const int32_t clamped_output = std::min( - params.quantized_activation_max, - std::max(params.quantized_activation_min, unclamped_result)); - output_data[Offset(extended_output_shape, b, y, x, c)] = - static_cast(clamped_output); - } - } - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_MUL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h deleted file mode 100644 index 17944bc4..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/pooling.h +++ /dev/null @@ -1,258 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ - -#include -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void AveragePool(const PoolParams& params, - const RuntimeShape& input_shape, - const int8_t* input_data, - const RuntimeShape& output_shape, int8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - int32_t acc = 0; - int filter_count = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - acc += - input_data[Offset(input_shape, batch, in_y, in_x, channel)]; - filter_count++; - } - } - // Round to the closest integer value. - acc = acc > 0 ? (acc + filter_count / 2) / filter_count - : (acc - filter_count / 2) / filter_count; - acc = std::max(acc, params.quantized_activation_min); - acc = std::min(acc, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(acc); - } - } - } - } -} - -inline void MaxPool(const PoolParams& params, const RuntimeShape& input_shape, - const int8_t* input_data, const RuntimeShape& output_shape, - int8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_GE(params.quantized_activation_min, - std::numeric_limits::min()); - TFLITE_DCHECK_LE(params.quantized_activation_max, - std::numeric_limits::max()); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - int8_t max = std::numeric_limits::lowest(); - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - max = std::max( - max, - input_data[Offset(input_shape, batch, in_y, in_x, channel)]); - } - } - max = std::max(max, params.quantized_activation_min); - max = std::min(max, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(max); - } - } - } - } -} - -inline void AveragePool(const PoolParams& params, - const RuntimeShape& input_shape, - const int16_t* input_data, - const RuntimeShape& output_shape, - int16_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - int32_t acc = 0; - int filter_count = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - acc += - input_data[Offset(input_shape, batch, in_y, in_x, channel)]; - filter_count++; - } - } - // Round to the closest integer value. - acc = acc > 0 ? (acc + filter_count / 2) / filter_count - : (acc - filter_count / 2) / filter_count; - acc = std::max(acc, params.quantized_activation_min); - acc = std::min(acc, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(acc); - } - } - } - } -} - -inline void MaxPool(const PoolParams& params, const RuntimeShape& input_shape, - const int16_t* input_data, const RuntimeShape& output_shape, - int16_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_GE(params.quantized_activation_min, - std::numeric_limits::min()); - TFLITE_DCHECK_LE(params.quantized_activation_max, - std::numeric_limits::max()); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - int16_t max = std::numeric_limits::lowest(); - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - max = std::max( - max, - input_data[Offset(input_shape, batch, in_y, in_x, channel)]); - } - } - max = std::max(max, params.quantized_activation_min); - max = std::min(max, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(max); - } - } - } - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_POOLING_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h deleted file mode 100644 index baae65ab..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/integer_ops/tanh.h +++ /dev/null @@ -1,106 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ - -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { -namespace reference_integer_ops { - -inline void Tanh(int32_t input_zero_point, int32_t input_range_radius, - int32_t input_multiplier, int32_t input_shift, - int32_t input_size, const int8_t* input_data, - int8_t* output_data) { - // Integer bits must be in sync with Prepare() function. - static constexpr int32_t kInputIntegerBits = 4; - static constexpr int32_t kOutputScale = 7; - static constexpr int32_t kMinInt8 = std::numeric_limits::min(); - static constexpr int32_t kMaxInt8 = std::numeric_limits::max(); - using F4 = gemmlowp::FixedPoint; - - for (int i = 0; i < input_size; ++i) { - const int32_t input = - static_cast(input_data[i]) - input_zero_point; - if (input <= -input_range_radius) { - output_data[i] = kMinInt8; - } else if (input >= input_range_radius) { - output_data[i] = kMaxInt8; - } else { - const int32_t input_in_q4 = - MultiplyByQuantizedMultiplier(input, input_multiplier, input_shift); - const int32_t output_in_q0 = - gemmlowp::tanh(F4::FromRaw(input_in_q4)).raw(); - - // Rescale and downcast. - using gemmlowp::RoundingDivideByPOT; - int32_t output_in_q24 = - RoundingDivideByPOT(output_in_q0, 31 - kOutputScale); - output_in_q24 = std::min(std::max(output_in_q24, kMinInt8), kMaxInt8); - output_data[i] = static_cast(output_in_q24); - } - } -} - -inline void Tanh(int32_t input_multiplier, int32_t input_left_shift, - int32_t input_size, const int16_t* ptr_input_data, - int16_t* ptr_output_data) { - // We use the LUT for sigmoid and take into account, that - // tanh(x) = 2*sigmoid(2*x) - 1 - - int32_t input_data_mul = (input_multiplier > 0) ? input_multiplier : 1; - - for (int i = 0; i < input_size; ++i, ptr_input_data++, ptr_output_data++) { - int32_t input_data = (*ptr_input_data) * input_data_mul; - - if (input_left_shift == 1) { - input_data <<= 1; - } - - // Scale by 3/4 to expand range [-8,8]->[-10.7,10.7]. - uint32_t abs_input_data = 3 * abs(input_data); - uint32_t uh = abs_input_data >> 8; - int32_t result; - - if (uh >= 255) { - // Saturate to maximum. - result = 0xFFFF << 8; - } else { - uint32_t ua = sigmoid_table_uint16[uh]; - uint32_t ub = sigmoid_table_uint16[uh + 1]; - - uint8_t ut = abs_input_data & 0xFF; - - result = (ua << 8) + ut * (ub - ua); - } - - result = (input_data >= 0) - ? (result - (1 << (14 + 9)) + (1 << (9 - 2))) - : (-result + (1 << (14 + 9)) + (1 << (9 - 2)) - 1); - - // Convert back to 16-bit. - result >>= (9 - 1); - - *ptr_output_data = result; - } -} - -} // namespace reference_integer_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_INTEGER_OPS_TANH_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/l2normalization.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/l2normalization.h deleted file mode 100644 index 7587d2b5..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/l2normalization.h +++ /dev/null @@ -1,90 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ - -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline void L2Normalization(const tflite::L2NormalizationParams& op_params, - const RuntimeShape& input_shape, - const float* input_data, - const RuntimeShape& output_shape, - float* output_data, float epsilon = 1e-6) { - const int trailing_dim = input_shape.DimensionsCount() - 1; - const int outer_size = - MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); - const int depth = - MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); - for (int i = 0; i < outer_size; ++i) { - float squared_l2_norm = 0; - for (int c = 0; c < depth; ++c) { - const float val = input_data[depth * i + c]; - squared_l2_norm += val * val; - } - float l2_norm = std::sqrt(squared_l2_norm); - l2_norm = std::max(l2_norm, epsilon); - for (int c = 0; c < depth; ++c) { - output_data[depth * i + c] = input_data[depth * i + c] / l2_norm; - } - } -} - -inline void L2Normalization(const tflite::L2NormalizationParams& op_params, - const RuntimeShape& input_shape, - const uint8_t* input_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - const int trailing_dim = input_shape.DimensionsCount() - 1; - const int depth = - MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); - const int outer_size = - MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); - const int32_t input_zero_point = op_params.input_zero_point; - - for (int i = 0; i < outer_size; ++i) { - int32_t square_l2_norm = 0; - for (int c = 0; c < depth; c++) { - int32_t diff = input_data[depth * i + c] - input_zero_point; - square_l2_norm += diff * diff; - } - int32_t inv_l2norm_multiplier; - int inv_l2norm_shift; - GetInvSqrtQuantizedMultiplierExp(square_l2_norm, kReverseShift, - &inv_l2norm_multiplier, &inv_l2norm_shift); - for (int c = 0; c < depth; c++) { - int32_t diff = input_data[depth * i + c] - input_zero_point; - int32_t rescaled_diff = MultiplyByQuantizedMultiplierSmallerThanOneExp( - 128 * diff, inv_l2norm_multiplier, inv_l2norm_shift); - int32_t unclamped_output_val = 128 + rescaled_diff; - int32_t output_val = - std::min(static_cast(255), - std::max(static_cast(0), unclamped_output_val)); - output_data[depth * i + c] = static_cast(output_val); - } - } -} - -} // namespace reference_ops -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_L2NORMALIZATION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/logistic.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/logistic.h deleted file mode 100644 index 64b7133b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/logistic.h +++ /dev/null @@ -1,132 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ - -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/quantization_util.h" -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/kernels/op_macros.h" - -namespace tflite { -namespace reference_ops { - -inline void Logistic(const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const float cutoff_upper = 16.619047164916992188f; - const float cutoff_lower = -9.f; - - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - // Rational for using approximation in reference kernel. - // 0. This approximation gives enough precision for float. - // 1. This works around an issue on an embedded chipset where exp() does not - // return correctly as expected - exp(x) should return inf when overflown - // not 1.701417 IEEE 754 defines representation for inf. - // 2. This will speed up calculation and is matching the behavior in the - // optimized kernels. (check the definition of scalar_logistic_op) - - for (int i = 0; i < flat_size; i++) { - float val = input_data[i]; - float result; - if (val > cutoff_upper) { - result = 1.0f; - } else if (val < cutoff_lower) { - result = std::exp(val); - } else { - result = 1.f / (1.f + std::exp(-val)); - } - output_data[i] = result; - } -} - -// Convenience version that allows, for example, generated-code calls to be -// uniform between data types. -inline void Logistic(const LogisticParams&, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& output_shape, - float* output_data) { - // Drop params: not needed. - Logistic(input_shape, input_data, output_shape, output_data); -} - -inline void Logistic(const LogisticParams& params, - const RuntimeShape& input_shape, const int16_t* input_data, - const RuntimeShape& output_shape, int16_t* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - // F0 uses 0 integer bits, range [-1, 1]. - // This is the return type of math functions such as tanh, logistic, - // whose range is in [-1, 1]. - using F0 = gemmlowp::FixedPoint; - // F3 uses 3 integer bits, range [-8, 8], the input range expected here. - using F3 = gemmlowp::FixedPoint; - - const F3 input = F3::FromRaw(input_data[i]); - F0 output = gemmlowp::logistic(input); - output_data[i] = output.raw(); - } -} - -// Quantized int8_t logistic activation. Cheats by dequantizing and -// requantizing around the floating point logistic method. This implementation -// is slow on platforms without a floating point unit. - -// TODO(b/141211002): Delete this int8_t implementation once we can reuse the -// approach used in TFLite for int8_t Logistic. -inline void Logistic(const RuntimeShape& input_shape, const int8_t* input_data, - float input_scale, int input_zero_point, - const RuntimeShape& output_shape, int8_t* output_data, - float output_scale, int output_zero_point) { - const float cutoff_upper = 16.619047164916992188f; - const float cutoff_lower = -9.f; - - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - // Rational for using approximation in reference kernel. - // 0. This approximation gives enough precision for float. - // 1. This works around an issue on an embedded chipset where exp() does not - // return correctly as expected - exp(x) should return inf when overflown - // not 1.701417 IEEE 754 defines representation for inf. - // 2. This will speed up calculation and is matching the behavior in the - // optimized kernels. (check the definition of scalar_logistic_op) - - for (int i = 0; i < flat_size; i++) { - // Dequantize. - float val = - static_cast((input_data[i] - input_zero_point) * input_scale); - float result; - if (val > cutoff_upper) { - result = 1.0f; - } else if (val < cutoff_lower) { - result = std::exp(val); - } else { - result = 1.f / (1.f + std::exp(-val)); - } - // Requantize - int8_t output = - static_cast(result / output_scale + output_zero_point); - output_data[i] = output; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_LOGISTIC_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/maximum_minimum.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/maximum_minimum.h deleted file mode 100644 index cd11b419..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/maximum_minimum.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -template -void MaximumMinimumBroadcastSlow(const RuntimeShape& unextended_input1_shape, - const T* input1_data, - const RuntimeShape& unextended_input2_shape, - const T* input2_data, - const RuntimeShape& unextended_output_shape, - T* output_data, Op op) { - // Uses element-wise calculation if broadcast is not required. - if (unextended_input1_shape == unextended_input2_shape) { - const int flat_size = - MatchingElementsSize(unextended_input1_shape, unextended_input2_shape, - unextended_output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = op(input1_data[i], input2_data[i]); - } - } else { - TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), N); - - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast( - unextended_input1_shape, unextended_input2_shape, &desc1, &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, unextended_output_shape), - &output_desc); - - auto maxmin_func = [&](int indexes[N]) { - output_data[SubscriptToIndex(output_desc, indexes)] = - op(input1_data[SubscriptToIndex(desc1, indexes)], - input2_data[SubscriptToIndex(desc2, indexes)]); - }; - NDOpsHelper(output_desc, maxmin_func); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MAXIMUM_MINIMUM_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/mul.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/mul.h deleted file mode 100644 index 0578b81b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/mul.h +++ /dev/null @@ -1,166 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ - -#include "tensorflow/lite/kernels/internal/common.h" - -namespace tflite { - -namespace reference_ops { - -// Element-wise mul that can often be used for inner loop of broadcast Mul as -// well as the non-broadcast Mul. -inline void MulElementwise(int size, const ArithmeticParams& params, - const uint8_t* input1_data, - const uint8_t* input2_data, uint8_t* output_data) { - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t unclamped_result = - params.output_offset + - MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, unclamped_result)); - output_data[i] = static_cast(clamped_output); - } -} - -template -inline void Mul(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const T* input1_data, - const RuntimeShape& input2_shape, const T* input2_data, - const RuntimeShape& output_shape, T* output_data) { - T output_activation_min; - T output_activation_max; - GetActivationParams(params, &output_activation_min, &output_activation_max); - - const int flat_size = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = ActivationFunctionWithMinMax( - input1_data[i] * input2_data[i], output_activation_min, - output_activation_max); - } -} - -inline void Mul(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const uint8_t* input1_data, - const RuntimeShape& input2_shape, const uint8_t* input2_data, - const RuntimeShape& output_shape, uint8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - const int flat_size = - MatchingFlatSize(input1_shape, input2_shape, output_shape); - - MulElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -inline void BroadcastMul4DSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const uint8_t* input1_data, - const RuntimeShape& input2_shape, - const uint8_t* input2_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - const int32_t input1_val = - params.input1_offset + - input1_data[SubscriptToIndex(desc1, b, y, x, c)]; - const int32_t input2_val = - params.input2_offset + - input2_data[SubscriptToIndex(desc2, b, y, x, c)]; - const int32_t unclamped_result = - params.output_offset + - MultiplyByQuantizedMultiplier(input1_val * input2_val, - params.output_multiplier, - params.output_shift); - const int32_t clamped_output = std::min( - params.quantized_activation_max, - std::max(params.quantized_activation_min, unclamped_result)); - output_data[Offset(extended_output_shape, b, y, x, c)] = - static_cast(clamped_output); - } - } - } - } -} - -template -void BroadcastMul4DSlow(const ArithmeticParams& params, - const RuntimeShape& unextended_input1_shape, - const T* input1_data, - const RuntimeShape& unextended_input2_shape, - const T* input2_data, - const RuntimeShape& unextended_output_shape, - T* output_data) { - T output_activation_min; - T output_activation_max; - GetActivationParams(params, &output_activation_min, &output_activation_max); - - TFLITE_DCHECK_LE(unextended_input1_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_input2_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(4, unextended_output_shape); - - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(unextended_input1_shape, - unextended_input2_shape, &desc1, &desc2); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < output_shape.Dims(0); ++b) { - for (int y = 0; y < output_shape.Dims(1); ++y) { - for (int x = 0; x < output_shape.Dims(2); ++x) { - for (int c = 0; c < output_shape.Dims(3); ++c) { - output_data[Offset(output_shape, b, y, x, c)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, b, y, x, c)] * - input2_data[SubscriptToIndex(desc2, b, y, x, c)], - output_activation_min, output_activation_max); - } - } - } - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_MUL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/neg.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/neg.h deleted file mode 100644 index e127883f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/neg.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -template -inline void Negate(const RuntimeShape& input_shape, const T* input_data, - const RuntimeShape& output_shape, T* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; ++i) { - output_data[i] = -input_data[i]; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_NEG_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pad.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pad.h deleted file mode 100644 index 2a040cef..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pad.h +++ /dev/null @@ -1,162 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ - -#include - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// TFLite Pad supports activation tensors with up to 4 dimensions. -constexpr int PadKernelMaxDimensionCount() { return 4; } - -// There are two versions of pad: Pad and PadV2. In PadV2 there is a second -// scalar input that provides the padding value. Therefore pad_value_ptr can be -// equivalent to a simple input1_data. For Pad, it should point to a zero -// value. -// -// Note that two typenames are required, so that T=P=int32_t is considered a -// specialization distinct from P=int32_t. -template -inline void PadImpl(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, const T* input_data, - const P* pad_value_ptr, const RuntimeShape& output_shape, - T* output_data) { - const RuntimeShape ext_input_shape = - RuntimeShape::ExtendedShape(PadKernelMaxDimensionCount(), input_shape); - const RuntimeShape ext_output_shape = - RuntimeShape::ExtendedShape(PadKernelMaxDimensionCount(), output_shape); - TFLITE_DCHECK_LE(op_params.left_padding_count, PadKernelMaxDimensionCount()); - TFLITE_DCHECK_LE(op_params.right_padding_count, PadKernelMaxDimensionCount()); - - // Runtime calls are currently fixed at 4 dimensions. Copy inputs so we can - // pad them to 4 dims (yes, we are "padding the padding"). - int left_padding_copy[PadKernelMaxDimensionCount()]; - for (int i = 0; i < PadKernelMaxDimensionCount(); i++) { - left_padding_copy[i] = 0; - } - for (int i = 0; i < op_params.left_padding_count; ++i) { - left_padding_copy[i + PadKernelMaxDimensionCount() - - op_params.left_padding_count] = op_params.left_padding[i]; - } - int right_padding_copy[PadKernelMaxDimensionCount()]; - for (int i = 0; i < PadKernelMaxDimensionCount(); i++) { - right_padding_copy[i] = 0; - } - for (int i = 0; i < op_params.right_padding_count; ++i) { - right_padding_copy[i + PadKernelMaxDimensionCount() - - op_params.right_padding_count] = - op_params.right_padding[i]; - } - - const int output_batch = ext_output_shape.Dims(0); - const int output_height = ext_output_shape.Dims(1); - const int output_width = ext_output_shape.Dims(2); - const int output_depth = ext_output_shape.Dims(3); - - const int left_b_padding = left_padding_copy[0]; - const int left_h_padding = left_padding_copy[1]; - const int left_w_padding = left_padding_copy[2]; - const int left_d_padding = left_padding_copy[3]; - - const int right_b_padding = right_padding_copy[0]; - const int right_h_padding = right_padding_copy[1]; - const int right_w_padding = right_padding_copy[2]; - const int right_d_padding = right_padding_copy[3]; - - const T pad_value = *pad_value_ptr; - - const T* in_ptr = input_data; - T* out_ptr = output_data; - for (int out_b = 0; out_b < output_batch; ++out_b) { - for (int out_h = 0; out_h < output_height; ++out_h) { - for (int out_w = 0; out_w < output_width; ++out_w) { - for (int out_d = 0; out_d < output_depth; ++out_d) { - if (out_b < left_b_padding || - out_b >= output_batch - right_b_padding || - out_h < left_h_padding || - out_h >= output_height - right_h_padding || - out_w < left_w_padding || - out_w >= output_width - right_w_padding || - out_d < left_d_padding || - out_d >= output_depth - right_d_padding) { - *out_ptr++ = pad_value; - } else { - *out_ptr++ = *in_ptr++; - } - } - } - } - } -} - -template -inline void Pad(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, const T* input_data, - const P* pad_value_ptr, const RuntimeShape& output_shape, - T* output_data) { - PadImpl(op_params, input_shape, input_data, pad_value_ptr, output_shape, - output_data); -} - -// The second (pad-value) input can be int32_t when, say, the first is uint8_t. -template -inline void Pad(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, const T* input_data, - const int32_t* pad_value_ptr, const RuntimeShape& output_shape, - T* output_data) { - const T converted_pad_value = static_cast(*pad_value_ptr); - PadImpl(op_params, input_shape, input_data, &converted_pad_value, - output_shape, output_data); -} - -// This version avoids conflicting template matching. -template <> -inline void Pad(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, const int32_t* input_data, - const int32_t* pad_value_ptr, const RuntimeShape& output_shape, - int32_t* output_data) { - PadImpl(op_params, input_shape, input_data, pad_value_ptr, output_shape, - output_data); -} - -template -inline void PadImageStyle(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, const T* input_data, - const P* pad_value_ptr, - const RuntimeShape& output_shape, T* output_data) { - Pad(op_params, input_shape, input_data, pad_value_ptr, output_shape, - output_data); -} - -template -inline void PadImageStyle(const tflite::PadParams& op_params, - const RuntimeShape& input_shape, - const float* input_data, const P* pad_value_ptr, - const RuntimeShape& output_shape, - float* output_data) { - Pad(op_params, input_shape, input_data, pad_value_ptr, output_shape, - output_data); -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PAD_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pooling.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pooling.h deleted file mode 100644 index 0872f521..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/pooling.h +++ /dev/null @@ -1,297 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/quantization_util.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -inline void AveragePool(const PoolParams& params, - const RuntimeShape& input_shape, - const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - float total = 0.f; - float filter_count = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - total += - input_data[Offset(input_shape, batch, in_y, in_x, channel)]; - filter_count++; - } - } - const float average = total / filter_count; - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - ActivationFunctionWithMinMax(average, params.float_activation_min, - params.float_activation_max); - } - } - } - } -} - -inline void AveragePool(const PoolParams& params, - const RuntimeShape& input_shape, - const uint8_t* input_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - int32_t acc = 0; - int filter_count = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - acc += - input_data[Offset(input_shape, batch, in_y, in_x, channel)]; - filter_count++; - } - } - acc = (acc + filter_count / 2) / filter_count; - acc = std::max(acc, params.quantized_activation_min); - acc = std::min(acc, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(acc); - } - } - } - } -} - -inline void L2Pool(const PoolParams& params, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& output_shape, - float* output_data) { - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - float sum_squares = 0.f; - int filter_count = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - const float val = - input_data[Offset(input_shape, batch, in_y, in_x, channel)]; - sum_squares += val * val; - filter_count++; - } - } - const float l2pool_result = std::sqrt(sum_squares / filter_count); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - ActivationFunctionWithMinMax(l2pool_result, - params.float_activation_min, - params.float_activation_max); - } - } - } - } -} - -inline void MaxPool(const PoolParams& params, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& output_shape, - float* output_data) { - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - float max = std::numeric_limits::lowest(); - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - max = std::max( - max, - input_data[Offset(input_shape, batch, in_y, in_x, channel)]); - } - } - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - ActivationFunctionWithMinMax(max, params.float_activation_min, - params.float_activation_max); - } - } - } - } -} - -inline void MaxPool(const PoolParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& output_shape, - uint8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - TFLITE_DCHECK_GE(params.quantized_activation_min, 0); - TFLITE_DCHECK_LE(params.quantized_activation_max, 255); - TFLITE_DCHECK_EQ(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_EQ(output_shape.DimensionsCount(), 4); - const int batches = MatchingDim(input_shape, 0, output_shape, 0); - const int depth = MatchingDim(input_shape, 3, output_shape, 3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int stride_height = params.stride_height; - const int stride_width = params.stride_width; - for (int batch = 0; batch < batches; ++batch) { - for (int out_y = 0; out_y < output_height; ++out_y) { - for (int out_x = 0; out_x < output_width; ++out_x) { - for (int channel = 0; channel < depth; ++channel) { - const int in_x_origin = - (out_x * stride_width) - params.padding_values.width; - const int in_y_origin = - (out_y * stride_height) - params.padding_values.height; - // Compute the boundaries of the filter region clamped so as to - // ensure that the filter window fits in the input array. - const int filter_x_start = std::max(0, -in_x_origin); - const int filter_x_end = - std::min(params.filter_width, input_width - in_x_origin); - const int filter_y_start = std::max(0, -in_y_origin); - const int filter_y_end = - std::min(params.filter_height, input_height - in_y_origin); - uint8_t max = 0; - for (int filter_y = filter_y_start; filter_y < filter_y_end; - ++filter_y) { - for (int filter_x = filter_x_start; filter_x < filter_x_end; - ++filter_x) { - const int in_x = in_x_origin + filter_x; - const int in_y = in_y_origin + filter_y; - max = std::max( - max, - input_data[Offset(input_shape, batch, in_y, in_x, channel)]); - } - } - max = std::max(max, params.quantized_activation_min); - max = std::min(max, params.quantized_activation_max); - output_data[Offset(output_shape, batch, out_y, out_x, channel)] = - static_cast(max); - } - } - } - } -} -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_POOLING_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/prelu.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/prelu.h deleted file mode 100644 index 02db5174..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/prelu.h +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// Broadcast prelu to output_shape for quantized uint8_t/int8_t data. -template -inline void BroadcastPrelu4DSlow( - const PreluParams& params, const RuntimeShape& input_shape, - const T* input_data, const RuntimeShape& alpha_shape, const T* alpha_data, - const RuntimeShape& output_shape, T* output_data) { - TFLITE_DCHECK_LE(input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(alpha_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), 4); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input_shape, alpha_shape, &desc1, &desc2); - - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - int output_index = Offset(extended_output_shape, b, y, x, c); - int input_index = SubscriptToIndex(desc1, b, y, x, c); - const int32_t input_value = - params.input_offset + input_data[input_index]; - int32_t output_value; - if (input_value >= 0) { - output_value = MultiplyByQuantizedMultiplier( - input_value, params.output_multiplier_1, params.output_shift_1); - } else { - auto alpha_index = SubscriptToIndex(desc2, b, y, x, c); - const int32_t alpha_value = - params.alpha_offset + alpha_data[alpha_index]; - - output_value = MultiplyByQuantizedMultiplier( - input_value * alpha_value, params.output_multiplier_2, - params.output_shift_2); - } - output_value += params.output_offset; - - const int32_t quantized_min = std::numeric_limits::min(); - const int32_t quantized_max = std::numeric_limits::max(); - const int32_t clamped_output = - std::min(quantized_max, std::max(quantized_min, output_value)); - output_data[output_index] = static_cast(clamped_output); - } - } - } - } -} - -template -inline void Prelu(const PreluParams& params, const RuntimeShape& input_shape, - const T* input_data, const RuntimeShape& alpha_shape, - const T* alpha_data, const RuntimeShape& output_shape, - T* output_data) { - const int32_t quantized_min = std::numeric_limits::min(); - const int32_t quantized_max = std::numeric_limits::max(); - - const int flat_size = - MatchingElementsSize(input_shape, alpha_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - const int32_t input_value = params.input_offset + input_data[i]; - int32_t output_value; - if (input_value >= 0) { - output_value = MultiplyByQuantizedMultiplier( - input_value, params.output_multiplier_1, params.output_shift_1); - } else { - const int32_t alpha_value = params.alpha_offset + alpha_data[i]; - - output_value = MultiplyByQuantizedMultiplier(input_value * alpha_value, - params.output_multiplier_2, - params.output_shift_2); - } - output_value += params.output_offset; - - const int32_t clamped_output = - std::min(quantized_max, std::max(quantized_min, output_value)); - output_data[i] = static_cast(clamped_output); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PRELU_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h deleted file mode 100644 index 40f779c5..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/process_broadcast_shapes.h +++ /dev/null @@ -1,138 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// Consolidates dimensions in broadcast inputs, checks for five-fold pattern. -// -// For example, if sequence of dimensions of one input is -// ..., 1, 3, 1, 7, 9, 5,... and the other is ..., 2, 3, 1, 7, 1, 1, ... -// we can consolidate these as -// ..., 1, 3*7, 9*5, ... and 2, 3*7, 1. -// -// The category is updated in the less-frequent case of shapes that are -// not suited to a fivefold-loop broadcast. -// -// Falls back to generic pattern when it does not know how to process properly. -// -// Returns true iff there is some sort of broadcast, which includes five-fold -// patterns and falling back to generic broadcast. -inline bool ProcessBroadcastShapes(const RuntimeShape& shape0, - const RuntimeShape& shape1, - tflite::ArithmeticParams* params) { - const int dims_count = - std::max(shape0.DimensionsCount(), shape1.DimensionsCount()); - - params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; - RuntimeShape scalar_shape(dims_count, 1); - - auto extended_shape0 = RuntimeShape::ExtendedShape(dims_count, shape0); - auto extended_shape1 = RuntimeShape::ExtendedShape(dims_count, shape1); - - // Check for "exact" match, implicitly accepting any scalar shapes. - if (extended_shape0 == extended_shape1) { - params->broadcast_category = BroadcastableOpCategory::kNonBroadcast; - return false; - } - - for (int i = dims_count - 1; i >= 0; --i) { - if (extended_shape0.Dims(i) == extended_shape1.Dims(i)) { - continue; - } else if (extended_shape0.Dims(i) == 1) { - params->broadcast_category = - BroadcastableOpCategory::kFirstInputBroadcastsFast; - break; - } else if (extended_shape1.Dims(i) == 1) { - params->broadcast_category = - BroadcastableOpCategory::kSecondInputBroadcastsFast; - break; - } else { - // This case is erroneous: there is a dimension that does not match and - // is not a broadcast from one shape to the other. - params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; - return true; - } - } - - if (params->broadcast_category != - BroadcastableOpCategory::kFirstInputBroadcastsFast && - params->broadcast_category != - BroadcastableOpCategory::kSecondInputBroadcastsFast) { - // This is unreachable because at least one else clause in the above loop - // must be reached. - TFLITE_DCHECK(false); - params->broadcast_category = BroadcastableOpCategory::kNonBroadcast; - return false; - } - - // From this point it is assumed contractually that corresponding dimensions - // in shape0 and shape1 are either (a) equal or (b) one or other equals 1. - const bool swap_inputs = params->broadcast_category == - BroadcastableOpCategory::kSecondInputBroadcastsFast; - const RuntimeShape* shape_a = - swap_inputs ? &extended_shape1 : &extended_shape0; - const RuntimeShape* shape_b = - swap_inputs ? &extended_shape0 : &extended_shape1; - - int i = dims_count - 1; - params->broadcast_shape[0] = 1; - params->broadcast_shape[1] = 1; - params->broadcast_shape[2] = 1; - params->broadcast_shape[3] = 1; - params->broadcast_shape[4] = 1; - // y_0 is greedy: include dims if both or neither equal 1: in other words, - // test for equality rather than (shape_a->Dims(i) != 1). - while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { - params->broadcast_shape[4] *= shape_b->Dims(i); - --i; - } - // Here either input_a or input_b has dim of 1 (if i >= 0). If it is input_b - // that has the unit dimension, the next two loops are not entered. - while (i >= 0 && shape_a->Dims(i) == 1) { - params->broadcast_shape[3] *= shape_b->Dims(i); - --i; - } - while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { - params->broadcast_shape[2] *= shape_a->Dims(i); - --i; - } - // Here either input_a or input_b has dim of 1 (if i >= 0). - while (i >= 0 && shape_b->Dims(i) == 1) { - params->broadcast_shape[1] *= shape_a->Dims(i); - --i; - } - while (i >= 0 && shape_a->Dims(i) == shape_b->Dims(i)) { - params->broadcast_shape[0] *= shape_b->Dims(i); - --i; - } - - // Rarer case is when the broadcast dimensions cannot be handled by a fivefold - // loop. - if (i >= 0) { - params->broadcast_category = BroadcastableOpCategory::kGenericBroadcast; - } - return true; -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_PROCESS_BROADCAST_SHAPES_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/quantize.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/quantize.h deleted file mode 100644 index 6f3f9aeb..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/quantize.h +++ /dev/null @@ -1,55 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ - -#include -#include - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -template -inline void AffineQuantize(const tflite::QuantizationParams& op_params, - const RuntimeShape& input_shape, - const InputT* input_data, - const RuntimeShape& output_shape, - OutputT* output_data) { - const int32_t zero_point = op_params.zero_point; - const double scale = op_params.scale; - const int flat_size = MatchingFlatSize(input_shape, output_shape); - static constexpr int32_t min_val = std::numeric_limits::min(); - static constexpr int32_t max_val = std::numeric_limits::max(); - - for (int i = 0; i < flat_size; i++) { - const InputT val = input_data[i]; - int32_t unclamped = - static_cast(TfLiteRound(val / static_cast(scale))) + - zero_point; - int32_t clamped = std::min(std::max(unclamped, min_val), max_val); - output_data[i] = clamped; - } -} - -} // namespace reference_ops - -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_QUANTIZE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/reduce.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/reduce.h deleted file mode 100644 index 597d015d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/reduce.h +++ /dev/null @@ -1,405 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ - -#include "ruy/profiler/instrumentation.h" // from @ruy -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/max.h" -#include "tensorflow/lite/kernels/internal/min.h" -#include "tensorflow/lite/kernels/internal/quantization_util.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -// A generic reduce method that can be used for reduce_sum, reduce_mean, etc. -// This method iterates through input data and reduce elements along the -// dimensions given in axis. -template -inline bool Reduce(const In* input_data, const int* input_dims, - const int* output_dims, const int input_num_dims, - const int output_num_dims, const int* axis, - const int num_axis, int* input_iter, - Out reducer(const Out current, const In in), - Out* output_data) { - // Reset input iterator. - for (int idx = 0; idx < input_num_dims; ++idx) { - input_iter[idx] = 0; - } - // Iterate through input_data. - do { - size_t input_offset = - ReducedOutputOffset(input_num_dims, input_dims, input_iter, 0, nullptr); - size_t output_offset = ReducedOutputOffset(input_num_dims, input_dims, - input_iter, num_axis, axis); - output_data[output_offset] = - reducer(output_data[output_offset], input_data[input_offset]); - } while (NextIndex(input_num_dims, input_dims, input_iter)); - return true; -} - -// This method parses the input 'axis' to remove duplicates and handle negative -// values, and returns a valid 'out_axis' -inline bool ResolveAxis(const int num_dims, const int* axis, - const int64_t num_axis, int* out_axis, - int* out_num_axis) { - *out_num_axis = 0; // Just in case. - // Short-circuit axis resolution for scalars; the axis will go unused. - if (num_dims == 0) { - return true; - } - // o(n^2) is fine since out_num_axis should be really small, mostly <= 4 - for (int64_t idx = 0; idx < num_axis; ++idx) { - // Handle negative index. A positive index 'p_idx' can be represented as a - // negative index 'n_idx' as: n_idx = p_idx-num_dims - // eg: For num_dims=3, [0, 1, 2] is the same as [-3, -2, -1] */ - int current = axis[idx] < 0 ? (axis[idx] + num_dims) : axis[idx]; - TFLITE_DCHECK(current >= 0 && current < num_dims); - bool is_dup = false; - for (int j = 0; j < *out_num_axis; ++j) { - if (out_axis[j] == current) { - is_dup = true; - break; - } - } - if (!is_dup) { - out_axis[*out_num_axis] = current; - *out_num_axis += 1; - } - } - return true; -} - -// This method expects that output_data has been initialized. -template -inline bool ReduceSumImpl(const In* input_data, const int* input_dims, - const int* output_dims, const int input_num_dims, - const int output_num_dims, const int* axis, - const int num_axis, int* input_iter, - Out* output_data) { - auto reducer = [](const Out current, const In in) -> Out { - const Out actual_in = static_cast(in); - return current + actual_in; - }; - return Reduce(input_data, input_dims, output_dims, input_num_dims, - output_num_dims, axis, num_axis, input_iter, reducer, - output_data); -} - -template -inline bool InitTensorDataForReduce(const int* dims, const int num_dims, - const T init_value, T* data) { - size_t num_elements = 1; - for (int idx = 0; idx < num_dims; ++idx) { - size_t current = static_cast(dims[idx]); - // Overflow prevention. - if (num_elements > std::numeric_limits::max() / current) { - return false; - } - num_elements *= current; - } - for (size_t idx = 0; idx < num_elements; ++idx) { - data[idx] = init_value; - } - return true; -} - -// Computes the generic value (i.e., sum/max/min/prod) of elements across -// dimensions given in axis. It needs to pass in init_value and reducer. -template -inline bool ReduceGeneric(const T* input_data, const int* input_dims, - const int input_num_dims, T* output_data, - const int* output_dims, const int output_num_dims, - const int* axis, const int64_t num_axis_dimensions, - bool keep_dims, int* temp_index, int* resolved_axis, - T init_value, - T reducer(const T current, const T in)) { - // Reset output data. - if (!InitTensorDataForReduce(output_dims, output_num_dims, init_value, - output_data)) { - return false; - } - - // Resolve axis. - int num_resolved_axis = 0; - if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, - &num_resolved_axis)) { - return false; - } - - return Reduce(input_data, input_dims, output_dims, input_num_dims, - output_num_dims, resolved_axis, num_resolved_axis, - temp_index, reducer, output_data); -} - -// Computes the mean of elements across dimensions given in axis. -// It does so in two stages, first calculates the sum of elements along the axis -// then divides it by the number of element in axis. -template -inline bool Mean(const T* input_data, const int* input_dims, - const int input_num_dims, T* output_data, - const int* output_dims, const int output_num_dims, - const int* axis, const int num_axis_dimensions, bool keep_dims, - int* temp_index, int* resolved_axis, U* temp_sum) { - ruy::profiler::ScopeLabel label("Mean"); - // Reset output data. - size_t num_outputs = 1; - for (int idx = 0; idx < output_num_dims; ++idx) { - size_t current = static_cast(output_dims[idx]); - // Overflow prevention. - if (num_outputs > std::numeric_limits::max() / current) { - return false; - } - num_outputs *= current; - } - for (size_t idx = 0; idx < num_outputs; ++idx) { - output_data[idx] = T(); - temp_sum[idx] = U(); - } - - // Resolve axis. - int num_resolved_axis = 0; - if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, - &num_resolved_axis)) { - return false; - } - - if (!ReduceSumImpl(input_data, input_dims, output_dims, input_num_dims, - output_num_dims, resolved_axis, num_resolved_axis, - temp_index, temp_sum)) { - return false; - } - - // Calculate mean by dividing output_data by num of aggregated element. - U num_elements_in_axis = 1; - for (int idx = 0; idx < num_resolved_axis; ++idx) { - size_t current = static_cast(input_dims[resolved_axis[idx]]); - // Overflow prevention. - if (current > (std::numeric_limits::max() / num_elements_in_axis)) { - return false; - } - num_elements_in_axis *= current; - } - - if (num_elements_in_axis > 0) { - for (size_t idx = 0; idx < num_outputs; ++idx) { - output_data[idx] = - static_cast(temp_sum[idx] / static_cast(num_elements_in_axis)); - } - } - return true; -} - -template -inline void Mean(const tflite::MeanParams& op_params, - const RuntimeShape& unextended_input_shape, - const T* input_data, - const RuntimeShape& unextended_output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("Mean4D"); - - // Current implementation only supports dimension equals 4 and simultaneous - // reduction over width and height. - TFLITE_CHECK_EQ(unextended_input_shape.DimensionsCount(), 4); - TFLITE_CHECK_LE(unextended_output_shape.DimensionsCount(), 4); - const RuntimeShape input_shape = - RuntimeShape::ExtendedShape(4, unextended_input_shape); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(4, unextended_output_shape); - - const int output_batch = output_shape.Dims(0); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int output_depth = output_shape.Dims(3); - - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - - TFLITE_CHECK_EQ(op_params.axis_count, 2); - TFLITE_CHECK((op_params.axis[0] == 1 && op_params.axis[1] == 2) || - (op_params.axis[0] == 2 && op_params.axis[1] == 1)); - TFLITE_CHECK_EQ(output_height, 1); - TFLITE_CHECK_EQ(output_width, 1); - - for (int out_b = 0; out_b < output_batch; ++out_b) { - for (int out_d = 0; out_d < output_depth; ++out_d) { - float value = 0; - for (int in_h = 0; in_h < input_height; ++in_h) { - for (int in_w = 0; in_w < input_width; ++in_w) { - value += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)]; - } - } - output_data[Offset(output_shape, out_b, 0, 0, out_d)] = - value / (input_width * input_height); - } - } -} - -inline void Mean(const tflite::MeanParams& op_params, - const RuntimeShape& unextended_input_shape, - const uint8_t* input_data, int32_t input_zero_point, - float input_scale, const RuntimeShape& unextended_output_shape, - uint8_t* output_data, int32_t output_zero_point, - float output_scale) { - ruy::profiler::ScopeLabel label("Mean4D/Uint8"); - - // Current implementation only supports dimension equals 4 and simultaneous - // reduction over width and height. - TFLITE_CHECK_EQ(unextended_input_shape.DimensionsCount(), 4); - TFLITE_CHECK_LE(unextended_output_shape.DimensionsCount(), 4); - const RuntimeShape input_shape = - RuntimeShape::ExtendedShape(4, unextended_input_shape); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(4, unextended_output_shape); - const int output_batch = output_shape.Dims(0); - const int output_height = output_shape.Dims(1); - const int output_width = output_shape.Dims(2); - const int output_depth = output_shape.Dims(3); - const int input_height = input_shape.Dims(1); - const int input_width = input_shape.Dims(2); - const float num_elements_in_axis = input_width * input_height; - - TFLITE_CHECK_EQ(op_params.axis_count, 2); - TFLITE_CHECK((op_params.axis[0] == 1 && op_params.axis[1] == 2) || - (op_params.axis[0] == 2 && op_params.axis[1] == 1)); - TFLITE_CHECK_EQ(output_height, 1); - TFLITE_CHECK_EQ(output_width, 1); - - constexpr int32_t kMinValue = std::numeric_limits::min(); - constexpr int32_t kMaxValue = std::numeric_limits::max(); - - int32_t bias = - output_zero_point - - static_cast(input_zero_point * input_scale / output_scale); - double real_scale = - static_cast(input_scale / (num_elements_in_axis * output_scale)); - - int32_t multiplier; - int shift; - QuantizeMultiplier(real_scale, &multiplier, &shift); - for (int out_b = 0; out_b < output_batch; ++out_b) { - for (int out_d = 0; out_d < output_depth; ++out_d) { - int32_t acc = 0; - for (int in_h = 0; in_h < input_height; ++in_h) { - for (int in_w = 0; in_w < input_width; ++in_w) { - acc += input_data[Offset(input_shape, out_b, in_h, in_w, out_d)]; - } - } - acc = MultiplyByQuantizedMultiplier(acc, multiplier, shift); - acc += bias; - acc = std::min(std::max(acc, kMinValue), kMaxValue); - output_data[Offset(output_shape, out_b, 0, 0, out_d)] = - static_cast(acc); - } - } -} - -// Computes the mean of elements across dimensions given in axis. -// It does so in two stages, first calculates the sum of elements along the axis -// then divides it by the number of element in axis for quantized values. -template -inline bool QuantizedMeanOrSum(const T* input_data, int32_t input_zero_point, - float input_scale, const int* input_dims, - const int input_num_dims, T* output_data, - int32_t output_zero_point, float output_scale, - const int* output_dims, - const int output_num_dims, const int* axis, - const int num_axis_dimensions, bool keep_dims, - int* temp_index, int* resolved_axis, U* temp_sum, - bool compute_sum) { - const bool uint8_case = std::is_same::value; - const bool int16_case = std::is_same::value; - if (uint8_case) { - ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Uint8" : "Mean/Uint8"); - } else if (int16_case) { - ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Int16" : "Mean/Int16"); - } else { - ruy::profiler::ScopeLabel label(compute_sum ? "Sum/Int8" : "Mean/Int8"); - } - // Reset output data. - size_t num_outputs = 1; - for (int idx = 0; idx < output_num_dims; ++idx) { - size_t current = static_cast(output_dims[idx]); - // Overflow prevention. - if (num_outputs > std::numeric_limits::max() / current) { - return false; - } - num_outputs *= current; - } - for (size_t idx = 0; idx < num_outputs; ++idx) { - output_data[idx] = T(); - temp_sum[idx] = U(); - } - - // Resolve axis. - int num_resolved_axis = 0; - if (!ResolveAxis(input_num_dims, axis, num_axis_dimensions, resolved_axis, - &num_resolved_axis)) { - return false; - } - - if (!ReduceSumImpl(input_data, input_dims, output_dims, input_num_dims, - output_num_dims, resolved_axis, num_resolved_axis, - temp_index, temp_sum)) { - return false; - } - - // Calculate mean by dividing output_data by num of aggregated element. - U num_elements_in_axis = 1; - for (int idx = 0; idx < num_resolved_axis; ++idx) { - size_t current = static_cast(input_dims[resolved_axis[idx]]); - // Overflow prevention. - if (current > (std::numeric_limits::max() / num_elements_in_axis)) { - return false; - } - num_elements_in_axis *= current; - } - - if (num_elements_in_axis > 0) { - const float scale = input_scale / output_scale; - if (compute_sum) { - // TODO(b/116341117): Eliminate float and do this completely in 8bit. - const float bias = - -input_zero_point * scale * num_elements_in_axis + 0.5f; - for (size_t idx = 0; idx < num_outputs; ++idx) { - const U value = - static_cast(TfLiteRound(temp_sum[idx] * scale + bias)) + - output_zero_point; - output_data[idx] = static_cast(value); - } - } else { - const float bias = -input_zero_point * scale + 0.5f; - for (size_t idx = 0; idx < num_outputs; ++idx) { - float float_mean = static_cast(temp_sum[idx]) / - static_cast(num_elements_in_axis); - float result = TfLiteMin( - TfLiteRound(float_mean * scale + bias) + output_zero_point, - static_cast(std::numeric_limits::max())); - result = TfLiteMax(result, - static_cast(std::numeric_limits::min())); - output_data[idx] = static_cast(result); - } - } - } - return true; -} - -} // namespace reference_ops - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REDUCE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/requantize.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/requantize.h deleted file mode 100644 index 32e32ed0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/requantize.h +++ /dev/null @@ -1,67 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ - -#include "ruy/profiler/instrumentation.h" // from @ruy -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace reference_ops { - -template -inline void Requantize(const input_type* input_data, int32_t size, - int32_t effective_scale_multiplier, - int32_t effective_scale_shift, int32_t input_zeropoint, - int32_t output_zeropoint, output_type* output_data) { - ruy::profiler::ScopeLabel label("Requantize"); - const bool same_scale = - (effective_scale_multiplier == 1 << 30 && effective_scale_shift == 1); - if (same_scale) { - const bool mixed_type_int8_uint8 = - std::is_same::value && - std::is_same::value; - const bool mixed_type_uint8_int8 = - std::is_same::value && - std::is_same::value; - const int32_t zero_point_diff = input_zeropoint - output_zeropoint; - // Fast path to do requantization for the case when just a shift of 128 is - // needed. - if ((mixed_type_int8_uint8 && zero_point_diff == -128) || - (mixed_type_uint8_int8 && zero_point_diff == 128)) { - for (int i = 0; i < size; ++i) { - output_data[i] = input_data[i] ^ 0x80; - } - } - } - static constexpr int32_t kMinOutput = std::numeric_limits::min(); - static constexpr int32_t kMaxOutput = std::numeric_limits::max(); - for (int i = 0; i < size; ++i) { - const int32_t input = input_data[i] - input_zeropoint; - const int32_t output = - MultiplyByQuantizedMultiplier(input, effective_scale_multiplier, - effective_scale_shift) + - output_zeropoint; - const int32_t clamped_output = - std::max(std::min(output, kMaxOutput), kMinOutput); - output_data[i] = static_cast(clamped_output); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_REQUANTIZE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h deleted file mode 100644 index 95550abc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/resize_nearest_neighbor.h +++ /dev/null @@ -1,101 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ - -#include - -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline int32_t GetNearestNeighbor(const int input_value, - const int32_t input_size, - const int32_t output_size, - const bool align_corners, - const bool half_pixel_centers) { - const float scale = - (align_corners && output_size > 1) - ? (input_size - 1) / static_cast(output_size - 1) - : input_size / static_cast(output_size); - const float offset = half_pixel_centers ? 0.5f : 0.0f; - int32_t output_value = std::min( - align_corners - ? static_cast(TfLiteRound((input_value + offset) * scale)) - : static_cast(std::floor((input_value + offset) * scale)), - input_size - 1); - if (half_pixel_centers) { - output_value = std::max(static_cast(0), output_value); - } - return output_value; -} - -template -inline void ResizeNearestNeighbor( - const tflite::ResizeNearestNeighborParams& op_params, - const RuntimeShape& unextended_input_shape, const T* input_data, - const RuntimeShape& output_size_shape, const int32_t* output_size_data, - const RuntimeShape& unextended_output_shape, T* output_data) { - TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 4); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 4); - - const RuntimeShape input_shape = - RuntimeShape::ExtendedShape(4, unextended_input_shape); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(4, unextended_output_shape); - - int32_t batches = MatchingDim(input_shape, 0, output_shape, 0); - int32_t input_height = input_shape.Dims(1); - int32_t input_width = input_shape.Dims(2); - int32_t depth = MatchingDim(input_shape, 3, output_shape, 3); - - // The Tensorflow version of this op allows resize on the width and height - // axis only. - TFLITE_DCHECK_EQ(output_size_shape.FlatSize(), 2); - int32_t output_height = output_size_data[0]; - int32_t output_width = output_size_data[1]; - - const int col_offset = input_shape.Dims(3); - const int row_offset = input_shape.Dims(2) * col_offset; - const int batch_offset = input_shape.Dims(1) * row_offset; - - const T* input_ptr = input_data; - T* output_ptr = output_data; - for (int b = 0; b < batches; ++b) { - for (int y = 0; y < output_height; ++y) { - int32_t in_y = GetNearestNeighbor(y, input_height, output_height, - op_params.align_corners, - op_params.half_pixel_centers); - const T* y_input_ptr = input_ptr + in_y * row_offset; - for (int x = 0; x < output_width; ++x) { - int32_t in_x = GetNearestNeighbor(x, input_width, output_width, - op_params.align_corners, - op_params.half_pixel_centers); - const T* x_input_ptr = y_input_ptr + in_x * col_offset; - memcpy(output_ptr, x_input_ptr, depth * sizeof(T)); - output_ptr += depth; - } - } - input_ptr += batch_offset; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_RESIZE_NEAREST_NEIGHBOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/round.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/round.h deleted file mode 100644 index 9bd8f3f2..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/round.h +++ /dev/null @@ -1,51 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ - -#include - -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline float RoundToNearest(float value) { - auto floor_val = std::floor(value); - auto diff = value - floor_val; - if ((diff < 0.5f) || - ((diff == 0.5f) && (static_cast(floor_val) % 2 == 0))) { - return floor_val; - } else { - return floor_val = floor_val + 1.0f; - } -} - -inline void Round(const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - // Note that this implementation matches that of tensorFlow tf.round - // and corresponds to the bankers rounding method. - // cfenv (for fesetround) is not yet supported universally on Android, so - // using a work around. - output_data[i] = RoundToNearest(input_data[i]); - } -} - -} // namespace reference_ops -} // namespace tflite -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_ROUND_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/softmax.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/softmax.h deleted file mode 100644 index b035b433..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/softmax.h +++ /dev/null @@ -1,228 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ - -#include -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/quantization_util.h" -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/kernels/op_macros.h" - -namespace tflite { -namespace reference_ops { - -inline void Softmax(const SoftmaxParams& params, - const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const int trailing_dim = input_shape.DimensionsCount() - 1; - const int outer_size = - MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); - const int depth = - MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); - - for (int i = 0; i < outer_size; ++i) { - // Find max element value which we'll use to ensure numerical stability - // taking advantage of the following equality: - // exp(x[i])/sum(exp(x[i])) == exp(x[i]+C)/sum(exp(x[i]+C)) - float max = std::numeric_limits::lowest(); - for (int c = 0; c < depth; ++c) { - max = std::max(max, input_data[i * depth + c]); - } - - // Compute sum. - float sum = 0.f; - for (int c = 0; c < depth; ++c) { - sum += std::exp((input_data[i * depth + c] - max) * - static_cast(params.beta)); - } - - // Compute result. - for (int c = 0; c < depth; ++c) { - output_data[i * depth + c] = std::exp((input_data[i * depth + c] - max) * - static_cast(params.beta)) / - sum; - } - } -} - -// Quantized softmax with int8_t/uint8_t input and int8_t/uint8_t/int16_t -// output. -template -inline void Softmax(const SoftmaxParams& params, - const RuntimeShape& input_shape, const InputT* input_data, - const RuntimeShape& output_shape, OutputT* output_data) { - const int32_t input_beta_multiplier = params.input_multiplier; - const int32_t input_beta_left_shift = params.input_left_shift; - const int diff_min = params.diff_min; - // The representation chosen for the input to the exp() function is Q5.26. - // We need to leave extra space since values that we skip might be as large as - // -32 before multiplying by input_beta_multiplier, and therefore as large as - // -16 afterwards. Note that exp(-8) is definitely not insignificant to - // accumulation, but exp(-16) definitely is. - static const int kScaledDiffIntegerBits = 5; - static const int kAccumulationIntegerBits = 12; - using FixedPointScaledDiff = - gemmlowp::FixedPoint; - using FixedPointAccum = - gemmlowp::FixedPoint; - using FixedPoint0 = gemmlowp::FixedPoint; - - const int trailing_dim = input_shape.DimensionsCount() - 1; - const int outer_size = - MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); - const int depth = - MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); - - for (int i = 0; i < outer_size; ++i) { - InputT max_in_row = std::numeric_limits::min(); - for (int c = 0; c < depth; ++c) { - max_in_row = std::max(max_in_row, input_data[i * depth + c]); - } - - FixedPointAccum sum_of_exps = FixedPointAccum::Zero(); - for (int c = 0; c < depth; ++c) { - int32_t input_diff = - static_cast(input_data[i * depth + c]) - max_in_row; - if (input_diff >= diff_min) { - const int32_t input_diff_rescaled = - MultiplyByQuantizedMultiplierGreaterThanOne( - input_diff, input_beta_multiplier, input_beta_left_shift); - const FixedPointScaledDiff scaled_diff_f8 = - FixedPointScaledDiff::FromRaw(input_diff_rescaled); - sum_of_exps = sum_of_exps + gemmlowp::Rescale( - exp_on_negative_values(scaled_diff_f8)); - } - } - - int num_bits_over_unit; - FixedPoint0 shifted_scale = FixedPoint0::FromRaw(GetReciprocal( - sum_of_exps.raw(), kAccumulationIntegerBits, &num_bits_over_unit)); - - for (int c = 0; c < depth; ++c) { - int32_t input_diff = - static_cast(input_data[i * depth + c]) - max_in_row; - if (input_diff >= diff_min) { - const int32_t input_diff_rescaled = - MultiplyByQuantizedMultiplierGreaterThanOne( - input_diff, input_beta_multiplier, input_beta_left_shift); - const FixedPointScaledDiff scaled_diff_f8 = - FixedPointScaledDiff::FromRaw(input_diff_rescaled); - - FixedPoint0 exp_in_0 = exp_on_negative_values(scaled_diff_f8); - int32_t unsat_output = gemmlowp::RoundingDivideByPOT( - (shifted_scale * exp_in_0).raw(), - num_bits_over_unit + 31 - (sizeof(OutputT) * 8)); - - const int32_t shifted_output = - unsat_output + - static_cast(std::numeric_limits::min()); - - output_data[i * depth + c] = static_cast(std::max( - std::min(shifted_output, - static_cast(std::numeric_limits::max())), - static_cast(std::numeric_limits::min()))); - } else { - output_data[i * depth + c] = std::numeric_limits::min(); - } - } - } -} - -// Quantized softmax with int16_t input and int16_t output. -inline void SoftmaxInt16(const SoftmaxParams& params, - const RuntimeShape& input_shape, - const int16_t* input_data, - const RuntimeShape& output_shape, - int16_t* output_data) { - const int trailing_dim = input_shape.DimensionsCount() - 1; - const int outer_size = - MatchingFlatSizeSkipDim(input_shape, trailing_dim, output_shape); - const int depth = - MatchingDim(input_shape, trailing_dim, output_shape, trailing_dim); - - for (int i = 0; i < outer_size; ++i) { - // Find the largest element - int16_t max_in_row = std::numeric_limits::min(); - for (int c = 0; c < depth; ++c) { - max_in_row = std::max(max_in_row, input_data[i * depth + c]); - } - - // Compute exp(input - max_input) - std::vector exp_result_Q015(depth); - for (int c = 0; c < depth; ++c) { - int32_t input_diff = input_data[i * depth + c] - max_in_row; - // scale the input_diff such that [-65535, 0] correspond to [-10.0, 0.0] - int32_t scaled_diff = MultiplyByQuantizedMultiplier( - input_diff, params.input_multiplier, params.input_left_shift); - // recenter to [-32768, 32767] - int32_t sym_scaled_diff = scaled_diff + 32767; - int16_t sat_sym_scaled_diff = - std::min(std::max(sym_scaled_diff, static_cast(-32768)), - static_cast(32767)); - // apply the exp() LUT activation function - exp_result_Q015[c] = - generic_int16_table_lookup(sat_sym_scaled_diff, params.exp_lut); - } - - // sum_of_exps is a Q16.15 fixed point format. - int32_t sum_of_exps = 0; - for (int c = 0; c < depth; ++c) { - // Q16.15 + Q0.15 - sum_of_exps += exp_result_Q015[c]; - } - - // Compute the reciprocal 1/sum_of_exps - uint8_t headroom_plus_one = - CountLeadingZeros(static_cast(sum_of_exps)); - int32_t shifted_sum = - ((static_cast(sum_of_exps) << (headroom_plus_one - 1)) + - (1 << 13)) >> - 14; - // since the LUT computes 1/(1 + x) we need to first compute x = (sum - 1). - // also, the LUT expects a symmetrical input, so we must also recenter x - // from [0, 65535] to [-32768, 32767]. - int32_t sym_shifted_sum = shifted_sum + (-((1 << 15) + (1 << 16))); - int16_t sat_sym_shifted_sum = static_cast( - std::min(std::max(sym_shifted_sum, static_cast(-32768)), - static_cast(32767))); - // apply 1/(1 + x) LUT activation function - int16_t reciprocal_scale_Q015 = generic_int16_table_lookup( - sat_sym_shifted_sum, params.one_over_one_plus_x_lut); - - // Rescale the exp_result with reciprocal - // range of output is [0, 32767] correspond to [0.0, 1.0] - for (int c = 0; c < depth; ++c) { - uint8_t right_shift = 31 - headroom_plus_one; - int64_t round = 1 << (right_shift - 1); - int32_t result = (static_cast(exp_result_Q015[c]) * - static_cast(reciprocal_scale_Q015) + - round) >> - right_shift; - output_data[i * depth + c] = static_cast( - std::min(std::max(result, static_cast(0)), - static_cast(32767))); - } - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SOFTMAX_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/strided_slice.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/strided_slice.h deleted file mode 100644 index 8b6f0c13..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/strided_slice.h +++ /dev/null @@ -1,94 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ - -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/strided_slice_logic.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { -template -inline void StridedSlice(const tflite::StridedSliceParams& op_params, - const RuntimeShape& unextended_input_shape, - const T* input_data, - const RuntimeShape& unextended_output_shape, - T* output_data) { - using strided_slice::LoopCondition; - using strided_slice::StartForAxis; - using strided_slice::StopForAxis; - // Note that the output_shape is not used herein. - tflite::StridedSliceParams params_copy = op_params; - - TFLITE_DCHECK_LE(unextended_input_shape.DimensionsCount(), 5); - TFLITE_DCHECK_LE(unextended_output_shape.DimensionsCount(), 5); - const RuntimeShape input_shape = - RuntimeShape::ExtendedShape(5, unextended_input_shape); - const RuntimeShape output_shape = - RuntimeShape::ExtendedShape(5, unextended_output_shape); - - // Reverse and pad to 5 dimensions because that is what the runtime code - // requires (ie. all shapes must be 5D and are given backwards). - strided_slice::StridedSlicePadIndices(¶ms_copy, 5); - - const int start_0 = StartForAxis(params_copy, input_shape, 0); - const int stop_0 = StopForAxis(params_copy, input_shape, 0, start_0); - const int start_1 = StartForAxis(params_copy, input_shape, 1); - const int stop_1 = StopForAxis(params_copy, input_shape, 1, start_1); - const int start_2 = StartForAxis(params_copy, input_shape, 2); - const int stop_2 = StopForAxis(params_copy, input_shape, 2, start_2); - const int start_3 = StartForAxis(params_copy, input_shape, 3); - const int stop_3 = StopForAxis(params_copy, input_shape, 3, start_3); - const int start_4 = StartForAxis(params_copy, input_shape, 4); - const int stop_4 = StopForAxis(params_copy, input_shape, 4, start_4); - - T* out_ptr = output_data; - for (int offset_0 = start_0 * input_shape.Dims(1), - end_0 = stop_0 * input_shape.Dims(1), - step_0 = params_copy.strides[0] * input_shape.Dims(1); - !LoopCondition(offset_0, end_0, params_copy.strides[0]); - offset_0 += step_0) { - for (int offset_1 = (offset_0 + start_1) * input_shape.Dims(2), - end_1 = (offset_0 + stop_1) * input_shape.Dims(2), - step_1 = params_copy.strides[1] * input_shape.Dims(2); - !LoopCondition(offset_1, end_1, params_copy.strides[1]); - offset_1 += step_1) { - for (int offset_2 = (offset_1 + start_2) * input_shape.Dims(3), - end_2 = (offset_1 + stop_2) * input_shape.Dims(3), - step_2 = params_copy.strides[2] * input_shape.Dims(3); - !LoopCondition(offset_2, end_2, params_copy.strides[2]); - offset_2 += step_2) { - for (int offset_3 = (offset_2 + start_3) * input_shape.Dims(4), - end_3 = (offset_2 + stop_3) * input_shape.Dims(4), - step_3 = params_copy.strides[3] * input_shape.Dims(4); - !LoopCondition(offset_3, end_3, params_copy.strides[3]); - offset_3 += step_3) { - for (int offset_4 = offset_3 + start_4, end_4 = offset_3 + stop_4; - !LoopCondition(offset_4, end_4, params_copy.strides[4]); - offset_4 += params_copy.strides[4]) { - *out_ptr++ = input_data[offset_4]; - } - } - } - } - } -} -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_STRIDED_SLICE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/sub.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/sub.h deleted file mode 100644 index b27f251d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/sub.h +++ /dev/null @@ -1,516 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ - -#include - -#include -#include - -#include "ruy/profiler/instrumentation.h" // from @ruy -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -namespace reference_ops { - -inline void SubNonBroadcast(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const float* input1_data, - const RuntimeShape& input2_shape, - const float* input2_data, - const RuntimeShape& output_shape, - float* output_data) { - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = ActivationFunctionWithMinMax( - input1_data[i] - input2_data[i], params.float_activation_min, - params.float_activation_max); - } -} - -inline void SubNonBroadcast(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int32_t* input1_data, - const RuntimeShape& input2_shape, - const int32_t* input2_data, - const RuntimeShape& output_shape, - int32_t* output_data) { - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - for (int i = 0; i < flat_size; ++i) { - output_data[i] = ActivationFunctionWithMinMax( - input1_data[i] - input2_data[i], params.quantized_activation_min, - params.quantized_activation_max); - } -} - -// TODO(b/151345304): We can implement BroadcastSub on buffers of arbitrary -// dimensionality if the runtime code does a single loop over one dimension -// that handles broadcasting as the base case. The code generator would then -// generate max(D1, D2) nested for loops. -// TODO(b/151345101): BroadcastSub is intentionally duplicated from -// reference_ops.h. Once an optimized version is implemented and NdArrayDesc -// is no longer referenced in this file, move NdArrayDesc from types.h to -// reference_ops.h. -template -inline void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const float* input1_data, - const RuntimeShape& input2_shape, - const float* input2_data, - const RuntimeShape& output_shape, - float* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/float"); - TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - output_data[SubscriptToIndex(output_desc, indexes)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, indexes)] - - input2_data[SubscriptToIndex(desc2, indexes)], - params.float_activation_min, params.float_activation_max); - }; - NDOpsHelper(output_desc, sub_func); -} - -template -inline void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const uint8_t* input1_data, - const RuntimeShape& input2_shape, - const uint8_t* input2_data, - const RuntimeShape& output_shape, - uint8_t* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/uint8_t"); - TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - const int32_t input1_val = - params.input1_offset + input1_data[SubscriptToIndex(desc1, indexes)]; - const int32_t input2_val = - params.input2_offset + input2_data[SubscriptToIndex(desc2, indexes)]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sub = scaled_input1_val - scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sub, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[SubscriptToIndex(output_desc, indexes)] = - static_cast(clamped_output); - }; - NDOpsHelper(output_desc, sub_func); -} - -template -inline void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int32_t* input1_data, - const RuntimeShape& input2_shape, - const int32_t* input2_data, - const RuntimeShape& output_shape, - int32_t* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/int32_t"); - TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - output_data[SubscriptToIndex(output_desc, indexes)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, indexes)] - - input2_data[SubscriptToIndex(desc2, indexes)], - params.quantized_activation_min, params.quantized_activation_max); - }; - NDOpsHelper(output_desc, sub_func); -} - -template -inline void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int8_t* input1_data, - const RuntimeShape& input2_shape, - const int8_t* input2_data, - const RuntimeShape& output_shape, - int8_t* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/int8_t"); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - const int32_t input1_val = - params.input1_offset + input1_data[SubscriptToIndex(desc1, indexes)]; - const int32_t input2_val = - params.input2_offset + input2_data[SubscriptToIndex(desc2, indexes)]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sub = scaled_input1_val - scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sub, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[SubscriptToIndex(output_desc, indexes)] = - static_cast(clamped_output); - }; - NDOpsHelper(output_desc, sub_func); -} - -template -void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, - const int64_t* input1_data, - const RuntimeShape& input2_shape, - const int64_t* input2_data, - const RuntimeShape& output_shape, int64_t* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/int64_t"); - TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - output_data[SubscriptToIndex(output_desc, indexes)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, indexes)] - - input2_data[SubscriptToIndex(desc2, indexes)], - params.int64_activation_min, params.int64_activation_max); - }; - NDOpsHelper(output_desc, sub_func); -} - -template -void BroadcastSubSlow(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const T* input1_data, - const RuntimeShape& input2_shape, const T* input2_data, - const RuntimeShape& output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("BroadcastSubSlow/templated"); - TFLITE_DCHECK_LE(input1_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(input2_shape.DimensionsCount(), N); - TFLITE_DCHECK_LE(output_shape.DimensionsCount(), N); - NdArrayDesc desc1; - NdArrayDesc desc2; - NdArrayDesc output_desc; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - CopyDimsToDesc(RuntimeShape::ExtendedShape(N, output_shape), &output_desc); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - auto sub_func = [&](int indexes[N]) { - output_data[SubscriptToIndex(output_desc, indexes)] = - ActivationFunctionWithMinMax( - input1_data[SubscriptToIndex(desc1, indexes)] - - input2_data[SubscriptToIndex(desc2, indexes)], - params.quantized_activation_min, params.quantized_activation_max); - }; - NDOpsHelper(output_desc, sub_func); -} - -// Element-wise Sub that can often be used for inner loop of broadcast sub as -// well as the non-broadcast sub. -inline void SubElementwise(int size, const ArithmeticParams& params, - const uint8_t* input1_data, - const uint8_t* input2_data, uint8_t* output_data) { - TFLITE_DCHECK_GT(params.input1_offset, -256); - TFLITE_DCHECK_GT(params.input2_offset, -256); - TFLITE_DCHECK_LT(params.input1_offset, 256); - TFLITE_DCHECK_LT(params.input2_offset, 256); - - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sub = scaled_input1_val - scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sub, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[i] = static_cast(clamped_output); - } -} - -// Element-wise add that can often be used for inner loop of broadcast add as -// well as the non-broadcast add. -inline void SubElementwise(int size, const ArithmeticParams& params, - const int8_t* input1_data, const int8_t* input2_data, - int8_t* output_data) { - const int32_t int8_max_value = std::numeric_limits::max(); - TFLITE_DCHECK_GE(params.input1_offset, -1 * int8_max_value); - TFLITE_DCHECK_GE(params.input2_offset, -1 * int8_max_value); - TFLITE_DCHECK_LE(params.input1_offset, int8_max_value); - TFLITE_DCHECK_LE(params.input2_offset, int8_max_value); - - for (int i = 0; i < size; ++i) { - const int32_t input1_val = params.input1_offset + input1_data[i]; - const int32_t input2_val = params.input2_offset + input2_data[i]; - const int32_t shifted_input1_val = input1_val * (1 << params.left_shift); - const int32_t shifted_input2_val = input2_val * (1 << params.left_shift); - const int32_t scaled_input1_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input1_val, params.input1_multiplier, params.input1_shift); - const int32_t scaled_input2_val = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - shifted_input2_val, params.input2_multiplier, params.input2_shift); - const int32_t raw_sub = scaled_input1_val - scaled_input2_val; - const int32_t raw_output = - MultiplyByQuantizedMultiplierSmallerThanOneExp( - raw_sub, params.output_multiplier, params.output_shift) + - params.output_offset; - const int32_t clamped_output = - std::min(params.quantized_activation_max, - std::max(params.quantized_activation_min, raw_output)); - output_data[i] = static_cast(clamped_output); - } -} - -inline void Sub(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const uint8_t* input1_data, - const RuntimeShape& input2_shape, const uint8_t* input2_data, - const RuntimeShape& output_shape, uint8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - TFLITE_DCHECK_GT(params.input1_offset, -256); - TFLITE_DCHECK_GT(params.input2_offset, -256); - TFLITE_DCHECK_LT(params.input1_offset, 256); - TFLITE_DCHECK_LT(params.input2_offset, 256); - SubElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -inline void Sub(const ArithmeticParams& params, - const RuntimeShape& input1_shape, const int8_t* input1_data, - const RuntimeShape& input2_shape, const int8_t* input2_data, - const RuntimeShape& output_shape, int8_t* output_data) { - TFLITE_DCHECK_LE(params.quantized_activation_min, - params.quantized_activation_max); - - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - - const int32_t int8_max_value = std::numeric_limits::max(); - TFLITE_DCHECK_GE(params.input1_offset, -1 * int8_max_value); - TFLITE_DCHECK_GE(params.input2_offset, -1 * int8_max_value); - TFLITE_DCHECK_LE(params.input1_offset, int8_max_value); - TFLITE_DCHECK_LE(params.input2_offset, int8_max_value); - SubElementwise(flat_size, params, input1_data, input2_data, output_data); -} - -template -void Sub(const ArithmeticParams& params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, - T* output_data) { - NdArrayDesc<4> desc1; - NdArrayDesc<4> desc2; - NdArrayDescsForElementwiseBroadcast(input1_shape, input2_shape, &desc1, - &desc2); - const RuntimeShape extended_output_shape = - RuntimeShape::ExtendedShape(4, output_shape); - - // In Tensorflow, the dimensions are canonically named (batch_number, row, - // col, channel), with extents (batches, height, width, depth), with the - // trailing dimension changing most rapidly (channels has the smallest stride, - // typically 1 element). - // - // In generated C code, we store arrays with the dimensions reversed. The - // first dimension has smallest stride. - // - // We name our variables by their Tensorflow convention, but generate C code - // nesting loops such that the innermost loop has the smallest stride for the - // best cache behavior. - for (int b = 0; b < extended_output_shape.Dims(0); ++b) { - for (int y = 0; y < extended_output_shape.Dims(1); ++y) { - for (int x = 0; x < extended_output_shape.Dims(2); ++x) { - for (int c = 0; c < extended_output_shape.Dims(3); ++c) { - output_data[Offset(extended_output_shape, b, y, x, c)] = - input1_data[SubscriptToIndex(desc1, b, y, x, c)] - - input2_data[SubscriptToIndex(desc2, b, y, x, c)]; - } - } - } - } -} - -inline void SetActivationMinMax(const ArithmeticParams& params, - int32_t* activation_min, - int32_t* activation_max) { - *activation_min = params.quantized_activation_min; - *activation_max = params.quantized_activation_max; -} - -inline void SetActivationMinMax(const ArithmeticParams& params, - float* activation_min, float* activation_max) { - *activation_min = params.float_activation_min; - *activation_max = params.float_activation_max; -} - -inline void SetActivationMinMax(const ArithmeticParams& params, - int64_t* activation_min, - int64_t* activation_max) { - *activation_min = params.int64_activation_min; - *activation_max = params.int64_activation_max; -} - -template -inline void SubWithActivation( - const ArithmeticParams& params, const RuntimeShape& input1_shape, - const T* input1_data, const RuntimeShape& input2_shape, - const T* input2_data, const RuntimeShape& output_shape, T* output_data) { - ruy::profiler::ScopeLabel label("SubWithActivation"); - const int flat_size = - MatchingElementsSize(input1_shape, input2_shape, output_shape); - T activation_min, activation_max; - SetActivationMinMax(params, &activation_min, &activation_max); - - for (int i = 0; i < flat_size; ++i) { - output_data[i] = ActivationFunctionWithMinMax( - input1_data[i] - input2_data[i], activation_min, activation_max); - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_SUB_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/tanh.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/tanh.h deleted file mode 100644 index 3a05c474..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/reference/tanh.h +++ /dev/null @@ -1,129 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ - -#include - -#include "fixedpoint/fixedpoint.h" -#include "tensorflow/lite/kernels/internal/common.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/kernels/op_macros.h" - -namespace tflite { -namespace reference_ops { - -inline void Tanh(const RuntimeShape& input_shape, const float* input_data, - const RuntimeShape& output_shape, float* output_data) { - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - float val = input_data[i]; - float result = std::tanh(val); - output_data[i] = result; - } -} - -// Convenience version that allows, for example, generated-code calls to be -// uniform between data types. -inline void Tanh(const TanhParams&, const RuntimeShape& input_shape, - const float* input_data, const RuntimeShape& output_shape, - float* output_data) { - // Drop params: not needed. - Tanh(input_shape, input_data, output_shape, output_data); -} - -inline void Tanh(const TanhParams& params, const RuntimeShape& input_shape, - const int16_t* input_data, const RuntimeShape& output_shape, - int16_t* output_data) { - const int input_left_shift = params.input_left_shift; - // Support for shifts is limited until we have a parameterized version of - // SaturatingRoundingMultiplyByPOT(). - TFLITE_DCHECK_GE(input_left_shift, 0); - TFLITE_DCHECK_LE(input_left_shift, 1); - - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - // F0 uses 0 integer bits, range [-1, 1]. - // This is the return type of math functions such as tanh, logistic, - // whose range is in [-1, 1]. - using F0 = gemmlowp::FixedPoint; - // F3 uses 3 integer bits, range [-8, 8], the input range expected here. - using F3 = gemmlowp::FixedPoint; - - if (input_left_shift == 0) { - for (int i = 0; i < flat_size; i++) { - F3 input = F3::FromRaw(input_data[i]); - F0 output = gemmlowp::tanh(input); - output_data[i] = output.raw(); - } - } else { - for (int i = 0; i < flat_size; i++) { - F3 input = F3::FromRaw( - gemmlowp::SaturatingRoundingMultiplyByPOT<1>(input_data[i])); - F0 output = gemmlowp::tanh(input); - output_data[i] = output.raw(); - } - } -} - -inline void Tanh(const TanhParams& params, const RuntimeShape& input_shape, - const uint8_t* input_data, const RuntimeShape& output_shape, - uint8_t* output_data) { - const int32_t input_zero_point = params.input_zero_point; - const int32_t input_range_radius = params.input_range_radius; - const int32_t input_multiplier = params.input_multiplier; - const int input_left_shift = params.input_left_shift; - const int32_t output_zero_point = 128; - const int flat_size = MatchingFlatSize(input_shape, output_shape); - - for (int i = 0; i < flat_size; i++) { - const uint8_t input_val_u8 = input_data[i]; - const int32_t input_val_centered = - static_cast(input_val_u8) - input_zero_point; - uint8_t output_val; - if (input_val_centered <= -input_range_radius) { - output_val = 0; - } else if (input_val_centered >= input_range_radius) { - output_val = 255; - } else { - const int32_t input_val_rescaled = - MultiplyByQuantizedMultiplierGreaterThanOne( - input_val_centered, input_multiplier, input_left_shift); - using FixedPoint4 = gemmlowp::FixedPoint; - using FixedPoint0 = gemmlowp::FixedPoint; - const FixedPoint4 input_val_f4 = FixedPoint4::FromRaw(input_val_rescaled); - const FixedPoint0 output_val_f0 = gemmlowp::tanh(input_val_f4); - // Convert from Q0.31 to Q24.7. - using gemmlowp::RoundingDivideByPOT; - int32_t output_val_s32 = RoundingDivideByPOT(output_val_f0.raw(), 24); - output_val_s32 += output_zero_point; - if (output_val_s32 == 256) { - output_val_s32 = 255; - } - // Reinterpret as Q0.7, encoded in uint8_t. - TFLITE_DCHECK_GE(output_val_s32, 0); - TFLITE_DCHECK_LE(output_val_s32, 255); - output_val = static_cast(output_val_s32); - } - output_data[i] = output_val; - } -} - -} // namespace reference_ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_REFERENCE_TANH_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/strided_slice_logic.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/strided_slice_logic.h deleted file mode 100644 index d9b5acbb..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/strided_slice_logic.h +++ /dev/null @@ -1,204 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ - -#include -#include -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace strided_slice { - -// Use until std::clamp() is available from C++17. -inline int Clamp(const int v, const int lo, const int hi) { - TFLITE_DCHECK(!(hi < lo)); - if (hi < v) return hi; - if (v < lo) return lo; - return v; -} - -inline void StridedSlicePadIndices(tflite::StridedSliceParams* p, - int dim_count) { - // Add indices and mask bits to fully include extra dimensions - TFLITE_CHECK_LE(dim_count, 5); - TFLITE_CHECK_GE(dim_count, p->start_indices_count); - TFLITE_CHECK_EQ(p->start_indices_count, p->stop_indices_count); - TFLITE_CHECK_EQ(p->stop_indices_count, p->strides_count); - - const int pad_count = dim_count - p->start_indices_count; - - // Pad indices at start, so move arrays by pad_count. - for (int i = p->start_indices_count - 1; i >= 0; --i) { - p->strides[i + pad_count] = p->strides[i]; - p->start_indices[i + pad_count] = p->start_indices[i]; - p->stop_indices[i + pad_count] = p->stop_indices[i]; - } - for (int i = 0; i < pad_count; ++i) { - p->start_indices[i] = 0; - p->stop_indices[i] = 1; - p->strides[i] = 1; - } - - // Pad masks with 0s or 1s as required. - p->shrink_axis_mask <<= pad_count; - p->ellipsis_mask <<= pad_count; - p->new_axis_mask <<= pad_count; - p->begin_mask <<= pad_count; - p->end_mask <<= pad_count; - p->begin_mask |= (1 << pad_count) - 1; - p->end_mask |= (1 << pad_count) - 1; - - p->start_indices_count = dim_count; - p->stop_indices_count = dim_count; - p->strides_count = dim_count; -} - -// Return the index for the first element along that axis. This index will be a -// positive integer between [0, axis_size - 1] that can be used to index -// directly into the data. -inline int StartForAxis(const tflite::StridedSliceParams& params, - const RuntimeShape& input_shape, int axis) { - const auto begin_mask = params.begin_mask; - const auto* start_indices = params.start_indices; - const auto* strides = params.strides; - const int axis_size = input_shape.Dims(axis); - if (axis_size == 0) { - return 0; - } - // Begin with the specified index. - int start = start_indices[axis]; - - // begin_mask override - if (begin_mask & 1 << axis) { - if (strides[axis] > 0) { - // Forward iteration - use the first element. These values will get - // clamped below (Note: We could have set them to 0 and axis_size-1, but - // use lowest() and max() to maintain symmetry with StopForAxis()) - start = std::numeric_limits::lowest(); - } else { - // Backward iteration - use the last element. - start = std::numeric_limits::max(); - } - } - - // Handle negative indices - if (start < 0) { - start += axis_size; - } - - // Clamping - start = Clamp(start, 0, axis_size - 1); - - return start; -} - -// Return the "real" index for the end of iteration along that axis. This is an -// "end" in the traditional C sense, in that it points to one past the last -// element. ie. So if you were iterating through all elements of a 1D array of -// size 4, this function would return 4 as the stop, because it is one past the -// "real" indices of 0, 1, 2 & 3. -inline int StopForAxis(const tflite::StridedSliceParams& params, - const RuntimeShape& input_shape, int axis, - int start_for_axis) { - const auto end_mask = params.end_mask; - const auto shrink_axis_mask = params.shrink_axis_mask; - const auto* stop_indices = params.stop_indices; - const auto* strides = params.strides; - const int axis_size = input_shape.Dims(axis); - if (axis_size == 0) { - return 0; - } - - // Begin with the specified index - const bool shrink_axis = shrink_axis_mask & (1 << axis); - int stop = stop_indices[axis]; - - // When shrinking an axis, the end position does not matter (and can be - // incorrect when negative indexing is used, see Issue #19260). Always use - // start_for_axis + 1 to generate a length 1 slice, since start_for_axis has - // already been adjusted for negative indices. - if (shrink_axis) { - stop = start_for_axis + 1; - } - - // end_mask override - if (end_mask & (1 << axis)) { - if (strides[axis] > 0) { - // Forward iteration - use the last element. These values will get - // clamped below - stop = std::numeric_limits::max(); - } else { - // Backward iteration - use the first element. - stop = std::numeric_limits::lowest(); - } - } - - // Handle negative indices - if (stop < 0) { - stop += axis_size; - } - - // Clamping - // Because the end index points one past the last element, we need slightly - // different clamping ranges depending on the direction. - if (strides[axis] > 0) { - // Forward iteration - stop = Clamp(stop, 0, axis_size); - } else { - // Backward iteration - stop = Clamp(stop, -1, axis_size - 1); - } - - return stop; -} - -inline bool LoopCondition(int index, int stop, int stride) { - // True when we have reached the end of an axis and should loop. - return stride > 0 ? index >= stop : index <= stop; -} - -inline tflite::StridedSliceParams BuildStridedSliceParams( - int begin_mask, int end_mask, int shrink_axis_mask, - const std::vector& start_indices, const std::vector& stop_indices, - const std::vector& strides) { - tflite::StridedSliceParams op_params; - const int dims_count = start_indices.size(); - - op_params.start_indices_count = dims_count; - op_params.stop_indices_count = dims_count; - op_params.strides_count = dims_count; - for (int i = 0; i < dims_count; ++i) { - op_params.start_indices[i] = start_indices[i]; - op_params.stop_indices[i] = stop_indices[i]; - op_params.strides[i] = strides[i]; - } - - op_params.begin_mask = begin_mask; - op_params.ellipsis_mask = 0; - op_params.end_mask = end_mask; - op_params.new_axis_mask = 0; - op_params.shrink_axis_mask = shrink_axis_mask; - - return op_params; -} - -} // namespace strided_slice - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_STRIDED_SLICE_LOGIC_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor.h deleted file mode 100644 index 905552fc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor.h +++ /dev/null @@ -1,147 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_H_ - -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" -#include "tensorflow/lite/kernels/internal/types.h" -#include "tensorflow/lite/string_util.h" - -namespace tflite { - -inline RuntimeShape GetTensorShape(std::vector data) { - return RuntimeShape(data.size(), data.data()); -} - -// A list of tensors in a format that can be used by kernels like split and -// concatenation. -template -class VectorOfTensors { - public: - // Build with the tensors in 'tensor_list'. - VectorOfTensors(const TfLiteContext& context, - const TfLiteIntArray& tensor_list) { - int num_tensors = tensor_list.size; - - all_data_.reserve(num_tensors); - all_shape_.reserve(num_tensors); - all_shape_ptr_.reserve(num_tensors); - - for (int i = 0; i < num_tensors; ++i) { - TfLiteTensor* t = &context.tensors[tensor_list.data[i]]; - all_data_.push_back(GetTensorData(t)); - all_shape_.push_back(GetTensorShape(t)); - } - - // Taking the pointer from inside a std::vector is only OK if the vector is - // never modified, so we populate all_shape in the previous loop and then we - // are free to grab iterators here. - for (int i = 0; i < num_tensors; ++i) { - all_shape_ptr_.push_back(&all_shape_[i]); - } - } - // Return a pointer to the data pointers of all tensors in the list. For - // example: - // float* const* f = v.data(); - // f[0][1] is the second element of the first tensor. - T* const* data() const { return all_data_.data(); } - - // Return a pointer the shape pointers of all tensors in the list. For - // example: - // const RuntimeShape* const* d = v.dims(); - // dims[1] are the dimensions of the second tensor in the list. - const RuntimeShape* const* shapes() const { return all_shape_ptr_.data(); } - - private: - std::vector all_data_; - std::vector all_shape_; - std::vector all_shape_ptr_; -}; - -// A list of quantized tensors in a format that can be used by kernels like -// split and concatenation. -class VectorOfQuantizedTensors : public VectorOfTensors { - public: - // Build with the tensors in 'tensor_list'. - VectorOfQuantizedTensors(const TfLiteContext& context, - const TfLiteIntArray& tensor_list) - : VectorOfTensors(context, tensor_list) { - for (int i = 0; i < tensor_list.size; ++i) { - TfLiteTensor* t = &context.tensors[tensor_list.data[i]]; - zero_point_.push_back(t->params.zero_point); - scale_.push_back(t->params.scale); - } - } - - const float* scale() const { return scale_.data(); } - const int32_t* zero_point() const { return zero_point_.data(); } - - private: - std::vector zero_point_; - std::vector scale_; -}; - -// Writes randomly accessed values from `input` sequentially into `output`. -template -class SequentialTensorWriter { - public: - SequentialTensorWriter(const TfLiteTensor* input, TfLiteTensor* output) { - input_data_ = GetTensorData(input); - output_ptr_ = GetTensorData(output); - } - SequentialTensorWriter(const T* input_data, T* output_data) - : input_data_(input_data), output_ptr_(output_data) {} - - void Write(int position) { *output_ptr_++ = input_data_[position]; } - void WriteN(int position, int len) { - memcpy(output_ptr_, &input_data_[position], sizeof(T) * len); - output_ptr_ += len; - } - - private: - const T* input_data_; - T* output_ptr_; -}; - -// String ops are not yet supported on platforms w/ static memory. -#ifndef TF_LITE_STATIC_MEMORY -template <> -class SequentialTensorWriter { - public: - SequentialTensorWriter(const TfLiteTensor* input, TfLiteTensor* output) - : input_(input), output_(output) {} - ~SequentialTensorWriter() { buffer_.WriteToTensor(output_, nullptr); } - - void Write(int position) { this->WriteN(position, 1); } - void WriteN(int position, int len) { - for (int i = 0; i < len; i++) { - buffer_.AddString(GetString(input_, position + i)); - } - } - - private: - const TfLiteTensor* input_; - TfLiteTensor* output_; - DynamicBuffer buffer_; -}; -#endif // TF_LITE_STATIC_MEMORY - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor_ctypes.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor_ctypes.h deleted file mode 100644 index f1d3e17f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/tensor_ctypes.h +++ /dev/null @@ -1,47 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { - -template -inline T* GetTensorData(TfLiteTensor* tensor) { - return tensor != nullptr ? reinterpret_cast(tensor->data.raw) : nullptr; -} - -template -inline const T* GetTensorData(const TfLiteTensor* tensor) { - return tensor != nullptr ? reinterpret_cast(tensor->data.raw) - : nullptr; -} - -inline RuntimeShape GetTensorShape(const TfLiteTensor* tensor) { - if (tensor == nullptr) { - return RuntimeShape(); - } - - TfLiteIntArray* dims = tensor->dims; - const int dims_size = dims->size; - const int32_t* dims_data = reinterpret_cast(dims->data); - return RuntimeShape(dims_size, dims_data); -} - -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TENSOR_CTYPES_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/types.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/types.h deleted file mode 100644 index 9db742dd..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/internal/types.h +++ /dev/null @@ -1,1153 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ -#define TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ - -#include -#include -#include -#include - -#include "tensorflow/lite/kernels/internal/compatibility.h" - -namespace tflite { - -enum class FusedActivationFunctionType : uint8_t { - kNone, - kRelu6, - kRelu1, - kRelu -}; -enum class PaddingType : uint8_t { kNone, kSame, kValid }; - -struct PaddingValues { - int16_t width; - int16_t height; - // offset is used for calculating "remaining" padding, for example, `width` - // is 1 and `width_offset` is 1, so padding_left is 1 while padding_right is - // 1 + 1 = 2. - int16_t width_offset; - // Same as width_offset except it's over the height dimension. - int16_t height_offset; -}; - -// This enumeration allows for non-default formats for the weights array -// of a fully-connected operator, allowing the use of special optimized -// runtime paths. -enum class FullyConnectedWeightsFormat : uint8_t { - // Default format (flat 2D layout, the inner contiguous dimension - // is input_depth, the outer non-contiguous dimension is output_depth) - kDefault, - // Summary: optimized layout for fast CPU runtime implementation, - // aimed specifically at ARM CPUs at the moment, and specialized for - // 8-bit quantized layers. - // - // The use case we're concerned with here is: 8-bit quantization, - // large weights matrix that doesn't fit in cache (e.g. 4096x2048 in - // a key application that drove this), very small batch size (e.g. 1 -- 4). - // - // Even with 8-bit quantization of weights, the performance of memory - // accesses to the weights can become the dominant issue when - // the batch size is small, so each weight value is used in only a few - // arithmetic ops, i.e. the fully-connected node has a low arithmetic - // intensity. The specific issues that arise are of three kinds: - // (1) One may, ideally, max out DRAM bandwidth, i.e. be truly memory - // bound. That's the "good" issue to run into. - // (2) One may run into sub-optimal pre-fetching: the data hasn't been - // prefetched into the cache by the time we need it. - // (3) One may run into cache aliasing: multiple values that are - // pre-fetched, alias each other in the L1 cache (which typically - // has only 4-way set associativity in ARM CPUs) and thus evict - // each other before we get to using them. - // - // The point of this shuffling is to avoid issues (2) and (3) so that - // we get as fast as possible given only the hard constraint (1). - // This is achieved by turning the difficulty into a solution: the - // difficulty, that each value loaded from memory is used only in - // one kernel iteration, making this operation memory-intensive, hints at - // the solution, of shuffling the weights so that they are stored in the - // exact order as the kernel needs to load them, so that the memory - // accesses made by the kernel are trivial. This solves (2) because the - // trivial memory access pattern allows the CPU's automatic prefetching - // to perform very well (no need even for preload instructions), and this - // solves (3) because the values being loaded concurrently are now - // contiguous in the address space, thus don't alias each other in the cache. - // - // On ARM, we typically want our kernel to process a 4x16 block of weights - // at a time, because: - // - 16 is the number of bytes in a NEON register. - // - 4 is how many rows we need to handle concurrently in the kernel in - // order to have sufficient mutual independence of instructions to - // maximize arithmetic throughput. - // - // Finally, the 'Int8' part in the name refers to the fact that this - // weights format has each weights value encoded as a signed int8_t value, - // even if the data type of the weights buffer is uint8_t. This is intended - // to save runtime kernels the effort to have to XOR the top bit of these - // bytes before using them in signed arithmetic, see this file for more - // explanations on the 'signed int8_t trick' in matrix multiplication kernels: - // - // tensorflow/lite/toco/graph_transformations/ensure_uint8_weights_safe_for_fast_int8_kernels.cc - // - kShuffled4x16Int8, -}; - -// Quantization parameters, determining the mapping of quantized values -// to real values (i.e. determining how quantized values are mathematically -// interpreted). -// -// The correspondence is as follows: -// -// real_value = scale * (quantized_value - zero_point); -// -// In other words, zero_point designates which quantized value corresponds to -// the real 0 value, and scale designates the difference between the real values -// corresponding to consecutive quantized values differing by 1. -struct QuantizationParams { - int32_t zero_point = 0; - double scale = 0.0; -}; - -inline bool operator==(const QuantizationParams& qp1, - const QuantizationParams& qp2) { - return qp1.zero_point == qp2.zero_point && qp1.scale == qp2.scale; -} - -template -struct Dims { - int sizes[N]; - int strides[N]; -}; - -class RuntimeShape { - public: - // Shapes with dimensions up to 5 are stored directly in the structure, while - // larger shapes are separately allocated. - static constexpr int kMaxSmallSize = 5; - - RuntimeShape& operator=(RuntimeShape const&) = delete; - - RuntimeShape() : size_(0) {} - - explicit RuntimeShape(int dimensions_count) : size_(dimensions_count) { - if (dimensions_count > kMaxSmallSize) { -#ifdef TF_LITE_STATIC_MEMORY - TFLITE_CHECK(false && "No shape resizing supported on this platform"); -#else // TF_LITE_STATIC_MEMORY - dims_pointer_ = new int32_t[dimensions_count]; -#endif // TF_LITE_STATIC_MEMORY - } - } - - RuntimeShape(int shape_size, int32_t value) : size_(0) { - Resize(shape_size); - for (int i = 0; i < shape_size; ++i) { - SetDim(i, value); - } - } - - RuntimeShape(int dimensions_count, const int32_t* dims_data) : size_(0) { - ReplaceWith(dimensions_count, dims_data); - } - - RuntimeShape(const std::initializer_list init_list) : size_(0) { - BuildFrom(init_list); - } - - // Avoid using this constructor. We should be able to delete it when C++17 - // rolls out. - RuntimeShape(RuntimeShape const& other) : size_(other.DimensionsCount()) { - if (size_ > kMaxSmallSize) { - dims_pointer_ = new int32_t[size_]; - } - std::memcpy(DimsData(), other.DimsData(), sizeof(int32_t) * size_); - } - - bool operator==(const RuntimeShape& comp) const { - return this->size_ == comp.size_ && - std::memcmp(DimsData(), comp.DimsData(), size_ * sizeof(int32_t)) == - 0; - } - - ~RuntimeShape() { - if (size_ > kMaxSmallSize) { -#ifdef TF_LITE_STATIC_MEMORY - TFLITE_CHECK(false && "No shape resizing supported on this platform"); -#else // TF_LITE_STATIC_MEMORY - delete[] dims_pointer_; -#endif // TF_LITE_STATIC_MEMORY - } - } - - inline int32_t DimensionsCount() const { return size_; } - inline int32_t Dims(int i) const { - TFLITE_DCHECK_GE(i, 0); - TFLITE_DCHECK_LT(i, size_); - return size_ > kMaxSmallSize ? dims_pointer_[i] : dims_[i]; - } - inline void SetDim(int i, int32_t val) { - TFLITE_DCHECK_GE(i, 0); - TFLITE_DCHECK_LT(i, size_); - if (size_ > kMaxSmallSize) { - dims_pointer_[i] = val; - } else { - dims_[i] = val; - } - } - - inline int32_t* DimsData() { - return size_ > kMaxSmallSize ? dims_pointer_ : dims_; - } - inline const int32_t* DimsData() const { - return size_ > kMaxSmallSize ? dims_pointer_ : dims_; - } - // The caller must ensure that the shape is no bigger than 5-D. - inline const int32_t* DimsDataUpTo5D() const { return dims_; } - - inline void Resize(int dimensions_count) { - if (size_ > kMaxSmallSize) { -#ifdef TF_LITE_STATIC_MEMORY - TFLITE_CHECK(false && "No shape resizing supported on this platform"); -#else // TF_LITE_STATIC_MEMORY - delete[] dims_pointer_; -#endif // TF_LITE_STATIC_MEMORY - } - size_ = dimensions_count; - if (dimensions_count > kMaxSmallSize) { -#ifdef TF_LITE_STATIC_MEMORY - TFLITE_CHECK(false && "No shape resizing supported on this platform"); -#else // TF_LITE_STATIC_MEMORY - dims_pointer_ = new int32_t[dimensions_count]; -#endif // TF_LITE_STATIC_MEMORY - } - } - - inline void ReplaceWith(int dimensions_count, const int32_t* dims_data) { - Resize(dimensions_count); - int32_t* dst_dims = DimsData(); - std::memcpy(dst_dims, dims_data, dimensions_count * sizeof(int32_t)); - } - - template - inline void BuildFrom(const T& src_iterable) { - const int dimensions_count = - std::distance(src_iterable.begin(), src_iterable.end()); - Resize(dimensions_count); - int32_t* data = DimsData(); - for (auto it : src_iterable) { - *data = it; - ++data; - } - } - - // This will probably be factored out. Old code made substantial use of 4-D - // shapes, and so this function is used to extend smaller shapes. Note that - // (a) as Dims<4>-dependent code is eliminated, the reliance on this should be - // reduced, and (b) some kernels are stricly 4-D, but then the shapes of their - // inputs should already be 4-D, so this function should not be needed. - inline static RuntimeShape ExtendedShape(int new_shape_size, - const RuntimeShape& shape) { - return RuntimeShape(new_shape_size, shape, 1); - } - - inline void BuildFrom(const std::initializer_list init_list) { - BuildFrom>(init_list); - } - - // Returns the total count of elements, that is the size when flattened into a - // vector. - inline int FlatSize() const { - int buffer_size = 1; - const int* dims_data = reinterpret_cast(DimsData()); - for (int i = 0; i < size_; i++) { - buffer_size *= dims_data[i]; - } - return buffer_size; - } - - bool operator!=(const RuntimeShape& comp) const { return !((*this) == comp); } - - private: - // For use only by ExtendedShape(), written to guarantee (return-value) copy - // elision in C++17. - // This creates a shape padded to the desired size with the specified value. - RuntimeShape(int new_shape_size, const RuntimeShape& shape, int pad_value) - : size_(0) { - // If the following check fails, it is likely because a 4D-only kernel is - // being used with an array of larger dimension count. - TFLITE_CHECK_GE(new_shape_size, shape.DimensionsCount()); - Resize(new_shape_size); - const int size_increase = new_shape_size - shape.DimensionsCount(); - for (int i = 0; i < size_increase; ++i) { - SetDim(i, pad_value); - } - std::memcpy(DimsData() + size_increase, shape.DimsData(), - sizeof(int32_t) * shape.DimensionsCount()); - } - - int32_t size_; - union { - int32_t dims_[kMaxSmallSize]; - int32_t* dims_pointer_; - }; -}; - -// Converts inference-style shape to legacy tflite::Dims<4>. -inline tflite::Dims<4> ToRuntimeDims(const tflite::RuntimeShape& array_shape) { - tflite::Dims<4> result; - const int dimensions_count = array_shape.DimensionsCount(); - TFLITE_CHECK_LE(dimensions_count, 4); - int cum_prod = 1; - for (int i = 0; i < 4; i++) { - const int new_dim = - (i < dimensions_count) ? array_shape.Dims(dimensions_count - 1 - i) : 1; - result.sizes[i] = new_dim; - result.strides[i] = cum_prod; - cum_prod *= new_dim; - } - return result; -} - -// TODO(b/80418076): Move to legacy ops file, update invocations. -inline RuntimeShape DimsToShape(const tflite::Dims<4>& dims) { - return RuntimeShape( - {dims.sizes[3], dims.sizes[2], dims.sizes[1], dims.sizes[0]}); -} - -// Gets next index to iterate through a multidimensional array. -inline bool NextIndex(const int num_dims, const int* dims, int* current) { - if (num_dims == 0) { - return false; - } - TFLITE_DCHECK(dims != nullptr); - TFLITE_DCHECK(current != nullptr); - int carry = 1; - for (int idx = num_dims - 1; idx >= 0; --idx) { - int current_val = current[idx] + carry; - TFLITE_DCHECK_GE(dims[idx], current_val); - if (dims[idx] == current_val) { - current[idx] = 0; - } else { - current[idx] = current_val; - carry = 0; - break; - } - } - return (carry == 0); -} - -// Gets offset of index if reducing on axis. When reducing, the flattened offset -// will not change, if the input index changes on the given axis. For example, -// if you have a 3D tensor and you are reducing to 2D by eliminating axis 0, -// then index (0, 1, 2) and index (1, 1, 2) will map to the same flattened -// offset. -// TODO(kanlig): uses Dims to represent dimensions. -inline size_t ReducedOutputOffset(const int num_dims, const int* dims, - const int* index, const int num_axis, - const int* axis) { - if (num_dims == 0) { - return 0; - } - TFLITE_DCHECK(dims != nullptr); - TFLITE_DCHECK(index != nullptr); - size_t offset = 0; - for (int idx = 0; idx < num_dims; ++idx) { - // if we need to skip this axis - bool is_axis = false; - if (axis != nullptr) { - for (int axis_idx = 0; axis_idx < num_axis; ++axis_idx) { - if (idx == axis[axis_idx]) { - is_axis = true; - break; - } - } - } - if (!is_axis) { - offset = offset * static_cast(dims[idx]) + - static_cast(index[idx]); - } - } - return offset; -} - -inline int Offset(const RuntimeShape& shape, int i0, int i1, int i2, int i3) { - TFLITE_DCHECK_EQ(shape.DimensionsCount(), 4); - const int* dims_data = reinterpret_cast(shape.DimsDataUpTo5D()); - TFLITE_DCHECK(i0 >= 0 && i0 < dims_data[0]); - TFLITE_DCHECK(i1 >= 0 && i1 < dims_data[1]); - TFLITE_DCHECK(i2 >= 0 && i2 < dims_data[2]); - TFLITE_DCHECK(i3 >= 0 && i3 < dims_data[3]); - return ((i0 * dims_data[1] + i1) * dims_data[2] + i2) * dims_data[3] + i3; -} - -inline int Offset(const Dims<4>& dims, int i0, int i1, int i2, int i3) { - TFLITE_DCHECK(i0 >= 0 && i0 < dims.sizes[0]); - TFLITE_DCHECK(i1 >= 0 && i1 < dims.sizes[1]); - TFLITE_DCHECK(i2 >= 0 && i2 < dims.sizes[2]); - TFLITE_DCHECK(i3 >= 0 && i3 < dims.sizes[3]); - return i0 * dims.strides[0] + i1 * dims.strides[1] + i2 * dims.strides[2] + - i3 * dims.strides[3]; -} - -inline int Offset(const Dims<4>& dims, int* index) { - return Offset(dims, index[0], index[1], index[2], index[3]); -} - -inline int Offset(const RuntimeShape& shape, int* index) { - return Offset(shape, index[0], index[1], index[2], index[3]); -} - -// Get array size, DCHECKing that the dim index is in range. -// -// Note that this will be phased out with Dims<4>, since RuntimeShape::Dims() -// already performs this check. -template -int ArraySize(const Dims& array, int index) { - TFLITE_DCHECK(index >= 0 && index < N); - return array.sizes[index]; -} - -// Get common array size, DCHECKing that they all agree. -template -int MatchingArraySize(const ArrayType1& array1, int index1, - const ArrayType2& array2, int index2) { - TFLITE_DCHECK_EQ(ArraySize(array1, index1), ArraySize(array2, index2)); - return ArraySize(array1, index1); -} - -template -int MatchingArraySize(const ArrayType1& array1, int index1, - const ArrayType2& array2, int index2, Args... args) { - TFLITE_DCHECK_EQ(ArraySize(array1, index1), ArraySize(array2, index2)); - return MatchingArraySize(array1, index1, args...); -} - -// Get common shape dim, DCHECKing that they all agree. -inline int MatchingDim(const RuntimeShape& shape1, int index1, - const RuntimeShape& shape2, int index2) { - TFLITE_DCHECK_EQ(shape1.Dims(index1), shape2.Dims(index2)); - return shape1.Dims(index1); -} - -template -int MatchingDim(const RuntimeShape& shape1, int index1, - const RuntimeShape& shape2, int index2, Args... args) { - TFLITE_DCHECK_EQ(shape1.Dims(index1), shape2.Dims(index2)); - return MatchingDim(shape1, index1, args...); -} - -// Will be phased out with Dims<4>, replaced by RuntimeShape::FlatSize(). -template -inline int FlatSize(const Dims& dims) { - int flat_size = 1; - for (int i = 0; i < N; ++i) { - flat_size *= dims.sizes[i]; - } - return flat_size; -} - -TFLITE_DEPRECATED("Prefer FlatSize.") -inline int RequiredBufferSizeForDims(const Dims<4>& dims) { - return FlatSize(dims); -} - -inline int MatchingElementsSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0) { - const int size_1 = shape.FlatSize(); - const int size_2 = check_shape_0.FlatSize(); - TFLITE_CHECK_EQ(size_1, size_2); - return size_1; -} - -inline int MatchingElementsSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1) { - const int size_1 = shape.FlatSize(); - const int size_2 = check_shape_0.FlatSize(); - const int size_3 = check_shape_1.FlatSize(); - TFLITE_CHECK_EQ(size_1, size_2); - TFLITE_CHECK_EQ(size_2, size_3); - return size_1; -} - -// Flat size calculation, checking that dimensions match with one or more other -// arrays. -inline int MatchingFlatSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0) { - TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - return shape.FlatSize(); -} - -inline int MatchingFlatSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1) { - TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - return MatchingFlatSize(shape, check_shape_1); -} - -inline int MatchingFlatSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1, - const RuntimeShape& check_shape_2) { - TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - return MatchingFlatSize(shape, check_shape_1, check_shape_2); -} - -inline int MatchingFlatSize(const RuntimeShape& shape, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1, - const RuntimeShape& check_shape_2, - const RuntimeShape& check_shape_3) { - TFLITE_DCHECK_EQ(shape.DimensionsCount(), check_shape_0.DimensionsCount()); - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - return MatchingFlatSize(shape, check_shape_1, check_shape_2, check_shape_3); -} - -// Flat size calculation, checking that dimensions match with one or more other -// arrays. -template -inline int MatchingFlatSize(const Dims& dims, const Dims& check_dims_0) { - for (int i = 0; i < N; ++i) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - return FlatSize(dims); -} - -template -inline int MatchingFlatSize(const Dims& dims, const Dims& check_dims_0, - const Dims& check_dims_1) { - for (int i = 0; i < N; ++i) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - return MatchingFlatSize(dims, check_dims_1); -} - -template -inline int MatchingFlatSize(const Dims& dims, const Dims& check_dims_0, - const Dims& check_dims_1, - const Dims& check_dims_2) { - for (int i = 0; i < N; ++i) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - return MatchingFlatSize(dims, check_dims_1, check_dims_2); -} - -template -inline int MatchingFlatSize(const Dims& dims, const Dims& check_dims_0, - const Dims& check_dims_1, - const Dims& check_dims_2, - const Dims& check_dims_3) { - for (int i = 0; i < N; ++i) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - return MatchingFlatSize(dims, check_dims_1, check_dims_2, check_dims_3); -} - -// Data is required to be contiguous, and so many operators can use either the -// full array flat size or the flat size with one dimension skipped (commonly -// the depth). -template -inline int FlatSizeSkipDim(const Dims& dims, int skip_dim) { - TFLITE_DCHECK(skip_dim >= 0 && skip_dim < N); - int flat_size = 1; - for (int i = 0; i < N; ++i) { - flat_size *= (i == skip_dim) ? 1 : dims.sizes[i]; - } - return flat_size; -} - -// A combination of MatchingFlatSize() and FlatSizeSkipDim(). -template -inline int MatchingFlatSizeSkipDim(const Dims& dims, int skip_dim, - const Dims& check_dims_0) { - for (int i = 0; i < N; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - } - return FlatSizeSkipDim(dims, skip_dim); -} - -template -inline int MatchingFlatSizeSkipDim(const Dims& dims, int skip_dim, - const Dims& check_dims_0, - const Dims& check_dims_1) { - for (int i = 0; i < N; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - } - return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1); -} - -template -inline int MatchingFlatSizeSkipDim(const Dims& dims, int skip_dim, - const Dims& check_dims_0, - const Dims& check_dims_1, - const Dims& check_dims_2) { - for (int i = 0; i < N; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - } - return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1, check_dims_2); -} - -template -inline int MatchingFlatSizeSkipDim(const Dims& dims, int skip_dim, - const Dims& check_dims_0, - const Dims& check_dims_1, - const Dims& check_dims_2, - const Dims& check_dims_3) { - for (int i = 0; i < N; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(ArraySize(dims, i), ArraySize(check_dims_0, i)); - } - } - return MatchingFlatSizeSkipDim(dims, skip_dim, check_dims_1, check_dims_2, - check_dims_3); -} - -// Data is required to be contiguous, and so many operators can use either the -// full array flat size or the flat size with one dimension skipped (commonly -// the depth). -inline int FlatSizeSkipDim(const RuntimeShape& shape, int skip_dim) { - const int dims_count = shape.DimensionsCount(); - TFLITE_DCHECK(skip_dim >= 0 && skip_dim < dims_count); - const auto* dims_data = shape.DimsData(); - int flat_size = 1; - for (int i = 0; i < dims_count; ++i) { - flat_size *= (i == skip_dim) ? 1 : dims_data[i]; - } - return flat_size; -} - -// A combination of MatchingFlatSize() and FlatSizeSkipDim(). -inline int MatchingFlatSizeSkipDim(const RuntimeShape& shape, int skip_dim, - const RuntimeShape& check_shape_0) { - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - } - return FlatSizeSkipDim(shape, skip_dim); -} - -inline int MatchingFlatSizeSkipDim(const RuntimeShape& shape, int skip_dim, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1) { - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - } - return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1); -} - -inline int MatchingFlatSizeSkipDim(const RuntimeShape& shape, int skip_dim, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1, - const RuntimeShape& check_shape_2) { - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - } - return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1, check_shape_2); -} - -inline int MatchingFlatSizeSkipDim(const RuntimeShape& shape, int skip_dim, - const RuntimeShape& check_shape_0, - const RuntimeShape& check_shape_1, - const RuntimeShape& check_shape_2, - const RuntimeShape& check_shape_3) { - const int dims_count = shape.DimensionsCount(); - for (int i = 0; i < dims_count; ++i) { - if (i != skip_dim) { - TFLITE_DCHECK_EQ(shape.Dims(i), check_shape_0.Dims(i)); - } - } - return MatchingFlatSizeSkipDim(shape, skip_dim, check_shape_1, check_shape_2, - check_shape_3); -} - -template -bool IsPackedWithoutStrides(const Dims& dims) { - int expected_stride = 1; - for (int d = 0; d < N; d++) { - if (dims.strides[d] != expected_stride) return false; - expected_stride *= dims.sizes[d]; - } - return true; -} - -template -void ComputeStrides(Dims* dims) { - dims->strides[0] = 1; - for (int d = 1; d < N; d++) { - dims->strides[d] = dims->strides[d - 1] * dims->sizes[d - 1]; - } -} - -enum class BroadcastableOpCategory : uint8_t { - kNone, - kNonBroadcast, // Matching input shapes. - kFirstInputBroadcastsFast, // Fivefold nested loops. - kSecondInputBroadcastsFast, // Fivefold nested loops. - kGenericBroadcast, // Fall-back. -}; - -struct MinMax { - float min; - float max; -}; -static_assert(sizeof(MinMax) == 8, ""); - -struct ActivationParams { - FusedActivationFunctionType activation_type; - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; -}; - -struct ReluParams : public ActivationParams { - int32_t input_offset; - int32_t output_offset; - int32_t output_multiplier; - int output_shift; -}; - -// Styles of resizing op usages. For example, kImageStyle can be used with a Pad -// op for pattern-specific optimization. -enum class ResizingCategory : uint8_t { - kNone, - kImageStyle, // 4D, operating on inner dimensions, say {0, a, b, 0}. - kGenericResize, -}; - -// For Add, Sub, Mul ops. -struct ArithmeticParams { - // Shape dependent / common to data / op types. - BroadcastableOpCategory broadcast_category; - // uint8_t inference params. - int32_t input1_offset; - int32_t input2_offset; - int32_t output_offset; - int32_t output_multiplier; - int output_shift; - // Add / Sub, not Mul, uint8_t inference params. - int left_shift; - int32_t input1_multiplier; - int input1_shift; - int32_t input2_multiplier; - int input2_shift; - - // TODO(b/158622529): Union the following activation params. - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; - // float activation params. - float float_activation_min; - float float_activation_max; - // int64_t activation params. - int64_t int64_activation_min; - int64_t int64_activation_max; - - // Processed output dimensions. - // Let input "a" be the one that broadcasts in the faster-changing dimension. - // Then, after coalescing, for shapes {a0, a1, a2, a3, a4} and - // {b0, b1, b2, b3, b4}, - // broadcast_shape[4] = b0 = a0. - // broadcast_shape[3] = b1; a1 = 1. - // broadcast_shape[2] = b2 = a2. - // broadcast_shape[1] = a3; b3 = 1. - // broadcast_shape[0] = b4 = a4. - int broadcast_shape[5]; -}; - -struct ConcatenationParams { - int8_t axis; - const int32_t* input_zeropoint; - const float* input_scale; - uint16_t inputs_count; - int32_t output_zeropoint; - float output_scale; -}; - -struct ComparisonParams { - // uint8_t inference params. - int left_shift; - int32_t input1_offset; - int32_t input1_multiplier; - int input1_shift; - int32_t input2_offset; - int32_t input2_multiplier; - int input2_shift; - // Shape dependent / common to inference types. - bool is_broadcast; -}; - -struct ConvParams { - PaddingType padding_type; - PaddingValues padding_values; - // TODO(starka): This was just "stride", so check that width+height is OK. - int16_t stride_width; - int16_t stride_height; - int16_t dilation_width_factor; - int16_t dilation_height_factor; - // uint8_t inference params. - // TODO(b/65838351): Use smaller types if appropriate. - int32_t input_offset; - int32_t weights_offset; - int32_t output_offset; - int32_t output_multiplier; - int output_shift; - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; - // float activation params. - float float_activation_min; - float float_activation_max; -}; - -struct DepthToSpaceParams { - int32_t block_size; -}; - -struct DepthwiseParams { - PaddingType padding_type; - PaddingValues padding_values; - int16_t stride_width; - int16_t stride_height; - int16_t dilation_width_factor; - int16_t dilation_height_factor; - int16_t depth_multiplier; - // uint8_t inference params. - // TODO(b/65838351): Use smaller types if appropriate. - int32_t input_offset; - int32_t weights_offset; - int32_t output_offset; - int32_t output_multiplier; - int output_shift; - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; - // float activation params. - float float_activation_min; - float float_activation_max; - const int32_t* output_multiplier_per_channel; - const int32_t* output_shift_per_channel; -}; - -struct DequantizationParams { - double scale; - int32_t zero_point; -}; - -struct PerChannelDequantizationParams { - const float* scale; - const int32_t* zero_point; - int32_t quantized_dimension; -}; - -struct FakeQuantParams { - MinMax minmax; - int32_t num_bits; -}; - -struct FullyConnectedParams { - // uint8_t inference params. - // TODO(b/65838351): Use smaller types if appropriate. - int32_t input_offset; - int32_t weights_offset; - int32_t output_offset; - int32_t output_multiplier; - int output_shift; - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; - // float activation params. - float float_activation_min; - float float_activation_max; - // Mark the operands as cacheable if they are unchanging, e.g. weights. - bool lhs_cacheable; - bool rhs_cacheable; - FullyConnectedWeightsFormat weights_format; -}; - -struct GatherParams { - int16_t axis; -}; - -struct L2NormalizationParams { - // uint8_t inference params. - int32_t input_zero_point; -}; - -struct LocalResponseNormalizationParams { - int32_t range; - double bias; - double alpha; - double beta; -}; - -struct HardSwishParams { - // zero_point of the input activations. - int16_t input_zero_point; - // zero_point of the output activations. - int16_t output_zero_point; - // 16bit fixed-point component of the multiplier to apply to go from the - // "high-res input scale", which is the input scale multiplied by 2^7, to the - // "relu-ish scale", which 3.0/32768. - // See the implementation of HardSwishPrepare. - int16_t reluish_multiplier_fixedpoint_int16; - // exponent/bit-shift component of the aforementioned multiplier. - int reluish_multiplier_exponent; - // 16bit fixed-point component of the multiplier to apply to go from the - // "high-res input scale", which is the input scale multiplied by 2^7, to the - // output scale. - // See the implementation of HardSwishPrepare. - int16_t output_multiplier_fixedpoint_int16; - // exponent/bit-shift component of the aforementioned multiplier. - int output_multiplier_exponent; -}; - -struct LogisticParams { - // uint8_t inference params. - int32_t input_zero_point; - int32_t input_range_radius; - int32_t input_multiplier; - int input_left_shift; -}; - -struct LstmCellParams { - int32_t weights_zero_point; - int32_t accum_multiplier; - int accum_shift; - int state_integer_bits; -}; - -struct MeanParams { - int8_t axis_count; - int16_t axis[4]; -}; - -struct PackParams { - int8_t axis; - const int32_t* input_zeropoint; - const float* input_scale; - uint16_t inputs_count; - int32_t output_zeropoint; - float output_scale; -}; - -struct PadParams { - int8_t left_padding_count; - int32_t left_padding[4]; - int8_t right_padding_count; - int32_t right_padding[4]; - ResizingCategory resizing_category; -}; - -struct PreluParams { - int32_t input_offset; - int32_t alpha_offset; - int32_t output_offset; - int32_t output_multiplier_1; - int output_shift_1; - int32_t output_multiplier_2; - int output_shift_2; -}; - -struct PoolParams { - FusedActivationFunctionType activation; - PaddingType padding_type; - PaddingValues padding_values; - int stride_height; - int stride_width; - int filter_height; - int filter_width; - // uint8_t, etc, activation params. - int32_t quantized_activation_min; - int32_t quantized_activation_max; - // float activation params. - float float_activation_min; - float float_activation_max; -}; - -struct ReshapeParams { - int8_t shape_count; - int32_t shape[4]; -}; - -struct ResizeBilinearParams { - bool align_corners; - // half_pixel_centers assumes pixels are of half the actual dimensions, and - // yields more accurate resizes. Corresponds to the same argument for the - // original TensorFlow op in TF2.0. - bool half_pixel_centers; -}; - -struct ResizeNearestNeighborParams { - bool align_corners; - bool half_pixel_centers; -}; - -struct SliceParams { - int8_t begin_count; - int32_t begin[4]; - int8_t size_count; - int32_t size[4]; -}; - -struct SoftmaxParams { - // beta is not really used (not a Tensorflow parameter) and not implemented - // for LogSoftmax. - double beta; - // uint8_t inference params. Used even when beta defaults to 1.0. - int32_t input_multiplier; - int32_t input_left_shift; - // Reverse scaling is only used by LogSoftmax. - int32_t reverse_scaling_divisor; - int32_t reverse_scaling_right_shift; - int diff_min; - int32_t zero_point; - float scale; - float* table; - int16_t* exp_lut; - int16_t* one_over_one_plus_x_lut; - uint8_t* uint8_table1; - uint8_t* uint8_table2; -}; - -struct SpaceToBatchParams { - // "Zero" padding for uint8_t means padding with the output offset. - int32_t output_offset; -}; - -struct SpaceToDepthParams { - int32_t block_size; -}; - -struct SplitParams { - // Graphs that split into, say, 2000 nodes are encountered. The indices in - // OperatorEdges are of type uint16_t. - uint16_t num_split; - int16_t axis; -}; - -struct SqueezeParams { - int8_t squeeze_dims_count; - int32_t squeeze_dims[4]; -}; - -struct StridedSliceParams { - int8_t start_indices_count; - int32_t start_indices[5]; - int8_t stop_indices_count; - int32_t stop_indices[5]; - int8_t strides_count; - int32_t strides[5]; - - int16_t begin_mask; - int16_t ellipsis_mask; - int16_t end_mask; - int16_t new_axis_mask; - int16_t shrink_axis_mask; -}; - -struct TanhParams { - int32_t input_zero_point; - int32_t input_range_radius; - int32_t input_multiplier; - int input_left_shift; -}; - -struct TransposeParams { - int8_t perm_count; - int32_t perm[5]; -}; - -struct UnpackParams { - uint16_t num_split; - int16_t axis; -}; - -struct LeakyReluParams { - float alpha; - int32_t input_offset; - int32_t output_offset; - int32_t output_multiplier_alpha; - int32_t output_shift_alpha; - int32_t output_multiplier_identity; - int32_t output_shift_identity; -}; - -template -inline void SetActivationParams(float min, float max, P* params) { - params->float_activation_min = min; - params->float_activation_max = max; -} - -template -inline void SetActivationParams(int32_t min, int32_t max, P* params) { - params->quantized_activation_min = min; - params->quantized_activation_max = max; -} - -template -inline void SetActivationParams(int64_t min, int64_t max, P* params) { - params->int64_activation_min = min; - params->int64_activation_max = max; -} - -template -inline void GetActivationParams(const P& params, int32_t* min, int32_t* max) { - *min = params.quantized_activation_min; - *max = params.quantized_activation_max; -} - -template -inline void GetActivationParams(const P& params, float* min, float* max) { - *min = params.float_activation_min; - *max = params.float_activation_max; -} - -template -inline void GetActivationParams(const P& params, int64_t* min, int64_t* max) { - *min = params.int64_activation_min; - *max = params.int64_activation_max; -} -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_INTERNAL_TYPES_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/kernel_util.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/kernel_util.h deleted file mode 100644 index 0d6aa8fc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/kernel_util.h +++ /dev/null @@ -1,196 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ -#define TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ - -#include - -#include - -#include "tensorflow/lite/c/builtin_op_data.h" -#include "tensorflow/lite/c/common.h" - -namespace tflite { - -// A fair number of functions in this header have historically been inline. -// It is ok to change functions to not be inline if the latency with -// benchmark_model for MobileNet + MobileBERT is unaffected. If such a change is -// made, move the newly non-inlined function declarations to the top of this -// header file. -const TfLiteTensor* GetInput(const TfLiteContext* context, - const TfLiteNode* node, int index); - -// Note: You must check if result is not null: -// TfLiteTensor* my_tensor = GetVariableInput(context, node, kMyTensorIdx); -// TF_LITE_ENSURE(context, my_tensor != nullptr); -TfLiteTensor* GetVariableInput(TfLiteContext* context, const TfLiteNode* node, - int index); - -TfLiteTensor* GetOutput(TfLiteContext* context, const TfLiteNode* node, - int index); - -const TfLiteTensor* GetOptionalInputTensor(const TfLiteContext* context, - const TfLiteNode* node, int index); - -inline int NumDimensions(const TfLiteTensor* t) { return t->dims->size; } -inline int SizeOfDimension(const TfLiteTensor* t, int dim) { - return t->dims->data[dim]; -} - -#ifndef TF_LITE_STATIC_MEMORY -inline TfLiteTensor* GetTemporary(TfLiteContext* context, - const TfLiteNode* node, int index) { - return &context->tensors[node->temporaries->data[index]]; -} -inline const TfLiteTensor* GetIntermediates(TfLiteContext* context, - const TfLiteNode* node, int index) { - return &context->tensors[node->intermediates->data[index]]; -} -inline int NumIntermediates(const TfLiteNode* node) { - return node->intermediates->size; -} -#endif // TF_LITE_STATIC_MEMORY -inline int NumInputs(const TfLiteNode* node) { return node->inputs->size; } -inline int NumOutputs(const TfLiteNode* node) { return node->outputs->size; } - -inline int64_t NumElements(const TfLiteIntArray* dims) { - int64_t count = 1; - for (int i = 0; i < dims->size; ++i) { - count *= dims->data[i]; - } - return count; -} - -inline int64_t NumElements(const TfLiteTensor* t) { - return NumElements(t->dims); -} - -// Determines whether tensor is constant. -// TODO(b/138199592): Introduce new query which checks for constant OR -// persistent-read-only, which would be useful for most tensor kernels that -// are potentially dynamic based on the input tensor value availability at the -// time of prepare. -inline bool IsConstantTensor(const TfLiteTensor* tensor) { - return tensor->allocation_type == kTfLiteMmapRo; -} - -// Determines whether tensor is dynamic. Note that a tensor can be non-const and -// not dynamic. This function specifically checks for a dynamic tensor. -inline bool IsDynamicTensor(const TfLiteTensor* tensor) { - return tensor->allocation_type == kTfLiteDynamic; -} - -// Sets tensor to dynamic. -inline void SetTensorToDynamic(TfLiteTensor* tensor) { - if (tensor->allocation_type != kTfLiteDynamic) { - tensor->allocation_type = kTfLiteDynamic; - tensor->data.raw = nullptr; - } -} - -// Sets tensor to persistent and read-only. -inline void SetTensorToPersistentRo(TfLiteTensor* tensor) { - if (tensor->allocation_type != kTfLitePersistentRo) { - tensor->allocation_type = kTfLitePersistentRo; - tensor->data.raw = nullptr; - } -} - -// Determines whether it is a hybrid op - one that has float inputs and -// quantized weights. -inline bool IsHybridOp(const TfLiteTensor* input, const TfLiteTensor* weight) { - return ((weight->type == kTfLiteUInt8 || weight->type == kTfLiteInt8) && - input->type == kTfLiteFloat32); -} - -// Check dimensionality match and populate OpData for Conv and DepthwiseConv. -TfLiteStatus PopulateConvolutionQuantizationParams( - TfLiteContext* context, const TfLiteTensor* input, - const TfLiteTensor* filter, const TfLiteTensor* bias, TfLiteTensor* output, - const TfLiteFusedActivation& activation, int32_t* multiplier, int* shift, - int32_t* output_activation_min, int32_t* output_activation_max, - int32_t* per_channel_multiplier, int* per_channel_shift); - -TfLiteStatus PopulateConvolutionQuantizationParams( - TfLiteContext* context, const TfLiteTensor* input, - const TfLiteTensor* filter, const TfLiteTensor* bias, TfLiteTensor* output, - const TfLiteFusedActivation& activation, int32_t* multiplier, int* shift, - int32_t* output_activation_min, int32_t* output_activation_max, - int32_t* per_channel_multiplier, int* per_channel_shift, int num_channels); - -// Calculates the multiplication factor for a quantized convolution (or -// quantized depthwise convolution) involving the given tensors. Returns an -// error if the scales of the tensors are not compatible. -TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext* context, - const TfLiteTensor* input, - const TfLiteTensor* filter, - const TfLiteTensor* bias, - TfLiteTensor* output, - double* multiplier); - -TfLiteStatus GetQuantizedConvolutionMultipler(TfLiteContext* context, - const TfLiteTensor* input, - const TfLiteTensor* filter, - TfLiteTensor* output, - double* multiplier); - -// Calculates the useful quantized range of an activation layer given its -// activation tensor. -TfLiteStatus CalculateActivationRangeQuantized(TfLiteContext* context, - TfLiteFusedActivation activation, - TfLiteTensor* output, - int32_t* act_min, - int32_t* act_max); - -// Calculates the useful range of an activation layer given its activation -// tensor.a -template -void CalculateActivationRange(TfLiteFusedActivation activation, - T* activation_min, T* activation_max) { - if (activation == kTfLiteActRelu) { - *activation_min = 0; - *activation_max = std::numeric_limits::max(); - } else if (activation == kTfLiteActRelu6) { - *activation_min = 0; - *activation_max = 6; - } else if (activation == kTfLiteActReluN1To1) { - *activation_min = -1; - *activation_max = 1; - } else { - *activation_min = std::numeric_limits::lowest(); - *activation_max = std::numeric_limits::max(); - } -} - -// Return true if the given tensors have the same shape. -bool HaveSameShapes(const TfLiteTensor* input1, const TfLiteTensor* input2); - -// Calculates the output_shape that is necessary for element-wise operations -// with broadcasting involving the two input tensors. -TfLiteStatus CalculateShapeForBroadcast(TfLiteContext* context, - const TfLiteTensor* input1, - const TfLiteTensor* input2, - TfLiteIntArray** output_shape); - -// Calculates the output_shape that is necessary for element-wise operations -// with broadcasting involving the three input tensors. -TfLiteStatus CalculateShapeForBroadcast(TfLiteContext* context, - const TfLiteTensor* input1, - const TfLiteTensor* input2, - const TfLiteTensor* input3, - TfLiteIntArray** output_shape); -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_KERNEL_UTIL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/op_macros.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/op_macros.h deleted file mode 100644 index 22a17634..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/op_macros.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ -#define TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ - -// If we're on a platform without standard IO functions, fall back to a -// non-portable function. -#ifdef TF_LITE_MCU_DEBUG_LOG - -#include "tensorflow/lite/micro/debug_log.h" - -#define DEBUG_LOG(x) \ - do { \ - DebugLog(x); \ - } while (0) - -inline void InfiniteLoop() { - DEBUG_LOG("HALTED\n"); - while (1) { - } -} - -#define TFLITE_ABORT InfiniteLoop(); - -#else // TF_LITE_MCU_DEBUG_LOG - -#include -#include - -#define DEBUG_LOG(x) \ - do { \ - printf("%s", (x)); \ - } while (0) - -// Report Error for unsupported type by op 'op_name' and returns kTfLiteError. -#define TF_LITE_UNSUPPORTED_TYPE(context, type, op_name) \ - do { \ - TF_LITE_KERNEL_LOG((context), "%s:%d Type %s is unsupported by op %s.", \ - __FILE__, __LINE__, TfLiteTypeGetName(type), \ - (op_name)); \ - return kTfLiteError; \ - } while (0) - -#define TFLITE_ABORT abort() - -#endif // TF_LITE_MCU_DEBUG_LOG - -#ifdef NDEBUG -#define TFLITE_ASSERT_FALSE (static_cast(0)) -#else -#define TFLITE_ASSERT_FALSE TFLITE_ABORT -#endif - -#define TF_LITE_FATAL(msg) \ - do { \ - DEBUG_LOG(msg); \ - DEBUG_LOG("\nFATAL\n"); \ - TFLITE_ABORT; \ - } while (0) - -#define TF_LITE_ASSERT(x) \ - do { \ - if (!(x)) TF_LITE_FATAL(#x); \ - } while (0) - -#define TF_LITE_ASSERT_EQ(x, y) \ - do { \ - if ((x) != (y)) TF_LITE_FATAL(#x " didn't equal " #y); \ - } while (0) - -#endif // TENSORFLOW_LITE_KERNELS_OP_MACROS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/padding.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/padding.h deleted file mode 100644 index 1116b1da..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/kernels/padding.h +++ /dev/null @@ -1,80 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_KERNELS_PADDING_H_ -#define TENSORFLOW_LITE_KERNELS_PADDING_H_ - -#include "tensorflow/lite/c/builtin_op_data.h" - -namespace tflite { - -// TODO(renjieliu): Migrate others to use ComputePaddingWithLeftover. -inline int ComputePadding(int stride, int dilation_rate, int in_size, - int filter_size, int out_size) { - int effective_filter_size = (filter_size - 1) * dilation_rate + 1; - int padding = ((out_size - 1) * stride + effective_filter_size - in_size) / 2; - return padding > 0 ? padding : 0; -} - -// It's not guaranteed that padding is symmetric. It's important to keep -// offset for algorithms need all paddings. -inline int ComputePaddingWithOffset(int stride, int dilation_rate, int in_size, - int filter_size, int out_size, - int* offset) { - int effective_filter_size = (filter_size - 1) * dilation_rate + 1; - int total_padding = - ((out_size - 1) * stride + effective_filter_size - in_size); - total_padding = total_padding > 0 ? total_padding : 0; - *offset = total_padding % 2; - return total_padding / 2; -} - -// Matching GetWindowedOutputSize in TensorFlow. -inline int ComputeOutSize(TfLitePadding padding, int image_size, - int filter_size, int stride, int dilation_rate = 1) { - int effective_filter_size = (filter_size - 1) * dilation_rate + 1; - switch (padding) { - case kTfLitePaddingSame: - return (image_size + stride - 1) / stride; - case kTfLitePaddingValid: - return (image_size + stride - effective_filter_size) / stride; - default: - return 0; - } -} - -inline TfLitePaddingValues ComputePaddingHeightWidth( - int stride_height, int stride_width, int dilation_rate_height, - int dilation_rate_width, int in_height, int in_width, int filter_height, - int filter_width, TfLitePadding padding, int* out_height, int* out_width) { - *out_width = ComputeOutSize(padding, in_width, filter_width, stride_width, - dilation_rate_width); - *out_height = ComputeOutSize(padding, in_height, filter_height, stride_height, - dilation_rate_height); - - TfLitePaddingValues padding_values; - int offset = 0; - padding_values.height = - ComputePaddingWithOffset(stride_height, dilation_rate_height, in_height, - filter_height, *out_height, &offset); - padding_values.height_offset = offset; - padding_values.width = - ComputePaddingWithOffset(stride_width, dilation_rate_width, in_width, - filter_width, *out_width, &offset); - padding_values.width_offset = offset; - return padding_values; -} -} // namespace tflite - -#endif // TENSORFLOW_LITE_KERNELS_PADDING_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/all_ops_resolver.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/all_ops_resolver.h deleted file mode 100644 index e8105b96..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/all_ops_resolver.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ -#define TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ - -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/micro_mutable_op_resolver.h" - -namespace tflite { - -// The magic number in the template parameter is the maximum number of ops that -// can be added to AllOpsResolver. It can be increased if needed. And most -// applications that care about the memory footprint will want to directly use -// MicroMutableOpResolver and have an application specific template parameter. -// The examples directory has sample code for this. -class AllOpsResolver : public MicroMutableOpResolver<128> { - public: - AllOpsResolver(); - - private: - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_ALL_OPS_RESOLVER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h deleted file mode 100644 index ce34426c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/benchmarks/keyword_scrambled_model_data.h +++ /dev/null @@ -1,22 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ -#define TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ - -extern const unsigned char g_keyword_scrambled_model_data[]; -extern const unsigned int g_keyword_scrambled_model_data_length; - -#endif // TENSORFLOW_LITE_MICRO_BENCHMARKS_KEYWORD_SCRAMBLED_MODEL_DATA_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/compatibility.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/compatibility.h deleted file mode 100644 index 49acb28f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/compatibility.h +++ /dev/null @@ -1,32 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ -#define TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ - -// C++ will automatically create class-specific delete operators for virtual -// objects, which by default call the global delete function. For embedded -// applications we want to avoid this, and won't be calling new/delete on these -// objects, so we need to override the default implementation with one that does -// nothing to avoid linking in ::delete(). -// This macro needs to be included in all subclasses of a virtual base class in -// the private section. -#ifdef TF_LITE_STATIC_MEMORY -#define TF_LITE_REMOVE_VIRTUAL_DELETE \ - void operator delete(void* p) {} -#else -#define TF_LITE_REMOVE_VIRTUAL_DELETE -#endif - -#endif // TENSORFLOW_LITE_MICRO_COMPATIBILITY_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/debug_log.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/debug_log.h deleted file mode 100644 index 1004ab9f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/debug_log.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ -#define TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ - -// This function should be implemented by each target platform, and provide a -// way for strings to be output to some text stream. For more information, see -// tensorflow/lite/micro/debug_log.cc. -extern "C" void DebugLog(const char* s); - -#endif // TENSORFLOW_LITE_MICRO_DEBUG_LOG_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/detection_responder.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/detection_responder.h deleted file mode 100644 index aadad3be..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/detection_responder.h +++ /dev/null @@ -1,34 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -// Provides an interface to take an action based on the output from the person -// detection model. - -#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_DETECTION_RESPONDER_H_ -#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_DETECTION_RESPONDER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/micro/micro_error_reporter.h" - -// Called every time the results of a person detection run are available. The -// `person_score` has the numerical confidence that the captured image contains -// a person, and `no_person_score` has the numerical confidence that the image -// does not contain a person. Typically if person_score > no person score, the -// image is considered to contain a person. This threshold may be adjusted for -// particular applications. -void RespondToDetection(tflite::ErrorReporter* error_reporter, - int8_t person_score, int8_t no_person_score); - -#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_DETECTION_RESPONDER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/image_provider.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/image_provider.h deleted file mode 100644 index 4d18c4d6..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/image_provider.h +++ /dev/null @@ -1,40 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_IMAGE_PROVIDER_H_ -#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_IMAGE_PROVIDER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/micro/micro_error_reporter.h" - -// This is an abstraction around an image source like a camera, and is -// expected to return 8-bit sample data. The assumption is that this will be -// called in a low duty-cycle fashion in a low-power application. In these -// cases, the imaging sensor need not be run in a streaming mode, but rather can -// be idled in a relatively low-power mode between calls to GetImage(). The -// assumption is that the overhead and time of bringing the low-power sensor out -// of this standby mode is commensurate with the expected duty cycle of the -// application. The underlying sensor may actually be put into a streaming -// configuration, but the image buffer provided to GetImage should not be -// overwritten by the driver code until the next call to GetImage(); -// -// The reference implementation can have no platform-specific dependencies, so -// it just returns a static image. For real applications, you should -// ensure there's a specialized implementation that accesses hardware APIs. -TfLiteStatus GetImage(tflite::ErrorReporter* error_reporter, int image_width, - int image_height, int channels, int8_t* image_data, - uint8_t * hardware_input); - -#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_IMAGE_PROVIDER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.h deleted file mode 100644 index 8361e318..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/main_functions.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MAIN_FUNCTIONS_H_ -#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MAIN_FUNCTIONS_H_ - -#include "tensorflow/lite/c/common.h" - -// Initializes all data needed for the example. The name is important, and needs -// to be setup() for Arduino compatibility. -extern "C" void person_detect_init(); - -// Runs one iteration of data gathering and inference. This should be called -// repeatedly from the application code. The name needs to be loop() for Arduino -// compatibility. -extern "C" int person_detect(uint8_t * hardware_input); - -#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MAIN_FUNCTIONS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/model_settings.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/model_settings.h deleted file mode 100644 index f6c968e9..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/model_settings.h +++ /dev/null @@ -1,35 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MODEL_SETTINGS_H_ -#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MODEL_SETTINGS_H_ - -// Keeping these as constant expressions allow us to allocate fixed-sized arrays -// on the stack for our working memory. - -// All of these values are derived from the values used during model training, -// if you change your model you'll need to update these constants. -constexpr int kNumCols = 96; -constexpr int kNumRows = 96; -constexpr int kNumChannels = 1; - -constexpr int kMaxImageSize = kNumCols * kNumRows * kNumChannels; - -constexpr int kCategoryCount = 2; -constexpr int kPersonIndex = 1; -constexpr int kNotAPersonIndex = 0; -extern const char* kCategoryLabels[kCategoryCount]; - -#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_MODEL_SETTINGS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/person_detect_model_data.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/person_detect_model_data.h deleted file mode 100644 index 5d1b59ff..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/examples/person_detection_experimental/person_detect_model_data.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -// This is a standard TensorFlow Lite model file that has been converted into a -// C data array, so it can be easily compiled into a binary for devices that -// don't have a file system. It was created using the command: -// xxd -i person_detect.tflite > person_detect_model_data.cc - -#ifndef TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_PERSON_DETECT_MODEL_DATA_H_ -#define TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_PERSON_DETECT_MODEL_DATA_H_ - -extern const unsigned char g_person_detect_model_data[]; -extern const int g_person_detect_model_data_len; - -#endif // TENSORFLOW_LITE_MICRO_EXAMPLES_PERSON_DETECTION_EXPERIMENTAL_PERSON_DETECT_MODEL_DATA_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/activation_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/activation_utils.h deleted file mode 100644 index 95ecc26d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/activation_utils.h +++ /dev/null @@ -1,57 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ -#define TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ - -#include -#include - -#include "tensorflow/lite/c/builtin_op_data.h" -#include "tensorflow/lite/kernels/internal/cppmath.h" -#include "tensorflow/lite/kernels/internal/max.h" -#include "tensorflow/lite/kernels/internal/min.h" - -namespace tflite { -namespace ops { -namespace micro { - -// Returns the floating point value for a fused activation: -inline float ActivationValFloat(TfLiteFusedActivation act, float a) { - switch (act) { - case kTfLiteActNone: - return a; - case kTfLiteActRelu: - return TfLiteMax(0.0f, a); - case kTfLiteActReluN1To1: - return TfLiteMax(-1.0f, TfLiteMin(a, 1.0f)); - case kTfLiteActRelu6: - return TfLiteMax(0.0f, TfLiteMin(a, 6.0f)); - case kTfLiteActTanh: - return std::tanh(a); - case kTfLiteActSignBit: - return std::signbit(a); - case kTfLiteActSigmoid: - return 1.0f / (1.0f + std::exp(-a)); - } - return 0.0f; // To indicate an unsupported activation (i.e. when a new fused - // activation is added to the enum and not handled here). -} - -} // namespace micro -} // namespace ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_KERNELS_ACTIVATION_UTILS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_runner.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_runner.h deleted file mode 100644 index 45d107e7..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_runner.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ -#define TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/micro/simple_memory_allocator.h" - -namespace tflite { -namespace micro { - -// Helper class to perform a simulated kernel (i.e. TfLiteRegistration) lifecyle -// (init, prepare, invoke). All internal allocations are handled by this class. -// Simply pass in the registration, list of required tensors, inputs array, -// outputs array, and any pre-builtin data. Calling Invoke() will automatically -// walk the kernl and outputs will be ready on the the TfLiteTensor output -// provided during construction. -class KernelRunner { - public: - KernelRunner(const TfLiteRegistration& registration, TfLiteTensor* tensors, - int tensors_size, TfLiteIntArray* inputs, - TfLiteIntArray* outputs, void* builtin_data, - ErrorReporter* error_reporter); - - // Calls init and prepare on the kernel (i.e. TfLiteRegistration) struct. Any - // exceptions will be reported through the error_reporter and returned as a - // status code here. - TfLiteStatus InitAndPrepare(const char* init_data = nullptr); - - // Calls init, prepare, and invoke on a given TfLiteRegistration pointer. - // After successful invoke, results will be available in the output tensor as - // passed into the constructor of this class. - TfLiteStatus Invoke(); - - protected: - static TfLiteTensor* GetTensor(const struct TfLiteContext* context, - int tensor_index); - static TfLiteEvalTensor* GetEvalTensor(const struct TfLiteContext* context, - int tensor_index); - static void* AllocatePersistentBuffer(TfLiteContext* context, size_t bytes); - static TfLiteStatus RequestScratchBufferInArena(TfLiteContext* context, - size_t bytes, - int* buffer_index); - static void* GetScratchBuffer(TfLiteContext* context, int buffer_index); - static void ReportOpError(struct TfLiteContext* context, const char* format, - ...); - - private: - static constexpr int kNumScratchBuffers_ = 5; - - static constexpr int kKernelRunnerBufferSize_ = 10000; - static uint8_t kKernelRunnerBuffer_[kKernelRunnerBufferSize_]; - - SimpleMemoryAllocator* allocator_ = nullptr; - const TfLiteRegistration& registration_; - TfLiteTensor* tensors_ = nullptr; - ErrorReporter* error_reporter_ = nullptr; - - TfLiteContext context_ = {}; - TfLiteNode node_ = {}; - - int scratch_buffer_count_ = 0; - uint8_t* scratch_buffers_[kNumScratchBuffers_]; -}; - -} // namespace micro -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_RUNNER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_util.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_util.h deleted file mode 100644 index 530e52df..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/kernel_util.h +++ /dev/null @@ -1,83 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ -#define TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ - -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/internal/types.h" - -namespace tflite { -namespace micro { - -// Returns a mutable tensor for a given input index. is_variable must be checked -// during prepare when the full TfLiteTensor is available. -inline TfLiteEvalTensor* GetMutableEvalInput(const TfLiteContext* context, - const TfLiteNode* node, - int index) { - TFLITE_DCHECK(context != nullptr); - TFLITE_DCHECK(node != nullptr); - return context->GetEvalTensor(context, node->inputs->data[index]); -} - -// Returns the TfLiteEvalTensor struct for a given input index in a node. -inline const TfLiteEvalTensor* GetEvalInput(const TfLiteContext* context, - const TfLiteNode* node, int index) { - return GetMutableEvalInput(context, node, index); -} - -// Returns the TfLiteEvalTensor struct for a given output index in a node. -inline TfLiteEvalTensor* GetEvalOutput(const TfLiteContext* context, - const TfLiteNode* node, int index) { - TFLITE_DCHECK(context != nullptr); - TFLITE_DCHECK(node != nullptr); - return context->GetEvalTensor(context, node->outputs->data[index]); -} - -// Returns data for a TfLiteEvalTensor struct. -template -T* GetTensorData(TfLiteEvalTensor* tensor) { - return tensor != nullptr ? reinterpret_cast(tensor->data.raw) : nullptr; -} - -// Returns const data for a TfLiteEvalTensor struct. -template -const T* GetTensorData(const TfLiteEvalTensor* tensor) { - TFLITE_DCHECK(tensor != nullptr); - return reinterpret_cast(tensor->data.raw); -} - -// Returns the shape of a TfLiteEvalTensor struct. -inline const RuntimeShape GetTensorShape(const TfLiteEvalTensor* tensor) { - if (tensor == nullptr) { - return RuntimeShape(); - } - TfLiteIntArray* dims = tensor->dims; - const int dims_size = dims->size; - const int32_t* dims_data = reinterpret_cast(dims->data); - return RuntimeShape(dims_size, dims_data); -} - -// Return true if the given tensors have the same shape. -bool HaveSameShapes(const TfLiteEvalTensor* input1, - const TfLiteEvalTensor* input2); - -} // namespace micro -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_KERNELS_KERNEL_UTIL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_ops.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_ops.h deleted file mode 100644 index 7e63f342..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_ops.h +++ /dev/null @@ -1,92 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ -#define TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ - -#include "tensorflow/lite/c/common.h" - -namespace tflite { -namespace ops { -namespace micro { - -// Forward declaration of all micro op kernel registration methods. These -// registrations are included with the standard `BuiltinOpResolver`. -// -// This header is particularly useful in cases where only a subset of ops are -// needed. In such cases, the client can selectively add only the registrations -// their model requires, using a custom `(Micro)MutableOpResolver`. Selective -// registration in turn allows the linker to strip unused kernels. - -TfLiteRegistration Register_ABS(); -TfLiteRegistration Register_ADD(); -TfLiteRegistration Register_ARG_MAX(); -TfLiteRegistration Register_ARG_MIN(); -TfLiteRegistration Register_AVERAGE_POOL_2D(); -TfLiteRegistration Register_CEIL(); -// TODO(b/160234179): Change custom OPs to also return by value. -TfLiteRegistration* Register_CIRCULAR_BUFFER(); -TfLiteRegistration Register_CONV_2D(); -TfLiteRegistration Register_CONCATENATION(); -TfLiteRegistration Register_COS(); -TfLiteRegistration Register_DEPTHWISE_CONV_2D(); -TfLiteRegistration Register_DEQUANTIZE(); -TfLiteRegistration Register_EQUAL(); -TfLiteRegistration Register_FLOOR(); -TfLiteRegistration Register_FULLY_CONNECTED(); -TfLiteRegistration Register_GREATER(); -TfLiteRegistration Register_GREATER_EQUAL(); -TfLiteRegistration Register_HARD_SWISH(); -TfLiteRegistration Register_LESS(); -TfLiteRegistration Register_LESS_EQUAL(); -TfLiteRegistration Register_LOG(); -TfLiteRegistration Register_LOGICAL_AND(); -TfLiteRegistration Register_LOGICAL_NOT(); -TfLiteRegistration Register_LOGICAL_OR(); -TfLiteRegistration Register_LOGISTIC(); -TfLiteRegistration Register_MAXIMUM(); -TfLiteRegistration Register_MAX_POOL_2D(); -TfLiteRegistration Register_MEAN(); -TfLiteRegistration Register_MINIMUM(); -TfLiteRegistration Register_MUL(); -TfLiteRegistration Register_NEG(); -TfLiteRegistration Register_NOT_EQUAL(); -TfLiteRegistration Register_PACK(); -TfLiteRegistration Register_PAD(); -TfLiteRegistration Register_PADV2(); -TfLiteRegistration Register_PRELU(); -TfLiteRegistration Register_QUANTIZE(); -TfLiteRegistration Register_RELU(); -TfLiteRegistration Register_RELU6(); -TfLiteRegistration Register_RESHAPE(); -TfLiteRegistration Register_RESIZE_NEAREST_NEIGHBOR(); -TfLiteRegistration Register_ROUND(); -TfLiteRegistration Register_RSQRT(); -TfLiteRegistration Register_SIN(); -TfLiteRegistration Register_SOFTMAX(); -TfLiteRegistration Register_SPLIT(); -TfLiteRegistration Register_SQRT(); -TfLiteRegistration Register_SQUARE(); -TfLiteRegistration Register_STRIDED_SLICE(); -TfLiteRegistration Register_SUB(); -TfLiteRegistration Register_SVDF(); -TfLiteRegistration Register_UNPACK(); -TfLiteRegistration Register_L2_NORMALIZATION(); -TfLiteRegistration Register_TANH(); - -} // namespace micro -} // namespace ops -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_KERNELS_MICRO_OPS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_utils.h deleted file mode 100644 index 85db263e..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/kernels/micro_utils.h +++ /dev/null @@ -1,37 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ -#define TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ -namespace tflite { -namespace ops { -namespace micro { - -// Same as gtl::Greater but defined here to reduce dependencies and -// binary size for micro environment. -struct Greater { - template - bool operator()(const T& x, const T& y) const { - return x > y; - } -}; - -struct Less { - template - bool operator()(const T& x, const T& y) const { - return x < y; - } -}; - -} // namespace micro -} // namespace ops -} // namespace tflite -#endif // TENSORFLOW_LITE_MICRO_KERNELS_MICRO_UTILS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_helpers.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_helpers.h deleted file mode 100644 index 8f5526ce..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_helpers.h +++ /dev/null @@ -1,59 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ -#define TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ - -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -// Returns the next pointer address aligned to the given alignment. -uint8_t* AlignPointerUp(uint8_t* data, size_t alignment); - -// Returns the previous pointer address aligned to the given alignment. -uint8_t* AlignPointerDown(uint8_t* data, size_t alignment); - -// Returns an increased size that's a multiple of alignment. -size_t AlignSizeUp(size_t size, size_t alignment); - -// Returns size in bytes for a given TfLiteType. -TfLiteStatus TfLiteTypeSizeOf(TfLiteType type, size_t* size); - -// How many bytes are needed to hold a tensor's contents. -TfLiteStatus BytesRequiredForTensor(const tflite::Tensor& flatbuffer_tensor, - size_t* bytes, size_t* type_size, - ErrorReporter* error_reporter); - -// How many bytes are used in a TfLiteEvalTensor instance. The byte length is -// returned in out_bytes. -TfLiteStatus TfLiteEvalTensorByteLength(const TfLiteEvalTensor* eval_tensor, - size_t* out_bytes); - -// Deduce output dimensions from input and allocate given size. -// Useful for operators with two inputs where the largest input should equal the -// output dimension. -TfLiteStatus AllocateOutputDimensionsFromInput(TfLiteContext* context, - const TfLiteTensor* input1, - const TfLiteTensor* input2, - TfLiteTensor* output); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MEMORY_HELPERS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h deleted file mode 100644 index f5f26a8b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/greedy_memory_planner.h +++ /dev/null @@ -1,163 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ -#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ - -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/memory_planner/memory_planner.h" - -namespace tflite { - -constexpr int kOnlinePlannedBuffer = -1; - -// A memory planner that uses a greedy algorithm to arrange buffers in memory -// to minimize the overall arena size needed. -// -// The algorithm works like this: -// - The client enters the buffer information through AddBuffer(). -// - When a function like GetOffsetForBuffer() is called, the -// CalculateOffsetsIfNeeded() method is invoked. -// - If an up to date plan is not already present, one will be calculated. -// - The buffers are sorted in descending order of size. -// - The largest buffer is placed at offset zero. -// - The rest of the buffers are looped through in descending size order. -// - The other buffers that need to be in memory at the same time are found. -// - The first gap between simultaneously active buffers that the current -// buffer fits into will be used. -// - If no large-enough gap is found, the current buffer is placed after the -// last buffer that's simultaneously active. -// - This continues until all buffers are placed, and the offsets stored. -// -// This is not guaranteed to produce the best placement, since that's an -// NP-Complete problem, but in practice it should produce one that's decent. -class GreedyMemoryPlanner : public MemoryPlanner { - public: - // You need to pass in an area of memory to be used for planning. This memory - // needs to have a lifetime as long as the planner, but isn't owned by this - // object, so management should be handled by the client. This is so it can be - // stack or globally allocated if necessary on devices without dynamic memory - // allocation. How many buffers can be planned for will depend on the size of - // this scratch memory, so you should enlarge it if you see an error when - // calling AddBuffer(). The memory can be reused once you're done with the - // planner, as long as you copy the calculated offsets to another location. - // Each buffer requires about 36 bytes of scratch. - GreedyMemoryPlanner(unsigned char* scratch_buffer, int scratch_buffer_size); - ~GreedyMemoryPlanner() override; - - // Record details of a buffer we want to place. - TfLiteStatus AddBuffer(ErrorReporter* error_reporter, int size, - int first_time_used, int last_time_used) override; - - // Record details of an offline planned buffer offset we want to place. - // offline_offset is the buffer offset from the start of the arena. - TfLiteStatus AddBuffer(ErrorReporter* error_reporter, int size, - int first_time_used, int last_time_used, - int offline_offset); - - // Returns the high-water mark of used memory. This is the minimum size of a - // memory arena you'd need to allocate to hold these buffers. - size_t GetMaximumMemorySize() override; - - // How many buffers have been recorded. - int GetBufferCount() override; - - // Where a given buffer should be placed in the memory arena. - // This information is stored in the memory arena itself, so once the arena - // is used for inference, it will be overwritten. - TfLiteStatus GetOffsetForBuffer(ErrorReporter* error_reporter, - int buffer_index, int* offset) override; - - // Prints an ascii-art diagram of the buffer layout plan. - void PrintMemoryPlan(ErrorReporter* error_reporter); - - // Debug method to check whether any buffer allocations are overlapping. This - // is an O(N^2) complexity operation, so only use for testing. - bool DoAnyBuffersOverlap(ErrorReporter* error_reporter); - - // Used to store a list of buffers ordered by their offset. - struct ListEntry { - int offset; - int requirements_index; - int next_entry_index; - }; - - // Number of bytes required in order to plan a buffer. - static size_t per_buffer_size() { - const int per_buffer_size = - sizeof(BufferRequirements) + // requirements_ - sizeof(int) + // buffer_sizes_sorted_ - sizeof(int) + // buffer_ids_sorted_ - sizeof(ListEntry) + // buffers_sorted_by_offset_ - sizeof(int); // buffer_offsets_; - return per_buffer_size; - } - - private: - // Whether a buffer is active in a given time range. - bool DoesEntryOverlapInTime(const ListEntry* entry, const int first_time_used, - const int last_time_used) const; - - // Walks the list to return the next buffer that is active in a given time - // range, or a null pointer if there are none. - ListEntry* NextSimultaneouslyActiveBuffer(const ListEntry* start, - const int first_time_used, - const int last_time_used); - - // If there isn't an up to date plan, calculate a new one. - void CalculateOffsetsIfNeeded(); - - // How many buffers we can plan for, based on the arena size we're given in - // the constructor. - int max_buffer_count_; - - // The number of buffers added so far. - int buffer_count_; - - // Records the client-provided information about each buffer. - struct BufferRequirements { - int size; - int offline_offset; - int first_time_used; - int last_time_used; - }; - - // Working arrays used during the layout algorithm. - BufferRequirements* requirements_; - // buffer_sizes_sorted_ and buffer_ids_sorted_ are sorted according to: - // { - // offline planned buffers, - // online planned buffers sorted by size - // } - int* buffer_sizes_sorted_; - int* buffer_ids_sorted_; - ListEntry* buffers_sorted_by_offset_; - int next_free_entry_; // Index of the next free entry of - // buffers_sorted_by_offset_ - int first_entry_index_; // Index of the first entry (smallest offset) of - // buffers_sorted_by_offset_ - - // Stores the outcome of the plan, the location of each buffer in the arena. - int* buffer_offsets_; - - // Whether buffers have been added since the last plan was calculated. - bool need_to_calculate_offsets_; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_GREEDY_MEMORY_PLANNER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/linear_memory_planner.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/linear_memory_planner.h deleted file mode 100644 index 4d77e778..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/linear_memory_planner.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ -#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ - -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/memory_planner/memory_planner.h" - -namespace tflite { - -// The simplest possible memory planner that just lays out all buffers at -// increasing offsets without trying to reuse memory. -class LinearMemoryPlanner : public MemoryPlanner { - public: - LinearMemoryPlanner(); - ~LinearMemoryPlanner() override; - - TfLiteStatus AddBuffer(tflite::ErrorReporter* error_reporter, int size, - int first_time_used, int last_time_used) override; - - size_t GetMaximumMemorySize() override; - int GetBufferCount() override; - TfLiteStatus GetOffsetForBuffer(tflite::ErrorReporter* error_reporter, - int buffer_index, int* offset) override; - - private: - static constexpr int kMaxBufferCount = 1024; - size_t buffer_offsets_[kMaxBufferCount]; - int current_buffer_count_; - size_t next_free_offset_; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_LINEAR_MEMORY_PLANNER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/memory_planner.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/memory_planner.h deleted file mode 100644 index 2c39fbe0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/memory_planner/memory_planner.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ -#define TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" - -namespace tflite { - -// Interface class for planning the layout of memory buffers during the -// execution of a graph. -// It's designed to be used by a client that iterates in any order through the -// buffers it wants to lay out, and then calls the getter functions for -// information about the calculated layout. For example: -// -// SomeMemoryPlanner planner; -// planner.AddBuffer(reporter, 100, 0, 1); // Buffer 0 -// planner.AddBuffer(reporter, 50, 2, 3); // Buffer 1 -// planner.AddBuffer(reporter, 50, 2, 3); // Buffer 2 -// -// int offset0; -// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 0, &offset0)); -// int offset1; -// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 1, &offset1)); -// int offset2; -// TF_EXPECT_OK(planner.GetOffsetForBuffer(reporter, 2, &offset2)); -// const int arena_size_needed = planner.GetMaximumMemorySize(); -// -// The goal is for applications to be able to experiment with different layout -// strategies without changing their client code, by swapping out classes that -// implement this interface.= -class MemoryPlanner { - public: - MemoryPlanner() {} - virtual ~MemoryPlanner() {} - - // Pass information about a buffer's size and lifetime to the layout - // algorithm. The order this is called implicitly assigns an index to the - // result, so the buffer information that's passed into the N-th call of - // this method will be used as the buffer_index argument to - // GetOffsetForBuffer(). - virtual TfLiteStatus AddBuffer(tflite::ErrorReporter* error_reporter, - int size, int first_time_used, - int last_time_used) = 0; - - // The largest contiguous block of memory that's needed to hold the layout. - virtual size_t GetMaximumMemorySize() = 0; - // How many buffers have been added to the planner. - virtual int GetBufferCount() = 0; - // Calculated layout offset for the N-th buffer added to the planner. - virtual TfLiteStatus GetOffsetForBuffer(tflite::ErrorReporter* error_reporter, - int buffer_index, int* offset) = 0; -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MEMORY_PLANNER_MEMORY_PLANNER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_allocator.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_allocator.h deleted file mode 100644 index efd11b8b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_allocator.h +++ /dev/null @@ -1,250 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. -b/160894903 -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ - -#include -#include - -#include "flatbuffers/flatbuffers.h" // from @flatbuffers -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/micro_op_resolver.h" -#include "tensorflow/lite/micro/simple_memory_allocator.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -// Namespace used for unittests. -namespace internal { - -// Sets up all of the data structure members for a TfLiteTensor based on the -// contents of a serialized tensor in the flatbuffer. -// TODO(b/160894903): Once all kernels have been updated to the new -// TfLiteEvalTensor API - drop the allocate_temp flag. This enables internal -// flatbuffer quantization or dimension allocations to take place in either the -// temp or tail section of the arena. -TfLiteStatus InitializeTfLiteTensorFromFlatbuffer( - SimpleMemoryAllocator* allocator, bool allocate_temp, - const tflite::Tensor& flatbuffer_tensor, - const flatbuffers::Vector>* buffers, - ErrorReporter* error_reporter, TfLiteTensor* result); - -// A handle tracking scratch buffer allocation. This handle is created by -// `RequestScratchBufferInArena`. `data` field is populated in -// `FinishModelAllocation` after static memory planning. -// TODO(b/150257460) As a future optimization, this struct could be replaced by -// a union, since once `data` is populated, `bytes` and `node_idx` is not -// needed. -typedef struct { - // Pointer to the scratch buffer. - uint8_t* data; - // Number of bytes required by the buffer. The actual allocated size might be - // greater than `bytes` due to buffer alignment. - size_t bytes; - // Node where the buffer is allocated for. This provides useful information to - // determine the lifetime of the buffer. In AllocationInfo, this buffer will - // have `before` = node_idx and `after` = node_idx. - int node_idx; -} ScratchBufferHandle; -} // namespace internal - -typedef struct { - TfLiteNode node; - const TfLiteRegistration* registration; -} NodeAndRegistration; - -// Allocator responsible for allocating memory for all intermediate tensors -// necessary to invoke a model. -// -// The lifetime of the model, tensor arena and error reporter must be at -// least as long as that of the allocator object, since the allocator needs -// them to be accessible during its entire lifetime. -// -// The MicroAllocator simply plans out additional allocations that are required -// to standup a model for inference in TF Micro. This class currently relies on -// an additional allocator - SimpleMemoryAllocator - for all allocations from an -// arena. These allocations are divided into head (non-persistent) and tail -// (persistent) regions: -// -// Memory layout to help understand how it works -// This information could change in the future version. -// ************** .memory_allocator->GetBuffer() -// Tensors/Scratch buffers (head) -// ************** .head_watermark -// unused memory -// ************** .memory_allocator->GetBuffer() + ->GetMaxBufferSize() -// - ->GetDataSize() -// persistent area (tail) -// ************** .memory_allocator->GetBuffer() + ->GetMaxBufferSize() -class MicroAllocator { - public: - // Creates a MicroAllocator instance from a given tensor arena. This arena - // will be managed by the created instance. - // Note: Please use __declspec(align(16)) to make sure tensor_arena is 16 - // bytes aligned, otherwise some head room will be wasted. - // TODO(b/157615197): Cleanup constructor + factory usage. - static MicroAllocator* Create(uint8_t* tensor_arena, size_t arena_size, - ErrorReporter* error_reporter); - - // Creates a MicroAllocator instance using the provided SimpleMemoryAllocator - // intance. This allocator instance will use the SimpleMemoryAllocator - // instance to manage allocations internally. - static MicroAllocator* Create(SimpleMemoryAllocator* memory_allocator, - ErrorReporter* error_reporter); - - // Begin allocating internal resources required for model inference. - // This method will run through the flatbuffer data supplied in the model to - // properly allocate tensor, node, and op registration data. This method is - // expected to be followed with a call to FinishModelAllocation() before - // resuming allocation with another model. All persistent tensor buffers are - // stored in the out-param eval_tensors. This value is allocated from the - // persistent memory arena and will be used to host runtime tensor buffers. - TfLiteStatus StartModelAllocation( - const Model* model, const MicroOpResolver& op_resolver, - NodeAndRegistration** node_and_registrations, - TfLiteEvalTensor** eval_tensors); - - // Finish allocating internal resources required for model inference. - // This method will plan non-persistent buffers and commit a memory plan to - // the 'head' section of the memory arena. All variable tensor data will also - // be allocated. This method should be called after assigning model resources - // in StartModelAllocation(). The eval_tensors pointer should be the value - // passed into this class during StartModelAllocation(). - TfLiteStatus FinishModelAllocation(const Model* model, - TfLiteEvalTensor* eval_tensors); - - // Allocates a TfLiteTensor struct and populates the returned value with - // properties from the model flatbuffer. This struct is allocated from - // persistent arena memory is only guaranteed for the lifetime of the - // application. The eval_tensors pointer should be the value passed into this - // class during StartModelAllocation() and contains the source-of-truth for - // buffers. - virtual TfLiteTensor* AllocatePersistentTfLiteTensor( - const Model* model, TfLiteEvalTensor* eval_tensors, int tensor_index); - - // Allocates a TfLiteTensor struct and populates the returned value with - // properties from the model flatbuffer. This struct is allocated from - // temporary arena memory is only guaranteed until a call is made to - // ResetTempAllocations(). The eval_tensors pointer should be the value passed - // into this class during StartModelAllocation() and contains the - // source-of-truth for buffers. - virtual TfLiteTensor* AllocateTempTfLiteTensor(const Model* model, - TfLiteEvalTensor* eval_tensors, - int tensor_index); - - // Resets all temporary allocations. This method should be called after a - // chain of temp allocations (e.g. chain of TfLiteTensor objects via - // AllocateTfLiteTensor()). - virtual void ResetTempAllocations(); - - // Allocates persistent buffer which has the same life time as the allocator. - // The memory is immediately available and is allocated from the tail of the - // arena. - void* AllocatePersistentBuffer(size_t bytes); - - // Register a scratch buffer of size `bytes` for Node with `node_id`. - // This method only allocates a BufferHandle holding information for memory - // planning. The buffer ptr is ready after `FinishModelAllocation` and can - // be retrieved by `GetScratchBuffer` method using the returned buffer_idx. - // Note that there should be no tail allocation between two consecutive - // `RequestScratchBufferInArena` calls. - TfLiteStatus RequestScratchBufferInArena(int node_id, size_t bytes, - int* buffer_idx); - // Returns the pointer to the planned scratch buffer. - void* GetScratchBuffer(int buffer_idx) const; - - // Returns the arena usage in bytes, only available after - // `FinishModelAllocation`. Otherwise, it will return 0. - size_t used_bytes() const; - - protected: - MicroAllocator(SimpleMemoryAllocator* memory_allocator, - ErrorReporter* error_reporter); - virtual ~MicroAllocator(); - - // Allocates an array in the arena to hold pointers to the node and - // registration pointers required to represent the inference graph of the - // model. - virtual TfLiteStatus AllocateNodeAndRegistrations( - const Model* model, NodeAndRegistration** node_and_registrations); - - // Populates node and registration pointers representing the inference graph - // of the model from values inside the flatbuffer (loaded from the TfLiteModel - // instance). Persistent data (e.g. operator data) is allocated from the - // arena. - virtual TfLiteStatus PrepareNodeAndRegistrationDataFromFlatbuffer( - const Model* model, const MicroOpResolver& op_resolver, - NodeAndRegistration* node_and_registrations); - - // Allocates the list of persistent TfLiteEvalTensors that are used for the - // "eval" phase of model inference. These structs will be the source of truth - // for all tensor buffers. Allocation results are stored in the out-param - // eval_tensors. - virtual TfLiteStatus AllocateTfLiteEvalTensors( - const Model* model, TfLiteEvalTensor** eval_tensors); - - // Allocates persistent tensor buffers for variable tensors in the subgraph. - virtual TfLiteStatus AllocateVariables(const SubGraph* subgraph, - TfLiteEvalTensor* eval_tensors); - - // TODO(b/160894903): Once all kernels have been updated to the new API drop - // this method. It is only used to record TfLiteTensor persistent allocations. - virtual TfLiteTensor* AllocatePersistentTfLiteTensorInternal( - const Model* model, TfLiteEvalTensor* eval_tensors, int tensor_index); - - // Populates a TfLiteTensor struct with data from the model flatbuffer. Any - // quantization data is allocated from either the tail (persistent) or temp - // sections of the arena based on the allocation flag. - // TODO(b/160894903): Once all kernels have been updated to the new API drop - // this function since all allocations for quantized data will take place in - // the temp section. - virtual TfLiteStatus PopulateTfLiteTensorFromFlatbuffer( - const Model* model, const SubGraph* subgraph, TfLiteTensor* tensor, - int tensor_index, bool allocate_temp); - - ErrorReporter* error_reporter() const; - - // Returns the first subgraph from the model. - const SubGraph* GetSubGraphFromModel(const Model* model); - - private: - // Commits a memory plan for all non-persistent buffer allocations in the - // 'head' section of the memory arena. The eval_tensors pointer is the list of - // pre-allocated TfLiteEvalTensor structs that will point to the buffers that - // will be allocated into the head section in this function call. - virtual TfLiteStatus CommitStaticMemoryPlan(const Model* model, - const SubGraph* subgraph, - TfLiteEvalTensor* eval_tensors); - - // A simple memory allocator that always allocate from the arena tail or head. - SimpleMemoryAllocator* memory_allocator_; - - ErrorReporter* error_reporter_; - bool model_is_allocating_; - - // In reverse order for efficiency. - // i.e. scratch_buffer_handles_[0] is the handle for the last buffer, - // corresponding to the last RequestScratchBufferInArena call. - internal::ScratchBufferHandle* scratch_buffer_handles_ = nullptr; - // How many scratch buffers have been allocated. - size_t scratch_buffer_count_ = 0; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite -#endif // TENSORFLOW_LITE_MICRO_MICRO_ALLOCATOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_error_reporter.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_error_reporter.h deleted file mode 100644 index e2c073a4..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_error_reporter.h +++ /dev/null @@ -1,36 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ - -#include - -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/micro/compatibility.h" - -namespace tflite { - -class MicroErrorReporter : public ErrorReporter { - public: - ~MicroErrorReporter() override {} - int Report(const char* format, va_list args) override; - - private: - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_ERROR_REPORTER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_interpreter.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_interpreter.h deleted file mode 100644 index 67d74574..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_interpreter.h +++ /dev/null @@ -1,208 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ - -#include -#include - -#include "flatbuffers/flatbuffers.h" // from @flatbuffers -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/core/api/profiler.h" -#include "tensorflow/lite/kernels/internal/tensor_ctypes.h" -#include "tensorflow/lite/micro/micro_allocator.h" -#include "tensorflow/lite/micro/micro_op_resolver.h" -#include "tensorflow/lite/schema/schema_generated.h" -#include "tensorflow/lite/type_to_tflitetype.h" - -namespace tflite { - -namespace internal { - -// A helper class to encapsulate the implementation of APIs in Context. -// context->impl_ points to an instance of this class. -// Check tensorflow/lite/c/common.h for detailed descriptions. -// TODO(b/16157777): Consider rolling this class into MicroInterpreter. -class ContextHelper { - public: - explicit ContextHelper(ErrorReporter* error_reporter, - MicroAllocator* allocator, const Model* model); - - // Functions that will be assigned to function pointers on TfLiteContext: - static void* AllocatePersistentBuffer(TfLiteContext* ctx, size_t bytes); - static TfLiteStatus RequestScratchBufferInArena(TfLiteContext* ctx, - size_t bytes, - int* buffer_idx); - static void* GetScratchBuffer(TfLiteContext* ctx, int buffer_idx); - static void ReportOpError(struct TfLiteContext* context, const char* format, - ...); - static TfLiteTensor* GetTensor(const struct TfLiteContext* context, - int tensor_idx); - static TfLiteEvalTensor* GetEvalTensor(const struct TfLiteContext* context, - int tensor_idx); - - // Sets the current node index to assist with scratch buffer allocations: - void SetNodeIndex(int idx); - - // Sets the pointer to a list of TfLiteEvalTensor instances. - void SetTfLiteEvalTensors(TfLiteEvalTensor* eval_tensors); - - private: - MicroAllocator* allocator_; - ErrorReporter* error_reporter_; - const Model* model_; - TfLiteEvalTensor* eval_tensors_; - int current_node_idx_ = -1; -}; - -} // namespace internal - -class MicroInterpreter { - public: - // The lifetime of the model, op resolver, tensor arena, error reporter and - // profiler must be at least as long as that of the interpreter object, since - // the interpreter may need to access them at any time. This means that you - // should usually create them with the same scope as each other, for example - // having them all allocated on the stack as local variables through a - // top-level function. The interpreter doesn't do any deallocation of any of - // the pointed-to objects, ownership remains with the caller. - MicroInterpreter(const Model* model, const MicroOpResolver& op_resolver, - uint8_t* tensor_arena, size_t tensor_arena_size, - ErrorReporter* error_reporter, - tflite::Profiler* profiler = nullptr); - - // Create an interpreter instance using an existing MicroAllocator instance. - // This constructor should be used when creating an allocator that needs to - // have allocation handled in more than one interpreter or for recording - // allocations inside the interpreter. The lifetime of the allocator must be - // as long as that of the interpreter object. - MicroInterpreter(const Model* model, const MicroOpResolver& op_resolver, - MicroAllocator* allocator, ErrorReporter* error_reporter, - tflite::Profiler* profiler = nullptr); - - ~MicroInterpreter(); - - // Runs through the model and allocates all necessary input, output and - // intermediate tensors. - TfLiteStatus AllocateTensors(); - - // In order to support partial graph runs for strided models, this can return - // values other than kTfLiteOk and kTfLiteError. - // TODO(b/149795762): Add this to the TfLiteStatus enum. - TfLiteStatus Invoke(); - - size_t tensors_size() const { return context_.tensors_size; } - TfLiteTensor* tensor(size_t tensor_index); - template - T* typed_tensor(int tensor_index) { - if (TfLiteTensor* tensor_ptr = tensor(tensor_index)) { - if (tensor_ptr->type == typeToTfLiteType()) { - return GetTensorData(tensor_ptr); - } - } - return nullptr; - } - - TfLiteTensor* input(size_t index); - size_t inputs_size() const { return subgraph_->inputs()->Length(); } - const flatbuffers::Vector& inputs() const { - return *subgraph_->inputs(); - } - TfLiteTensor* input_tensor(size_t index) { return input(index); } - template - T* typed_input_tensor(int tensor_index) { - if (TfLiteTensor* tensor_ptr = input_tensor(tensor_index)) { - if (tensor_ptr->type == typeToTfLiteType()) { - return GetTensorData(tensor_ptr); - } - } - return nullptr; - } - - TfLiteTensor* output(size_t index); - size_t outputs_size() const { return subgraph_->outputs()->Length(); } - const flatbuffers::Vector& outputs() const { - return *subgraph_->outputs(); - } - TfLiteTensor* output_tensor(size_t index) { return output(index); } - template - T* typed_output_tensor(int tensor_index) { - if (TfLiteTensor* tensor_ptr = output_tensor(tensor_index)) { - if (tensor_ptr->type == typeToTfLiteType()) { - return GetTensorData(tensor_ptr); - } - } - return nullptr; - } - - // Reset all variable tensors to the default value. - TfLiteStatus ResetVariableTensors(); - - TfLiteStatus initialization_status() const { return initialization_status_; } - - size_t operators_size() const { return subgraph_->operators()->size(); } - - // For debugging only. - const NodeAndRegistration node_and_registration(int node_index) const { - return node_and_registrations_[node_index]; - } - - // For debugging only. - // Returns the actual used arena in bytes. This method gives the optimal arena - // size. It's only available after `AllocateTensors` has been called. - // Note that normally `tensor_arena` requires 16 bytes alignment to fully - // utilize the space. If it's not the case, the optimial arena size would be - // arena_used_bytes() + 16. - size_t arena_used_bytes() const { return allocator_.used_bytes(); } - - protected: - const MicroAllocator& allocator() const { return allocator_; } - const TfLiteContext& context() const { return context_; } - - private: - // TODO(b/158263161): Consider switching to Create() function to enable better - // error reporting during initialization. - void Init(tflite::Profiler* profiler); - - void CorrectTensorEndianness(TfLiteEvalTensor* tensorCorr); - - template - void CorrectTensorDataEndianness(T* data, int32_t size); - - NodeAndRegistration* node_and_registrations_ = nullptr; - - const Model* model_; - const MicroOpResolver& op_resolver_; - ErrorReporter* error_reporter_; - TfLiteContext context_ = {}; - MicroAllocator& allocator_; - bool tensors_allocated_; - - TfLiteStatus initialization_status_; - - const SubGraph* subgraph_; - TfLiteEvalTensor* eval_tensors_; - internal::ContextHelper context_helper_; - - // TODO(b/160894903): Clean these pointers up when all APIs are updated to new - // TfLiteEvalTensor buffers. - TfLiteTensor* input_tensor_; - TfLiteTensor* output_tensor_; -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_INTERPRETER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_mutable_op_resolver.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_mutable_op_resolver.h deleted file mode 100644 index 27a66a91..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_mutable_op_resolver.h +++ /dev/null @@ -1,458 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ - -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/core/api/flatbuffer_conversions.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/kernels/op_macros.h" -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/kernels/micro_ops.h" -#include "tensorflow/lite/micro/micro_op_resolver.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -template -class MicroMutableOpResolver : public MicroOpResolver { - public: - explicit MicroMutableOpResolver(ErrorReporter* error_reporter = nullptr) - : error_reporter_(error_reporter) {} - - const TfLiteRegistration* FindOp(tflite::BuiltinOperator op) const override { - if (op == BuiltinOperator_CUSTOM) return nullptr; - - for (unsigned int i = 0; i < registrations_len_; ++i) { - const TfLiteRegistration& registration = registrations_[i]; - if (registration.builtin_code == op) { - return ®istration; - } - } - return nullptr; - } - - const TfLiteRegistration* FindOp(const char* op) const override { - for (unsigned int i = 0; i < registrations_len_; ++i) { - const TfLiteRegistration& registration = registrations_[i]; - if ((registration.builtin_code == BuiltinOperator_CUSTOM) && - (strcmp(registration.custom_name, op) == 0)) { - return ®istration; - } - } - return nullptr; - } - - MicroOpResolver::BuiltinParseFunction GetOpDataParser( - BuiltinOperator op) const override { - TFLITE_DCHECK(num_buitin_ops_ <= tOpCount); - for (unsigned int i = 0; i < num_buitin_ops_; ++i) { - if (builtin_codes_[i] == op) return builtin_parsers_[i]; - } - return nullptr; - } - - // Registers a Custom Operator with the MicroOpResolver. - // - // Only the first call for a given name will be successful. i.e. if this - // function is called again for a previously added Custom Operator, the - // MicroOpResolver will be unchanged and this function will return - // kTfLiteError. - TfLiteStatus AddCustom(const char* name, TfLiteRegistration* registration) { - if (registrations_len_ >= tOpCount) { - if (error_reporter_) { - TF_LITE_REPORT_ERROR( - error_reporter_, - "Couldn't register custom op '%s', resolver size is too small (%d)", - name, tOpCount); - } - return kTfLiteError; - } - - if (FindOp(name) != nullptr) { - if (error_reporter_ != nullptr) { - TF_LITE_REPORT_ERROR(error_reporter_, - "Calling AddCustom for the same op more than once " - "is not supported (Op: %s).", - name); - } - return kTfLiteError; - } - - TfLiteRegistration* new_registration = ®istrations_[registrations_len_]; - registrations_len_ += 1; - - *new_registration = *registration; - new_registration->builtin_code = BuiltinOperator_CUSTOM; - new_registration->custom_name = name; - return kTfLiteOk; - } - - // The Add* functions below add the various Builtin operators to the - // MicroMutableOpResolver object. - - TfLiteStatus AddAbs() { - return AddBuiltin(BuiltinOperator_ABS, tflite::ops::micro::Register_ABS(), - ParseAbs); - } - - TfLiteStatus AddAdd() { - return AddBuiltin(BuiltinOperator_ADD, tflite::ops::micro::Register_ADD(), - ParseAdd); - } - - TfLiteStatus AddArgMax() { - return AddBuiltin(BuiltinOperator_ARG_MAX, - tflite::ops::micro::Register_ARG_MAX(), ParseArgMax); - } - - TfLiteStatus AddArgMin() { - return AddBuiltin(BuiltinOperator_ARG_MIN, - tflite::ops::micro::Register_ARG_MIN(), ParseArgMin); - } - - TfLiteStatus AddAveragePool2D() { - return AddBuiltin(BuiltinOperator_AVERAGE_POOL_2D, - tflite::ops::micro::Register_AVERAGE_POOL_2D(), - ParsePool); - } - - TfLiteStatus AddCeil() { - return AddBuiltin(BuiltinOperator_CEIL, tflite::ops::micro::Register_CEIL(), - ParseCeil); - } - - TfLiteStatus AddCircularBuffer() { - return AddCustom("CIRCULAR_BUFFER", - tflite::ops::micro::Register_CIRCULAR_BUFFER()); - } - - TfLiteStatus AddConcatenation() { - return AddBuiltin(BuiltinOperator_CONCATENATION, - tflite::ops::micro::Register_CONCATENATION(), - ParseConcatenation); - } - - TfLiteStatus AddConv2D() { - return AddBuiltin(BuiltinOperator_CONV_2D, - tflite::ops::micro::Register_CONV_2D(), ParseConv2D); - } - - TfLiteStatus AddCos() { - return AddBuiltin(BuiltinOperator_COS, tflite::ops::micro::Register_COS(), - ParseCos); - } - - TfLiteStatus AddDepthwiseConv2D() { - return AddBuiltin(BuiltinOperator_DEPTHWISE_CONV_2D, - tflite::ops::micro::Register_DEPTHWISE_CONV_2D(), - ParseDepthwiseConv2D); - } - - TfLiteStatus AddDequantize() { - return AddBuiltin(BuiltinOperator_DEQUANTIZE, - tflite::ops::micro::Register_DEQUANTIZE(), - ParseDequantize); - } - - TfLiteStatus AddEqual() { - return AddBuiltin(BuiltinOperator_EQUAL, - tflite::ops::micro::Register_EQUAL(), ParseEqual); - } - - TfLiteStatus AddFloor() { - return AddBuiltin(BuiltinOperator_FLOOR, - tflite::ops::micro::Register_FLOOR(), ParseFloor); - } - - TfLiteStatus AddFullyConnected() { - return AddBuiltin(BuiltinOperator_FULLY_CONNECTED, - tflite::ops::micro::Register_FULLY_CONNECTED(), - ParseFullyConnected); - } - - TfLiteStatus AddGreater() { - return AddBuiltin(BuiltinOperator_GREATER, - tflite::ops::micro::Register_GREATER(), ParseGreater); - } - - TfLiteStatus AddGreaterEqual() { - return AddBuiltin(BuiltinOperator_GREATER_EQUAL, - tflite::ops::micro::Register_GREATER_EQUAL(), - ParseGreaterEqual); - } - - TfLiteStatus AddHardSwish() { - return AddBuiltin(BuiltinOperator_HARD_SWISH, - tflite::ops::micro::Register_HARD_SWISH(), - ParseHardSwish); - } - - TfLiteStatus AddL2Normalization() { - return AddBuiltin(BuiltinOperator_L2_NORMALIZATION, - tflite::ops::micro::Register_L2_NORMALIZATION(), - ParseL2Normalization); - } - - TfLiteStatus AddLess() { - return AddBuiltin(BuiltinOperator_LESS, tflite::ops::micro::Register_LESS(), - ParseLess); - } - - TfLiteStatus AddLessEqual() { - return AddBuiltin(BuiltinOperator_LESS_EQUAL, - tflite::ops::micro::Register_LESS_EQUAL(), - ParseLessEqual); - } - - TfLiteStatus AddLog() { - return AddBuiltin(BuiltinOperator_LOG, tflite::ops::micro::Register_LOG(), - ParseLog); - } - - TfLiteStatus AddLogicalAnd() { - return AddBuiltin(BuiltinOperator_LOGICAL_AND, - tflite::ops::micro::Register_LOGICAL_AND(), - ParseLogicalAnd); - } - - TfLiteStatus AddLogicalNot() { - return AddBuiltin(BuiltinOperator_LOGICAL_NOT, - tflite::ops::micro::Register_LOGICAL_NOT(), - ParseLogicalNot); - } - - TfLiteStatus AddLogicalOr() { - return AddBuiltin(BuiltinOperator_LOGICAL_OR, - tflite::ops::micro::Register_LOGICAL_OR(), - ParseLogicalOr); - } - - TfLiteStatus AddLogistic() { - return AddBuiltin(BuiltinOperator_LOGISTIC, - tflite::ops::micro::Register_LOGISTIC(), ParseLogistic); - } - - TfLiteStatus AddMaximum() { - return AddBuiltin(BuiltinOperator_MAXIMUM, - tflite::ops::micro::Register_MAXIMUM(), ParseMaximum); - } - - TfLiteStatus AddMaxPool2D() { - return AddBuiltin(BuiltinOperator_MAX_POOL_2D, - tflite::ops::micro::Register_MAX_POOL_2D(), ParsePool); - } - - TfLiteStatus AddMean() { - return AddBuiltin(BuiltinOperator_MEAN, tflite::ops::micro::Register_MEAN(), - ParseReducer); - } - - TfLiteStatus AddMinimum() { - return AddBuiltin(BuiltinOperator_MINIMUM, - tflite::ops::micro::Register_MINIMUM(), ParseMinimum); - } - - TfLiteStatus AddMul() { - return AddBuiltin(BuiltinOperator_MUL, tflite::ops::micro::Register_MUL(), - ParseMul); - } - - TfLiteStatus AddNeg() { - return AddBuiltin(BuiltinOperator_NEG, tflite::ops::micro::Register_NEG(), - ParseNeg); - } - - TfLiteStatus AddNotEqual() { - return AddBuiltin(BuiltinOperator_NOT_EQUAL, - tflite::ops::micro::Register_NOT_EQUAL(), ParseNotEqual); - } - - TfLiteStatus AddPack() { - return AddBuiltin(BuiltinOperator_PACK, tflite::ops::micro::Register_PACK(), - ParsePack); - } - - TfLiteStatus AddPad() { - return AddBuiltin(BuiltinOperator_PAD, tflite::ops::micro::Register_PAD(), - ParsePad); - } - - TfLiteStatus AddPadV2() { - return AddBuiltin(BuiltinOperator_PADV2, - tflite::ops::micro::Register_PADV2(), ParsePadV2); - } - - TfLiteStatus AddPrelu() { - return AddBuiltin(BuiltinOperator_PRELU, - tflite::ops::micro::Register_PRELU(), ParsePrelu); - } - - TfLiteStatus AddQuantize() { - return AddBuiltin(BuiltinOperator_QUANTIZE, - tflite::ops::micro::Register_QUANTIZE(), ParseQuantize); - } - - TfLiteStatus AddRelu() { - return AddBuiltin(BuiltinOperator_RELU, tflite::ops::micro::Register_RELU(), - ParseRelu); - } - - TfLiteStatus AddRelu6() { - return AddBuiltin(BuiltinOperator_RELU6, - tflite::ops::micro::Register_RELU6(), ParseRelu6); - } - - TfLiteStatus AddReshape() { - return AddBuiltin(BuiltinOperator_RESHAPE, - tflite::ops::micro::Register_RESHAPE(), ParseReshape); - } - - TfLiteStatus AddResizeNearestNeighbor() { - return AddBuiltin(BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, - tflite::ops::micro::Register_RESIZE_NEAREST_NEIGHBOR(), - ParseResizeNearestNeighbor); - } - - TfLiteStatus AddRound() { - return AddBuiltin(BuiltinOperator_ROUND, - tflite::ops::micro::Register_ROUND(), ParseRound); - } - - TfLiteStatus AddRsqrt() { - return AddBuiltin(BuiltinOperator_RSQRT, - tflite::ops::micro::Register_RSQRT(), ParseRsqrt); - } - - TfLiteStatus AddSin() { - return AddBuiltin(BuiltinOperator_SIN, tflite::ops::micro::Register_SIN(), - ParseSin); - } - - TfLiteStatus AddSoftmax() { - return AddBuiltin(BuiltinOperator_SOFTMAX, - tflite::ops::micro::Register_SOFTMAX(), ParseSoftmax); - } - - TfLiteStatus AddSplit() { - return AddBuiltin(BuiltinOperator_SPLIT, - tflite::ops::micro::Register_SPLIT(), ParseSplit); - } - - TfLiteStatus AddSqrt() { - return AddBuiltin(BuiltinOperator_SQRT, tflite::ops::micro::Register_SQRT(), - ParseSqrt); - } - - TfLiteStatus AddSquare() { - return AddBuiltin(BuiltinOperator_SQUARE, - tflite::ops::micro::Register_SQUARE(), ParseSquare); - } - - TfLiteStatus AddStridedSlice() { - return AddBuiltin(BuiltinOperator_STRIDED_SLICE, - tflite::ops::micro::Register_STRIDED_SLICE(), - ParseStridedSlice); - } - - TfLiteStatus AddSub() { - return AddBuiltin(BuiltinOperator_SUB, tflite::ops::micro::Register_SUB(), - ParseSub); - } - - TfLiteStatus AddSvdf() { - return AddBuiltin(BuiltinOperator_SVDF, tflite::ops::micro::Register_SVDF(), - ParseSvdf); - } - - TfLiteStatus AddTanh() { - return AddBuiltin(BuiltinOperator_TANH, tflite::ops::micro::Register_TANH(), - ParseTanh); - } - - TfLiteStatus AddUnpack() { - return AddBuiltin(BuiltinOperator_UNPACK, - tflite::ops::micro::Register_UNPACK(), ParseUnpack); - } - - unsigned int GetRegistrationLength() { return registrations_len_; } - - private: - TfLiteStatus AddBuiltin(tflite::BuiltinOperator op, - const TfLiteRegistration& registration, - MicroOpResolver::BuiltinParseFunction parser) { - if (op == BuiltinOperator_CUSTOM) { - if (error_reporter_ != nullptr) { - TF_LITE_REPORT_ERROR(error_reporter_, - "Invalid parameter BuiltinOperator_CUSTOM to the " - "AddBuiltin function."); - } - return kTfLiteError; - } - - if (FindOp(op) != nullptr) { - if (error_reporter_ != nullptr) { - TF_LITE_REPORT_ERROR(error_reporter_, - "Calling AddBuiltin with the same op more than " - "once is not supported (Op: #%d).", - op); - } - return kTfLiteError; - } - - if (registrations_len_ >= tOpCount) { - if (error_reporter_) { - TF_LITE_REPORT_ERROR(error_reporter_, - "Couldn't register builtin op #%d, resolver size " - "is too small (%d).", - op, tOpCount); - } - return kTfLiteError; - } - - registrations_[registrations_len_] = registration; - // Strictly speaking, the builtin_code is not necessary for TFLM but filling - // it in regardless. - registrations_[registrations_len_].builtin_code = op; - registrations_len_++; - - builtin_codes_[num_buitin_ops_] = op; - builtin_parsers_[num_buitin_ops_] = parser; - num_buitin_ops_++; - - return kTfLiteOk; - } - - TfLiteRegistration registrations_[tOpCount]; - unsigned int registrations_len_ = 0; - - // Arrays (and counter) to store the builtin codes and their corresponding - // parse functions as these are registered with the Op Resolver. - BuiltinOperator builtin_codes_[tOpCount]; - MicroOpResolver::BuiltinParseFunction builtin_parsers_[tOpCount]; - unsigned int num_buitin_ops_ = 0; - - ErrorReporter* error_reporter_; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -}; // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_MUTABLE_OP_RESOLVER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_op_resolver.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_op_resolver.h deleted file mode 100644 index 757b6b89..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_op_resolver.h +++ /dev/null @@ -1,73 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/core/api/flatbuffer_conversions.h" -#include "tensorflow/lite/core/api/op_resolver.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { - -// This is an interface for the OpResolver for TFLiteMicro. The differences from -// the TFLite OpResolver base class are to: -// * explicitly remove support for Op versions -// * allow for finer grained registration of the Builtin Ops to reduce code -// size for TFLiteMicro. -// -// We need an interface class instead of directly using MicroMutableOpResolver -// because MicroMutableOpResolver is a class template with the number of -// registered Ops as the template parameter. -class MicroOpResolver : public OpResolver { - public: - typedef TfLiteStatus (*BuiltinParseFunction)(const Operator* op, - ErrorReporter* error_reporter, - BuiltinDataAllocator* allocator, - void** builtin_data); - - // Returns the Op registration struct corresponding to the enum code from the - // flatbuffer schema. Returns nullptr if the op is not found or if op == - // BuiltinOperator_CUSTOM. - virtual const TfLiteRegistration* FindOp(BuiltinOperator op) const = 0; - - // Returns the Op registration struct corresponding to the custom operator by - // name. - virtual const TfLiteRegistration* FindOp(const char* op) const = 0; - - // This implementation exists for compatibility with the OpResolver base class - // and disregards the version parameter. - const TfLiteRegistration* FindOp(BuiltinOperator op, - int version) const final { - return FindOp(op); - } - - // This implementation exists for compatibility with the OpResolver base class - // and disregards the version parameter. - const TfLiteRegistration* FindOp(const char* op, int version) const final { - return FindOp(op); - } - - // Returns the operator specific parsing function for the OpData for a - // BuiltinOperator (if registered), else nullptr. - virtual BuiltinParseFunction GetOpDataParser(BuiltinOperator op) const = 0; - - ~MicroOpResolver() override {} -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_OP_RESOLVER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_optional_debug_tools.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_optional_debug_tools.h deleted file mode 100644 index cc9630e6..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_optional_debug_tools.h +++ /dev/null @@ -1,30 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -// Optional debugging functionality. For small sized binaries, these are not -// needed. -#ifndef TENSORFLOW_LITE_MICRO_MICRO_OPTIONAL_DEBUG_TOOLS_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_OPTIONAL_DEBUG_TOOLS_H_ - -#include "tensorflow/lite/micro/micro_interpreter.h" - -namespace tflite { -// Helper function to print model flatbuffer data. This function is not called -// by default. Hence it's not linked in to the final binary code. -void PrintModelData(const Model* model, ErrorReporter* error_reporter); -// Prints a dump of what tensors and what nodes are in the interpreter. -void PrintInterpreterState(MicroInterpreter* interpreter); -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_OPTIONAL_DEBUG_TOOLS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_profiler.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_profiler.h deleted file mode 100644 index a3144b3a..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_profiler.h +++ /dev/null @@ -1,71 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ - -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/core/api/profiler.h" -#include "tensorflow/lite/micro/compatibility.h" - -namespace tflite { - -// MicroProfiler creates a common way to gain fine-grained insight into runtime -// performance. Bottleck operators can be identified along with slow code -// sections. This can be used in conjunction with running the relevant micro -// benchmark to evaluate end-to-end performance. -// -// Usage example: -// MicroProfiler profiler(error_reporter); -// { -// ScopedProfile scoped_profile(profiler, tag); -// work_to_profile(); -// } -// -// This will call the following methods in order: -// int event_handle = profiler->BeginEvent(op_name, EventType::DEFAULT, 0) -// work_to_profile(); -// profiler->EndEvent(event_handle) -class MicroProfiler : public tflite::Profiler { - public: - explicit MicroProfiler(tflite::ErrorReporter* reporter); - ~MicroProfiler() override = default; - - // AddEvent is unused for Tf Micro. - void AddEvent(const char* tag, EventType event_type, uint64_t start, - uint64_t end, int64_t event_metadata1, - int64_t event_metadata2) override{}; - - // BeginEvent followed by code followed by EndEvent will profile the code - // enclosed. Multiple concurrent events are unsupported, so the return value - // is always 0. Event_metadata1 and event_metadata2 are unused. The tag - // pointer must be valid until EndEvent is called. - uint32_t BeginEvent(const char* tag, EventType event_type, - int64_t event_metadata1, - int64_t event_metadata2) override; - - // Event_handle is ignored since TF Micro does not support concurrent events. - void EndEvent(uint32_t event_handle) override; - - private: - tflite::ErrorReporter* reporter_; - int32_t start_time_; - const char* event_tag_; - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_PROFILER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_string.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_string.h deleted file mode 100644 index 59303e82..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_string.h +++ /dev/null @@ -1,33 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ - -#include - -// Implements simple string formatting for numeric types. Returns the number of -// bytes written to output. -extern "C" { -// Functionally equivalent to vsnprintf, trimmed down for TFLite Micro. -// MicroSnprintf() is implemented using MicroVsnprintf(). -int MicroVsnprintf(char* output, int len, const char* format, va_list args); -// Functionally equavalent to snprintf, trimmed down for TFLite Micro. -// For example, MicroSnprintf(buffer, 10, "int %d", 10) will put the string -// "int 10" in the buffer. -// Floating point values are logged in exponent notation (1.XXX*2^N). -int MicroSnprintf(char* output, int len, const char* format, ...); -} - -#endif // TENSORFLOW_LITE_MICRO_MICRO_STRING_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_time.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_time.h deleted file mode 100644 index 465490a8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_time.h +++ /dev/null @@ -1,31 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ - -#include - -namespace tflite { - -// These functions should be implemented by each target platform, and provide an -// accurate tick count along with how many ticks there are per second. -int32_t ticks_per_second(); - -// Return time in ticks. The meaning of a tick varies per platform. -int32_t GetCurrentTimeTicks(); - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_TIME_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_utils.h deleted file mode 100644 index 24aebad8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/micro_utils.h +++ /dev/null @@ -1,110 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ -#define TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ - -#include - -#include "tensorflow/lite/c/common.h" - -namespace tflite { - -// Returns number of elements in the shape array. - -int ElementCount(const TfLiteIntArray& dims); - -uint8_t FloatToAsymmetricQuantizedUInt8(const float value, const float scale, - const int zero_point); - -uint8_t FloatToSymmetricQuantizedUInt8(const float value, const float scale); - -int8_t FloatToAsymmetricQuantizedInt8(const float value, const float scale, - const int zero_point); - -int16_t FloatToAsymmetricQuantizedInt16(const float value, const float scale, - const int zero_point); - -int8_t FloatToSymmetricQuantizedInt8(const float value, const float scale); - -// Converts a float value into a signed thirty-two-bit quantized value. Note -// that values close to max int and min int may see significant error due to -// a lack of floating point granularity for large values. -int32_t FloatToSymmetricQuantizedInt32(const float value, const float scale); - -// Helper methods to quantize arrays of floats to the desired format. -// -// There are several key flavors of quantization in TfLite: -// asymmetric symmetric per channel -// int8_t | X | X | X | -// uint8_t | X | X | | -// int16_t | X | | | -// int32_t | | X | X | -// -// The per-op quantization spec can be found here: -// https://www.tensorflow.org/lite/performance/quantization_spec - -void AsymmetricQuantize(const float* input, int8_t* output, int num_elements, - float scale, int zero_point = 0); - -void AsymmetricQuantize(const float* input, uint8_t* output, int num_elements, - float scale, int zero_point = 128); - -void AsymmetricQuantize(const float* input, int16_t* output, int num_elements, - float scale, int zero_point = 0); - -void SymmetricQuantize(const float* input, int32_t* output, int num_elements, - float scale); - -void SymmetricPerChannelQuantize(const float* input, int32_t* output, - int num_elements, int num_channels, - float* scales); - -void SignedSymmetricPerChannelQuantize(const float* values, - TfLiteIntArray* dims, - int quantized_dimension, - int8_t* quantized_values, - float* scaling_factor); - -void SignedSymmetricQuantize(const float* values, TfLiteIntArray* dims, - int8_t* quantized_values, float* scaling_factor); - -void SignedSymmetricQuantize(const float* values, TfLiteIntArray* dims, - int16_t* quantized_values, float* scaling_factor); - -void SignedSymmetricQuantize(const float* values, TfLiteIntArray* dims, - int32_t* quantized_values, float* scaling_factor); - -void SymmetricQuantize(const float* values, TfLiteIntArray* dims, - uint8_t* quantized_values, float* scaling_factor); - -void SymmetricDequantize(const int8_t* values, const int size, - const float dequantization_scale, - float* dequantized_values); - -template -void AsymmetricDequantize(const T* values, const int size, - const float dequantization_scale, - int dequantization_zero_point, - float* dequantized_values) { - for (int i = 0; i < size; ++i) { - dequantized_values[i] = - (values[i] - dequantization_zero_point) * dequantization_scale; - } -} - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_MICRO_UTILS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_allocator.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_allocator.h deleted file mode 100644 index 9243fec1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_allocator.h +++ /dev/null @@ -1,120 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ -#define TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ - -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/micro_allocator.h" -#include "tensorflow/lite/micro/recording_simple_memory_allocator.h" - -namespace tflite { - -// List of buckets currently recorded by this class. Each type keeps a list of -// allocated information during model initialization. -enum class RecordedAllocationType { - kTfLiteEvalTensorData, - kPersistentTfLiteTensorData, - kPersistentTfLiteTensorQuantizationData, - kTfLiteTensorVariableBufferData, - kNodeAndRegistrationArray, - kOpData, -}; - -// Container for holding information about allocation recordings by a given -// type. Each recording contains the number of bytes requested, the actual bytes -// allocated (can defer from requested by alignment), and the number of items -// allocated. -struct RecordedAllocation { - size_t requested_bytes; - size_t used_bytes; - size_t count; -}; - -// Utility subclass of MicroAllocator that records all allocations -// inside the arena. A summary of allocations can be logged through the -// ErrorReporter by invoking LogAllocations(). This special allocator requires -// an instance of RecordingSimpleMemoryAllocator to capture allocations in the -// head and tail. Arena allocation recording can be retrieved by type through -// the GetRecordedAllocation() function. This class should only be used for -// auditing memory usage or integration testing. -class RecordingMicroAllocator : public MicroAllocator { - public: - static RecordingMicroAllocator* Create(uint8_t* tensor_arena, - size_t arena_size, - ErrorReporter* error_reporter); - - // Returns the recorded allocations information for a given allocation type. - RecordedAllocation GetRecordedAllocation( - RecordedAllocationType allocation_type) const; - - const RecordingSimpleMemoryAllocator* GetSimpleMemoryAllocator() const; - - // Logs out through the ErrorReporter all allocation recordings by type - // defined in RecordedAllocationType. - void PrintAllocations() const; - - protected: - TfLiteStatus AllocateNodeAndRegistrations( - const Model* model, - NodeAndRegistration** node_and_registrations) override; - TfLiteStatus PrepareNodeAndRegistrationDataFromFlatbuffer( - const Model* model, const MicroOpResolver& op_resolver, - NodeAndRegistration* node_and_registrations) override; - TfLiteStatus AllocateTfLiteEvalTensors( - const Model* model, TfLiteEvalTensor** eval_tensors) override; - TfLiteStatus AllocateVariables(const SubGraph* subgraph, - TfLiteEvalTensor* eval_tensors) override; - // TODO(b/160894903): Once all kernels have been updated to the new API drop - // this method. It is only used to record TfLiteTensor persistent allocations. - TfLiteTensor* AllocatePersistentTfLiteTensorInternal( - const Model* model, TfLiteEvalTensor* eval_tensors, - int tensor_index) override; - // TODO(b/160894903): Once all kernels have been updated to the new API drop - // this function since all allocations for quantized data will take place in - // the temp section. - TfLiteStatus PopulateTfLiteTensorFromFlatbuffer(const Model* model, - const SubGraph* subgraph, - TfLiteTensor* tensor, - int tensor_index, - bool allocate_temp) override; - - private: - RecordingMicroAllocator(RecordingSimpleMemoryAllocator* memory_allocator, - ErrorReporter* error_reporter); - - void PrintRecordedAllocation(RecordedAllocationType allocation_type, - const char* allocation_name, - const char* allocation_description) const; - - RecordedAllocation SnapshotAllocationUsage() const; - void RecordAllocationUsage(const RecordedAllocation& snapshotted_allocation, - RecordedAllocation& recorded_allocation); - - const RecordingSimpleMemoryAllocator* recording_memory_allocator_; - - RecordedAllocation recorded_tflite_eval_tensor_data_ = {}; - RecordedAllocation recorded_persistent_tflite_tensor_data_ = {}; - RecordedAllocation recorded_persistent_tflite_tensor_quantization_data_ = {}; - RecordedAllocation recorded_tflite_tensor_variable_buffer_data_ = {}; - RecordedAllocation recorded_node_and_registration_array_data_ = {}; - RecordedAllocation recorded_op_data_ = {}; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_RECORDING_MICRO_ALLOCATOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_interpreter.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_interpreter.h deleted file mode 100644 index 0a579b0b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_micro_interpreter.h +++ /dev/null @@ -1,65 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ -#define TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ - -#include "tensorflow/lite/micro/micro_interpreter.h" -#include "tensorflow/lite/micro/recording_micro_allocator.h" - -namespace tflite { - -// Utility subclass that enables internal recordings of the MicroInterpreter. -// This class should be used to audit and analyze memory arena usage for a given -// model and interpreter. -// -// After construction and the first Invoke() or AllocateTensors() call - the -// memory usage is recorded and available through the GetMicroAllocator() -// function. See RecordingMicroAlloctor for more details on what is currently -// recorded from arena allocations. -// -// It is recommended for users to increase the tensor arena size by at least 1kb -// to ensure enough additional memory is available for internal recordings. -class RecordingMicroInterpreter : public MicroInterpreter { - public: - RecordingMicroInterpreter(const Model* model, - const MicroOpResolver& op_resolver, - uint8_t* tensor_arena, size_t tensor_arena_size, - ErrorReporter* error_reporter) - : MicroInterpreter(model, op_resolver, - RecordingMicroAllocator::Create( - tensor_arena, tensor_arena_size, error_reporter), - error_reporter), - recording_micro_allocator_( - static_cast(allocator())) {} - - RecordingMicroInterpreter(const Model* model, - const MicroOpResolver& op_resolver, - RecordingMicroAllocator* allocator, - ErrorReporter* error_reporter) - : MicroInterpreter(model, op_resolver, allocator, error_reporter), - recording_micro_allocator_(*allocator) {} - - const RecordingMicroAllocator& GetMicroAllocator() const { - return recording_micro_allocator_; - } - - private: - const RecordingMicroAllocator& recording_micro_allocator_; -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_RECORDING_MICRO_INTERPRETER_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_simple_memory_allocator.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_simple_memory_allocator.h deleted file mode 100644 index 8d3e9fb4..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/recording_simple_memory_allocator.h +++ /dev/null @@ -1,64 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ -#define TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ - -#include "tensorflow/lite/micro/compatibility.h" -#include "tensorflow/lite/micro/simple_memory_allocator.h" - -namespace tflite { - -// Utility class used to log allocations of a SimpleMemoryAllocator. Should only -// be used in debug/evaluation settings or unit tests to evaluate allocation -// usage. -class RecordingSimpleMemoryAllocator : public SimpleMemoryAllocator { - public: - RecordingSimpleMemoryAllocator(ErrorReporter* error_reporter, - uint8_t* buffer_head, size_t buffer_size); - // TODO(b/157615197): Cleanup constructors/destructor and use factory - // functions. - ~RecordingSimpleMemoryAllocator() override; - - static RecordingSimpleMemoryAllocator* Create(ErrorReporter* error_reporter, - uint8_t* buffer_head, - size_t buffer_size); - - // Returns the number of bytes requested from the head or tail. - size_t GetRequestedBytes() const; - - // Returns the number of bytes actually allocated from the head or tail. This - // value will be >= to the number of requested bytes due to padding and - // alignment. - size_t GetUsedBytes() const; - - // Returns the number of alloc calls from the head or tail. - size_t GetAllocatedCount() const; - - TfLiteStatus EnsureHeadSize(size_t size, size_t alignment) override; - uint8_t* AllocateFromTail(size_t size, size_t alignment) override; - - private: - size_t requested_head_bytes_; - size_t requested_tail_bytes_; - size_t used_bytes_; - size_t alloc_count_; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_RECORDING_SIMPLE_MEMORY_ALLOCATOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/simple_memory_allocator.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/simple_memory_allocator.h deleted file mode 100644 index 8c216f47..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/simple_memory_allocator.h +++ /dev/null @@ -1,99 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ -#define TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ - -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/error_reporter.h" -#include "tensorflow/lite/micro/compatibility.h" - -namespace tflite { - -// TODO(petewarden): This allocator never frees up or reuses any memory, even -// though we have enough information about lifetimes of the tensors to do so. -// This makes it pretty wasteful, so we should use a more intelligent method. -class SimpleMemoryAllocator { - public: - // TODO(b/157615197): Cleanup constructors/destructor and use factory - // functions. - SimpleMemoryAllocator(ErrorReporter* error_reporter, uint8_t* buffer_head, - uint8_t* buffer_tail); - SimpleMemoryAllocator(ErrorReporter* error_reporter, uint8_t* buffer, - size_t buffer_size); - virtual ~SimpleMemoryAllocator(); - - // Creates a new SimpleMemoryAllocator from a given buffer head and size. - static SimpleMemoryAllocator* Create(ErrorReporter* error_reporter, - uint8_t* buffer_head, - size_t buffer_size); - - // Ensure that the head (lowest address and moving upwards) memory allocation - // is at least a given size. This function will only increase the head size if - // the passed in value is larger than the current head size. Calls to this - // method will also invalidate all temporary allocation values. This call will - // fail if a chain of allocations through AllocateTemp() have not been cleaned - // up with a call to ResetTempAllocations(). - virtual TfLiteStatus EnsureHeadSize(size_t size, size_t alignment); - - // Allocates memory starting at the tail of the arena (highest address and - // moving downwards). - virtual uint8_t* AllocateFromTail(size_t size, size_t alignment); - - // Allocates a temporary buffer from the head of the arena (lowest address and - // moving upwards) but does not update the actual head allocation size or - // position. The returned buffer is guaranteed until either - // ResetTempAllocations() is called or another call to AllocateFromHead(). - // Repeat calls to this function will create a chain of temp allocations. All - // calls to AllocateTemp() must end with a call to ResetTempAllocations(). If - // AllocateFromHead() is called before a call to ResetTempAllocations(), it - // will fail with an error message. - virtual uint8_t* AllocateTemp(size_t size, size_t alignment); - - // Resets a chain of temporary allocations back to the current head of the - // arena (lowest address). - virtual void ResetTempAllocations(); - - uint8_t* GetHead() const; - uint8_t* GetBufferHead() const; - uint8_t* GetTail() const; - - size_t GetHeadUsedBytes() const; - size_t GetTailUsedBytes() const; - - // Returns the number of bytes available with a given alignment. - size_t GetAvailableMemory(size_t alignment) const; - - size_t GetUsedBytes() const; - - private: - size_t GetBufferSize() const; - - ErrorReporter* error_reporter_; - uint8_t* buffer_head_; - uint8_t* buffer_tail_; - uint8_t* head_; - uint8_t* tail_; - uint8_t* temp_; - - TF_LITE_REMOVE_VIRTUAL_DELETE -}; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_SIMPLE_MEMORY_ALLOCATOR_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/test_helpers.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/test_helpers.h deleted file mode 100644 index a7897145..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/test_helpers.h +++ /dev/null @@ -1,186 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ -#define TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ - -// Useful functions for writing tests. - -#include - -#include "flatbuffers/flatbuffers.h" // from @flatbuffers -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/kernels/internal/compatibility.h" -#include "tensorflow/lite/micro/all_ops_resolver.h" -#include "tensorflow/lite/micro/micro_utils.h" -#include "tensorflow/lite/schema/schema_generated.h" - -namespace tflite { -namespace testing { - -constexpr int kOfflinePlannerHeaderSize = 3; - -struct NodeConnection_ { - std::initializer_list input; - std::initializer_list output; -}; -typedef struct NodeConnection_ NodeConnection; - -// A simple operator that returns the median of the input with the number of -// times the kernel was invoked. The implementation below is deliberately -// complicated, just to demonstrate how kernel memory planning works. -class SimpleStatefulOp { - static constexpr int kBufferNotAllocated = 0; - // Inputs: - static constexpr int kInputTensor = 0; - // Outputs: - static constexpr int kMedianTensor = 0; - static constexpr int kInvokeCount = 1; - struct OpData { - int invoke_count = 0; - int sorting_buffer = kBufferNotAllocated; - }; - - public: - static const TfLiteRegistration* getRegistration(); - static TfLiteRegistration* GetMutableRegistration(); - static void* Init(TfLiteContext* context, const char* buffer, size_t length); - static TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node); - static TfLiteStatus Invoke(TfLiteContext* context, TfLiteNode* node); -}; - -class MockCustom { - public: - static const TfLiteRegistration* getRegistration(); - static TfLiteRegistration* GetMutableRegistration(); - static void* Init(TfLiteContext* context, const char* buffer, size_t length); - static void Free(TfLiteContext* context, void* buffer); - static TfLiteStatus Prepare(TfLiteContext* context, TfLiteNode* node); - static TfLiteStatus Invoke(TfLiteContext* context, TfLiteNode* node); - - static bool freed_; -}; - -// Returns an Op Resolver that can be used in the testing code. -AllOpsResolver GetOpResolver(); - -// Returns a simple example flatbuffer TensorFlow Lite model. Contains 1 input, -// 1 layer of weights, 1 output Tensor, and 1 operator. -const Model* GetSimpleMockModel(); - -// Returns a flatbuffer TensorFlow Lite model with more inputs, variable -// tensors, and operators. -const Model* GetComplexMockModel(); - -// Returns a simple flatbuffer model with two branches. -const Model* GetSimpleModelWithBranch(); - -// Returns a simple flatbuffer model with offline planned tensors -const Model* GetModelWithOfflinePlanning(int num_tensors, - const int32_t* metadata_buffer, - NodeConnection* node_conn, - int num_conns); - -// Returns a flatbuffer model with `simple_stateful_op` -const Model* GetSimpleStatefulModel(); - -// Builds a one-dimensional flatbuffer tensor of the given size. -const Tensor* Create1dFlatbufferTensor(int size, bool is_variable = false); - -// Builds a one-dimensional flatbuffer tensor of the given size with -// quantization metadata. -const Tensor* CreateQuantizedFlatbufferTensor(int size); - -// Creates a one-dimensional tensor with no quantization metadata. -const Tensor* CreateMissingQuantizationFlatbufferTensor(int size); - -// Creates a vector of flatbuffer buffers. -const flatbuffers::Vector>* -CreateFlatbufferBuffers(); - -// Performs a simple string comparison without requiring standard C library. -int TestStrcmp(const char* a, const char* b); - -// Wrapper to forward kernel errors to the interpreter's error reporter. -void ReportOpError(struct TfLiteContext* context, const char* format, ...); - -void PopulateContext(TfLiteTensor* tensors, int tensors_size, - TfLiteContext* context); - -// Create a TfLiteIntArray from an array of ints. The first element in the -// supplied array must be the size of the array expressed as an int. -TfLiteIntArray* IntArrayFromInts(const int* int_array); - -// Create a TfLiteFloatArray from an array of floats. The first element in the -// supplied array must be the size of the array expressed as a float. -TfLiteFloatArray* FloatArrayFromFloats(const float* floats); - -TfLiteTensor CreateFloatTensor(const float* data, TfLiteIntArray* dims, - bool is_variable = false); - -void PopulateFloatTensor(TfLiteTensor* tensor, float* begin, float* end); - -TfLiteTensor CreateBoolTensor(const bool* data, TfLiteIntArray* dims, - bool is_variable = false); - -TfLiteTensor CreateInt32Tensor(const int32_t*, TfLiteIntArray* dims, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(const uint8_t* data, TfLiteIntArray* dims, - float scale, int zero_point, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(const int8_t* data, TfLiteIntArray* dims, - float scale, int zero_point, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(const int16_t* data, TfLiteIntArray* dims, - float scale, int zero_point, - bool is_variable = false); - -template -TfLiteTensor CreateQuantizedTensor(const float* input, T* quantized, - TfLiteIntArray* dims, float scale, - int zero_point, bool is_variable = false) { - int input_size = ElementCount(*dims); - tflite::AsymmetricQuantize(input, quantized, input_size, scale, zero_point); - return CreateQuantizedTensor(quantized, dims, scale, zero_point, is_variable); -} - -TfLiteTensor CreateQuantizedBiasTensor(const float* data, int32_t* quantized, - TfLiteIntArray* dims, float input_scale, - float weights_scale, - bool is_variable = false); - -// Quantizes int32_t bias tensor with per-channel weights determined by input -// scale multiplied by weight scale for each channel. -TfLiteTensor CreatePerChannelQuantizedBiasTensor( - const float* input, int32_t* quantized, TfLiteIntArray* dims, - float input_scale, float* weight_scales, float* scales, int* zero_points, - TfLiteAffineQuantization* affine_quant, int quantized_dimension, - bool is_variable = false); - -TfLiteTensor CreateSymmetricPerChannelQuantizedTensor( - const float* input, int8_t* quantized, TfLiteIntArray* dims, float* scales, - int* zero_points, TfLiteAffineQuantization* affine_quant, - int quantized_dimension, bool is_variable = false); - -// Returns the number of tensors in the default subgraph for a tflite::Model. -size_t GetModelTensorCount(const Model* model); - -} // namespace testing -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_TEST_HELPERS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/micro_test.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/micro_test.h deleted file mode 100644 index 0b523f34..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/micro_test.h +++ /dev/null @@ -1,241 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -// An ultra-lightweight testing framework designed for use with microcontroller -// applications. Its only dependency is on TensorFlow Lite's ErrorReporter -// interface, where log messages are output. This is designed to be usable even -// when no standard C or C++ libraries are available, and without any dynamic -// memory allocation or reliance on global constructors. -// -// To build a test, you use syntax similar to gunit, but with some extra -// decoration to create a hidden 'main' function containing each of the tests to -// be run. Your code should look something like: -// ---------------------------------------------------------------------------- -// #include "path/to/this/header" -// -// TF_LITE_MICRO_TESTS_BEGIN -// -// TF_LITE_MICRO_TEST(SomeTest) { -// TF_LITE_LOG_EXPECT_EQ(true, true); -// } -// -// TF_LITE_MICRO_TESTS_END -// ---------------------------------------------------------------------------- -// If you compile this for your platform, you'll get a normal binary that you -// should be able to run. Executing it will output logging information like this -// to stderr (or whatever equivalent is available and written to by -// ErrorReporter): -// ---------------------------------------------------------------------------- -// Testing SomeTest -// 1/1 tests passed -// ~~~ALL TESTS PASSED~~~ -// ---------------------------------------------------------------------------- -// This is designed to be human-readable, so you can just run tests manually, -// but the string "~~~ALL TESTS PASSED~~~" should only appear if all of the -// tests do pass. This makes it possible to integrate with automated test -// systems by scanning the output logs and looking for that magic value. -// -// This framework is intended to be a rudimentary alternative to no testing at -// all on systems that struggle to run more conventional approaches, so use with -// caution! - -#ifndef TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ -#define TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/micro/micro_error_reporter.h" - -namespace micro_test { -extern int tests_passed; -extern int tests_failed; -extern bool is_test_complete; -extern bool did_test_fail; -extern tflite::ErrorReporter* reporter; -} // namespace micro_test - -#define TF_LITE_MICRO_TESTS_BEGIN \ - namespace micro_test { \ - int tests_passed; \ - int tests_failed; \ - bool is_test_complete; \ - bool did_test_fail; \ - tflite::ErrorReporter* reporter; \ - } \ - \ - int main(void) { \ - micro_test::tests_passed = 0; \ - micro_test::tests_failed = 0; \ - tflite::MicroErrorReporter error_reporter; \ - micro_test::reporter = &error_reporter; \ - HAL_Init(); \ - SystemClock_Config(); \ - board_init(); \ - printf("Init Successful"); - -#define TF_LITE_MICRO_TESTS_END \ - micro_test::reporter->Report( \ - "%d/%d tests passed", micro_test::tests_passed, \ - (micro_test::tests_failed + micro_test::tests_passed)); \ - if (micro_test::tests_failed == 0) { \ - micro_test::reporter->Report("~~~ALL TESTS PASSED~~~\n"); \ - } else { \ - micro_test::reporter->Report("~~~SOME TESTS FAILED~~~\n"); \ - } \ - while(1); \ - } - -// TODO(petewarden): I'm going to hell for what I'm doing to this poor for loop. -#define TF_LITE_MICRO_TEST(name) \ - micro_test::reporter->Report("Testing " #name); \ - for (micro_test::is_test_complete = false, \ - micro_test::did_test_fail = false; \ - !micro_test::is_test_complete; micro_test::is_test_complete = true, \ - micro_test::tests_passed += (micro_test::did_test_fail) ? 0 : 1, \ - micro_test::tests_failed += (micro_test::did_test_fail) ? 1 : 0) - -#define TF_LITE_MICRO_EXPECT(x) \ - do { \ - if (!(x)) { \ - micro_test::reporter->Report(#x " failed at %s:%d", __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -// TODO(b/139142772): this macro is used with types other than ints even though -// the printf specifier is %d. -#define TF_LITE_MICRO_EXPECT_EQ(x, y) \ - do { \ - auto vx = x; \ - auto vy = y; \ - if ((vx) != (vy)) { \ - micro_test::reporter->Report(#x " == " #y " failed at %s:%d (%d vs %d)", \ - __FILE__, __LINE__, static_cast(vx), \ - static_cast(vy)); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_NE(x, y) \ - do { \ - if ((x) == (y)) { \ - micro_test::reporter->Report(#x " != " #y " failed at %s:%d", __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -// TODO(wangtz): Making it more generic once needed. -#define TF_LITE_MICRO_ARRAY_ELEMENT_EXPECT_NEAR(arr1, idx1, arr2, idx2, \ - epsilon) \ - do { \ - auto delta = ((arr1)[(idx1)] > (arr2)[(idx2)]) \ - ? ((arr1)[(idx1)] - (arr2)[(idx2)]) \ - : ((arr2)[(idx2)] - (arr1)[(idx1)]); \ - if (delta > epsilon) { \ - micro_test::reporter->Report( \ - #arr1 "[%d] (%f) near " #arr2 "[%d] (%f) failed at %s:%d", \ - static_cast(idx1), static_cast((arr1)[(idx1)]), \ - static_cast(idx2), static_cast((arr2)[(idx2)]), \ - __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_NEAR(x, y, epsilon) \ - do { \ - auto vx = (x); \ - auto vy = (y); \ - auto delta = ((vx) > (vy)) ? ((vx) - (vy)) : ((vy) - (vx)); \ - if (delta > epsilon) { \ - micro_test::reporter->Report( \ - #x " (%f) near " #y " (%f) failed at %s:%d", \ - static_cast(vx), static_cast(vy), __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_GT(x, y) \ - do { \ - if ((x) <= (y)) { \ - micro_test::reporter->Report(#x " > " #y " failed at %s:%d", __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_LT(x, y) \ - do { \ - if ((x) >= (y)) { \ - micro_test::reporter->Report(#x " < " #y " failed at %s:%d", __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_GE(x, y) \ - do { \ - if ((x) < (y)) { \ - micro_test::reporter->Report(#x " >= " #y " failed at %s:%d", __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_LE(x, y) \ - do { \ - if ((x) > (y)) { \ - micro_test::reporter->Report(#x " <= " #y " failed at %s:%d", __FILE__, \ - __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_TRUE(x) \ - do { \ - if (!(x)) { \ - micro_test::reporter->Report(#x " was not true failed at %s:%d", \ - __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_FALSE(x) \ - do { \ - if (x) { \ - micro_test::reporter->Report(#x " was not false failed at %s:%d", \ - __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } while (false) - -#define TF_LITE_MICRO_FAIL(msg) \ - do { \ - micro_test::reporter->Report("FAIL: %s", msg, __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } while (false) - -#define TF_LITE_MICRO_EXPECT_STRING_EQ(string1, string2) \ - do { \ - for (int i = 0; string1[i] != '\0' && string2[i] != '\0'; i++) { \ - if (string1[i] != string2[i]) { \ - micro_test::reporter->Report("FAIL: %s did not match %s", string1, \ - string2, __FILE__, __LINE__); \ - micro_test::did_test_fail = true; \ - } \ - } \ - } while (false) - -#endif // TENSORFLOW_LITE_MICRO_TESTING_MICRO_TEST_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_conv_model.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_conv_model.h deleted file mode 100644 index 2103196e..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_conv_model.h +++ /dev/null @@ -1,23 +0,0 @@ -/* Copyright 2020 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -#ifndef TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ -#define TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ - -// See generate_test_models.py for updating the contents of this model: -extern const unsigned char kTestConvModelData[]; -extern const unsigned int kTestConvModelDataSize; - -#endif // TENSORFLOW_LITE_MICRO_TESTING_TEST_CONV_MODEL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_utils.h deleted file mode 100644 index e83ac806..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/testing/test_utils.h +++ /dev/null @@ -1,116 +0,0 @@ -/* Copyright 2018 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_MICRO_TESTING_TEST_UTILS_H_ -#define TENSORFLOW_LITE_MICRO_TESTING_TEST_UTILS_H_ - -#include -#include -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/core/api/tensor_utils.h" -#include "tensorflow/lite/micro/micro_utils.h" -#include "tensorflow/lite/micro/test_helpers.h" -#include "tensorflow/lite/micro/testing/micro_test.h" - -namespace tflite { -namespace testing { - -// Note: These methods are deprecated, do not use. See b/141332970. - - -// Derives the quantization range max from scaling factor and zero point. -template -inline float MaxFromZeroPointScale(const int zero_point, const float scale) { - return (std::numeric_limits::max() - zero_point) * scale; -} - -// Derives the quantization range min from scaling factor and zero point. -template -inline float MinFromZeroPointScale(const int zero_point, const float scale) { - return (std::numeric_limits::min() - zero_point) * scale; -} - -// Derives the quantization scaling factor from a min and max range. -template -inline float ScaleFromMinMax(const float min, const float max) { - return (max - min) / - static_cast((std::numeric_limits::max() * 1.0) - - std::numeric_limits::min()); -} - -// Derives the quantization zero point from a min and max range. -template -inline int ZeroPointFromMinMax(const float min, const float max) { - return static_cast(std::numeric_limits::min()) + - static_cast(-min / ScaleFromMinMax(min, max) + 0.5f); -} - -// Converts a float value into an unsigned eight-bit quantized value. -uint8_t F2Q(float value, float min, float max); - -// Converts a float value into a signed eight-bit quantized value. -int8_t F2QS(const float value, const float min, const float max); - -// Converts a float value into a signed thirty-two-bit quantized value. Note -// that values close to max int and min int may see significant error due to -// a lack of floating point granularity for large values. -int32_t F2Q32(const float value, const float scale); - -// TODO(b/141330728): Move this method elsewhere as part clean up. -void PopulateContext(TfLiteTensor* tensors, int tensors_size, - ErrorReporter* error_reporter, TfLiteContext* context); - -TfLiteTensor CreateQuantizedTensor(const uint8_t* data, TfLiteIntArray* dims, - float min, float max, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(const int8_t* data, TfLiteIntArray* dims, - float min, float max, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(float* data, uint8_t* quantized_data, - TfLiteIntArray* dims, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(float* data, int8_t* quantized_data, - TfLiteIntArray* dims, - bool is_variable = false); - -TfLiteTensor CreateQuantizedTensor(float* data, int16_t* quantized_data, - TfLiteIntArray* dims, - bool is_variable = false); - -TfLiteTensor CreateQuantized32Tensor(const int32_t* data, TfLiteIntArray* dims, - float scale, bool is_variable = false); - -template -inline TfLiteTensor CreateTensor(const input_type* data, TfLiteIntArray* dims, - bool is_variable = false) { - TfLiteTensor result; - result.type = tensor_input_type; - result.data.raw = reinterpret_cast(const_cast(data)); - result.dims = dims; - result.allocation_type = kTfLiteMemNone; - result.bytes = ElementCount(*dims) * sizeof(input_type); - result.is_variable = is_variable; - return result; -} - -} // namespace testing -} // namespace tflite - -#endif // TENSORFLOW_LITE_MICRO_TESTING_TEST_UTILS_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_common_tables.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_common_tables.h deleted file mode 100644 index e82e62d2..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_common_tables.h +++ /dev/null @@ -1,528 +0,0 @@ -/* ---------------------------------------------------------------------- - * Project: CMSIS DSP Library - * Title: arm_common_tables.h - * Description: Extern declaration for common tables - * - * $Date: 27. January 2017 - * $Revision: V.1.5.1 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ -/* - * Copyright (C) 2010-2017 ARM Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _ARM_COMMON_TABLES_H -#define _ARM_COMMON_TABLES_H - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_ALLOW_TABLES) - /* Double Precision Float CFFT twiddles */ - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREV_1024) - extern const uint16_t armBitRevTable[1024]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_16) - extern const uint64_t twiddleCoefF64_16[32]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_32) - extern const uint64_t twiddleCoefF64_32[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_64) - extern const uint64_t twiddleCoefF64_64[128]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_128) - extern const uint64_t twiddleCoefF64_128[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_256) - extern const uint64_t twiddleCoefF64_256[512]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_512) - extern const uint64_t twiddleCoefF64_512[1024]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_1024) - extern const uint64_t twiddleCoefF64_1024[2048]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_2048) - extern const uint64_t twiddleCoefF64_2048[4096]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F64_4096) - extern const uint64_t twiddleCoefF64_4096[8192]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_16) - extern const float32_t twiddleCoef_16[32]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_32) - extern const float32_t twiddleCoef_32[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_64) - extern const float32_t twiddleCoef_64[128]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_128) - extern const float32_t twiddleCoef_128[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_256) - extern const float32_t twiddleCoef_256[512]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_512) - extern const float32_t twiddleCoef_512[1024]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_1024) - extern const float32_t twiddleCoef_1024[2048]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_2048) - extern const float32_t twiddleCoef_2048[4096]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_F32_4096) - extern const float32_t twiddleCoef_4096[8192]; - #define twiddleCoef twiddleCoef_4096 - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - /* Q31 */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_16) - extern const q31_t twiddleCoef_16_q31[24]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_32) - extern const q31_t twiddleCoef_32_q31[48]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_64) - extern const q31_t twiddleCoef_64_q31[96]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_128) - extern const q31_t twiddleCoef_128_q31[192]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_256) - extern const q31_t twiddleCoef_256_q31[384]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_512) - extern const q31_t twiddleCoef_512_q31[768]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_1024) - extern const q31_t twiddleCoef_1024_q31[1536]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_2048) - extern const q31_t twiddleCoef_2048_q31[3072]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q31_4096) - extern const q31_t twiddleCoef_4096_q31[6144]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_16) - extern const q15_t twiddleCoef_16_q15[24]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_32) - extern const q15_t twiddleCoef_32_q15[48]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_64) - extern const q15_t twiddleCoef_64_q15[96]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_128) - extern const q15_t twiddleCoef_128_q15[192]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_256) - extern const q15_t twiddleCoef_256_q15[384]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_512) - extern const q15_t twiddleCoef_512_q15[768]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_1024) - extern const q15_t twiddleCoef_1024_q15[1536]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_2048) - extern const q15_t twiddleCoef_2048_q15[3072]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_Q15_4096) - extern const q15_t twiddleCoef_4096_q15[6144]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - /* Double Precision Float RFFT twiddles */ - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_32) - extern const uint64_t twiddleCoefF64_rfft_32[32]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_64) - extern const uint64_t twiddleCoefF64_rfft_64[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_128) - extern const uint64_t twiddleCoefF64_rfft_128[128]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_256) - extern const uint64_t twiddleCoefF64_rfft_256[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_512) - extern const uint64_t twiddleCoefF64_rfft_512[512]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_1024) - extern const uint64_t twiddleCoefF64_rfft_1024[1024]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_2048) - extern const uint64_t twiddleCoefF64_rfft_2048[2048]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F64_4096) - extern const uint64_t twiddleCoefF64_rfft_4096[4096]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_32) - extern const float32_t twiddleCoef_rfft_32[32]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_64) - extern const float32_t twiddleCoef_rfft_64[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_128) - extern const float32_t twiddleCoef_rfft_128[128]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_256) - extern const float32_t twiddleCoef_rfft_256[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_512) - extern const float32_t twiddleCoef_rfft_512[512]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_1024) - extern const float32_t twiddleCoef_rfft_1024[1024]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_2048) - extern const float32_t twiddleCoef_rfft_2048[2048]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_TWIDDLECOEF_RFFT_F32_4096) - extern const float32_t twiddleCoef_rfft_4096[4096]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - - /* Double precision floating-point bit reversal tables */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_16) - #define ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH ((uint16_t)12) - extern const uint16_t armBitRevIndexTableF64_16[ARMBITREVINDEXTABLEF64_16_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_32) - #define ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH ((uint16_t)24) - extern const uint16_t armBitRevIndexTableF64_32[ARMBITREVINDEXTABLEF64_32_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_64) - #define ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTableF64_64[ARMBITREVINDEXTABLEF64_64_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_128) - #define ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH ((uint16_t)112) - extern const uint16_t armBitRevIndexTableF64_128[ARMBITREVINDEXTABLEF64_128_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_256) - #define ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH ((uint16_t)240) - extern const uint16_t armBitRevIndexTableF64_256[ARMBITREVINDEXTABLEF64_256_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_512) - #define ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH ((uint16_t)480) - extern const uint16_t armBitRevIndexTableF64_512[ARMBITREVINDEXTABLEF64_512_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_1024) - #define ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH ((uint16_t)992) - extern const uint16_t armBitRevIndexTableF64_1024[ARMBITREVINDEXTABLEF64_1024_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_2048) - #define ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH ((uint16_t)1984) - extern const uint16_t armBitRevIndexTableF64_2048[ARMBITREVINDEXTABLEF64_2048_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT64_4096) - #define ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTableF64_4096[ARMBITREVINDEXTABLEF64_4096_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - /* floating-point bit reversal tables */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_16) - #define ARMBITREVINDEXTABLE_16_TABLE_LENGTH ((uint16_t)20) - extern const uint16_t armBitRevIndexTable16[ARMBITREVINDEXTABLE_16_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_32) - #define ARMBITREVINDEXTABLE_32_TABLE_LENGTH ((uint16_t)48) - extern const uint16_t armBitRevIndexTable32[ARMBITREVINDEXTABLE_32_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_64) - #define ARMBITREVINDEXTABLE_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTable64[ARMBITREVINDEXTABLE_64_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_128) - #define ARMBITREVINDEXTABLE_128_TABLE_LENGTH ((uint16_t)208) - extern const uint16_t armBitRevIndexTable128[ARMBITREVINDEXTABLE_128_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_256) - #define ARMBITREVINDEXTABLE_256_TABLE_LENGTH ((uint16_t)440) - extern const uint16_t armBitRevIndexTable256[ARMBITREVINDEXTABLE_256_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_512) - #define ARMBITREVINDEXTABLE_512_TABLE_LENGTH ((uint16_t)448) - extern const uint16_t armBitRevIndexTable512[ARMBITREVINDEXTABLE_512_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_1024) - #define ARMBITREVINDEXTABLE_1024_TABLE_LENGTH ((uint16_t)1800) - extern const uint16_t armBitRevIndexTable1024[ARMBITREVINDEXTABLE_1024_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_2048) - #define ARMBITREVINDEXTABLE_2048_TABLE_LENGTH ((uint16_t)3808) - extern const uint16_t armBitRevIndexTable2048[ARMBITREVINDEXTABLE_2048_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FLT_4096) - #define ARMBITREVINDEXTABLE_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTable4096[ARMBITREVINDEXTABLE_4096_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - - /* fixed-point bit reversal tables */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_16) - #define ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH ((uint16_t)12) - extern const uint16_t armBitRevIndexTable_fixed_16[ARMBITREVINDEXTABLE_FIXED_16_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_32) - #define ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH ((uint16_t)24) - extern const uint16_t armBitRevIndexTable_fixed_32[ARMBITREVINDEXTABLE_FIXED_32_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_64) - #define ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH ((uint16_t)56) - extern const uint16_t armBitRevIndexTable_fixed_64[ARMBITREVINDEXTABLE_FIXED_64_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_128) - #define ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH ((uint16_t)112) - extern const uint16_t armBitRevIndexTable_fixed_128[ARMBITREVINDEXTABLE_FIXED_128_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_256) - #define ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH ((uint16_t)240) - extern const uint16_t armBitRevIndexTable_fixed_256[ARMBITREVINDEXTABLE_FIXED_256_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_512) - #define ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH ((uint16_t)480) - extern const uint16_t armBitRevIndexTable_fixed_512[ARMBITREVINDEXTABLE_FIXED_512_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_1024) - #define ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH ((uint16_t)992) - extern const uint16_t armBitRevIndexTable_fixed_1024[ARMBITREVINDEXTABLE_FIXED_1024_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_2048) - #define ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH ((uint16_t)1984) - extern const uint16_t armBitRevIndexTable_fixed_2048[ARMBITREVINDEXTABLE_FIXED_2048_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_BITREVIDX_FXT_4096) - #define ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH ((uint16_t)4032) - extern const uint16_t armBitRevIndexTable_fixed_4096[ARMBITREVINDEXTABLE_FIXED_4096_TABLE_LENGTH]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_F32) - extern const float32_t realCoefA[8192]; - extern const float32_t realCoefB[8192]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q31) - extern const q31_t realCoefAQ31[8192]; - extern const q31_t realCoefBQ31[8192]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_REALCOEF_Q15) - extern const q15_t realCoefAQ15[8192]; - extern const q15_t realCoefBQ15[8192]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_128) - extern const float32_t Weights_128[256]; - extern const float32_t cos_factors_128[128]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_512) - extern const float32_t Weights_512[1024]; - extern const float32_t cos_factors_512[512]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_2048) - extern const float32_t Weights_2048[4096]; - extern const float32_t cos_factors_2048[2048]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_F32_8192) - extern const float32_t Weights_8192[16384]; - extern const float32_t cos_factors_8192[8192]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_128) - extern const q15_t WeightsQ15_128[256]; - extern const q15_t cos_factorsQ15_128[128]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_512) - extern const q15_t WeightsQ15_512[1024]; - extern const q15_t cos_factorsQ15_512[512]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_2048) - extern const q15_t WeightsQ15_2048[4096]; - extern const q15_t cos_factorsQ15_2048[2048]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q15_8192) - extern const q15_t WeightsQ15_8192[16384]; - extern const q15_t cos_factorsQ15_8192[8192]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_128) - extern const q31_t WeightsQ31_128[256]; - extern const q31_t cos_factorsQ31_128[128]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_512) - extern const q31_t WeightsQ31_512[1024]; - extern const q31_t cos_factorsQ31_512[512]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_2048) - extern const q31_t WeightsQ31_2048[4096]; - extern const q31_t cos_factorsQ31_2048[2048]; - #endif - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FFT_TABLES) || defined(ARM_TABLE_DCT4_Q31_8192) - extern const q31_t WeightsQ31_8192[16384]; - extern const q31_t cos_factorsQ31_8192[8192]; - #endif - -#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FFT_TABLES) */ - -#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_ALLOW_TABLES) - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q15) - extern const q15_t armRecipTableQ15[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_RECIP_Q31) - extern const q31_t armRecipTableQ31[64]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - - /* Tables for Fast Math Sine and Cosine */ - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_F32) - extern const float32_t sinTable_f32[FAST_MATH_TABLE_SIZE + 1]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q31) - extern const q31_t sinTable_q31[FAST_MATH_TABLE_SIZE + 1]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_SIN_Q15) - extern const q15_t sinTable_q15[FAST_MATH_TABLE_SIZE + 1]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - - #if defined(ARM_MATH_MVEI) - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE) - extern const q31_t sqrtTable_Q31[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - #endif - - #if defined(ARM_MATH_MVEI) - #if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE) - extern const q15_t sqrtTable_Q15[256]; - #endif /* !defined(ARM_DSP_CONFIG_TABLES) defined(ARM_ALL_FAST_TABLES) */ - #endif - -#endif /* if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_FAST_TABLES) */ - -#if (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) - extern const float32_t exp_tab[8]; - extern const float32_t __logf_lut_f32[8]; -#endif /* (defined(ARM_MATH_MVEF) || defined(ARM_MATH_HELIUM)) && !defined(ARM_MATH_AUTOVECTORIZE) */ - -#if (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) -extern const unsigned char hwLUT[256]; -#endif /* (defined(ARM_MATH_MVEI) || defined(ARM_MATH_HELIUM)) */ - -#ifdef __cplusplus -} -#endif - -#endif /* ARM_COMMON_TABLES_H */ - diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_helium_utils.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_helium_utils.h deleted file mode 100644 index 53a5c338..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_helium_utils.h +++ /dev/null @@ -1,371 +0,0 @@ -/* ---------------------------------------------------------------------- - * Project: CMSIS DSP Library - * Title: arm_helium_utils.h - * Description: Utility functions for Helium development - * - * $Date: 09. September 2019 - * $Revision: V.1.5.1 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ -/* - * Copyright (C) 2010-2019 ARM Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _ARM_UTILS_HELIUM_H_ -#define _ARM_UTILS_HELIUM_H_ - - -#ifdef __cplusplus -extern "C" -{ -#endif -/*************************************** - -Definitions available for MVEF and MVEI - -***************************************/ -#if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) - -#define INACTIVELANE 0 /* inactive lane content */ - - -#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) || defined(ARM_MATH_MVEI) */ - -/*************************************** - -Definitions available for MVEF only - -***************************************/ -#if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) - -__STATIC_FORCEINLINE float32_t vecAddAcrossF32Mve(float32x4_t in) -{ - float32_t acc; - - acc = vgetq_lane(in, 0) + vgetq_lane(in, 1) + - vgetq_lane(in, 2) + vgetq_lane(in, 3); - - return acc; -} - -__STATIC_FORCEINLINE float16_t vecAddAcrossF16Mve(float16x8_t in) -{ - float16x8_t tmpVec; - float16_t acc; - - tmpVec = (float16x8_t) vrev32q_s16((int16x8_t) in); - in = vaddq_f16(tmpVec, in); - tmpVec = (float16x8_t) vrev64q_s32((int32x4_t) in); - in = vaddq_f16(tmpVec, in); - acc = vgetq_lane_f16(in, 0) + vgetq_lane_f16(in, 4); - - return acc; -} - - -/* newton initial guess */ -#define INVSQRT_MAGIC_F32 0x5f3759df - -#define INVSQRT_NEWTON_MVE_F32(invSqrt, xHalf, xStart)\ -{ \ - float32x4_t tmp; \ - \ - /* tmp = xhalf * x * x */ \ - tmp = vmulq(xStart, xStart); \ - tmp = vmulq(tmp, xHalf); \ - /* (1.5f - xhalf * x * x) */ \ - tmp = vsubq(vdupq_n_f32(1.5f), tmp); \ - /* x = x*(1.5f-xhalf*x*x); */ \ - invSqrt = vmulq(tmp, xStart); \ -} -#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEF) */ - -/*************************************** - -Definitions available for MVEI only - -***************************************/ -#if defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI) - -#include "cmsis/CMSIS/DSP/Include/arm_common_tables.h" - -/* Following functions are used to transpose matrix in f32 and q31 cases */ -__STATIC_INLINE arm_status arm_mat_trans_32bit_2x2_mve( - uint32_t * pDataSrc, - uint32_t * pDataDest) -{ - static const uint32x4_t vecOffs = { 0, 2, 1, 3 }; - /* - * - * | 0 1 | => | 0 2 | - * | 2 3 | | 1 3 | - * - */ - uint32x4_t vecIn = vldrwq_u32((uint32_t const *)pDataSrc); - vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs, vecIn); - - return (ARM_MATH_SUCCESS); -} - -__STATIC_INLINE arm_status arm_mat_trans_32bit_3x3_mve( - uint32_t * pDataSrc, - uint32_t * pDataDest) -{ - const uint32x4_t vecOffs1 = { 0, 3, 6, 1}; - const uint32x4_t vecOffs2 = { 4, 7, 2, 5}; - /* - * - * | 0 1 2 | | 0 3 6 | 4 x 32 flattened version | 0 3 6 1 | - * | 3 4 5 | => | 1 4 7 | => | 4 7 2 5 | - * | 6 7 8 | | 2 5 8 | (row major) | 8 . . . | - * - */ - uint32x4_t vecIn1 = vldrwq_u32((uint32_t const *) pDataSrc); - uint32x4_t vecIn2 = vldrwq_u32((uint32_t const *) &pDataSrc[4]); - - vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs1, vecIn1); - vstrwq_scatter_shifted_offset_u32(pDataDest, vecOffs2, vecIn2); - - pDataDest[8] = pDataSrc[8]; - - return (ARM_MATH_SUCCESS); -} - -__STATIC_INLINE arm_status arm_mat_trans_32bit_4x4_mve(uint32_t * pDataSrc, uint32_t * pDataDest) -{ - /* - * 4x4 Matrix transposition - * is 4 x de-interleave operation - * - * 0 1 2 3 0 4 8 12 - * 4 5 6 7 1 5 9 13 - * 8 9 10 11 2 6 10 14 - * 12 13 14 15 3 7 11 15 - */ - - uint32x4x4_t vecIn; - - vecIn = vld4q((uint32_t const *) pDataSrc); - vstrwq(pDataDest, vecIn.val[0]); - pDataDest += 4; - vstrwq(pDataDest, vecIn.val[1]); - pDataDest += 4; - vstrwq(pDataDest, vecIn.val[2]); - pDataDest += 4; - vstrwq(pDataDest, vecIn.val[3]); - - return (ARM_MATH_SUCCESS); -} - - -__STATIC_INLINE arm_status arm_mat_trans_32bit_generic_mve( - uint16_t srcRows, - uint16_t srcCols, - uint32_t * pDataSrc, - uint32_t * pDataDest) -{ - uint32x4_t vecOffs; - uint32_t i; - uint32_t blkCnt; - uint32_t const *pDataC; - uint32_t *pDataDestR; - uint32x4_t vecIn; - - vecOffs = vidupq_u32((uint32_t)0, 1); - vecOffs = vecOffs * srcCols; - - i = srcCols; - do - { - pDataC = (uint32_t const *) pDataSrc; - pDataDestR = pDataDest; - - blkCnt = srcRows >> 2; - while (blkCnt > 0U) - { - vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); - vstrwq(pDataDestR, vecIn); - pDataDestR += 4; - pDataC = pDataC + srcCols * 4; - /* - * Decrement the blockSize loop counter - */ - blkCnt--; - } - - /* - * tail - */ - blkCnt = srcRows & 3; - if (blkCnt > 0U) - { - mve_pred16_t p0 = vctp32q(blkCnt); - vecIn = vldrwq_gather_shifted_offset_u32(pDataC, vecOffs); - vstrwq_p(pDataDestR, vecIn, p0); - } - - pDataSrc += 1; - pDataDest += srcRows; - } - while (--i); - - return (ARM_MATH_SUCCESS); -} - -#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q31_MVE) -__STATIC_INLINE q31x4_t FAST_VSQRT_Q31(q31x4_t vecIn) -{ - q63x2_t vecTmpLL; - q31x4_t vecTmp0, vecTmp1; - q31_t scale; - q63_t tmp64; - q31x4_t vecNrm, vecDst, vecIdx, vecSignBits; - - - vecSignBits = vclsq(vecIn); - vecSignBits = vbicq(vecSignBits, 1); - /* - * in = in << no_of_sign_bits; - */ - vecNrm = vshlq(vecIn, vecSignBits); - /* - * index = in >> 24; - */ - vecIdx = vecNrm >> 24; - vecIdx = vecIdx << 1; - - vecTmp0 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx); - - vecIdx = vecIdx + 1; - - vecTmp1 = vldrwq_gather_shifted_offset_s32(sqrtTable_Q31, (uint32x4_t)vecIdx); - - vecTmp1 = vqrdmulhq(vecTmp1, vecNrm); - vecTmp0 = vecTmp0 - vecTmp1; - vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0); - vecTmp1 = vqrdmulhq(vecNrm, vecTmp1); - vecTmp1 = vdupq_n_s32(0x18000000) - vecTmp1; - vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1); - vecTmpLL = vmullbq_int(vecNrm, vecTmp0); - - /* - * scale elements 0, 2 - */ - scale = 26 + (vecSignBits[0] >> 1); - tmp64 = asrl(vecTmpLL[0], scale); - vecDst[0] = (q31_t) tmp64; - - scale = 26 + (vecSignBits[2] >> 1); - tmp64 = asrl(vecTmpLL[1], scale); - vecDst[2] = (q31_t) tmp64; - - vecTmpLL = vmulltq_int(vecNrm, vecTmp0); - - /* - * scale elements 1, 3 - */ - scale = 26 + (vecSignBits[1] >> 1); - tmp64 = asrl(vecTmpLL[0], scale); - vecDst[1] = (q31_t) tmp64; - - scale = 26 + (vecSignBits[3] >> 1); - tmp64 = asrl(vecTmpLL[1], scale); - vecDst[3] = (q31_t) tmp64; - /* - * set negative values to 0 - */ - vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s32(vecIn, 0)); - - return vecDst; -} -#endif - -#if !defined(ARM_DSP_CONFIG_TABLES) || defined(ARM_ALL_FAST_TABLES) || defined(ARM_TABLE_FAST_SQRT_Q15_MVE) -__STATIC_INLINE q15x8_t FAST_VSQRT_Q15(q15x8_t vecIn) -{ - q31x4_t vecTmpLev, vecTmpLodd, vecSignL; - q15x8_t vecTmp0, vecTmp1; - q15x8_t vecNrm, vecDst, vecIdx, vecSignBits; - - vecDst = vuninitializedq_s16(); - - vecSignBits = vclsq(vecIn); - vecSignBits = vbicq(vecSignBits, 1); - /* - * in = in << no_of_sign_bits; - */ - vecNrm = vshlq(vecIn, vecSignBits); - - vecIdx = vecNrm >> 8; - vecIdx = vecIdx << 1; - - vecTmp0 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx); - - vecIdx = vecIdx + 1; - - vecTmp1 = vldrhq_gather_shifted_offset_s16(sqrtTable_Q15, (uint16x8_t)vecIdx); - - vecTmp1 = vqrdmulhq(vecTmp1, vecNrm); - vecTmp0 = vecTmp0 - vecTmp1; - vecTmp1 = vqrdmulhq(vecTmp0, vecTmp0); - vecTmp1 = vqrdmulhq(vecNrm, vecTmp1); - vecTmp1 = vdupq_n_s16(0x1800) - vecTmp1; - vecTmp0 = vqrdmulhq(vecTmp0, vecTmp1); - - vecSignBits = vecSignBits >> 1; - - vecTmpLev = vmullbq_int(vecNrm, vecTmp0); - vecTmpLodd = vmulltq_int(vecNrm, vecTmp0); - - vecTmp0 = vecSignBits + 10; - /* - * negate sign to apply register based vshl - */ - vecTmp0 = -vecTmp0; - - /* - * shift even elements - */ - vecSignL = vmovlbq(vecTmp0); - vecTmpLev = vshlq(vecTmpLev, vecSignL); - /* - * shift odd elements - */ - vecSignL = vmovltq(vecTmp0); - vecTmpLodd = vshlq(vecTmpLodd, vecSignL); - /* - * merge and narrow odd and even parts - */ - vecDst = vmovnbq_s32(vecDst, vecTmpLev); - vecDst = vmovntq_s32(vecDst, vecTmpLodd); - /* - * set negative values to 0 - */ - vecDst = vdupq_m(vecDst, 0, vcmpltq_n_s16(vecIn, 0)); - - return vecDst; -} -#endif - -#endif /* defined (ARM_MATH_HELIUM) || defined(ARM_MATH_MVEI) */ - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_math.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_math.h deleted file mode 100644 index a5eb4ff1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/arm_math.h +++ /dev/null @@ -1,8955 +0,0 @@ -/****************************************************************************** - * @file arm_math.h - * @brief Public header file for CMSIS DSP Library - * @version V1.7.0 - * @date 18. March 2019 - ******************************************************************************/ -/* - * Copyright (c) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - \mainpage CMSIS DSP Software Library - * - * \section intro Introduction - * - * This user manual describes the CMSIS DSP software library, - * a suite of common signal processing functions for use on Cortex-M and Cortex-A processor - * based devices. - * - * The library is divided into a number of functions each covering a specific category: - * - Basic math functions - * - Fast math functions - * - Complex math functions - * - Filtering functions - * - Matrix functions - * - Transform functions - * - Motor control functions - * - Statistical functions - * - Support functions - * - Interpolation functions - * - Support Vector Machine functions (SVM) - * - Bayes classifier functions - * - Distance functions - * - * The library has generally separate functions for operating on 8-bit integers, 16-bit integers, - * 32-bit integer and 32-bit floating-point values. - * - * \section using Using the Library - * - * The library installer contains prebuilt versions of the libraries in the Lib folder. - * - * Here is the list of pre-built libraries : - * - arm_cortexM7lfdp_math.lib (Cortex-M7, Little endian, Double Precision Floating Point Unit) - * - arm_cortexM7bfdp_math.lib (Cortex-M7, Big endian, Double Precision Floating Point Unit) - * - arm_cortexM7lfsp_math.lib (Cortex-M7, Little endian, Single Precision Floating Point Unit) - * - arm_cortexM7bfsp_math.lib (Cortex-M7, Big endian and Single Precision Floating Point Unit on) - * - arm_cortexM7l_math.lib (Cortex-M7, Little endian) - * - arm_cortexM7b_math.lib (Cortex-M7, Big endian) - * - arm_cortexM4lf_math.lib (Cortex-M4, Little endian, Floating Point Unit) - * - arm_cortexM4bf_math.lib (Cortex-M4, Big endian, Floating Point Unit) - * - arm_cortexM4l_math.lib (Cortex-M4, Little endian) - * - arm_cortexM4b_math.lib (Cortex-M4, Big endian) - * - arm_cortexM3l_math.lib (Cortex-M3, Little endian) - * - arm_cortexM3b_math.lib (Cortex-M3, Big endian) - * - arm_cortexM0l_math.lib (Cortex-M0 / Cortex-M0+, Little endian) - * - arm_cortexM0b_math.lib (Cortex-M0 / Cortex-M0+, Big endian) - * - arm_ARMv8MBLl_math.lib (Armv8-M Baseline, Little endian) - * - arm_ARMv8MMLl_math.lib (Armv8-M Mainline, Little endian) - * - arm_ARMv8MMLlfsp_math.lib (Armv8-M Mainline, Little endian, Single Precision Floating Point Unit) - * - arm_ARMv8MMLld_math.lib (Armv8-M Mainline, Little endian, DSP instructions) - * - arm_ARMv8MMLldfsp_math.lib (Armv8-M Mainline, Little endian, DSP instructions, Single Precision Floating Point Unit) - * - * The library functions are declared in the public file arm_math.h which is placed in the Include folder. - * Simply include this file and link the appropriate library in the application and begin calling the library functions. The Library supports single - * public header file arm_math.h for Cortex-M cores with little endian and big endian. Same header file will be used for floating point unit(FPU) variants. - * - * - * \section example Examples - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * \section toolchain Toolchain Support - * - * The library is now tested on Fast Models building with cmake. - * Core M0, M7, A5 are tested. - * - * - * - * \section building Building the Library - * - * The library installer contains a project file to rebuild libraries on MDK toolchain in the CMSIS\\DSP\\Projects\\ARM folder. - * - arm_cortexM_math.uvprojx - * - * - * The libraries can be built by opening the arm_cortexM_math.uvprojx project in MDK-ARM, selecting a specific target, and defining the optional preprocessor macros detailed above. - * - * There is also a work in progress cmake build. The README file is giving more details. - * - * \section preprocessor Preprocessor Macros - * - * Each library project have different preprocessor macros. - * - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. By default library builds for little endian targets. - * - * - ARM_MATH_MATRIX_CHECK: - * - * Define macro ARM_MATH_MATRIX_CHECK for checking on the input and output sizes of matrices - * - * - ARM_MATH_ROUNDING: - * - * Define macro ARM_MATH_ROUNDING for rounding on support functions - * - * - ARM_MATH_LOOPUNROLL: - * - * Define macro ARM_MATH_LOOPUNROLL to enable manual loop unrolling in DSP functions - * - * - ARM_MATH_NEON: - * - * Define macro ARM_MATH_NEON to enable Neon versions of the DSP functions. - * It is not enabled by default when Neon is available because performances are - * dependent on the compiler and target architecture. - * - * - ARM_MATH_NEON_EXPERIMENTAL: - * - * Define macro ARM_MATH_NEON_EXPERIMENTAL to enable experimental Neon versions of - * of some DSP functions. Experimental Neon versions currently do not have better - * performances than the scalar versions. - * - * - ARM_MATH_HELIUM: - * - * It implies the flags ARM_MATH_MVEF and ARM_MATH_MVEI and ARM_MATH_FLOAT16. - * - * - ARM_MATH_MVEF: - * - * Select Helium versions of the f32 algorithms. - * It implies ARM_MATH_FLOAT16 and ARM_MATH_MVEI. - * - * - ARM_MATH_MVEI: - * - * Select Helium versions of the int and fixed point algorithms. - * - * - ARM_MATH_MVE_FLOAT16: - * - * MVE Float16 implementations of some algorithms (Requires MVE extension). - * - *
- * \section pack CMSIS-DSP in ARM::CMSIS Pack - * - * The following files relevant to CMSIS-DSP are present in the ARM::CMSIS Pack directories: - * |File/Folder |Content | - * |---------------------------------|------------------------------------------------------------------------| - * |\b CMSIS\\Documentation\\DSP | This documentation | - * |\b CMSIS\\DSP\\DSP_Lib_TestSuite | DSP_Lib test suite | - * |\b CMSIS\\DSP\\Examples | Example projects demonstrating the usage of the library functions | - * |\b CMSIS\\DSP\\Include | DSP_Lib include files | - * |\b CMSIS\\DSP\\Lib | DSP_Lib binaries | - * |\b CMSIS\\DSP\\Projects | Projects to rebuild DSP_Lib binaries | - * |\b CMSIS\\DSP\\Source | DSP_Lib source files | - * - *
- * \section rev Revision History of CMSIS-DSP - * Please refer to \ref ChangeLog_pg. - */ - - -/** - * @defgroup groupMath Basic Math Functions - */ - -/** - * @defgroup groupFastMath Fast Math Functions - * This set of functions provides a fast approximation to sine, cosine, and square root. - * As compared to most of the other functions in the CMSIS math library, the fast math functions - * operate on individual values and not arrays. - * There are separate functions for Q15, Q31, and floating-point data. - * - */ - -/** - * @defgroup groupCmplxMath Complex Math Functions - * This set of functions operates on complex data vectors. - * The data in the complex arrays is stored in an interleaved fashion - * (real, imag, real, imag, ...). - * In the API functions, the number of samples in a complex array refers - * to the number of complex values; the array contains twice this number of - * real values. - */ - -/** - * @defgroup groupFilters Filtering Functions - */ - -/** - * @defgroup groupMatrix Matrix Functions - * - * This set of functions provides basic matrix math operations. - * The functions operate on matrix data structures. For example, - * the type - * definition for the floating-point matrix structure is shown - * below: - *
- *     typedef struct
- *     {
- *       uint16_t numRows;     // number of rows of the matrix.
- *       uint16_t numCols;     // number of columns of the matrix.
- *       float32_t *pData;     // points to the data of the matrix.
- *     } arm_matrix_instance_f32;
- * 
- * There are similar definitions for Q15 and Q31 data types. - * - * The structure specifies the size of the matrix and then points to - * an array of data. The array is of size numRows X numCols - * and the values are arranged in row order. That is, the - * matrix element (i, j) is stored at: - *
- *     pData[i*numCols + j]
- * 
- * - * \par Init Functions - * There is an associated initialization function for each type of matrix - * data structure. - * The initialization function sets the values of the internal structure fields. - * Refer to \ref arm_mat_init_f32(), \ref arm_mat_init_q31() and \ref arm_mat_init_q15() - * for floating-point, Q31 and Q15 types, respectively. - * - * \par - * Use of the initialization function is optional. However, if initialization function is used - * then the instance structure cannot be placed into a const data section. - * To place the instance structure in a const data - * section, manually initialize the data structure. For example: - *
- * arm_matrix_instance_f32 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q31 S = {nRows, nColumns, pData};
- * arm_matrix_instance_q15 S = {nRows, nColumns, pData};
- * 
- * where nRows specifies the number of rows, nColumns - * specifies the number of columns, and pData points to the - * data array. - * - * \par Size Checking - * By default all of the matrix functions perform size checking on the input and - * output matrices. For example, the matrix addition function verifies that the - * two input matrices and the output matrix all have the same number of rows and - * columns. If the size check fails the functions return: - *
- *     ARM_MATH_SIZE_MISMATCH
- * 
- * Otherwise the functions return - *
- *     ARM_MATH_SUCCESS
- * 
- * There is some overhead associated with this matrix size checking. - * The matrix size checking is enabled via the \#define - *
- *     ARM_MATH_MATRIX_CHECK
- * 
- * within the library project settings. By default this macro is defined - * and size checking is enabled. By changing the project settings and - * undefining this macro size checking is eliminated and the functions - * run a bit faster. With size checking disabled the functions always - * return ARM_MATH_SUCCESS. - */ - -/** - * @defgroup groupTransforms Transform Functions - */ - -/** - * @defgroup groupController Controller Functions - */ - -/** - * @defgroup groupStats Statistics Functions - */ - -/** - * @defgroup groupSupport Support Functions - */ - -/** - * @defgroup groupInterpolation Interpolation Functions - * These functions perform 1- and 2-dimensional interpolation of data. - * Linear interpolation is used for 1-dimensional data and - * bilinear interpolation is used for 2-dimensional data. - */ - -/** - * @defgroup groupExamples Examples - */ - -/** - * @defgroup groupSVM SVM Functions - * This set of functions is implementing SVM classification on 2 classes. - * The training must be done from scikit-learn. The parameters can be easily - * generated from the scikit-learn object. Some examples are given in - * DSP/Testing/PatternGeneration/SVM.py - * - * If more than 2 classes are needed, the functions in this folder - * will have to be used, as building blocks, to do multi-class classification. - * - * No multi-class classification is provided in this SVM folder. - * - */ - - -/** - * @defgroup groupBayes Bayesian estimators - * - * Implement the naive gaussian Bayes estimator. - * The training must be done from scikit-learn. - * - * The parameters can be easily - * generated from the scikit-learn object. Some examples are given in - * DSP/Testing/PatternGeneration/Bayes.py - */ - -/** - * @defgroup groupDistance Distance functions - * - * Distance functions for use with clustering algorithms. - * There are distance functions for float vectors and boolean vectors. - * - */ - - -#ifndef _ARM_MATH_H -#define _ARM_MATH_H - -#ifdef __cplusplus -extern "C" -{ -#endif - -/* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) - -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - -#elif defined ( __GNUC__ ) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wsign-conversion" - #pragma GCC diagnostic ignored "-Wconversion" - #pragma GCC diagnostic ignored "-Wunused-parameter" - -#elif defined ( __ICCARM__ ) - -#elif defined ( __TI_ARM__ ) - -#elif defined ( __CSMC__ ) - -#elif defined ( __TASKING__ ) - -#elif defined ( _MSC_VER ) - -#else - #error Unknown compiler -#endif - - -/* Included for instrinsics definitions */ -#if defined (_MSC_VER ) -#include -#define __STATIC_FORCEINLINE static __forceinline -#define __STATIC_INLINE static __inline -#define __ALIGNED(x) __declspec(align(x)) - -#elif defined (__GNUC_PYTHON__) -#include -#define __ALIGNED(x) __attribute__((aligned(x))) -#define __STATIC_FORCEINLINE static __attribute__((inline)) -#define __STATIC_INLINE static __attribute__((inline)) -#pragma GCC diagnostic ignored "-Wunused-function" -#pragma GCC diagnostic ignored "-Wattributes" - -#else -#include "cmsis_compiler.h" -#endif - - - -#include -#include -#include -#include - -/* evaluate ARM DSP feature */ -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - #define ARM_MATH_DSP 1 -#endif - -#if defined(ARM_MATH_NEON) -#include -#if __ARM_FEATURE_FP16_VECTOR_ARITHMETIC - #if !defined(ARM_MATH_NEON_FLOAT16) - #define ARM_MATH_NEON_FLOAT16 - #endif -#endif -#endif - -#if !defined(ARM_MATH_AUTOVECTORIZE) - -#if __ARM_FEATURE_MVE - #if !defined(ARM_MATH_MVEI) - #define ARM_MATH_MVEI - #endif -#endif - -#if (__ARM_FEATURE_MVE & 2) - #if !defined(ARM_MATH_MVEF) - #define ARM_MATH_MVEF - #endif - #if !defined(ARM_MATH_MVE_FLOAT16) - /* HW Float16 not yet well supported on gcc for M55 */ - #if !defined(__CMSIS_GCC_H) - #define ARM_MATH_MVE_FLOAT16 - #endif - #endif -#endif - -#endif /*!defined(ARM_MATH_AUTOVECTORIZE)*/ - - -#if defined (ARM_MATH_HELIUM) - #if !defined(ARM_MATH_MVEF) - #define ARM_MATH_MVEF - #endif - - #if !defined(ARM_MATH_MVEI) - #define ARM_MATH_MVEI - #endif - - #if !defined(ARM_MATH_MVE_FLOAT16) - /* HW Float16 not yet well supported on gcc for M55 */ - #if !defined(__CMSIS_GCC_H) - #define ARM_MATH_MVE_FLOAT16 - #endif - #endif -#endif - -#ifdef __cplusplus -} -#endif - -#if __ARM_FEATURE_MVE -#include -#endif - -#ifdef __cplusplus -extern "C" -{ -#endif - /** - * @brief 8-bit fractional data type in 1.7 format. - */ - typedef int8_t q7_t; - - /** - * @brief 16-bit fractional data type in 1.15 format. - */ - typedef int16_t q15_t; - - /** - * @brief 32-bit fractional data type in 1.31 format. - */ - typedef int32_t q31_t; - - /** - * @brief 64-bit fractional data type in 1.63 format. - */ - typedef int64_t q63_t; - - /** - * @brief 32-bit floating-point type definition. - */ - typedef float float32_t; - - /** - * @brief 64-bit floating-point type definition. - */ - typedef double float64_t; - - /** - * @brief vector types - */ -#if defined(ARM_MATH_NEON) || defined (ARM_MATH_MVEI) - /** - * @brief 64-bit fractional 128-bit vector data type in 1.63 format - */ - typedef int64x2_t q63x2_t; - - /** - * @brief 32-bit fractional 128-bit vector data type in 1.31 format. - */ - typedef int32x4_t q31x4_t; - - /** - * @brief 16-bit fractional 128-bit vector data type with 16-bit alignement in 1.15 format. - */ - typedef __ALIGNED(2) int16x8_t q15x8_t; - - /** - * @brief 8-bit fractional 128-bit vector data type with 8-bit alignement in 1.7 format. - */ - typedef __ALIGNED(1) int8x16_t q7x16_t; - - /** - * @brief 32-bit fractional 128-bit vector pair data type in 1.31 format. - */ - typedef int32x4x2_t q31x4x2_t; - - /** - * @brief 32-bit fractional 128-bit vector quadruplet data type in 1.31 format. - */ - typedef int32x4x4_t q31x4x4_t; - - /** - * @brief 16-bit fractional 128-bit vector pair data type in 1.15 format. - */ - typedef int16x8x2_t q15x8x2_t; - - /** - * @brief 16-bit fractional 128-bit vector quadruplet data type in 1.15 format. - */ - typedef int16x8x4_t q15x8x4_t; - - /** - * @brief 8-bit fractional 128-bit vector pair data type in 1.7 format. - */ - typedef int8x16x2_t q7x16x2_t; - - /** - * @brief 8-bit fractional 128-bit vector quadruplet data type in 1.7 format. - */ - typedef int8x16x4_t q7x16x4_t; - - /** - * @brief 32-bit fractional data type in 9.23 format. - */ - typedef int32_t q23_t; - - /** - * @brief 32-bit fractional 128-bit vector data type in 9.23 format. - */ - typedef int32x4_t q23x4_t; - - /** - * @brief 64-bit status 128-bit vector data type. - */ - typedef int64x2_t status64x2_t; - - /** - * @brief 32-bit status 128-bit vector data type. - */ - typedef int32x4_t status32x4_t; - - /** - * @brief 16-bit status 128-bit vector data type. - */ - typedef int16x8_t status16x8_t; - - /** - * @brief 8-bit status 128-bit vector data type. - */ - typedef int8x16_t status8x16_t; - - -#endif - -#if defined(ARM_MATH_NEON) || defined(ARM_MATH_MVEF) /* floating point vector*/ - /** - * @brief 32-bit floating-point 128-bit vector type - */ - typedef float32x4_t f32x4_t; - - /** - * @brief 32-bit floating-point 128-bit vector pair data type - */ - typedef float32x4x2_t f32x4x2_t; - - /** - * @brief 32-bit floating-point 128-bit vector quadruplet data type - */ - typedef float32x4x4_t f32x4x4_t; - - /** - * @brief 32-bit ubiquitous 128-bit vector data type - */ - typedef union _any32x4_t - { - float32x4_t f; - int32x4_t i; - } any32x4_t; - -#endif - -#if defined(ARM_MATH_NEON) - /** - * @brief 32-bit fractional 64-bit vector data type in 1.31 format. - */ - typedef int32x2_t q31x2_t; - - /** - * @brief 16-bit fractional 64-bit vector data type in 1.15 format. - */ - typedef __ALIGNED(2) int16x4_t q15x4_t; - - /** - * @brief 8-bit fractional 64-bit vector data type in 1.7 format. - */ - typedef __ALIGNED(1) int8x8_t q7x8_t; - - /** - * @brief 32-bit float 64-bit vector data type. - */ - typedef float32x2_t f32x2_t; - - /** - * @brief 32-bit floating-point 128-bit vector triplet data type - */ - typedef float32x4x3_t f32x4x3_t; - - - /** - * @brief 32-bit fractional 128-bit vector triplet data type in 1.31 format - */ - typedef int32x4x3_t q31x4x3_t; - - /** - * @brief 16-bit fractional 128-bit vector triplet data type in 1.15 format - */ - typedef int16x8x3_t q15x8x3_t; - - /** - * @brief 8-bit fractional 128-bit vector triplet data type in 1.7 format - */ - typedef int8x16x3_t q7x16x3_t; - - /** - * @brief 32-bit floating-point 64-bit vector pair data type - */ - typedef float32x2x2_t f32x2x2_t; - - /** - * @brief 32-bit floating-point 64-bit vector triplet data type - */ - typedef float32x2x3_t f32x2x3_t; - - /** - * @brief 32-bit floating-point 64-bit vector quadruplet data type - */ - typedef float32x2x4_t f32x2x4_t; - - - /** - * @brief 32-bit fractional 64-bit vector pair data type in 1.31 format - */ - typedef int32x2x2_t q31x2x2_t; - - /** - * @brief 32-bit fractional 64-bit vector triplet data type in 1.31 format - */ - typedef int32x2x3_t q31x2x3_t; - - /** - * @brief 32-bit fractional 64-bit vector quadruplet data type in 1.31 format - */ - typedef int32x4x3_t q31x2x4_t; - - /** - * @brief 16-bit fractional 64-bit vector pair data type in 1.15 format - */ - typedef int16x4x2_t q15x4x2_t; - - /** - * @brief 16-bit fractional 64-bit vector triplet data type in 1.15 format - */ - typedef int16x4x2_t q15x4x3_t; - - /** - * @brief 16-bit fractional 64-bit vector quadruplet data type in 1.15 format - */ - typedef int16x4x3_t q15x4x4_t; - - /** - * @brief 8-bit fractional 64-bit vector pair data type in 1.7 format - */ - typedef int8x8x2_t q7x8x2_t; - - /** - * @brief 8-bit fractional 64-bit vector triplet data type in 1.7 format - */ - typedef int8x8x3_t q7x8x3_t; - - /** - * @brief 8-bit fractional 64-bit vector quadruplet data type in 1.7 format - */ - typedef int8x8x4_t q7x8x4_t; - - /** - * @brief 32-bit ubiquitous 64-bit vector data type - */ - typedef union _any32x2_t - { - float32x2_t f; - int32x2_t i; - } any32x2_t; - - - /** - * @brief 32-bit status 64-bit vector data type. - */ - typedef int32x4_t status32x2_t; - - /** - * @brief 16-bit status 64-bit vector data type. - */ - typedef int16x8_t status16x4_t; - - /** - * @brief 8-bit status 64-bit vector data type. - */ - typedef int8x16_t status8x8_t; - -#endif - - - - - -#define F64_MAX ((float64_t)DBL_MAX) -#define F32_MAX ((float32_t)FLT_MAX) - - - -#define F64_MIN (-DBL_MAX) -#define F32_MIN (-FLT_MAX) - - - -#define F64_ABSMAX ((float64_t)DBL_MAX) -#define F32_ABSMAX ((float32_t)FLT_MAX) - - - -#define F64_ABSMIN ((float64_t)0.0) -#define F32_ABSMIN ((float32_t)0.0) - - -#define Q31_MAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_MAX ((q15_t)(0x7FFF)) -#define Q7_MAX ((q7_t)(0x7F)) -#define Q31_MIN ((q31_t)(0x80000000L)) -#define Q15_MIN ((q15_t)(0x8000)) -#define Q7_MIN ((q7_t)(0x80)) - -#define Q31_ABSMAX ((q31_t)(0x7FFFFFFFL)) -#define Q15_ABSMAX ((q15_t)(0x7FFF)) -#define Q7_ABSMAX ((q7_t)(0x7F)) -#define Q31_ABSMIN ((q31_t)0) -#define Q15_ABSMIN ((q15_t)0) -#define Q7_ABSMIN ((q7_t)0) - - - - /** - * @brief Macros required for reciprocal calculation in Normalized LMS - */ - -#define DELTA_Q31 ((q31_t)(0x100)) -#define DELTA_Q15 ((q15_t)0x5) -#define INDEX_MASK 0x0000003F -#ifndef PI - #define PI 3.14159265358979f -#endif - - /** - * @brief Macros required for SINE and COSINE Fast math approximations - */ - -#define FAST_MATH_TABLE_SIZE 512 -#define FAST_MATH_Q31_SHIFT (32 - 10) -#define FAST_MATH_Q15_SHIFT (16 - 10) -#define CONTROLLER_Q31_SHIFT (32 - 9) -#define TABLE_SPACING_Q31 0x400000 -#define TABLE_SPACING_Q15 0x80 - - /** - * @brief Macros required for SINE and COSINE Controller functions - */ - /* 1.31(q31) Fixed value of 2/360 */ - /* -1 to +1 is divided into 360 values so total spacing is (2/360) */ -#define INPUT_SPACING 0xB60B61 - - /** - * @brief Macros for complex numbers - */ - - /* Dimension C vector space */ - #define CMPLX_DIM 2 - - /** - * @brief Error status returned by some functions in the library. - */ - - typedef enum - { - ARM_MATH_SUCCESS = 0, /**< No error */ - ARM_MATH_ARGUMENT_ERROR = -1, /**< One or more arguments are incorrect */ - ARM_MATH_LENGTH_ERROR = -2, /**< Length of data buffer is incorrect */ - ARM_MATH_SIZE_MISMATCH = -3, /**< Size of matrices is not compatible with the operation */ - ARM_MATH_NANINF = -4, /**< Not-a-number (NaN) or infinity is generated */ - ARM_MATH_SINGULAR = -5, /**< Input matrix is singular and cannot be inverted */ - ARM_MATH_TEST_FAILURE = -6 /**< Test Failed */ - } arm_status; - - -/** - @brief definition to read/write two 16 bit values. - @deprecated - */ -#if defined ( __CC_ARM ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define __SIMD32_TYPE int32_t -#elif defined ( __GNUC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __ICCARM__ ) - #define __SIMD32_TYPE int32_t __packed -#elif defined ( __TI_ARM__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __CSMC__ ) - #define __SIMD32_TYPE int32_t -#elif defined ( __TASKING__ ) - #define __SIMD32_TYPE __un(aligned) int32_t -#elif defined(_MSC_VER ) - #define __SIMD32_TYPE int32_t -#else - #error Unknown compiler -#endif - -#define __SIMD32(addr) (*(__SIMD32_TYPE **) & (addr)) -#define __SIMD32_CONST(addr) ( (__SIMD32_TYPE * ) (addr)) -#define _SIMD32_OFFSET(addr) (*(__SIMD32_TYPE * ) (addr)) -#define __SIMD64(addr) (*( int64_t **) & (addr)) - -#define STEP(x) (x) <= 0 ? 0 : 1 -#define SQ(x) ((x) * (x)) - -/* SIMD replacement */ - - -/** - @brief Read 2 Q15 from Q15 pointer. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2 ( - q15_t * pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, pQ15, 4); -#else - val = (pQ15[1] << 16) | (pQ15[0] & 0x0FFFF) ; -#endif - - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_ia ( - q15_t ** pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ15, 4); -#else - val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF); -#endif - - *pQ15 += 2; - return (val); -} - -/** - @brief Read 2 Q15 from Q15 pointer and decrement pointer afterwards. - @param[in] pQ15 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q15x2_da ( - q15_t ** pQ15) -{ - q31_t val; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ15, 4); -#else - val = ((*pQ15)[1] << 16) | ((*pQ15)[0] & 0x0FFFF); -#endif - - *pQ15 -= 2; - return (val); -} - -/** - @brief Write 2 Q15 to Q15 pointer and increment pointer afterwards. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2_ia ( - q15_t ** pQ15, - q31_t value) -{ - q31_t val = value; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ15, &val, 4); -#else - (*pQ15)[0] = (val & 0x0FFFF); - (*pQ15)[1] = (val >> 16) & 0x0FFFF; -#endif - - *pQ15 += 2; -} - -/** - @brief Write 2 Q15 to Q15 pointer. - @param[in] pQ15 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q15x2 ( - q15_t * pQ15, - q31_t value) -{ - q31_t val = value; - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (pQ15, &val, 4); -#else - pQ15[0] = val & 0x0FFFF; - pQ15[1] = val >> 16; -#endif -} - - -/** - @brief Read 4 Q7 from Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_ia ( - q7_t ** pQ7) -{ - q31_t val; - - -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ7, 4); -#else - val =(((*pQ7)[3] & 0x0FF) << 24) | (((*pQ7)[2] & 0x0FF) << 16) | (((*pQ7)[1] & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF); -#endif - - *pQ7 += 4; - - return (val); -} - -/** - @brief Read 4 Q7 from Q7 pointer and decrement pointer afterwards. - @param[in] pQ7 points to input value - @return Q31 value - */ -__STATIC_FORCEINLINE q31_t read_q7x4_da ( - q7_t ** pQ7) -{ - q31_t val; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (&val, *pQ7, 4); -#else - val = ((((*pQ7)[3]) & 0x0FF) << 24) | ((((*pQ7)[2]) & 0x0FF) << 16) | ((((*pQ7)[1]) & 0x0FF) << 8) | ((*pQ7)[0] & 0x0FF); -#endif - *pQ7 -= 4; - - return (val); -} - -/** - @brief Write 4 Q7 to Q7 pointer and increment pointer afterwards. - @param[in] pQ7 points to input value - @param[in] value Q31 value - @return none - */ -__STATIC_FORCEINLINE void write_q7x4_ia ( - q7_t ** pQ7, - q31_t value) -{ - q31_t val = value; -#ifdef __ARM_FEATURE_UNALIGNED - memcpy (*pQ7, &val, 4); -#else - (*pQ7)[0] = val & 0x0FF; - (*pQ7)[1] = (val >> 8) & 0x0FF; - (*pQ7)[2] = (val >> 16) & 0x0FF; - (*pQ7)[3] = (val >> 24) & 0x0FF; - -#endif - *pQ7 += 4; -} - -/* - -Normally those kind of definitions are in a compiler file -in Core or Core_A. - -But for MSVC compiler it is a bit special. The goal is very specific -to CMSIS-DSP and only to allow the use of this library from other -systems like Python or Matlab. - -MSVC is not going to be used to cross-compile to ARM. So, having a MSVC -compiler file in Core or Core_A would not make sense. - -*/ -#if defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) - __STATIC_FORCEINLINE uint8_t __CLZ(uint32_t data) - { - if (data == 0U) { return 32U; } - - uint32_t count = 0U; - uint32_t mask = 0x80000000U; - - while ((data & mask) == 0U) - { - count += 1U; - mask = mask >> 1U; - } - return count; - } - - __STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) - { - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; - } - - __STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) - { - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; - } -#endif - -#ifndef ARM_MATH_DSP - /** - * @brief definition to pack two 16 bit values. - */ - #define __PKHBT(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0x0000FFFF) | \ - (((int32_t)(ARG2) << ARG3) & (int32_t)0xFFFF0000) ) - #define __PKHTB(ARG1, ARG2, ARG3) ( (((int32_t)(ARG1) << 0) & (int32_t)0xFFFF0000) | \ - (((int32_t)(ARG2) >> ARG3) & (int32_t)0x0000FFFF) ) -#endif - - /** - * @brief definition to pack four 8 bit values. - */ -#ifndef ARM_MATH_BIG_ENDIAN - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v0) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v1) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v2) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v3) << 24) & (int32_t)0xFF000000) ) -#else - #define __PACKq7(v0,v1,v2,v3) ( (((int32_t)(v3) << 0) & (int32_t)0x000000FF) | \ - (((int32_t)(v2) << 8) & (int32_t)0x0000FF00) | \ - (((int32_t)(v1) << 16) & (int32_t)0x00FF0000) | \ - (((int32_t)(v0) << 24) & (int32_t)0xFF000000) ) -#endif - - - /** - * @brief Clips Q63 to Q31 values. - */ - __STATIC_FORCEINLINE q31_t clip_q63_to_q31( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFFFFFF ^ ((q31_t) (x >> 63)))) : (q31_t) x; - } - - /** - * @brief Clips Q63 to Q15 values. - */ - __STATIC_FORCEINLINE q15_t clip_q63_to_q15( - q63_t x) - { - return ((q31_t) (x >> 32) != ((q31_t) x >> 31)) ? - ((0x7FFF ^ ((q15_t) (x >> 63)))) : (q15_t) (x >> 15); - } - - /** - * @brief Clips Q31 to Q7 values. - */ - __STATIC_FORCEINLINE q7_t clip_q31_to_q7( - q31_t x) - { - return ((q31_t) (x >> 24) != ((q31_t) x >> 23)) ? - ((0x7F ^ ((q7_t) (x >> 31)))) : (q7_t) x; - } - - /** - * @brief Clips Q31 to Q15 values. - */ - __STATIC_FORCEINLINE q15_t clip_q31_to_q15( - q31_t x) - { - return ((q31_t) (x >> 16) != ((q31_t) x >> 15)) ? - ((0x7FFF ^ ((q15_t) (x >> 31)))) : (q15_t) x; - } - - /** - * @brief Multiplies 32 X 64 and returns 32 bit result in 2.30 format. - */ - __STATIC_FORCEINLINE q63_t mult32x64( - q63_t x, - q31_t y) - { - return ((((q63_t) (x & 0x00000000FFFFFFFF) * y) >> 32) + - (((q63_t) (x >> 32) * y) ) ); - } - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q31 Data type. - */ - __STATIC_FORCEINLINE uint32_t arm_recip_q31( - q31_t in, - q31_t * dst, - const q31_t * pRecipTable) - { - q31_t out; - uint32_t tempVal; - uint32_t index, i; - uint32_t signBits; - - if (in > 0) - { - signBits = ((uint32_t) (__CLZ( in) - 1)); - } - else - { - signBits = ((uint32_t) (__CLZ(-in) - 1)); - } - - /* Convert input sample to 1.31 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 24); - index = (index & INDEX_MASK); - - /* 1.31 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (uint32_t) (((q63_t) in * out) >> 31); - tempVal = 0x7FFFFFFFu - tempVal; - /* 1.31 with exp 1 */ - /* out = (q31_t) (((q63_t) out * tempVal) >> 30); */ - out = clip_q63_to_q31(((q63_t) out * tempVal) >> 30); - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1U); - } - - - /** - * @brief Function to Calculates 1/in (reciprocal) value of Q15 Data type. - */ - __STATIC_FORCEINLINE uint32_t arm_recip_q15( - q15_t in, - q15_t * dst, - const q15_t * pRecipTable) - { - q15_t out = 0; - uint32_t tempVal = 0; - uint32_t index = 0, i = 0; - uint32_t signBits = 0; - - if (in > 0) - { - signBits = ((uint32_t)(__CLZ( in) - 17)); - } - else - { - signBits = ((uint32_t)(__CLZ(-in) - 17)); - } - - /* Convert input sample to 1.15 format */ - in = (in << signBits); - - /* calculation of index for initial approximated Val */ - index = (uint32_t)(in >> 8); - index = (index & INDEX_MASK); - - /* 1.15 with exp 1 */ - out = pRecipTable[index]; - - /* calculation of reciprocal value */ - /* running approximation for two iterations */ - for (i = 0U; i < 2U; i++) - { - tempVal = (uint32_t) (((q31_t) in * out) >> 15); - tempVal = 0x7FFFu - tempVal; - /* 1.15 with exp 1 */ - out = (q15_t) (((q31_t) out * tempVal) >> 14); - /* out = clip_q31_to_q15(((q31_t) out * tempVal) >> 14); */ - } - - /* write output */ - *dst = out; - - /* return num of signbits of out = 1/in value */ - return (signBits + 1); - } - -/** - * @brief Integer exponentiation - * @param[in] x value - * @param[in] nb integer exponent >= 1 - * @return x^nb - * - */ -__STATIC_INLINE float32_t arm_exponent_f32(float32_t x, int32_t nb) -{ - float32_t r = x; - nb --; - while(nb > 0) - { - r = r * x; - nb--; - } - return(r); -} - -/** - * @brief 64-bit to 32-bit unsigned normalization - * @param[in] in is input unsigned long long value - * @param[out] normalized is the 32-bit normalized value - * @param[out] norm is norm scale - */ -__STATIC_INLINE void arm_norm_64_to_32u(uint64_t in, int32_t * normalized, int32_t *norm) -{ - int32_t n1; - int32_t hi = (int32_t) (in >> 32); - int32_t lo = (int32_t) ((in << 32) >> 32); - - n1 = __CLZ(hi) - 32; - if (!n1) - { - /* - * input fits in 32-bit - */ - n1 = __CLZ(lo); - if (!n1) - { - /* - * MSB set, need to scale down by 1 - */ - *norm = -1; - *normalized = (((uint32_t) lo) >> 1); - } else - { - if (n1 == 32) - { - /* - * input is zero - */ - *norm = 0; - *normalized = 0; - } else - { - /* - * 32-bit normalization - */ - *norm = n1 - 1; - *normalized = lo << *norm; - } - } - } else - { - /* - * input fits in 64-bit - */ - n1 = 1 - n1; - *norm = -n1; - /* - * 64 bit normalization - */ - *normalized = (((uint32_t) lo) >> n1) | (hi << (32 - n1)); - } -} - -__STATIC_INLINE q31_t arm_div_q63_to_q31(q63_t num, q31_t den) -{ - q31_t result; - uint64_t absNum; - int32_t normalized; - int32_t norm; - - /* - * if sum fits in 32bits - * avoid costly 64-bit division - */ - absNum = num > 0 ? num : -num; - arm_norm_64_to_32u(absNum, &normalized, &norm); - if (norm > 0) - /* - * 32-bit division - */ - result = (q31_t) num / den; - else - /* - * 64-bit division - */ - result = (q31_t) (num / den); - - return result; -} - - -/* - * @brief C custom defined intrinsic functions - */ -#if !defined (ARM_MATH_DSP) - - /* - * @brief C custom defined QADD8 - */ - __STATIC_FORCEINLINE uint32_t __QADD8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) + (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) + (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) + (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) + (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QSUB8 - */ - __STATIC_FORCEINLINE uint32_t __QSUB8( - uint32_t x, - uint32_t y) - { - q31_t r, s, t, u; - - r = __SSAT(((((q31_t)x << 24) >> 24) - (((q31_t)y << 24) >> 24)), 8) & (int32_t)0x000000FF; - s = __SSAT(((((q31_t)x << 16) >> 24) - (((q31_t)y << 16) >> 24)), 8) & (int32_t)0x000000FF; - t = __SSAT(((((q31_t)x << 8) >> 24) - (((q31_t)y << 8) >> 24)), 8) & (int32_t)0x000000FF; - u = __SSAT(((((q31_t)x ) >> 24) - (((q31_t)y ) >> 24)), 8) & (int32_t)0x000000FF; - - return ((uint32_t)((u << 24) | (t << 16) | (s << 8) | (r ))); - } - - - /* - * @brief C custom defined QADD16 - */ - __STATIC_FORCEINLINE uint32_t __QADD16( - uint32_t x, - uint32_t y) - { -/* q31_t r, s; without initialisation 'arm_offset_q15 test' fails but 'intrinsic' tests pass! for armCC */ - q31_t r = 0, s = 0; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHADD16 - */ - __STATIC_FORCEINLINE uint32_t __SHADD16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSUB16 - */ - __STATIC_FORCEINLINE uint32_t __QSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSUB16 - */ - __STATIC_FORCEINLINE uint32_t __SHSUB16( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QASX - */ - __STATIC_FORCEINLINE uint32_t __QASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHASX - */ - __STATIC_FORCEINLINE uint32_t __SHASX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) - (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) + (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined QSAX - */ - __STATIC_FORCEINLINE uint32_t __QSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = __SSAT(((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)), 16) & (int32_t)0x0000FFFF; - s = __SSAT(((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)), 16) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SHSAX - */ - __STATIC_FORCEINLINE uint32_t __SHSAX( - uint32_t x, - uint32_t y) - { - q31_t r, s; - - r = (((((q31_t)x << 16) >> 16) + (((q31_t)y ) >> 16)) >> 1) & (int32_t)0x0000FFFF; - s = (((((q31_t)x ) >> 16) - (((q31_t)y << 16) >> 16)) >> 1) & (int32_t)0x0000FFFF; - - return ((uint32_t)((s << 16) | (r ))); - } - - - /* - * @brief C custom defined SMUSDX - */ - __STATIC_FORCEINLINE uint32_t __SMUSDX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - /* - * @brief C custom defined SMUADX - */ - __STATIC_FORCEINLINE uint32_t __SMUADX( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) )); - } - - - /* - * @brief C custom defined QADD - */ - __STATIC_FORCEINLINE int32_t __QADD( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x + (q31_t)y))); - } - - - /* - * @brief C custom defined QSUB - */ - __STATIC_FORCEINLINE int32_t __QSUB( - int32_t x, - int32_t y) - { - return ((int32_t)(clip_q63_to_q31((q63_t)x - (q31_t)y))); - } - - - /* - * @brief C custom defined SMLAD - */ - __STATIC_FORCEINLINE uint32_t __SMLAD( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLADX - */ - __STATIC_FORCEINLINE uint32_t __SMLADX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLSDX - */ - __STATIC_FORCEINLINE uint32_t __SMLSDX( - uint32_t x, - uint32_t y, - uint32_t sum) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q31_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALD - */ - __STATIC_FORCEINLINE uint64_t __SMLALD( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) (y >> 16)) + ((q15_t) x * (q15_t) y)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMLALDX - */ - __STATIC_FORCEINLINE uint64_t __SMLALDX( - uint32_t x, - uint32_t y, - uint64_t sum) - { -/* return (sum + ((q15_t) (x >> 16) * (q15_t) y)) + ((q15_t) x * (q15_t) (y >> 16)); */ - return ((uint64_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y ) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y << 16) >> 16)) + - ( ((q63_t)sum ) ) )); - } - - - /* - * @brief C custom defined SMUAD - */ - __STATIC_FORCEINLINE uint32_t __SMUAD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) + - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SMUSD - */ - __STATIC_FORCEINLINE uint32_t __SMUSD( - uint32_t x, - uint32_t y) - { - return ((uint32_t)(((((q31_t)x << 16) >> 16) * (((q31_t)y << 16) >> 16)) - - ((((q31_t)x ) >> 16) * (((q31_t)y ) >> 16)) )); - } - - - /* - * @brief C custom defined SXTB16 - */ - __STATIC_FORCEINLINE uint32_t __SXTB16( - uint32_t x) - { - return ((uint32_t)(((((q31_t)x << 24) >> 24) & (q31_t)0x0000FFFF) | - ((((q31_t)x << 8) >> 8) & (q31_t)0xFFFF0000) )); - } - - /* - * @brief C custom defined SMMLA - */ - __STATIC_FORCEINLINE int32_t __SMMLA( - int32_t x, - int32_t y, - int32_t sum) - { - return (sum + (int32_t) (((int64_t) x * y) >> 32)); - } - -#endif /* !defined (ARM_MATH_DSP) */ - - - /** - * @brief Instance structure for the Q7 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q7_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q7; - - /** - * @brief Instance structure for the Q15 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - } arm_fir_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of filter coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - } arm_fir_instance_f32; - - /** - * @brief Processing function for the Q7 FIR filter. - * @param[in] S points to an instance of the Q7 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q7( - const arm_fir_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q7 FIR filter. - * @param[in,out] S points to an instance of the Q7 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed. - * - * For the MVE version, the coefficient length must be a multiple of 16. - * You can pad with zeros if you have less coefficients. - */ - void arm_fir_init_q7( - arm_fir_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q15 FIR filter. - * @param[in] S points to an instance of the Q15 FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q15 FIR filter (fast version). - * @param[in] S points to an instance of the Q15 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q15( - const arm_fir_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 FIR filter. - * @param[in,out] S points to an instance of the Q15 FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. Must be even and greater than or equal to 4. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * @return The function returns either - * ARM_MATH_SUCCESS if initialization was successful or - * ARM_MATH_ARGUMENT_ERROR if numTaps is not a supported value. - * - * For the MVE version, the coefficient length must be a multiple of 8. - * You can pad with zeros if you have less coefficients. - * - */ - arm_status arm_fir_init_q15( - arm_fir_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR filter. - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the fast Q31 FIR filter (fast version). - * @param[in] S points to an instance of the Q31 FIR filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_fast_q31( - const arm_fir_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 FIR filter. - * @param[in,out] S points to an instance of the Q31 FIR structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - * - * For the MVE version, the coefficient length must be a multiple of 4. - * You can pad with zeros if you have less coefficients. - */ - void arm_fir_init_q31( - arm_fir_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - /** - * @brief Processing function for the floating-point FIR filter. - * @param[in] S points to an instance of the floating-point FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_f32( - const arm_fir_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point FIR filter. - * @param[in,out] S points to an instance of the floating-point FIR filter structure. - * @param[in] numTaps Number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of samples that are processed at a time. - */ - void arm_fir_init_f32( - arm_fir_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - /** - * @brief Instance structure for the Q15 Biquad cascade filter. - */ - typedef struct - { - int8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q15_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q15_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - int8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q15; - - /** - * @brief Instance structure for the Q31 Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q31_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< Additional shift, in bits, applied to each output sample. */ - } arm_biquad_casd_df1_inst_q31; - - /** - * @brief Instance structure for the floating-point Biquad cascade filter. - */ - typedef struct - { - uint32_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< Points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< Points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_casd_df1_inst_f32; - -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - /** - * @brief Instance structure for the modified Biquad coefs required by vectorized code. - */ - typedef struct - { - float32_t coeffs[8][4]; /**< Points to the array of modified coefficients. The array is of length 32. There is one per stage */ - } arm_biquad_mod_coef_f32; -#endif - - /** - * @brief Processing function for the Q15 Biquad cascade filter. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q15 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q15( - arm_biquad_casd_df1_inst_q15 * S, - uint8_t numStages, - const q15_t * pCoeffs, - q15_t * pState, - int8_t postShift); - - /** - * @brief Fast but less precise processing function for the Q15 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q15( - const arm_biquad_casd_df1_inst_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 Biquad cascade filter - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Fast but less precise processing function for the Q31 Biquad cascade filter for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_fast_q31( - const arm_biquad_casd_df1_inst_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the Q31 Biquad cascade filter. - * @param[in,out] S points to an instance of the Q31 Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift Shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cascade_df1_init_q31( - arm_biquad_casd_df1_inst_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q31_t * pState, - int8_t postShift); - - /** - * @brief Processing function for the floating-point Biquad cascade filter. - * @param[in] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df1_f32( - const arm_biquad_casd_df1_inst_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point Biquad cascade filter. - * @param[in,out] S points to an instance of the floating-point Biquad cascade structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pCoeffsMod points to the modified filter coefficients (only MVE version). - * @param[in] pState points to the state buffer. - */ -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - void arm_biquad_cascade_df1_mve_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - arm_biquad_mod_coef_f32 * pCoeffsMod, - float32_t * pState); -#endif - - void arm_biquad_cascade_df1_init_f32( - arm_biquad_casd_df1_inst_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise AND of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_and_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise OR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_or_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u16( - const uint16_t * pSrc, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u32( - const uint32_t * pSrc, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise NOT of a fixed-point vector. - * @param[in] pSrc points to input vector - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_not_u8( - const uint8_t * pSrc, - uint8_t * pDst, - uint32_t blockSize); - -/** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u16( - const uint16_t * pSrcA, - const uint16_t * pSrcB, - uint16_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u32( - const uint32_t * pSrcA, - const uint32_t * pSrcB, - uint32_t * pDst, - uint32_t blockSize); - - /** - * @brief Compute the logical bitwise XOR of two fixed-point vectors. - * @param[in] pSrcA points to input vector A - * @param[in] pSrcB points to input vector B - * @param[out] pDst points to output vector - * @param[in] blockSize number of samples in each vector - * @return none - */ - void arm_xor_u8( - const uint8_t * pSrcA, - const uint8_t * pSrcB, - uint8_t * pDst, - uint32_t blockSize); - - /** - * @brief Struct for specifying sorting algorithm - */ - typedef enum - { - ARM_SORT_BITONIC = 0, - /**< Bitonic sort */ - ARM_SORT_BUBBLE = 1, - /**< Bubble sort */ - ARM_SORT_HEAP = 2, - /**< Heap sort */ - ARM_SORT_INSERTION = 3, - /**< Insertion sort */ - ARM_SORT_QUICK = 4, - /**< Quick sort */ - ARM_SORT_SELECTION = 5 - /**< Selection sort */ - } arm_sort_alg; - - /** - * @brief Struct for specifying sorting algorithm - */ - typedef enum - { - ARM_SORT_DESCENDING = 0, - /**< Descending order (9 to 0) */ - ARM_SORT_ASCENDING = 1 - /**< Ascending order (0 to 9) */ - } arm_sort_dir; - - /** - * @brief Instance structure for the sorting algorithms. - */ - typedef struct - { - arm_sort_alg alg; /**< Sorting algorithm selected */ - arm_sort_dir dir; /**< Sorting order (direction) */ - } arm_sort_instance_f32; - - /** - * @param[in] S points to an instance of the sorting structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_sort_f32( - const arm_sort_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @param[in,out] S points to an instance of the sorting structure. - * @param[in] alg Selected algorithm. - * @param[in] dir Sorting order. - */ - void arm_sort_init_f32( - arm_sort_instance_f32 * S, - arm_sort_alg alg, - arm_sort_dir dir); - - /** - * @brief Instance structure for the sorting algorithms. - */ - typedef struct - { - arm_sort_dir dir; /**< Sorting order (direction) */ - float32_t * buffer; /**< Working buffer */ - } arm_merge_sort_instance_f32; - - /** - * @param[in] S points to an instance of the sorting structure. - * @param[in,out] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_merge_sort_f32( - const arm_merge_sort_instance_f32 * S, - float32_t *pSrc, - float32_t *pDst, - uint32_t blockSize); - - /** - * @param[in,out] S points to an instance of the sorting structure. - * @param[in] dir Sorting order. - * @param[in] buffer Working buffer. - */ - void arm_merge_sort_init_f32( - arm_merge_sort_instance_f32 * S, - arm_sort_dir dir, - float32_t * buffer); - - /** - * @brief Struct for specifying cubic spline type - */ - typedef enum - { - ARM_SPLINE_NATURAL = 0, /**< Natural spline */ - ARM_SPLINE_PARABOLIC_RUNOUT = 1 /**< Parabolic runout spline */ - } arm_spline_type; - - /** - * @brief Instance structure for the floating-point cubic spline interpolation. - */ - typedef struct - { - arm_spline_type type; /**< Type (boundary conditions) */ - const float32_t * x; /**< x values */ - const float32_t * y; /**< y values */ - uint32_t n_x; /**< Number of known data points */ - float32_t * coeffs; /**< Coefficients buffer (b,c, and d) */ - } arm_spline_instance_f32; - - /** - * @brief Processing function for the floating-point cubic spline interpolation. - * @param[in] S points to an instance of the floating-point spline structure. - * @param[in] xq points to the x values ot the interpolated data points. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples of output data. - */ - void arm_spline_f32( - arm_spline_instance_f32 * S, - const float32_t * xq, - float32_t * pDst, - uint32_t blockSize); - - /** - * @brief Initialization function for the floating-point cubic spline interpolation. - * @param[in,out] S points to an instance of the floating-point spline structure. - * @param[in] type type of cubic spline interpolation (boundary conditions) - * @param[in] x points to the x values of the known data points. - * @param[in] y points to the y values of the known data points. - * @param[in] n number of known data points. - * @param[in] coeffs coefficients array for b, c, and d - * @param[in] tempBuffer buffer array for internal computations - */ - void arm_spline_init_f32( - arm_spline_instance_f32 * S, - arm_spline_type type, - const float32_t * x, - const float32_t * y, - uint32_t n, - float32_t * coeffs, - float32_t * tempBuffer); - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float32_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f32; - - /** - * @brief Instance structure for the floating-point matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - float64_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_f64; - - /** - * @brief Instance structure for the Q15 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q15_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q15; - - /** - * @brief Instance structure for the Q31 matrix structure. - */ - typedef struct - { - uint16_t numRows; /**< number of rows of the matrix. */ - uint16_t numCols; /**< number of columns of the matrix. */ - q31_t *pData; /**< points to the data of the matrix. */ - } arm_matrix_instance_q31; - - /** - * @brief Floating-point matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix addition. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_add_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pScratch); - - /** - * @brief Q31, complex, matrix multiplication. - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_cmplx_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_f32( - const arm_matrix_instance_f32 * pSrc, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_q15( - const arm_matrix_instance_q15 * pSrc, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix transpose. - * @param[in] pSrc points to the input matrix - * @param[out] pDst points to the output matrix - * @return The function returns either ARM_MATH_SIZE_MISMATCH - * or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_trans_q31( - const arm_matrix_instance_q31 * pSrc, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q15 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @param[in] pState points to the array for storing intermediate results - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_fast_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst, - q15_t * pState); - - /** - * @brief Q31 matrix multiplication - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix multiplication (fast variant) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_mult_fast_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_f32( - const arm_matrix_instance_f32 * pSrcA, - const arm_matrix_instance_f32 * pSrcB, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_q15( - const arm_matrix_instance_q15 * pSrcA, - const arm_matrix_instance_q15 * pSrcB, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix subtraction - * @param[in] pSrcA points to the first input matrix structure - * @param[in] pSrcB points to the second input matrix structure - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_sub_q31( - const arm_matrix_instance_q31 * pSrcA, - const arm_matrix_instance_q31 * pSrcB, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Floating-point matrix scaling. - * @param[in] pSrc points to the input matrix - * @param[in] scale scale factor - * @param[out] pDst points to the output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_f32( - const arm_matrix_instance_f32 * pSrc, - float32_t scale, - arm_matrix_instance_f32 * pDst); - - /** - * @brief Q15 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_q15( - const arm_matrix_instance_q15 * pSrc, - q15_t scaleFract, - int32_t shift, - arm_matrix_instance_q15 * pDst); - - /** - * @brief Q31 matrix scaling. - * @param[in] pSrc points to input matrix - * @param[in] scaleFract fractional portion of the scale factor - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to output matrix structure - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - */ -arm_status arm_mat_scale_q31( - const arm_matrix_instance_q31 * pSrc, - q31_t scaleFract, - int32_t shift, - arm_matrix_instance_q31 * pDst); - - /** - * @brief Q31 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_q31( - arm_matrix_instance_q31 * S, - uint16_t nRows, - uint16_t nColumns, - q31_t * pData); - - /** - * @brief Q15 matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_q15( - arm_matrix_instance_q15 * S, - uint16_t nRows, - uint16_t nColumns, - q15_t * pData); - - /** - * @brief Floating-point matrix initialization. - * @param[in,out] S points to an instance of the floating-point matrix structure. - * @param[in] nRows number of rows in the matrix. - * @param[in] nColumns number of columns in the matrix. - * @param[in] pData points to the matrix data array. - */ -void arm_mat_init_f32( - arm_matrix_instance_f32 * S, - uint16_t nRows, - uint16_t nColumns, - float32_t * pData); - - - /** - * @brief Instance structure for the Q15 PID Control. - */ - typedef struct - { - q15_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ -#if !defined (ARM_MATH_DSP) - q15_t A1; - q15_t A2; -#else - q31_t A1; /**< The derived gain A1 = -Kp - 2Kd | Kd.*/ -#endif - q15_t state[3]; /**< The state array of length 3. */ - q15_t Kp; /**< The proportional gain. */ - q15_t Ki; /**< The integral gain. */ - q15_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q15; - - /** - * @brief Instance structure for the Q31 PID Control. - */ - typedef struct - { - q31_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - q31_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - q31_t A2; /**< The derived gain, A2 = Kd . */ - q31_t state[3]; /**< The state array of length 3. */ - q31_t Kp; /**< The proportional gain. */ - q31_t Ki; /**< The integral gain. */ - q31_t Kd; /**< The derivative gain. */ - } arm_pid_instance_q31; - - /** - * @brief Instance structure for the floating-point PID Control. - */ - typedef struct - { - float32_t A0; /**< The derived gain, A0 = Kp + Ki + Kd . */ - float32_t A1; /**< The derived gain, A1 = -Kp - 2Kd. */ - float32_t A2; /**< The derived gain, A2 = Kd . */ - float32_t state[3]; /**< The state array of length 3. */ - float32_t Kp; /**< The proportional gain. */ - float32_t Ki; /**< The integral gain. */ - float32_t Kd; /**< The derivative gain. */ - } arm_pid_instance_f32; - - - - /** - * @brief Initialization function for the floating-point PID Control. - * @param[in,out] S points to an instance of the PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_f32( - arm_pid_instance_f32 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - */ - void arm_pid_reset_f32( - arm_pid_instance_f32 * S); - - - /** - * @brief Initialization function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q31( - arm_pid_instance_q31 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q31 PID Control. - * @param[in,out] S points to an instance of the Q31 PID Control structure - */ - - void arm_pid_reset_q31( - arm_pid_instance_q31 * S); - - - /** - * @brief Initialization function for the Q15 PID Control. - * @param[in,out] S points to an instance of the Q15 PID structure. - * @param[in] resetStateFlag flag to reset the state. 0 = no change in state 1 = reset the state. - */ - void arm_pid_init_q15( - arm_pid_instance_q15 * S, - int32_t resetStateFlag); - - - /** - * @brief Reset function for the Q15 PID Control. - * @param[in,out] S points to an instance of the q15 PID Control structure - */ - void arm_pid_reset_q15( - arm_pid_instance_q15 * S); - - - /** - * @brief Instance structure for the floating-point Linear Interpolate function. - */ - typedef struct - { - uint32_t nValues; /**< nValues */ - float32_t x1; /**< x1 */ - float32_t xSpacing; /**< xSpacing */ - float32_t *pYData; /**< pointer to the table of Y values */ - } arm_linear_interp_instance_f32; - - /** - * @brief Instance structure for the floating-point bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - float32_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_f32; - - /** - * @brief Instance structure for the Q31 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q31_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q31; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q15_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q15; - - /** - * @brief Instance structure for the Q15 bilinear interpolation function. - */ - typedef struct - { - uint16_t numRows; /**< number of rows in the data table. */ - uint16_t numCols; /**< number of columns in the data table. */ - q7_t *pData; /**< points to the data table. */ - } arm_bilinear_interp_instance_q7; - - - /** - * @brief Q7 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector multiplication. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_mult_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the Sin twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q15( - arm_cfft_radix2_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q15( - const arm_cfft_radix2_instance_q15 * S, - q15_t * pSrc); - - - /** - * @brief Instance structure for the Q15 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q15; - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q15( - arm_cfft_radix4_instance_q15 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_q15( - const arm_cfft_radix4_instance_q15 * S, - q15_t * pSrc); - - /** - * @brief Instance structure for the Radix-2 Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix2_instance_q31; - -/* Deprecated */ - arm_status arm_cfft_radix2_init_q31( - arm_cfft_radix2_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_q31( - const arm_cfft_radix2_instance_q31 * S, - q31_t * pSrc); - - /** - * @brief Instance structure for the Q31 CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - } arm_cfft_radix4_instance_q31; - -/* Deprecated */ - void arm_cfft_radix4_q31( - const arm_cfft_radix4_instance_q31 * S, - q31_t * pSrc); - -/* Deprecated */ - arm_status arm_cfft_radix4_init_q31( - arm_cfft_radix4_instance_q31 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix2_instance_f32; - - -/* Deprecated */ - arm_status arm_cfft_radix2_init_f32( - arm_cfft_radix2_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix2_f32( - const arm_cfft_radix2_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - uint8_t ifftFlag; /**< flag that selects forward (ifftFlag=0) or inverse (ifftFlag=1) transform. */ - uint8_t bitReverseFlag; /**< flag that enables (bitReverseFlag=1) or disables (bitReverseFlag=0) bit reversal of output. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t twidCoefModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - uint16_t bitRevFactor; /**< bit reversal modifier that supports different size FFTs with the same bit reversal table. */ - float32_t onebyfftLen; /**< value of 1/fftLen. */ - } arm_cfft_radix4_instance_f32; - - - -/* Deprecated */ - arm_status arm_cfft_radix4_init_f32( - arm_cfft_radix4_instance_f32 * S, - uint16_t fftLen, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - -/* Deprecated */ - void arm_cfft_radix4_f32( - const arm_cfft_radix4_instance_f32 * S, - float32_t * pSrc); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q15_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEI) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q15_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q15_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q15_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_q15; - -arm_status arm_cfft_init_q15( - arm_cfft_instance_q15 * S, - uint16_t fftLen); - -void arm_cfft_q15( - const arm_cfft_instance_q15 * S, - q15_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the fixed-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const q31_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEI) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const q31_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const q31_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const q31_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_q31; - -arm_status arm_cfft_init_q31( - arm_cfft_instance_q31 * S, - uint16_t fftLen); - -void arm_cfft_q31( - const arm_cfft_instance_q31 * S, - q31_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float32_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ -#if defined(ARM_MATH_MVEF) && !defined(ARM_MATH_AUTOVECTORIZE) - const uint32_t *rearranged_twiddle_tab_stride1_arr; /**< Per stage reordered twiddle pointer (offset 1) */ \ - const uint32_t *rearranged_twiddle_tab_stride2_arr; /**< Per stage reordered twiddle pointer (offset 2) */ \ - const uint32_t *rearranged_twiddle_tab_stride3_arr; /**< Per stage reordered twiddle pointer (offset 3) */ \ - const float32_t *rearranged_twiddle_stride1; /**< reordered twiddle offset 1 storage */ \ - const float32_t *rearranged_twiddle_stride2; /**< reordered twiddle offset 2 storage */ \ - const float32_t *rearranged_twiddle_stride3; -#endif - } arm_cfft_instance_f32; - - - - arm_status arm_cfft_init_f32( - arm_cfft_instance_f32 * S, - uint16_t fftLen); - - void arm_cfft_f32( - const arm_cfft_instance_f32 * S, - float32_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - - /** - * @brief Instance structure for the Double Precision Floating-point CFFT/CIFFT function. - */ - typedef struct - { - uint16_t fftLen; /**< length of the FFT. */ - const float64_t *pTwiddle; /**< points to the Twiddle factor table. */ - const uint16_t *pBitRevTable; /**< points to the bit reversal table. */ - uint16_t bitRevLength; /**< bit reversal table length. */ - } arm_cfft_instance_f64; - - arm_status arm_cfft_init_f64( - arm_cfft_instance_f64 * S, - uint16_t fftLen); - - void arm_cfft_f64( - const arm_cfft_instance_f64 * S, - float64_t * p1, - uint8_t ifftFlag, - uint8_t bitReverseFlag); - - /** - * @brief Instance structure for the Q15 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q15_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q15_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#if defined(ARM_MATH_MVEI) - arm_cfft_instance_q15 cfftInst; -#else - const arm_cfft_instance_q15 *pCfft; /**< points to the complex FFT instance. */ -#endif - } arm_rfft_instance_q15; - - arm_status arm_rfft_init_q15( - arm_rfft_instance_q15 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q15( - const arm_rfft_instance_q15 * S, - q15_t * pSrc, - q15_t * pDst); - - /** - * @brief Instance structure for the Q31 RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const q31_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const q31_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ -#if defined(ARM_MATH_MVEI) - arm_cfft_instance_q31 cfftInst; -#else - const arm_cfft_instance_q31 *pCfft; /**< points to the complex FFT instance. */ -#endif - } arm_rfft_instance_q31; - - arm_status arm_rfft_init_q31( - arm_rfft_instance_q31 * S, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_q31( - const arm_rfft_instance_q31 * S, - q31_t * pSrc, - q31_t * pDst); - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ - typedef struct - { - uint32_t fftLenReal; /**< length of the real FFT. */ - uint16_t fftLenBy2; /**< length of the complex FFT. */ - uint8_t ifftFlagR; /**< flag that selects forward (ifftFlagR=0) or inverse (ifftFlagR=1) transform. */ - uint8_t bitReverseFlagR; /**< flag that enables (bitReverseFlagR=1) or disables (bitReverseFlagR=0) bit reversal of output. */ - uint32_t twidCoefRModifier; /**< twiddle coefficient modifier that supports different size FFTs with the same twiddle factor table. */ - const float32_t *pTwiddleAReal; /**< points to the real twiddle factor table. */ - const float32_t *pTwiddleBReal; /**< points to the imag twiddle factor table. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_rfft_instance_f32; - - arm_status arm_rfft_init_f32( - arm_rfft_instance_f32 * S, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint32_t fftLenReal, - uint32_t ifftFlagR, - uint32_t bitReverseFlag); - - void arm_rfft_f32( - const arm_rfft_instance_f32 * S, - float32_t * pSrc, - float32_t * pDst); - - /** - * @brief Instance structure for the Double Precision Floating-point RFFT/RIFFT function. - */ -typedef struct - { - arm_cfft_instance_f64 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float64_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f64 ; - -arm_status arm_rfft_fast_init_f64 ( - arm_rfft_fast_instance_f64 * S, - uint16_t fftLen); - - -void arm_rfft_fast_f64( - arm_rfft_fast_instance_f64 * S, - float64_t * p, float64_t * pOut, - uint8_t ifftFlag); - - - /** - * @brief Instance structure for the floating-point RFFT/RIFFT function. - */ -typedef struct - { - arm_cfft_instance_f32 Sint; /**< Internal CFFT structure. */ - uint16_t fftLenRFFT; /**< length of the real sequence */ - const float32_t * pTwiddleRFFT; /**< Twiddle factors real stage */ - } arm_rfft_fast_instance_f32 ; - -arm_status arm_rfft_fast_init_f32 ( - arm_rfft_fast_instance_f32 * S, - uint16_t fftLen); - - - void arm_rfft_fast_f32( - const arm_rfft_fast_instance_f32 * S, - float32_t * p, float32_t * pOut, - uint8_t ifftFlag); - - /** - * @brief Instance structure for the floating-point DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - float32_t normalize; /**< normalizing factor. */ - const float32_t *pTwiddle; /**< points to the twiddle factor table. */ - const float32_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_f32 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_f32 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_f32; - - - /** - * @brief Initialization function for the floating-point DCT4/IDCT4. - * @param[in,out] S points to an instance of floating-point DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of floating-point RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of floating-point CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if fftLenReal is not a supported transform length. - */ - arm_status arm_dct4_init_f32( - arm_dct4_instance_f32 * S, - arm_rfft_instance_f32 * S_RFFT, - arm_cfft_radix4_instance_f32 * S_CFFT, - uint16_t N, - uint16_t Nby2, - float32_t normalize); - - - /** - * @brief Processing function for the floating-point DCT4/IDCT4. - * @param[in] S points to an instance of the floating-point DCT4/IDCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_f32( - const arm_dct4_instance_f32 * S, - float32_t * pState, - float32_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q31 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q31_t normalize; /**< normalizing factor. */ - const q31_t *pTwiddle; /**< points to the twiddle factor table. */ - const q31_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q31 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q31 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q31; - - - /** - * @brief Initialization function for the Q31 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q31 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q31 RFFT/RIFFT structure - * @param[in] S_CFFT points to an instance of Q31 CFFT/CIFFT structure - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q31( - arm_dct4_instance_q31 * S, - arm_rfft_instance_q31 * S_RFFT, - arm_cfft_radix4_instance_q31 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q31_t normalize); - - - /** - * @brief Processing function for the Q31 DCT4/IDCT4. - * @param[in] S points to an instance of the Q31 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q31( - const arm_dct4_instance_q31 * S, - q31_t * pState, - q31_t * pInlineBuffer); - - - /** - * @brief Instance structure for the Q15 DCT4/IDCT4 function. - */ - typedef struct - { - uint16_t N; /**< length of the DCT4. */ - uint16_t Nby2; /**< half of the length of the DCT4. */ - q15_t normalize; /**< normalizing factor. */ - const q15_t *pTwiddle; /**< points to the twiddle factor table. */ - const q15_t *pCosFactor; /**< points to the cosFactor table. */ - arm_rfft_instance_q15 *pRfft; /**< points to the real FFT instance. */ - arm_cfft_radix4_instance_q15 *pCfft; /**< points to the complex FFT instance. */ - } arm_dct4_instance_q15; - - - /** - * @brief Initialization function for the Q15 DCT4/IDCT4. - * @param[in,out] S points to an instance of Q15 DCT4/IDCT4 structure. - * @param[in] S_RFFT points to an instance of Q15 RFFT/RIFFT structure. - * @param[in] S_CFFT points to an instance of Q15 CFFT/CIFFT structure. - * @param[in] N length of the DCT4. - * @param[in] Nby2 half of the length of the DCT4. - * @param[in] normalize normalizing factor. - * @return arm_status function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_ARGUMENT_ERROR if N is not a supported transform length. - */ - arm_status arm_dct4_init_q15( - arm_dct4_instance_q15 * S, - arm_rfft_instance_q15 * S_RFFT, - arm_cfft_radix4_instance_q15 * S_CFFT, - uint16_t N, - uint16_t Nby2, - q15_t normalize); - - - /** - * @brief Processing function for the Q15 DCT4/IDCT4. - * @param[in] S points to an instance of the Q15 DCT4 structure. - * @param[in] pState points to state buffer. - * @param[in,out] pInlineBuffer points to the in-place input and output buffer. - */ - void arm_dct4_q15( - const arm_dct4_instance_q15 * S, - q15_t * pState, - q15_t * pInlineBuffer); - - - /** - * @brief Floating-point vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Q7 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector addition. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_add_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Q7 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q15 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector subtraction. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in each vector - */ - void arm_sub_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a floating-point vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scale scale factor to be applied - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_f32( - const float32_t * pSrc, - float32_t scale, - float32_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Multiplies a Q7 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q7( - const q7_t * pSrc, - q7_t scaleFract, - int8_t shift, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q15 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q15( - const q15_t * pSrc, - q15_t scaleFract, - int8_t shift, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Multiplies a Q31 vector by a scalar. - * @param[in] pSrc points to the input vector - * @param[in] scaleFract fractional portion of the scale value - * @param[in] shift number of bits to shift the result by - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_scale_q31( - const q31_t * pSrc, - q31_t scaleFract, - int8_t shift, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q7 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Floating-point vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - - - /** - * @brief Q15 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Q31 vector absolute value. - * @param[in] pSrc points to the input buffer - * @param[out] pDst points to the output buffer - * @param[in] blockSize number of samples in each vector - */ - void arm_abs_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Dot product of floating-point vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t * result); - - - - /** - * @brief Dot product of Q7 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q7( - const q7_t * pSrcA, - const q7_t * pSrcB, - uint32_t blockSize, - q31_t * result); - - - /** - * @brief Dot product of Q15 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Dot product of Q31 vectors. - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[out] result output result returned here - */ - void arm_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t blockSize, - q63_t * result); - - - /** - * @brief Shifts the elements of a Q7 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q7( - const q7_t * pSrc, - int8_t shiftBits, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q15 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q15( - const q15_t * pSrc, - int8_t shiftBits, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Shifts the elements of a Q31 vector a specified number of bits. - * @param[in] pSrc points to the input vector - * @param[in] shiftBits number of bits to shift. A positive value shifts left; a negative value shifts right. - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_shift_q31( - const q31_t * pSrc, - int8_t shiftBits, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_f32( - const float32_t * pSrc, - float32_t offset, - float32_t * pDst, - uint32_t blockSize); - - - - /** - * @brief Adds a constant offset to a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q7( - const q7_t * pSrc, - q7_t offset, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q15( - const q15_t * pSrc, - q15_t offset, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Adds a constant offset to a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[in] offset is the offset to be added - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_offset_q31( - const q31_t * pSrc, - q31_t offset, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a floating-point vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q7 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q15 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Negates the elements of a Q31 vector. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] blockSize number of samples in the vector - */ - void arm_negate_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a floating-point vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q7 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q7( - const q7_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Copies the elements of a Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_copy_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a floating-point vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_f32( - float32_t value, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q7 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q7( - q7_t value, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q15 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q15( - q15_t value, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Fills a constant value into a Q31 vector. - * @param[in] value input value to be filled - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_fill_q31( - q31_t value, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - - /** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the location where the output result is written. Length srcALen+srcBLen-1. - */ - void arm_conv_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - - /** - * @brief Convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - */ - void arm_conv_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_conv_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length srcALen+srcBLen-1. - */ - void arm_conv_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Partial convolution of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q15 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q15 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Partial convolution of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q31 sequences (fast version) for Cortex-M3 and Cortex-M4 - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Partial convolution of Q7 sequences - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints, - q15_t * pScratch1, - q15_t * pScratch2); - - -/** - * @brief Partial convolution of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data - * @param[in] firstIndex is the first output sample to start with. - * @param[in] numPoints is the number of output points to be computed. - * @return Returns either ARM_MATH_SUCCESS if the function completed correctly or ARM_MATH_ARGUMENT_ERROR if the requested subset is not in the range [0 srcALen+srcBLen-2]. - */ - arm_status arm_conv_partial_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - uint32_t firstIndex, - uint32_t numPoints); - - - /** - * @brief Instance structure for the Q15 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR decimator. - */ - typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_q31; - -/** - @brief Instance structure for floating-point FIR decimator. - */ -typedef struct - { - uint8_t M; /**< decimation factor. */ - uint16_t numTaps; /**< number of coefficients in the filter. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - } arm_fir_decimate_instance_f32; - - -/** - @brief Processing function for floating-point FIR decimator. - @param[in] S points to an instance of the floating-point FIR decimator structure - @param[in] pSrc points to the block of input data - @param[out] pDst points to the block of output data - @param[in] blockSize number of samples to process - */ -void arm_fir_decimate_f32( - const arm_fir_decimate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - -/** - @brief Initialization function for the floating-point FIR decimator. - @param[in,out] S points to an instance of the floating-point FIR decimator structure - @param[in] numTaps number of coefficients in the filter - @param[in] M decimation factor - @param[in] pCoeffs points to the filter coefficients - @param[in] pState points to the state buffer - @param[in] blockSize number of input samples to process per call - @return execution status - - \ref ARM_MATH_SUCCESS : Operation successful - - \ref ARM_MATH_LENGTH_ERROR : blockSize is not a multiple of M - */ -arm_status arm_fir_decimate_init_f32( - arm_fir_decimate_instance_f32 * S, - uint16_t numTaps, - uint8_t M, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q15 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q15( - const arm_fir_decimate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR decimator. - * @param[in,out] S points to an instance of the Q15 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q15( - arm_fir_decimate_instance_q15 * S, - uint16_t numTaps, - uint8_t M, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR decimator. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - /** - * @brief Processing function for the Q31 FIR decimator (fast variant) for Cortex-M3 and Cortex-M4. - * @param[in] S points to an instance of the Q31 FIR decimator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_decimate_fast_q31( - const arm_fir_decimate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR decimator. - * @param[in,out] S points to an instance of the Q31 FIR decimator structure. - * @param[in] numTaps number of coefficients in the filter. - * @param[in] M decimation factor. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * blockSize is not a multiple of M. - */ - arm_status arm_fir_decimate_init_q31( - arm_fir_decimate_instance_q31 * S, - uint16_t numTaps, - uint8_t M, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q15_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - q31_t *pState; /**< points to the state variable array. The array is of length blockSize+phaseLength-1. */ - } arm_fir_interpolate_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR interpolator. - */ - typedef struct - { - uint8_t L; /**< upsample factor. */ - uint16_t phaseLength; /**< length of each polyphase filter component. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length L*phaseLength. */ - float32_t *pState; /**< points to the state variable array. The array is of length phaseLength+numTaps-1. */ - } arm_fir_interpolate_instance_f32; - - - /** - * @brief Processing function for the Q15 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q15( - const arm_fir_interpolate_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 FIR interpolator. - * @param[in,out] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q15( - arm_fir_interpolate_instance_q15 * S, - uint8_t L, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 FIR interpolator. - * @param[in] S points to an instance of the Q15 FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_q31( - const arm_fir_interpolate_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR interpolator. - * @param[in,out] S points to an instance of the Q31 FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_q31( - arm_fir_interpolate_instance_q31 * S, - uint8_t L, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point FIR interpolator. - * @param[in] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_interpolate_f32( - const arm_fir_interpolate_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point FIR interpolator. - * @param[in,out] S points to an instance of the floating-point FIR interpolator structure. - * @param[in] L upsample factor. - * @param[in] numTaps number of filter coefficients in the filter. - * @param[in] pCoeffs points to the filter coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] blockSize number of input samples to process per call. - * @return The function returns ARM_MATH_SUCCESS if initialization is successful or ARM_MATH_LENGTH_ERROR if - * the filter length numTaps is not a multiple of the interpolation factor L. - */ - arm_status arm_fir_interpolate_init_f32( - arm_fir_interpolate_instance_f32 * S, - uint8_t L, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the high precision Q31 Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - q63_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const q31_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - uint8_t postShift; /**< additional shift, in bits, applied to each output sample. */ - } arm_biquad_cas_df1_32x64_ins_q31; - - - /** - * @param[in] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cas_df1_32x64_q31( - const arm_biquad_cas_df1_32x64_ins_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @param[in,out] S points to an instance of the high precision Q31 Biquad cascade filter structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] postShift shift to be applied to the output. Varies according to the coefficients format - */ - void arm_biquad_cas_df1_32x64_init_q31( - arm_biquad_cas_df1_32x64_ins_q31 * S, - uint8_t numStages, - const q31_t * pCoeffs, - q63_t * pState, - uint8_t postShift); - - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float32_t *pState; /**< points to the array of state coefficients. The array is of length 4*numStages. */ - const float32_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_stereo_df2T_instance_f32; - - /** - * @brief Instance structure for the floating-point transposed direct form II Biquad cascade filter. - */ - typedef struct - { - uint8_t numStages; /**< number of 2nd order stages in the filter. Overall order is 2*numStages. */ - float64_t *pState; /**< points to the array of state coefficients. The array is of length 2*numStages. */ - const float64_t *pCoeffs; /**< points to the array of coefficients. The array is of length 5*numStages. */ - } arm_biquad_cascade_df2T_instance_f64; - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f32( - const arm_biquad_cascade_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. 2 channels - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_stereo_df2T_f32( - const arm_biquad_cascade_stereo_df2T_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Processing function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in] S points to an instance of the filter data structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_biquad_cascade_df2T_f64( - const arm_biquad_cascade_df2T_instance_f64 * S, - const float64_t * pSrc, - float64_t * pDst, - uint32_t blockSize); - - -#if defined(ARM_MATH_NEON) -void arm_biquad_cascade_df2T_compute_coefs_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - float32_t * pCoeffs); -#endif - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f32( - arm_biquad_cascade_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_stereo_df2T_init_f32( - arm_biquad_cascade_stereo_df2T_instance_f32 * S, - uint8_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Initialization function for the floating-point transposed direct form II Biquad cascade filter. - * @param[in,out] S points to an instance of the filter data structure. - * @param[in] numStages number of 2nd order stages in the filter. - * @param[in] pCoeffs points to the filter coefficients. - * @param[in] pState points to the state buffer. - */ - void arm_biquad_cascade_df2T_init_f64( - arm_biquad_cascade_df2T_instance_f64 * S, - uint8_t numStages, - const float64_t * pCoeffs, - float64_t * pState); - - - /** - * @brief Instance structure for the Q15 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point FIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of filter stages. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numStages. */ - } arm_fir_lattice_instance_f32; - - - /** - * @brief Initialization function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q15( - arm_fir_lattice_instance_q15 * S, - uint16_t numStages, - const q15_t * pCoeffs, - q15_t * pState); - - - /** - * @brief Processing function for the Q15 FIR lattice filter. - * @param[in] S points to an instance of the Q15 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q15( - const arm_fir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_q31( - arm_fir_lattice_instance_q31 * S, - uint16_t numStages, - const q31_t * pCoeffs, - q31_t * pState); - - - /** - * @brief Processing function for the Q31 FIR lattice filter. - * @param[in] S points to an instance of the Q31 FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_q31( - const arm_fir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] numStages number of filter stages. - * @param[in] pCoeffs points to the coefficient buffer. The array is of length numStages. - * @param[in] pState points to the state buffer. The array is of length numStages. - */ - void arm_fir_lattice_init_f32( - arm_fir_lattice_instance_f32 * S, - uint16_t numStages, - const float32_t * pCoeffs, - float32_t * pState); - - - /** - * @brief Processing function for the floating-point FIR lattice filter. - * @param[in] S points to an instance of the floating-point FIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] blockSize number of samples to process. - */ - void arm_fir_lattice_f32( - const arm_fir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q15_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q15_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q15; - - /** - * @brief Instance structure for the Q31 IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - q31_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - q31_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_q31; - - /** - * @brief Instance structure for the floating-point IIR lattice filter. - */ - typedef struct - { - uint16_t numStages; /**< number of stages in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numStages+blockSize. */ - float32_t *pkCoeffs; /**< points to the reflection coefficient array. The array is of length numStages. */ - float32_t *pvCoeffs; /**< points to the ladder coefficient array. The array is of length numStages+1. */ - } arm_iir_lattice_instance_f32; - - - /** - * @brief Processing function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_f32( - const arm_iir_lattice_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point IIR lattice filter. - * @param[in] S points to an instance of the floating-point IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize-1. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_f32( - arm_iir_lattice_instance_f32 * S, - uint16_t numStages, - float32_t * pkCoeffs, - float32_t * pvCoeffs, - float32_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q31( - const arm_iir_lattice_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 IIR lattice filter. - * @param[in] S points to an instance of the Q31 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to the reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to the ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to the state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_init_q31( - arm_iir_lattice_instance_q31 * S, - uint16_t numStages, - q31_t * pkCoeffs, - q31_t * pvCoeffs, - q31_t * pState, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the Q15 IIR lattice structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data. - * @param[in] blockSize number of samples to process. - */ - void arm_iir_lattice_q15( - const arm_iir_lattice_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - -/** - * @brief Initialization function for the Q15 IIR lattice filter. - * @param[in] S points to an instance of the fixed-point Q15 IIR lattice structure. - * @param[in] numStages number of stages in the filter. - * @param[in] pkCoeffs points to reflection coefficient buffer. The array is of length numStages. - * @param[in] pvCoeffs points to ladder coefficient buffer. The array is of length numStages+1. - * @param[in] pState points to state buffer. The array is of length numStages+blockSize. - * @param[in] blockSize number of samples to process per call. - */ - void arm_iir_lattice_init_q15( - arm_iir_lattice_instance_q15 * S, - uint16_t numStages, - q15_t * pkCoeffs, - q15_t * pvCoeffs, - q15_t * pState, - uint32_t blockSize); - - - /** - * @brief Instance structure for the floating-point LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that controls filter coefficient updates. */ - } arm_lms_instance_f32; - - - /** - * @brief Processing function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_f32( - const arm_lms_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_init_f32( - arm_lms_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q15 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q15; - - - /** - * @brief Initialization function for the Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to the coefficient buffer. - * @param[in] pState points to the state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q15( - arm_lms_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Processing function for Q15 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q15( - const arm_lms_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint32_t postShift; /**< bit shift applied to coefficients. */ - } arm_lms_instance_q31; - - - /** - * @brief Processing function for Q31 LMS filter. - * @param[in] S points to an instance of the Q15 LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_q31( - const arm_lms_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 LMS filter. - * @param[in] S points to an instance of the Q31 LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_init_q31( - arm_lms_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint32_t postShift); - - - /** - * @brief Instance structure for the floating-point normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - float32_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - float32_t mu; /**< step size that control filter coefficient updates. */ - float32_t energy; /**< saves previous frame energy. */ - float32_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_f32; - - - /** - * @brief Processing function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_f32( - arm_lms_norm_instance_f32 * S, - const float32_t * pSrc, - float32_t * pRef, - float32_t * pOut, - float32_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for floating-point normalized LMS filter. - * @param[in] S points to an instance of the floating-point LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_init_f32( - arm_lms_norm_instance_f32 * S, - uint16_t numTaps, - float32_t * pCoeffs, - float32_t * pState, - float32_t mu, - uint32_t blockSize); - - - /** - * @brief Instance structure for the Q31 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - q31_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q31_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q31_t *recipTable; /**< points to the reciprocal initial value table. */ - q31_t energy; /**< saves previous frame energy. */ - q31_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q31; - - - /** - * @brief Processing function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q31( - arm_lms_norm_instance_q31 * S, - const q31_t * pSrc, - q31_t * pRef, - q31_t * pOut, - q31_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q31 normalized LMS filter. - * @param[in] S points to an instance of the Q31 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q31( - arm_lms_norm_instance_q31 * S, - uint16_t numTaps, - q31_t * pCoeffs, - q31_t * pState, - q31_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Instance structure for the Q15 normalized LMS filter. - */ - typedef struct - { - uint16_t numTaps; /**< Number of coefficients in the filter. */ - q15_t *pState; /**< points to the state variable array. The array is of length numTaps+blockSize-1. */ - q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps. */ - q15_t mu; /**< step size that controls filter coefficient updates. */ - uint8_t postShift; /**< bit shift applied to coefficients. */ - const q15_t *recipTable; /**< Points to the reciprocal initial value table. */ - q15_t energy; /**< saves previous frame energy. */ - q15_t x0; /**< saves previous input sample. */ - } arm_lms_norm_instance_q15; - - - /** - * @brief Processing function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] pSrc points to the block of input data. - * @param[in] pRef points to the block of reference data. - * @param[out] pOut points to the block of output data. - * @param[out] pErr points to the block of error data. - * @param[in] blockSize number of samples to process. - */ - void arm_lms_norm_q15( - arm_lms_norm_instance_q15 * S, - const q15_t * pSrc, - q15_t * pRef, - q15_t * pOut, - q15_t * pErr, - uint32_t blockSize); - - - /** - * @brief Initialization function for Q15 normalized LMS filter. - * @param[in] S points to an instance of the Q15 normalized LMS filter structure. - * @param[in] numTaps number of filter coefficients. - * @param[in] pCoeffs points to coefficient buffer. - * @param[in] pState points to state buffer. - * @param[in] mu step size that controls filter coefficient updates. - * @param[in] blockSize number of samples to process. - * @param[in] postShift bit shift applied to coefficients. - */ - void arm_lms_norm_init_q15( - arm_lms_norm_instance_q15 * S, - uint16_t numTaps, - q15_t * pCoeffs, - q15_t * pState, - q15_t mu, - uint32_t blockSize, - uint8_t postShift); - - - /** - * @brief Correlation of floating-point sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_f32( - const float32_t * pSrcA, - uint32_t srcALen, - const float32_t * pSrcB, - uint32_t srcBLen, - float32_t * pDst); - - -/** - @brief Correlation of Q15 sequences - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. -*/ -void arm_correlate_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - -/** - @brief Correlation of Q15 sequences. - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the location where the output result is written. Length 2 * max(srcALen, srcBLen) - 1. - @return none - */ -void arm_correlate_fast_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst); - - -/** - @brief Correlation of Q15 sequences (fast version). - @param[in] pSrcA points to the first input sequence. - @param[in] srcALen length of the first input sequence. - @param[in] pSrcB points to the second input sequence. - @param[in] srcBLen length of the second input sequence. - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - @param[in] pScratch points to scratch buffer of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - */ -void arm_correlate_fast_opt_q15( - const q15_t * pSrcA, - uint32_t srcALen, - const q15_t * pSrcB, - uint32_t srcBLen, - q15_t * pDst, - q15_t * pScratch); - - - /** - * @brief Correlation of Q31 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - -/** - @brief Correlation of Q31 sequences (fast version). - @param[in] pSrcA points to the first input sequence - @param[in] srcALen length of the first input sequence - @param[in] pSrcB points to the second input sequence - @param[in] srcBLen length of the second input sequence - @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ -void arm_correlate_fast_q31( - const q31_t * pSrcA, - uint32_t srcALen, - const q31_t * pSrcB, - uint32_t srcBLen, - q31_t * pDst); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - * @param[in] pScratch1 points to scratch buffer(of type q15_t) of size max(srcALen, srcBLen) + 2*min(srcALen, srcBLen) - 2. - * @param[in] pScratch2 points to scratch buffer (of type q15_t) of size min(srcALen, srcBLen). - */ - void arm_correlate_opt_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst, - q15_t * pScratch1, - q15_t * pScratch2); - - - /** - * @brief Correlation of Q7 sequences. - * @param[in] pSrcA points to the first input sequence. - * @param[in] srcALen length of the first input sequence. - * @param[in] pSrcB points to the second input sequence. - * @param[in] srcBLen length of the second input sequence. - * @param[out] pDst points to the block of output data Length 2 * max(srcALen, srcBLen) - 1. - */ - void arm_correlate_q7( - const q7_t * pSrcA, - uint32_t srcALen, - const q7_t * pSrcB, - uint32_t srcBLen, - q7_t * pDst); - - - /** - * @brief Instance structure for the floating-point sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - float32_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const float32_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_f32; - - /** - * @brief Instance structure for the Q31 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q31_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q31_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q31; - - /** - * @brief Instance structure for the Q15 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q15_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q15_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q15; - - /** - * @brief Instance structure for the Q7 sparse FIR filter. - */ - typedef struct - { - uint16_t numTaps; /**< number of coefficients in the filter. */ - uint16_t stateIndex; /**< state buffer index. Points to the oldest sample in the state buffer. */ - q7_t *pState; /**< points to the state buffer array. The array is of length maxDelay+blockSize-1. */ - const q7_t *pCoeffs; /**< points to the coefficient array. The array is of length numTaps.*/ - uint16_t maxDelay; /**< maximum offset specified by the pTapDelay array. */ - int32_t *pTapDelay; /**< points to the array of delay values. The array is of length numTaps. */ - } arm_fir_sparse_instance_q7; - - - /** - * @brief Processing function for the floating-point sparse FIR filter. - * @param[in] S points to an instance of the floating-point sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_f32( - arm_fir_sparse_instance_f32 * S, - const float32_t * pSrc, - float32_t * pDst, - float32_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the floating-point sparse FIR filter. - * @param[in,out] S points to an instance of the floating-point sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_f32( - arm_fir_sparse_instance_f32 * S, - uint16_t numTaps, - const float32_t * pCoeffs, - float32_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q31 sparse FIR filter. - * @param[in] S points to an instance of the Q31 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q31( - arm_fir_sparse_instance_q31 * S, - const q31_t * pSrc, - q31_t * pDst, - q31_t * pScratchIn, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q31 sparse FIR filter. - * @param[in,out] S points to an instance of the Q31 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q31( - arm_fir_sparse_instance_q31 * S, - uint16_t numTaps, - const q31_t * pCoeffs, - q31_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q15 sparse FIR filter. - * @param[in] S points to an instance of the Q15 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q15( - arm_fir_sparse_instance_q15 * S, - const q15_t * pSrc, - q15_t * pDst, - q15_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q15 sparse FIR filter. - * @param[in,out] S points to an instance of the Q15 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q15( - arm_fir_sparse_instance_q15 * S, - uint16_t numTaps, - const q15_t * pCoeffs, - q15_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Processing function for the Q7 sparse FIR filter. - * @param[in] S points to an instance of the Q7 sparse FIR structure. - * @param[in] pSrc points to the block of input data. - * @param[out] pDst points to the block of output data - * @param[in] pScratchIn points to a temporary buffer of size blockSize. - * @param[in] pScratchOut points to a temporary buffer of size blockSize. - * @param[in] blockSize number of input samples to process per call. - */ - void arm_fir_sparse_q7( - arm_fir_sparse_instance_q7 * S, - const q7_t * pSrc, - q7_t * pDst, - q7_t * pScratchIn, - q31_t * pScratchOut, - uint32_t blockSize); - - - /** - * @brief Initialization function for the Q7 sparse FIR filter. - * @param[in,out] S points to an instance of the Q7 sparse FIR structure. - * @param[in] numTaps number of nonzero coefficients in the filter. - * @param[in] pCoeffs points to the array of filter coefficients. - * @param[in] pState points to the state buffer. - * @param[in] pTapDelay points to the array of offset times. - * @param[in] maxDelay maximum offset time supported. - * @param[in] blockSize number of samples that will be processed per block. - */ - void arm_fir_sparse_init_q7( - arm_fir_sparse_instance_q7 * S, - uint16_t numTaps, - const q7_t * pCoeffs, - q7_t * pState, - int32_t * pTapDelay, - uint16_t maxDelay, - uint32_t blockSize); - - - /** - * @brief Floating-point sin_cos function. - * @param[in] theta input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cos output. - */ - void arm_sin_cos_f32( - float32_t theta, - float32_t * pSinVal, - float32_t * pCosVal); - - - /** - * @brief Q31 sin_cos function. - * @param[in] theta scaled input value in degrees - * @param[out] pSinVal points to the processed sine output. - * @param[out] pCosVal points to the processed cosine output. - */ - void arm_sin_cos_q31( - q31_t theta, - q31_t * pSinVal, - q31_t * pCosVal); - - - /** - * @brief Floating-point complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - /** - * @brief Q31 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex conjugate. - * @param[in] pSrc points to the input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_conj_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude squared - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_squared_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @ingroup groupController - */ - - /** - * @defgroup PID PID Motor Control - * - * A Proportional Integral Derivative (PID) controller is a generic feedback control - * loop mechanism widely used in industrial control systems. - * A PID controller is the most commonly used type of feedback controller. - * - * This set of functions implements (PID) controllers - * for Q15, Q31, and floating-point data types. The functions operate on a single sample - * of data and each call to the function returns a single processed value. - * S points to an instance of the PID control data structure. in - * is the input sample value. The functions return the output value. - * - * \par Algorithm: - *
-   *    y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
-   *    A0 = Kp + Ki + Kd
-   *    A1 = (-Kp ) - (2 * Kd )
-   *    A2 = Kd
-   * 
- * - * \par - * where \c Kp is proportional constant, \c Ki is Integral constant and \c Kd is Derivative constant - * - * \par - * \image html PID.gif "Proportional Integral Derivative Controller" - * - * \par - * The PID controller calculates an "error" value as the difference between - * the measured output and the reference input. - * The controller attempts to minimize the error by adjusting the process control inputs. - * The proportional value determines the reaction to the current error, - * the integral value determines the reaction based on the sum of recent errors, - * and the derivative value determines the reaction based on the rate at which the error has been changing. - * - * \par Instance Structure - * The Gains A0, A1, A2 and state variables for a PID controller are stored together in an instance data structure. - * A separate instance structure must be defined for each PID Controller. - * There are separate instance structure declarations for each of the 3 supported data types. - * - * \par Reset Functions - * There is also an associated reset function for each data type which clears the state array. - * - * \par Initialization Functions - * There is also an associated initialization function for each data type. - * The initialization function performs the following operations: - * - Initializes the Gains A0, A1, A2 from Kp,Ki, Kd gains. - * - Zeros out the values in the state buffer. - * - * \par - * Instance structure cannot be placed into a const data section and it is recommended to use the initialization function. - * - * \par Fixed-Point Behavior - * Care must be taken when using the fixed-point versions of the PID Controller functions. - * In particular, the overflow and saturation behavior of the accumulator used in each function must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup PID - * @{ - */ - - /** - * @brief Process function for the floating-point PID Control. - * @param[in,out] S is an instance of the floating-point PID Control structure - * @param[in] in input sample to process - * @return processed output sample. - */ - __STATIC_FORCEINLINE float32_t arm_pid_f32( - arm_pid_instance_f32 * S, - float32_t in) - { - float32_t out; - - /* y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2] */ - out = (S->A0 * in) + - (S->A1 * S->state[0]) + (S->A2 * S->state[1]) + (S->state[2]); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - - } - -/** - @brief Process function for the Q31 PID Control. - @param[in,out] S points to an instance of the Q31 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using an internal 64-bit accumulator. - The accumulator has a 2.62 format and maintains full precision of the intermediate multiplication results but provides only a single guard bit. - Thus, if the accumulator result overflows it wraps around rather than clip. - In order to avoid overflows completely the input signal must be scaled down by 2 bits as there are four additions. - After all multiply-accumulates are performed, the 2.62 accumulator is truncated to 1.32 format and then saturated to 1.31 format. - */ -__STATIC_FORCEINLINE q31_t arm_pid_q31( - arm_pid_instance_q31 * S, - q31_t in) - { - q63_t acc; - q31_t out; - - /* acc = A0 * x[n] */ - acc = (q63_t) S->A0 * in; - - /* acc += A1 * x[n-1] */ - acc += (q63_t) S->A1 * S->state[0]; - - /* acc += A2 * x[n-2] */ - acc += (q63_t) S->A2 * S->state[1]; - - /* convert output to 1.31 format to add y[n-1] */ - out = (q31_t) (acc >> 31U); - - /* out += y[n-1] */ - out += S->state[2]; - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - -/** - @brief Process function for the Q15 PID Control. - @param[in,out] S points to an instance of the Q15 PID Control structure - @param[in] in input sample to process - @return processed output sample. - - \par Scaling and Overflow Behavior - The function is implemented using a 64-bit internal accumulator. - Both Gains and state variables are represented in 1.15 format and multiplications yield a 2.30 result. - The 2.30 intermediate results are accumulated in a 64-bit accumulator in 34.30 format. - There is no risk of internal overflow with this approach and the full precision of intermediate multiplications is preserved. - After all additions have been performed, the accumulator is truncated to 34.15 format by discarding low 15 bits. - Lastly, the accumulator is saturated to yield a result in 1.15 format. - */ -__STATIC_FORCEINLINE q15_t arm_pid_q15( - arm_pid_instance_q15 * S, - q15_t in) - { - q63_t acc; - q15_t out; - -#if defined (ARM_MATH_DSP) - /* Implementation of PID controller */ - - /* acc = A0 * x[n] */ - acc = (q31_t) __SMUAD((uint32_t)S->A0, (uint32_t)in); - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc = (q63_t)__SMLALD((uint32_t)S->A1, (uint32_t)read_q15x2 (S->state), (uint64_t)acc); -#else - /* acc = A0 * x[n] */ - acc = ((q31_t) S->A0) * in; - - /* acc += A1 * x[n-1] + A2 * x[n-2] */ - acc += (q31_t) S->A1 * S->state[0]; - acc += (q31_t) S->A2 * S->state[1]; -#endif - - /* acc += y[n-1] */ - acc += (q31_t) S->state[2] << 15; - - /* saturate the output */ - out = (q15_t) (__SSAT((q31_t)(acc >> 15), 16)); - - /* Update state */ - S->state[1] = S->state[0]; - S->state[0] = in; - S->state[2] = out; - - /* return to application */ - return (out); - } - - /** - * @} end of PID group - */ - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f32( - const arm_matrix_instance_f32 * src, - arm_matrix_instance_f32 * dst); - - - /** - * @brief Floating-point matrix inverse. - * @param[in] src points to the instance of the input floating-point matrix structure. - * @param[out] dst points to the instance of the output floating-point matrix structure. - * @return The function returns ARM_MATH_SIZE_MISMATCH, if the dimensions do not match. - * If the input matrix is singular (does not have an inverse), then the algorithm terminates and returns error status ARM_MATH_SINGULAR. - */ - arm_status arm_mat_inverse_f64( - const arm_matrix_instance_f64 * src, - arm_matrix_instance_f64 * dst); - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup clarke Vector Clarke Transform - * Forward Clarke transform converts the instantaneous stator phases into a two-coordinate time invariant vector. - * Generally the Clarke transform uses three-phase currents Ia, Ib and Ic to calculate currents - * in the two-phase orthogonal stator axis Ialpha and Ibeta. - * When Ialpha is superposed with Ia as shown in the figure below - * \image html clarke.gif Stator current space vector and its components in (a,b). - * and Ia + Ib + Ic = 0, in this condition Ialpha and Ibeta - * can be calculated using only Ia and Ib. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeFormula.gif - * where Ia and Ib are the instantaneous stator phases and - * pIalpha and pIbeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup clarke - * @{ - */ - - /** - * - * @brief Floating-point Clarke transform - * @param[in] Ia input three-phase coordinate a - * @param[in] Ib input three-phase coordinate b - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @return none - */ - __STATIC_FORCEINLINE void arm_clarke_f32( - float32_t Ia, - float32_t Ib, - float32_t * pIalpha, - float32_t * pIbeta) - { - /* Calculate pIalpha using the equation, pIalpha = Ia */ - *pIalpha = Ia; - - /* Calculate pIbeta using the equation, pIbeta = (1/sqrt(3)) * Ia + (2/sqrt(3)) * Ib */ - *pIbeta = (0.57735026919f * Ia + 1.15470053838f * Ib); - } - - -/** - @brief Clarke transform for Q31 version - @param[in] Ia input three-phase coordinate a - @param[in] Ib input three-phase coordinate b - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_clarke_q31( - q31_t Ia, - q31_t Ib, - q31_t * pIalpha, - q31_t * pIbeta) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIalpha from Ia by equation pIalpha = Ia */ - *pIalpha = Ia; - - /* Intermediate product is calculated by (1/(sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) Ia * 0x24F34E8B) >> 30); - - /* Intermediate product is calculated by (2/sqrt(3) * Ib) */ - product2 = (q31_t) (((q63_t) Ib * 0x49E69D16) >> 30); - - /* pIbeta is calculated by adding the intermediate products */ - *pIbeta = __QADD(product1, product2); - } - - /** - * @} end of clarke group - */ - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_clarke Vector Inverse Clarke Transform - * Inverse Clarke transform converts the two-coordinate time invariant vector into instantaneous stator phases. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html clarkeInvFormula.gif - * where pIa and pIb are the instantaneous stator phases and - * Ialpha and Ibeta are the two coordinates of time invariant vector. - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Clarke transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_clarke - * @{ - */ - - /** - * @brief Floating-point Inverse Clarke transform - * @param[in] Ialpha input two-phase orthogonal vector axis alpha - * @param[in] Ibeta input two-phase orthogonal vector axis beta - * @param[out] pIa points to output three-phase coordinate a - * @param[out] pIb points to output three-phase coordinate b - * @return none - */ - __STATIC_FORCEINLINE void arm_inv_clarke_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pIa, - float32_t * pIb) - { - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Calculating pIb from Ialpha and Ibeta by equation pIb = -(1/2) * Ialpha + (sqrt(3)/2) * Ibeta */ - *pIb = -0.5f * Ialpha + 0.8660254039f * Ibeta; - } - - -/** - @brief Inverse Clarke transform for Q31 version - @param[in] Ialpha input two-phase orthogonal vector axis alpha - @param[in] Ibeta input two-phase orthogonal vector axis beta - @param[out] pIa points to output three-phase coordinate a - @param[out] pIb points to output three-phase coordinate b - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_inv_clarke_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pIa, - q31_t * pIb) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - - /* Calculating pIa from Ialpha by equation pIa = Ialpha */ - *pIa = Ialpha; - - /* Intermediate product is calculated by (1/(2*sqrt(3)) * Ia) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (0x40000000)) >> 31); - - /* Intermediate product is calculated by (1/sqrt(3) * pIb) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (0x6ED9EBA1)) >> 31); - - /* pIb is calculated by subtracting the products */ - *pIb = __QSUB(product2, product1); - } - - /** - * @} end of inv_clarke group - */ - - - - /** - * @ingroup groupController - */ - - /** - * @defgroup park Vector Park Transform - * - * Forward Park transform converts the input two-coordinate vector to flux and torque components. - * The Park transform can be used to realize the transformation of the Ialpha and the Ibeta currents - * from the stationary to the moving reference frame and control the spatial relationship between - * the stator vector current and rotor flux vector. - * If we consider the d axis aligned with the rotor flux, the diagram below shows the - * current vector and the relationship from the two reference frames: - * \image html park.gif "Stator current space vector and its component in (a,b) and in the d,q rotating reference frame" - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkFormula.gif - * where Ialpha and Ibeta are the stator vector components, - * pId and pIq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup park - * @{ - */ - - /** - * @brief Floating-point Park transform - * @param[in] Ialpha input two-phase vector coordinate alpha - * @param[in] Ibeta input two-phase vector coordinate beta - * @param[out] pId points to output rotor reference frame d - * @param[out] pIq points to output rotor reference frame q - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none - * - * The function implements the forward Park transform. - * - */ - __STATIC_FORCEINLINE void arm_park_f32( - float32_t Ialpha, - float32_t Ibeta, - float32_t * pId, - float32_t * pIq, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pId using the equation, pId = Ialpha * cosVal + Ibeta * sinVal */ - *pId = Ialpha * cosVal + Ibeta * sinVal; - - /* Calculate pIq using the equation, pIq = - Ialpha * sinVal + Ibeta * cosVal */ - *pIq = -Ialpha * sinVal + Ibeta * cosVal; - } - - -/** - @brief Park transform for Q31 version - @param[in] Ialpha input two-phase vector coordinate alpha - @param[in] Ibeta input two-phase vector coordinate beta - @param[out] pId points to output rotor reference frame d - @param[out] pIq points to output rotor reference frame q - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - \par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition and subtraction, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_park_q31( - q31_t Ialpha, - q31_t Ibeta, - q31_t * pId, - q31_t * pIq, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Ialpha * cosVal) */ - product1 = (q31_t) (((q63_t) (Ialpha) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * sinVal) */ - product2 = (q31_t) (((q63_t) (Ibeta) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Ialpha * sinVal) */ - product3 = (q31_t) (((q63_t) (Ialpha) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Ibeta * cosVal) */ - product4 = (q31_t) (((q63_t) (Ibeta) * (cosVal)) >> 31); - - /* Calculate pId by adding the two intermediate products 1 and 2 */ - *pId = __QADD(product1, product2); - - /* Calculate pIq by subtracting the two intermediate products 3 from 4 */ - *pIq = __QSUB(product4, product3); - } - - /** - * @} end of park group - */ - - - /** - * @ingroup groupController - */ - - /** - * @defgroup inv_park Vector Inverse Park transform - * Inverse Park transform converts the input flux and torque components to two-coordinate vector. - * - * The function operates on a single sample of data and each call to the function returns the processed output. - * The library provides separate functions for Q31 and floating-point data types. - * \par Algorithm - * \image html parkInvFormula.gif - * where pIalpha and pIbeta are the stator vector components, - * Id and Iq are rotor vector components and cosVal and sinVal are the - * cosine and sine values of theta (rotor flux position). - * \par Fixed-Point Behavior - * Care must be taken when using the Q31 version of the Park transform. - * In particular, the overflow and saturation behavior of the accumulator used must be considered. - * Refer to the function specific documentation below for usage guidelines. - */ - - /** - * @addtogroup inv_park - * @{ - */ - - /** - * @brief Floating-point Inverse Park transform - * @param[in] Id input coordinate of rotor reference frame d - * @param[in] Iq input coordinate of rotor reference frame q - * @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - * @param[out] pIbeta points to output two-phase orthogonal vector axis beta - * @param[in] sinVal sine value of rotation angle theta - * @param[in] cosVal cosine value of rotation angle theta - * @return none - */ - __STATIC_FORCEINLINE void arm_inv_park_f32( - float32_t Id, - float32_t Iq, - float32_t * pIalpha, - float32_t * pIbeta, - float32_t sinVal, - float32_t cosVal) - { - /* Calculate pIalpha using the equation, pIalpha = Id * cosVal - Iq * sinVal */ - *pIalpha = Id * cosVal - Iq * sinVal; - - /* Calculate pIbeta using the equation, pIbeta = Id * sinVal + Iq * cosVal */ - *pIbeta = Id * sinVal + Iq * cosVal; - } - - -/** - @brief Inverse Park transform for Q31 version - @param[in] Id input coordinate of rotor reference frame d - @param[in] Iq input coordinate of rotor reference frame q - @param[out] pIalpha points to output two-phase orthogonal vector axis alpha - @param[out] pIbeta points to output two-phase orthogonal vector axis beta - @param[in] sinVal sine value of rotation angle theta - @param[in] cosVal cosine value of rotation angle theta - @return none - - @par Scaling and Overflow Behavior - The function is implemented using an internal 32-bit accumulator. - The accumulator maintains 1.31 format by truncating lower 31 bits of the intermediate multiplication in 2.62 format. - There is saturation on the addition, hence there is no risk of overflow. - */ -__STATIC_FORCEINLINE void arm_inv_park_q31( - q31_t Id, - q31_t Iq, - q31_t * pIalpha, - q31_t * pIbeta, - q31_t sinVal, - q31_t cosVal) - { - q31_t product1, product2; /* Temporary variables used to store intermediate results */ - q31_t product3, product4; /* Temporary variables used to store intermediate results */ - - /* Intermediate product is calculated by (Id * cosVal) */ - product1 = (q31_t) (((q63_t) (Id) * (cosVal)) >> 31); - - /* Intermediate product is calculated by (Iq * sinVal) */ - product2 = (q31_t) (((q63_t) (Iq) * (sinVal)) >> 31); - - - /* Intermediate product is calculated by (Id * sinVal) */ - product3 = (q31_t) (((q63_t) (Id) * (sinVal)) >> 31); - - /* Intermediate product is calculated by (Iq * cosVal) */ - product4 = (q31_t) (((q63_t) (Iq) * (cosVal)) >> 31); - - /* Calculate pIalpha by using the two intermediate products 1 and 2 */ - *pIalpha = __QSUB(product1, product2); - - /* Calculate pIbeta by using the two intermediate products 3 and 4 */ - *pIbeta = __QADD(product4, product3); - } - - /** - * @} end of Inverse park group - */ - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup LinearInterpolate Linear Interpolation - * - * Linear interpolation is a method of curve fitting using linear polynomials. - * Linear interpolation works by effectively drawing a straight line between two neighboring samples and returning the appropriate point along that line - * - * \par - * \image html LinearInterp.gif "Linear interpolation" - * - * \par - * A Linear Interpolate function calculates an output value(y), for the input(x) - * using linear interpolation of the input values x0, x1( nearest input values) and the output values y0 and y1(nearest output values) - * - * \par Algorithm: - *
-   *       y = y0 + (x - x0) * ((y1 - y0)/(x1-x0))
-   *       where x0, x1 are nearest values of input x
-   *             y0, y1 are nearest values to output y
-   * 
- * - * \par - * This set of functions implements Linear interpolation process - * for Q7, Q15, Q31, and floating-point data types. The functions operate on a single - * sample of data and each call to the function returns a single processed value. - * S points to an instance of the Linear Interpolate function data structure. - * x is the input sample value. The functions returns the output value. - * - * \par - * if x is outside of the table boundary, Linear interpolation returns first value of the table - * if x is below input range and returns last value of table if x is above range. - */ - - /** - * @addtogroup LinearInterpolate - * @{ - */ - - /** - * @brief Process function for the floating-point Linear Interpolation Function. - * @param[in,out] S is an instance of the floating-point Linear Interpolation structure - * @param[in] x input sample to process - * @return y processed output sample. - * - */ - __STATIC_FORCEINLINE float32_t arm_linear_interp_f32( - arm_linear_interp_instance_f32 * S, - float32_t x) - { - float32_t y; - float32_t x0, x1; /* Nearest input values */ - float32_t y0, y1; /* Nearest output values */ - float32_t xSpacing = S->xSpacing; /* spacing between input values */ - int32_t i; /* Index variable */ - float32_t *pYData = S->pYData; /* pointer to output table */ - - /* Calculation of index */ - i = (int32_t) ((x - S->x1) / xSpacing); - - if (i < 0) - { - /* Iniatilize output for below specified range as least output value of table */ - y = pYData[0]; - } - else if ((uint32_t)i >= (S->nValues - 1)) - { - /* Iniatilize output for above specified range as last output value of table */ - y = pYData[S->nValues - 1]; - } - else - { - /* Calculation of nearest input values */ - x0 = S->x1 + i * xSpacing; - x1 = S->x1 + (i + 1) * xSpacing; - - /* Read of nearest output values */ - y0 = pYData[i]; - y1 = pYData[i + 1]; - - /* Calculation of output */ - y = y0 + (x - x0) * ((y1 - y0) / (x1 - x0)); - - } - - /* returns output value */ - return (y); - } - - - /** - * - * @brief Process function for the Q31 Linear Interpolation Function. - * @param[in] pYData pointer to Q31 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - __STATIC_FORCEINLINE q31_t arm_linear_interp_q31( - q31_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q31_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (q31_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if (index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* shift left by 11 to keep fract in 1.31 format */ - fract = (x & 0x000FFFFF) << 11; - - /* Read two nearest output values from the index in 1.31(q31) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 2.30 format */ - y = ((q31_t) ((q63_t) y0 * (0x7FFFFFFF - fract) >> 32)); - - /* Calculation of y0 * (1-fract) + y1 *fract and y is in 2.30 format */ - y += ((q31_t) (((q63_t) y1 * fract) >> 32)); - - /* Convert y to 1.31 format */ - return (y << 1U); - } - } - - - /** - * - * @brief Process function for the Q15 Linear Interpolation Function. - * @param[in] pYData pointer to Q15 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - * - */ - __STATIC_FORCEINLINE q15_t arm_linear_interp_q15( - q15_t * pYData, - q31_t x, - uint32_t nValues) - { - q63_t y; /* output */ - q15_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - int32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - index = ((x & (int32_t)0xFFF00000) >> 20); - - if (index >= (int32_t)(nValues - 1)) - { - return (pYData[nValues - 1]); - } - else if (index < 0) - { - return (pYData[0]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract) and y is in 13.35 format */ - y = ((q63_t) y0 * (0xFFFFF - fract)); - - /* Calculation of (y0 * (1-fract) + y1 * fract) and y is in 13.35 format */ - y += ((q63_t) y1 * (fract)); - - /* convert y to 1.15 format */ - return (q15_t) (y >> 20); - } - } - - - /** - * - * @brief Process function for the Q7 Linear Interpolation Function. - * @param[in] pYData pointer to Q7 Linear Interpolation table - * @param[in] x input sample to process - * @param[in] nValues number of table values - * @return y processed output sample. - * - * \par - * Input sample x is in 12.20 format which contains 12 bits for table index and 20 bits for fractional part. - * This function can support maximum of table size 2^12. - */ - __STATIC_FORCEINLINE q7_t arm_linear_interp_q7( - q7_t * pYData, - q31_t x, - uint32_t nValues) - { - q31_t y; /* output */ - q7_t y0, y1; /* Nearest output values */ - q31_t fract; /* fractional part */ - uint32_t index; /* Index to read nearest output values */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - if (x < 0) - { - return (pYData[0]); - } - index = (x >> 20) & 0xfff; - - if (index >= (nValues - 1)) - { - return (pYData[nValues - 1]); - } - else - { - /* 20 bits for the fractional part */ - /* fract is in 12.20 format */ - fract = (x & 0x000FFFFF); - - /* Read two nearest output values from the index and are in 1.7(q7) format */ - y0 = pYData[index]; - y1 = pYData[index + 1]; - - /* Calculation of y0 * (1-fract ) and y is in 13.27(q27) format */ - y = ((y0 * (0xFFFFF - fract))); - - /* Calculation of y1 * fract + y0 * (1-fract) and y is in 13.27(q27) format */ - y += (y1 * fract); - - /* convert y to 1.7(q7) format */ - return (q7_t) (y >> 20); - } - } - - /** - * @} end of LinearInterpolate group - */ - - /** - * @brief Fast approximation to the trigonometric sine function for floating-point data. - * @param[in] x input value in radians. - * @return sin(x). - */ - float32_t arm_sin_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q31_t arm_sin_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric sine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return sin(x). - */ - q15_t arm_sin_q15( - q15_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for floating-point data. - * @param[in] x input value in radians. - * @return cos(x). - */ - float32_t arm_cos_f32( - float32_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q31 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q31_t arm_cos_q31( - q31_t x); - - - /** - * @brief Fast approximation to the trigonometric cosine function for Q15 data. - * @param[in] x Scaled input value in radians. - * @return cos(x). - */ - q15_t arm_cos_q15( - q15_t x); - - -/** - @brief Floating-point vector of log values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ - void arm_vlog_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - -/** - @brief Floating-point vector of exp values. - @param[in] pSrc points to the input vector - @param[out] pDst points to the output vector - @param[in] blockSize number of samples in each vector - @return none - */ - void arm_vexp_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - /** - * @ingroup groupFastMath - */ - - - /** - * @defgroup SQRT Square Root - * - * Computes the square root of a number. - * There are separate functions for Q15, Q31, and floating-point data types. - * The square root function is computed using the Newton-Raphson algorithm. - * This is an iterative algorithm of the form: - *
-   *      x1 = x0 - f(x0)/f'(x0)
-   * 
- * where x1 is the current estimate, - * x0 is the previous estimate, and - * f'(x0) is the derivative of f() evaluated at x0. - * For the square root function, the algorithm reduces to: - *
-   *     x0 = in/2                         [initial guess]
-   *     x1 = 1/2 * ( x0 + in / x0)        [each iteration]
-   * 
- */ - - - /** - * @addtogroup SQRT - * @{ - */ - -/** - @brief Floating-point square root function. - @param[in] in input value - @param[out] pOut square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -__STATIC_FORCEINLINE arm_status arm_sqrt_f32( - float32_t in, - float32_t * pOut) - { - if (in >= 0.0f) - { -#if defined ( __CC_ARM ) - #if defined __TARGET_FPU_VFP - *pOut = __sqrtf(in); - #else - *pOut = sqrtf(in); - #endif - -#elif defined ( __ICCARM__ ) - #if defined __ARMVFP__ - __ASM("VSQRT.F32 %0,%1" : "=t"(*pOut) : "t"(in)); - #else - *pOut = sqrtf(in); - #endif - -#else - *pOut = sqrtf(in); -#endif - - return (ARM_MATH_SUCCESS); - } - else - { - *pOut = 0.0f; - return (ARM_MATH_ARGUMENT_ERROR); - } - } - - -/** - @brief Q31 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x00000000 to 0x7FFFFFFF - @param[out] pOut points to square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -arm_status arm_sqrt_q31( - q31_t in, - q31_t * pOut); - - -/** - @brief Q15 square root function. - @param[in] in input value. The range of the input value is [0 +1) or 0x0000 to 0x7FFF - @param[out] pOut points to square root of input value - @return execution status - - \ref ARM_MATH_SUCCESS : input value is positive - - \ref ARM_MATH_ARGUMENT_ERROR : input value is negative; *pOut is set to 0 - */ -arm_status arm_sqrt_q15( - q15_t in, - q15_t * pOut); - - /** - * @brief Vector Floating-point square root function. - * @param[in] pIn input vector. - * @param[out] pOut vector of square roots of input elements. - * @param[in] len length of input vector. - * @return The function returns ARM_MATH_SUCCESS if input value is positive value or ARM_MATH_ARGUMENT_ERROR if - * in is negative value and returns zero output for negative values. - */ - void arm_vsqrt_f32( - float32_t * pIn, - float32_t * pOut, - uint16_t len); - - void arm_vsqrt_q31( - q31_t * pIn, - q31_t * pOut, - uint16_t len); - - void arm_vsqrt_q15( - q15_t * pIn, - q15_t * pOut, - uint16_t len); - - /** - * @} end of SQRT group - */ - - - /** - * @brief floating-point Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_f32( - int32_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const int32_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - - /** - * @brief floating-point Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_f32( - int32_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - int32_t * dst, - int32_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t rOffset; - int32_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q15 Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_q15( - q15_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q15_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q15 Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_q15( - q15_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q15_t * dst, - q15_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset; - q15_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update wOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Q7 Circular write function. - */ - __STATIC_FORCEINLINE void arm_circularWrite_q7( - q7_t * circBuffer, - int32_t L, - uint16_t * writeOffset, - int32_t bufferInc, - const q7_t * src, - int32_t srcInc, - uint32_t blockSize) - { - uint32_t i = 0U; - int32_t wOffset; - - /* Copy the value of Index pointer that points - * to the current location where the input samples to be copied */ - wOffset = *writeOffset; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the input sample to the circular buffer */ - circBuffer[wOffset] = *src; - - /* Update the input pointer */ - src += srcInc; - - /* Circularly update wOffset. Watch out for positive and negative value */ - wOffset += bufferInc; - if (wOffset >= L) - wOffset -= L; - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *writeOffset = (uint16_t)wOffset; - } - - - /** - * @brief Q7 Circular Read function. - */ - __STATIC_FORCEINLINE void arm_circularRead_q7( - q7_t * circBuffer, - int32_t L, - int32_t * readOffset, - int32_t bufferInc, - q7_t * dst, - q7_t * dst_base, - int32_t dst_length, - int32_t dstInc, - uint32_t blockSize) - { - uint32_t i = 0; - int32_t rOffset; - q7_t* dst_end; - - /* Copy the value of Index pointer that points - * to the current location from where the input samples to be read */ - rOffset = *readOffset; - - dst_end = dst_base + dst_length; - - /* Loop over the blockSize */ - i = blockSize; - - while (i > 0U) - { - /* copy the sample from the circular buffer to the destination buffer */ - *dst = circBuffer[rOffset]; - - /* Update the input pointer */ - dst += dstInc; - - if (dst == dst_end) - { - dst = dst_base; - } - - /* Circularly update rOffset. Watch out for positive and negative value */ - rOffset += bufferInc; - - if (rOffset >= L) - { - rOffset -= L; - } - - /* Decrement the loop counter */ - i--; - } - - /* Update the index pointer */ - *readOffset = rOffset; - } - - - /** - * @brief Sum of the squares of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q31( - const q31_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q15( - const q15_t * pSrc, - uint32_t blockSize, - q63_t * pResult); - - - /** - * @brief Sum of the squares of the elements of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_power_q7( - const q7_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult); - - - /** - * @brief Mean value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Mean value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Mean value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_mean_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Variance of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Variance of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_var_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Root Mean Square of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_rms_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Standard deviation of the elements of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult); - - - /** - * @brief Standard deviation of the elements of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output value. - */ - void arm_std_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult); - - - /** - * @brief Floating-point complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_f32( - const float32_t * pSrc, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q31( - const q31_t * pSrc, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex magnitude - * @param[in] pSrc points to the complex input vector - * @param[out] pDst points to the real output vector - * @param[in] numSamples number of complex samples in the input vector - */ - void arm_cmplx_mag_q15( - const q15_t * pSrc, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q15 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - uint32_t numSamples, - q31_t * realResult, - q31_t * imagResult); - - - /** - * @brief Q31 complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - uint32_t numSamples, - q63_t * realResult, - q63_t * imagResult); - - - /** - * @brief Floating-point complex dot product - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] numSamples number of complex samples in each vector - * @param[out] realResult real part of the result returned here - * @param[out] imagResult imaginary part of the result returned here - */ - void arm_cmplx_dot_prod_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t numSamples, - float32_t * realResult, - float32_t * imagResult); - - - /** - * @brief Q15 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q15( - const q15_t * pSrcCmplx, - const q15_t * pSrcReal, - q15_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_q31( - const q31_t * pSrcCmplx, - const q31_t * pSrcReal, - q31_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-real multiplication - * @param[in] pSrcCmplx points to the complex input vector - * @param[in] pSrcReal points to the real input vector - * @param[out] pCmplxDst points to the complex output vector - * @param[in] numSamples number of samples in each vector - */ - void arm_cmplx_mult_real_f32( - const float32_t * pSrcCmplx, - const float32_t * pSrcReal, - float32_t * pCmplxDst, - uint32_t numSamples); - - - /** - * @brief Minimum value of a Q7 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] result is output pointer - * @param[in] index is the array index of the minimum value in the input buffer. - */ - void arm_min_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * result, - uint32_t * index); - - - /** - * @brief Minimum value of a Q15 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[in] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a Q31 vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - - /** - * @brief Minimum value of a floating-point vector. - * @param[in] pSrc is input pointer - * @param[in] blockSize is the number of samples to process - * @param[out] pResult is output pointer - * @param[out] pIndex is the array index of the minimum value in the input buffer. - */ - void arm_min_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q7 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q7( - const q7_t * pSrc, - uint32_t blockSize, - q7_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q15 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q15( - const q15_t * pSrc, - uint32_t blockSize, - q15_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a Q31 vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_q31( - const q31_t * pSrc, - uint32_t blockSize, - q31_t * pResult, - uint32_t * pIndex); - - -/** - * @brief Maximum value of a floating-point vector. - * @param[in] pSrc points to the input buffer - * @param[in] blockSize length of the input vector - * @param[out] pResult maximum value returned here - * @param[out] pIndex index of maximum value returned here - */ - void arm_max_f32( - const float32_t * pSrc, - uint32_t blockSize, - float32_t * pResult, - uint32_t * pIndex); - - /** - @brief Maximum value of a floating-point vector. - @param[in] pSrc points to the input vector - @param[in] blockSize number of samples in input vector - @param[out] pResult maximum value returned here - @return none - */ - void arm_max_no_idx_f32( - const float32_t *pSrc, - uint32_t blockSize, - float32_t *pResult); - - /** - * @brief Q15 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q15( - const q15_t * pSrcA, - const q15_t * pSrcB, - q15_t * pDst, - uint32_t numSamples); - - - /** - * @brief Q31 complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_q31( - const q31_t * pSrcA, - const q31_t * pSrcB, - q31_t * pDst, - uint32_t numSamples); - - - /** - * @brief Floating-point complex-by-complex multiplication - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[out] pDst points to the output vector - * @param[in] numSamples number of complex samples in each vector - */ - void arm_cmplx_mult_cmplx_f32( - const float32_t * pSrcA, - const float32_t * pSrcB, - float32_t * pDst, - uint32_t numSamples); - - - /** - * @brief Converts the elements of the floating-point vector to Q31 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q31 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q31( - const float32_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q15 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q15( - const float32_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the floating-point vector to Q7 vector. - * @param[in] pSrc points to the floating-point input vector - * @param[out] pDst points to the Q7 output vector - * @param[in] blockSize length of the input vector - */ - void arm_float_to_q7( - const float32_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_float( - const q31_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q15 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q15( - const q31_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q31 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q31_to_q7( - const q31_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_float( - const q15_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q31 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q31( - const q15_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q15 vector to Q7 vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q15_to_q7( - const q15_t * pSrc, - q7_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to floating-point vector. - * @param[in] pSrc is input pointer - * @param[out] pDst is output pointer - * @param[in] blockSize is the number of samples to process - */ - void arm_q7_to_float( - const q7_t * pSrc, - float32_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to Q31 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q31( - const q7_t * pSrc, - q31_t * pDst, - uint32_t blockSize); - - - /** - * @brief Converts the elements of the Q7 vector to Q15 vector. - * @param[in] pSrc input pointer - * @param[out] pDst output pointer - * @param[in] blockSize number of samples to process - */ - void arm_q7_to_q15( - const q7_t * pSrc, - q15_t * pDst, - uint32_t blockSize); - -/** - * @brief Struct for specifying SVM Kernel - */ -typedef enum -{ - ARM_ML_KERNEL_LINEAR = 0, - /**< Linear kernel */ - ARM_ML_KERNEL_POLYNOMIAL = 1, - /**< Polynomial kernel */ - ARM_ML_KERNEL_RBF = 2, - /**< Radial Basis Function kernel */ - ARM_ML_KERNEL_SIGMOID = 3 - /**< Sigmoid kernel */ -} arm_ml_kernel_type; - - -/** - * @brief Instance structure for linear SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ -} arm_svm_linear_instance_f32; - - -/** - * @brief Instance structure for polynomial SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - int32_t degree; /**< Polynomial degree */ - float32_t coef0; /**< Polynomial constant */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_polynomial_instance_f32; - -/** - * @brief Instance structure for rbf SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_rbf_instance_f32; - -/** - * @brief Instance structure for sigmoid SVM prediction function. - */ -typedef struct -{ - uint32_t nbOfSupportVectors; /**< Number of support vectors */ - uint32_t vectorDimension; /**< Dimension of vector space */ - float32_t intercept; /**< Intercept */ - const float32_t *dualCoefficients; /**< Dual coefficients */ - const float32_t *supportVectors; /**< Support vectors */ - const int32_t *classes; /**< The two SVM classes */ - float32_t coef0; /**< Independant constant */ - float32_t gamma; /**< Gamma factor */ -} arm_svm_sigmoid_instance_f32; - -/** - * @brief SVM linear instance init function - * @param[in] S Parameters for SVM functions - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @return none. - * - */ - - -void arm_svm_linear_init_f32(arm_svm_linear_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes); - -/** - * @brief SVM linear prediction - * @param[in] S Pointer to an instance of the linear SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ - -void arm_svm_linear_predict_f32(const arm_svm_linear_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM polynomial instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] degree Polynomial degree - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - - -void arm_svm_polynomial_init_f32(arm_svm_polynomial_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - int32_t degree, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM polynomial prediction - * @param[in] S Pointer to an instance of the polynomial SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void arm_svm_polynomial_predict_f32(const arm_svm_polynomial_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - -/** - * @brief SVM radial basis function instance init function - * @param[in] S points to an instance of the polynomial SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void arm_svm_rbf_init_f32(arm_svm_rbf_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t gamma - ); - -/** - * @brief SVM rbf prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult decision value - * @return none. - * - */ -void arm_svm_rbf_predict_f32(const arm_svm_rbf_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - -/** - * @brief SVM sigmoid instance init function - * @param[in] S points to an instance of the rbf SVM structure. - * @param[in] nbOfSupportVectors Number of support vectors - * @param[in] vectorDimension Dimension of vector space - * @param[in] intercept Intercept - * @param[in] dualCoefficients Array of dual coefficients - * @param[in] supportVectors Array of support vectors - * @param[in] classes Array of 2 classes ID - * @param[in] coef0 coeff0 (scikit-learn terminology) - * @param[in] gamma gamma (scikit-learn terminology) - * @return none. - * - */ - -void arm_svm_sigmoid_init_f32(arm_svm_sigmoid_instance_f32 *S, - uint32_t nbOfSupportVectors, - uint32_t vectorDimension, - float32_t intercept, - const float32_t *dualCoefficients, - const float32_t *supportVectors, - const int32_t *classes, - float32_t coef0, - float32_t gamma - ); - -/** - * @brief SVM sigmoid prediction - * @param[in] S Pointer to an instance of the rbf SVM structure. - * @param[in] in Pointer to input vector - * @param[out] pResult Decision value - * @return none. - * - */ -void arm_svm_sigmoid_predict_f32(const arm_svm_sigmoid_instance_f32 *S, - const float32_t * in, - int32_t * pResult); - - - -/** - * @brief Instance structure for Naive Gaussian Bayesian estimator. - */ -typedef struct -{ - uint32_t vectorDimension; /**< Dimension of vector space */ - uint32_t numberOfClasses; /**< Number of different classes */ - const float32_t *theta; /**< Mean values for the Gaussians */ - const float32_t *sigma; /**< Variances for the Gaussians */ - const float32_t *classPriors; /**< Class prior probabilities */ - float32_t epsilon; /**< Additive value to variances */ -} arm_gaussian_naive_bayes_instance_f32; - -/** - * @brief Naive Gaussian Bayesian Estimator - * - * @param[in] S points to a naive bayes instance structure - * @param[in] in points to the elements of the input vector. - * @param[in] pBuffer points to a buffer of length numberOfClasses - * @return The predicted class - * - */ - - -uint32_t arm_gaussian_naive_bayes_predict_f32(const arm_gaussian_naive_bayes_instance_f32 *S, - const float32_t * in, - float32_t *pBuffer); - -/** - * @brief Computation of the LogSumExp - * - * In probabilistic computations, the dynamic of the probability values can be very - * wide because they come from gaussian functions. - * To avoid underflow and overflow issues, the values are represented by their log. - * In this representation, multiplying the original exp values is easy : their logs are added. - * But adding the original exp values is requiring some special handling and it is the - * goal of the LogSumExp function. - * - * If the values are x1...xn, the function is computing: - * - * ln(exp(x1) + ... + exp(xn)) and the computation is done in such a way that - * rounding issues are minimised. - * - * The max xm of the values is extracted and the function is computing: - * xm + ln(exp(x1 - xm) + ... + exp(xn - xm)) - * - * @param[in] *in Pointer to an array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return LogSumExp - * - */ - - -float32_t arm_logsumexp_f32(const float32_t *in, uint32_t blockSize); - -/** - * @brief Dot product with log arithmetic - * - * Vectors are containing the log of the samples - * - * @param[in] pSrcA points to the first input vector - * @param[in] pSrcB points to the second input vector - * @param[in] blockSize number of samples in each vector - * @param[in] pTmpBuffer temporary buffer of length blockSize - * @return The log of the dot product . - * - */ - - -float32_t arm_logsumexp_dot_prod_f32(const float32_t * pSrcA, - const float32_t * pSrcB, - uint32_t blockSize, - float32_t *pTmpBuffer); - -/** - * @brief Entropy - * - * @param[in] pSrcA Array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return Entropy -Sum(p ln p) - * - */ - - -float32_t arm_entropy_f32(const float32_t * pSrcA,uint32_t blockSize); - - -/** - * @brief Entropy - * - * @param[in] pSrcA Array of input values. - * @param[in] blockSize Number of samples in the input array. - * @return Entropy -Sum(p ln p) - * - */ - - -float64_t arm_entropy_f64(const float64_t * pSrcA, uint32_t blockSize); - - -/** - * @brief Kullback-Leibler - * - * @param[in] pSrcA Pointer to an array of input values for probability distribution A. - * @param[in] pSrcB Pointer to an array of input values for probability distribution B. - * @param[in] blockSize Number of samples in the input array. - * @return Kullback-Leibler Divergence D(A || B) - * - */ -float32_t arm_kullback_leibler_f32(const float32_t * pSrcA - ,const float32_t * pSrcB - ,uint32_t blockSize); - - -/** - * @brief Kullback-Leibler - * - * @param[in] pSrcA Pointer to an array of input values for probability distribution A. - * @param[in] pSrcB Pointer to an array of input values for probability distribution B. - * @param[in] blockSize Number of samples in the input array. - * @return Kullback-Leibler Divergence D(A || B) - * - */ -float64_t arm_kullback_leibler_f64(const float64_t * pSrcA, - const float64_t * pSrcB, - uint32_t blockSize); - - -/** - * @brief Weighted sum - * - * - * @param[in] *in Array of input values. - * @param[in] *weigths Weights - * @param[in] blockSize Number of samples in the input array. - * @return Weighted sum - * - */ -float32_t arm_weighted_sum_f32(const float32_t *in - , const float32_t *weigths - , uint32_t blockSize); - - -/** - * @brief Barycenter - * - * - * @param[in] in List of vectors - * @param[in] weights Weights of the vectors - * @param[out] out Barycenter - * @param[in] nbVectors Number of vectors - * @param[in] vecDim Dimension of space (vector dimension) - * @return None - * - */ -void arm_barycenter_f32(const float32_t *in - , const float32_t *weights - , float32_t *out - , uint32_t nbVectors - , uint32_t vecDim); - -/** - * @brief Euclidean distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_euclidean_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Bray-Curtis distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_braycurtis_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Canberra distance between two vectors - * - * This function may divide by zero when samples pA[i] and pB[i] are both zero. - * The result of the computation will be correct. So the division per zero may be - * ignored. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_canberra_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Chebyshev distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_chebyshev_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - - -/** - * @brief Cityblock (Manhattan) distance between two vectors - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_cityblock_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Correlation distance between two vectors - * - * The input vectors are modified in place ! - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ -float32_t arm_correlation_distance_f32(float32_t *pA,float32_t *pB, uint32_t blockSize); - -/** - * @brief Cosine distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_cosine_distance_f32(const float32_t *pA,const float32_t *pB, uint32_t blockSize); - -/** - * @brief Jensen-Shannon distance between two vectors - * - * This function is assuming that elements of second vector are > 0 - * and 0 only when the corresponding element of first vector is 0. - * Otherwise the result of the computation does not make sense - * and for speed reasons, the cases returning NaN or Infinity are not - * managed. - * - * When the function is computing x log (x / y) with x 0 and y 0, - * it will compute the right value (0) but a division per zero will occur - * and shoudl be ignored in client code. - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] blockSize vector length - * @return distance - * - */ - -float32_t arm_jensenshannon_distance_f32(const float32_t *pA,const float32_t *pB,uint32_t blockSize); - -/** - * @brief Minkowski distance between two vectors - * - * @param[in] pA First vector - * @param[in] pB Second vector - * @param[in] n Norm order (>= 2) - * @param[in] blockSize vector length - * @return distance - * - */ - - - -float32_t arm_minkowski_distance_f32(const float32_t *pA,const float32_t *pB, int32_t order, uint32_t blockSize); - -/** - * @brief Dice distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] order Distance order - * @param[in] blockSize Number of samples - * @return distance - * - */ - - -float32_t arm_dice_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Hamming distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_hamming_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Jaccard distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_jaccard_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Kulsinski distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_kulsinski_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Roger Stanimoto distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_rogerstanimoto_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Russell-Rao distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_russellrao_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Michener distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_sokalmichener_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Sokal-Sneath distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_sokalsneath_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - -/** - * @brief Yule distance between two vectors - * - * @param[in] pA First vector of packed booleans - * @param[in] pB Second vector of packed booleans - * @param[in] numberOfBools Number of booleans - * @return distance - * - */ - -float32_t arm_yule_distance(const uint32_t *pA, const uint32_t *pB, uint32_t numberOfBools); - - - /** - * @ingroup groupInterpolation - */ - - /** - * @defgroup BilinearInterpolate Bilinear Interpolation - * - * Bilinear interpolation is an extension of linear interpolation applied to a two dimensional grid. - * The underlying function f(x, y) is sampled on a regular grid and the interpolation process - * determines values between the grid points. - * Bilinear interpolation is equivalent to two step linear interpolation, first in the x-dimension and then in the y-dimension. - * Bilinear interpolation is often used in image processing to rescale images. - * The CMSIS DSP library provides bilinear interpolation functions for Q7, Q15, Q31, and floating-point data types. - * - * Algorithm - * \par - * The instance structure used by the bilinear interpolation functions describes a two dimensional data table. - * For floating-point, the instance structure is defined as: - *
-   *   typedef struct
-   *   {
-   *     uint16_t numRows;
-   *     uint16_t numCols;
-   *     float32_t *pData;
-   * } arm_bilinear_interp_instance_f32;
-   * 
- * - * \par - * where numRows specifies the number of rows in the table; - * numCols specifies the number of columns in the table; - * and pData points to an array of size numRows*numCols values. - * The data table pTable is organized in row order and the supplied data values fall on integer indexes. - * That is, table element (x,y) is located at pTable[x + y*numCols] where x and y are integers. - * - * \par - * Let (x, y) specify the desired interpolation point. Then define: - *
-   *     XF = floor(x)
-   *     YF = floor(y)
-   * 
- * \par - * The interpolated output point is computed as: - *
-   *  f(x, y) = f(XF, YF) * (1-(x-XF)) * (1-(y-YF))
-   *           + f(XF+1, YF) * (x-XF)*(1-(y-YF))
-   *           + f(XF, YF+1) * (1-(x-XF))*(y-YF)
-   *           + f(XF+1, YF+1) * (x-XF)*(y-YF)
-   * 
- * Note that the coordinates (x, y) contain integer and fractional components. - * The integer components specify which portion of the table to use while the - * fractional components control the interpolation processor. - * - * \par - * if (x,y) are outside of the table boundary, Bilinear interpolation returns zero output. - */ - - - /** - * @addtogroup BilinearInterpolate - * @{ - */ - - /** - * @brief Floating-point bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate. - * @param[in] Y interpolation coordinate. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE float32_t arm_bilinear_interp_f32( - const arm_bilinear_interp_instance_f32 * S, - float32_t X, - float32_t Y) - { - float32_t out; - float32_t f00, f01, f10, f11; - float32_t *pData = S->pData; - int32_t xIndex, yIndex, index; - float32_t xdiff, ydiff; - float32_t b1, b2, b3, b4; - - xIndex = (int32_t) X; - yIndex = (int32_t) Y; - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (xIndex < 0 || xIndex > (S->numCols - 2) || yIndex < 0 || yIndex > (S->numRows - 2)) - { - return (0); - } - - /* Calculation of index for two nearest points in X-direction */ - index = (xIndex ) + (yIndex ) * S->numCols; - - - /* Read two nearest points in X-direction */ - f00 = pData[index]; - f01 = pData[index + 1]; - - /* Calculation of index for two nearest points in Y-direction */ - index = (xIndex ) + (yIndex+1) * S->numCols; - - - /* Read two nearest points in Y-direction */ - f10 = pData[index]; - f11 = pData[index + 1]; - - /* Calculation of intermediate values */ - b1 = f00; - b2 = f01 - f00; - b3 = f10 - f00; - b4 = f00 - f01 - f10 + f11; - - /* Calculation of fractional part in X */ - xdiff = X - xIndex; - - /* Calculation of fractional part in Y */ - ydiff = Y - yIndex; - - /* Calculation of bi-linear interpolated output */ - out = b1 + b2 * xdiff + b3 * ydiff + b4 * xdiff * ydiff; - - /* return to application */ - return (out); - } - - - /** - * @brief Q31 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q31_t arm_bilinear_interp_q31( - arm_bilinear_interp_instance_q31 * S, - q31_t X, - q31_t Y) - { - q31_t out; /* Temporary output */ - q31_t acc = 0; /* output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q31_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q31_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* shift left xfract by 11 to keep 1.31 format */ - xfract = (X & 0x000FFFFF) << 11U; - - /* Read two nearest output values from the index */ - x1 = pYData[(rI) + (int32_t)nCols * (cI) ]; - x2 = pYData[(rI) + (int32_t)nCols * (cI) + 1]; - - /* 20 bits for the fractional part */ - /* shift left yfract by 11 to keep 1.31 format */ - yfract = (Y & 0x000FFFFF) << 11U; - - /* Read two nearest output values from the index */ - y1 = pYData[(rI) + (int32_t)nCols * (cI + 1) ]; - y2 = pYData[(rI) + (int32_t)nCols * (cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 3.29(q29) format */ - out = ((q31_t) (((q63_t) x1 * (0x7FFFFFFF - xfract)) >> 32)); - acc = ((q31_t) (((q63_t) out * (0x7FFFFFFF - yfract)) >> 32)); - - /* x2 * (xfract) * (1-yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) x2 * (0x7FFFFFFF - yfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (xfract) >> 32)); - - /* y1 * (1 - xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y1 * (0x7FFFFFFF - xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* y2 * (xfract) * (yfract) in 3.29(q29) and adding to acc */ - out = ((q31_t) ((q63_t) y2 * (xfract) >> 32)); - acc += ((q31_t) ((q63_t) out * (yfract) >> 32)); - - /* Convert acc to 1.31(q31) format */ - return ((q31_t)(acc << 2)); - } - - - /** - * @brief Q15 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q15_t arm_bilinear_interp_q15( - arm_bilinear_interp_instance_q15 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q15_t x1, x2, y1, y2; /* Nearest output values */ - q31_t xfract, yfract; /* X, Y fractional parts */ - int32_t rI, cI; /* Row and column indices */ - q15_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & 0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & 0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 13.51 format */ - - /* x1 is in 1.15(q15), xfract in 12.20 format and out is in 13.35 format */ - /* convert 13.35 to 13.31 by right shifting and out is in 1.31 */ - out = (q31_t) (((q63_t) x1 * (0x0FFFFF - xfract)) >> 4U); - acc = ((q63_t) out * (0x0FFFFF - yfract)); - - /* x2 * (xfract) * (1-yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) x2 * (0x0FFFFF - yfract)) >> 4U); - acc += ((q63_t) out * (xfract)); - - /* y1 * (1 - xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y1 * (0x0FFFFF - xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - - /* y2 * (xfract) * (yfract) in 1.51 and adding to acc */ - out = (q31_t) (((q63_t) y2 * (xfract)) >> 4U); - acc += ((q63_t) out * (yfract)); - - /* acc is in 13.51 format and down shift acc by 36 times */ - /* Convert out to 1.15 format */ - return ((q15_t)(acc >> 36)); - } - - - /** - * @brief Q7 bilinear interpolation. - * @param[in,out] S points to an instance of the interpolation structure. - * @param[in] X interpolation coordinate in 12.20 format. - * @param[in] Y interpolation coordinate in 12.20 format. - * @return out interpolated value. - */ - __STATIC_FORCEINLINE q7_t arm_bilinear_interp_q7( - arm_bilinear_interp_instance_q7 * S, - q31_t X, - q31_t Y) - { - q63_t acc = 0; /* output */ - q31_t out; /* Temporary output */ - q31_t xfract, yfract; /* X, Y fractional parts */ - q7_t x1, x2, y1, y2; /* Nearest output values */ - int32_t rI, cI; /* Row and column indices */ - q7_t *pYData = S->pData; /* pointer to output table values */ - uint32_t nCols = S->numCols; /* num of rows */ - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - rI = ((X & (q31_t)0xFFF00000) >> 20); - - /* Input is in 12.20 format */ - /* 12 bits for the table index */ - /* Index value calculation */ - cI = ((Y & (q31_t)0xFFF00000) >> 20); - - /* Care taken for table outside boundary */ - /* Returns zero output when values are outside table boundary */ - if (rI < 0 || rI > (S->numCols - 2) || cI < 0 || cI > (S->numRows - 2)) - { - return (0); - } - - /* 20 bits for the fractional part */ - /* xfract should be in 12.20 format */ - xfract = (X & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - x1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) ]; - x2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI) + 1]; - - /* 20 bits for the fractional part */ - /* yfract should be in 12.20 format */ - yfract = (Y & (q31_t)0x000FFFFF); - - /* Read two nearest output values from the index */ - y1 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) ]; - y2 = pYData[((uint32_t)rI) + nCols * ((uint32_t)cI + 1) + 1]; - - /* Calculation of x1 * (1-xfract ) * (1-yfract) and acc is in 16.47 format */ - out = ((x1 * (0xFFFFF - xfract))); - acc = (((q63_t) out * (0xFFFFF - yfract))); - - /* x2 * (xfract) * (1-yfract) in 2.22 and adding to acc */ - out = ((x2 * (0xFFFFF - yfract))); - acc += (((q63_t) out * (xfract))); - - /* y1 * (1 - xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y1 * (0xFFFFF - xfract))); - acc += (((q63_t) out * (yfract))); - - /* y2 * (xfract) * (yfract) in 2.22 and adding to acc */ - out = ((y2 * (yfract))); - acc += (((q63_t) out * (xfract))); - - /* acc in 16.47 format and down shift by 40 to convert to 1.7 format */ - return ((q7_t)(acc >> 40)); - } - - /** - * @} end of BilinearInterpolate group - */ - - -/* SMMLAR */ -#define multAcc_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) + ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMLSR */ -#define multSub_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((((q63_t) a) << 32) - ((q63_t) x * y) + 0x80000000LL ) >> 32) - -/* SMMULR */ -#define mult_32x32_keep32_R(a, x, y) \ - a = (q31_t) (((q63_t) x * y + 0x80000000LL ) >> 32) - -/* SMMLA */ -#define multAcc_32x32_keep32(a, x, y) \ - a += (q31_t) (((q63_t) x * y) >> 32) - -/* SMMLS */ -#define multSub_32x32_keep32(a, x, y) \ - a -= (q31_t) (((q63_t) x * y) >> 32) - -/* SMMUL */ -#define mult_32x32_keep32(a, x, y) \ - a = (q31_t) (((q63_t) x * y ) >> 32) - - -#if defined ( __CC_ARM ) - /* Enter low optimization region - place directly above function definition */ - #if defined( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("push") \ - _Pragma ("O1") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_EXIT \ - _Pragma ("pop") - #else - #define LOW_OPTIMIZATION_EXIT - #endif - - /* Enter low optimization region - place directly above function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined (__ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __GNUC__ ) - #define LOW_OPTIMIZATION_ENTER \ - __attribute__(( optimize("-O1") )) - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __ICCARM__ ) - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define LOW_OPTIMIZATION_EXIT - - /* Enter low optimization region - place directly above function definition */ - #if defined ( __ARM_ARCH_7EM__ ) - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER \ - _Pragma ("optimize=low") - #else - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #endif - - /* Exit low optimization region - place directly after end of function definition */ - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TI_ARM__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __CSMC__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( __TASKING__ ) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT - -#elif defined ( _MSC_VER ) || defined(__GNUC_PYTHON__) - #define LOW_OPTIMIZATION_ENTER - #define LOW_OPTIMIZATION_EXIT - #define IAR_ONLY_LOW_OPTIMIZATION_ENTER - #define IAR_ONLY_LOW_OPTIMIZATION_EXIT -#endif - - - -/* Compiler specific diagnostic adjustment */ -#if defined ( __CC_ARM ) - -#elif defined ( __ARMCC_VERSION ) && ( __ARMCC_VERSION >= 6010050 ) - -#elif defined ( __GNUC__ ) -#pragma GCC diagnostic pop - -#elif defined ( __ICCARM__ ) - -#elif defined ( __TI_ARM__ ) - -#elif defined ( __CSMC__ ) - -#elif defined ( __TASKING__ ) - -#elif defined ( _MSC_VER ) - -#else - #error Unknown compiler -#endif - -#ifdef __cplusplus -} -#endif - - -#endif /* _ARM_MATH_H */ - -/** - * - * End of file. - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_armclang.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_armclang.h deleted file mode 100644 index 90de9dbf..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_armclang.h +++ /dev/null @@ -1,1467 +0,0 @@ -/**************************************************************************//** - * @file cmsis_armclang.h - * @brief CMSIS compiler armclang (Arm Compiler 6) header file - * @version V5.3.1 - * @date 26. March 2020 - ******************************************************************************/ -/* - * Copyright (c) 2009-2020 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/*lint -esym(9058, IRQn)*/ /* disable MISRA 2012 Rule 2.4 for IRQn */ - -#ifndef __CMSIS_ARMCLANG_H -#define __CMSIS_ARMCLANG_H - -#pragma clang system_header /* treat file as system include file */ - -#ifndef __ARM_COMPAT_H -#include /* Compatibility header for Arm Compiler 5 intrinsics */ -#endif - -/* CMSIS compiler specific defines */ -#ifndef __ASM - #define __ASM __asm -#endif -#ifndef __INLINE - #define __INLINE __inline -#endif -#ifndef __STATIC_INLINE - #define __STATIC_INLINE static __inline -#endif -#ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __attribute__((always_inline)) static __inline -#endif -#ifndef __NO_RETURN - #define __NO_RETURN __attribute__((__noreturn__)) -#endif -#ifndef __USED - #define __USED __attribute__((used)) -#endif -#ifndef __WEAK - #define __WEAK __attribute__((weak)) -#endif -#ifndef __PACKED - #define __PACKED __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed, aligned(1))) -#endif -#ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed, aligned(1))) -#endif -#ifndef __UNALIGNED_UINT32 /* deprecated */ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32 */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) -#endif -#ifndef __UNALIGNED_UINT16_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_WRITE */ - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT16_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT16_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT16_READ */ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) -#endif -#ifndef __UNALIGNED_UINT32_WRITE - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_WRITE)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_WRITE */ - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) -#endif -#ifndef __UNALIGNED_UINT32_READ - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wpacked" -/*lint -esym(9058, T_UINT32_READ)*/ /* disable MISRA 2012 Rule 2.4 for T_UINT32_READ */ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #pragma clang diagnostic pop - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) -#endif -#ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) -#endif -#ifndef __RESTRICT - #define __RESTRICT __restrict -#endif -#ifndef __COMPILER_BARRIER - #define __COMPILER_BARRIER() __ASM volatile("":::"memory") -#endif - -/* ######################### Startup and Lowlevel Init ######################## */ - -#ifndef __PROGRAM_START -#define __PROGRAM_START __main -#endif - -#ifndef __INITIAL_SP -#define __INITIAL_SP Image$$ARM_LIB_STACK$$ZI$$Limit -#endif - -#ifndef __STACK_LIMIT -#define __STACK_LIMIT Image$$ARM_LIB_STACK$$ZI$$Base -#endif - -#ifndef __VECTOR_TABLE -#define __VECTOR_TABLE __Vectors -#endif - -#ifndef __VECTOR_TABLE_ATTRIBUTE -#define __VECTOR_TABLE_ATTRIBUTE __attribute__((used, section("RESET"))) -#endif - -/* ########################### Core Function Access ########################### */ -/** \ingroup CMSIS_Core_FunctionInterface - \defgroup CMSIS_Core_RegAccFunctions CMSIS Core Register Access Functions - @{ - */ - -/** - \brief Enable IRQ Interrupts - \details Enables IRQ interrupts by clearing the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __enable_irq(); see arm_compat.h */ - - -/** - \brief Disable IRQ Interrupts - \details Disables IRQ interrupts by setting the I-bit in the CPSR. - Can only be executed in Privileged modes. - */ -/* intrinsic void __disable_irq(); see arm_compat.h */ - - -/** - \brief Get Control Register - \details Returns the content of the Control Register. - \return Control Register value - */ -__STATIC_FORCEINLINE uint32_t __get_CONTROL(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Control Register (non-secure) - \details Returns the content of the non-secure Control Register when in secure mode. - \return non-secure Control Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_CONTROL_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, control_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Control Register - \details Writes the given value to the Control Register. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __set_CONTROL(uint32_t control) -{ - __ASM volatile ("MSR control, %0" : : "r" (control) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Control Register (non-secure) - \details Writes the given value to the non-secure Control Register when in secure state. - \param [in] control Control Register value to set - */ -__STATIC_FORCEINLINE void __TZ_set_CONTROL_NS(uint32_t control) -{ - __ASM volatile ("MSR control_ns, %0" : : "r" (control) : "memory"); -} -#endif - - -/** - \brief Get IPSR Register - \details Returns the content of the IPSR Register. - \return IPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_IPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, ipsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get APSR Register - \details Returns the content of the APSR Register. - \return APSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_APSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, apsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get xPSR Register - \details Returns the content of the xPSR Register. - \return xPSR Register value - */ -__STATIC_FORCEINLINE uint32_t __get_xPSR(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, xpsr" : "=r" (result) ); - return(result); -} - - -/** - \brief Get Process Stack Pointer - \details Returns the current value of the Process Stack Pointer (PSP). - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer (non-secure) - \details Returns the current value of the non-secure Process Stack Pointer (PSP) when in secure state. - \return PSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, psp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Process Stack Pointer - \details Assigns the given value to the Process Stack Pointer (PSP). - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_PSP(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp, %0" : : "r" (topOfProcStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Process Stack Pointer (PSP) when in secure state. - \param [in] topOfProcStack Process Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSP_NS(uint32_t topOfProcStack) -{ - __ASM volatile ("MSR psp_ns, %0" : : "r" (topOfProcStack) : ); -} -#endif - - -/** - \brief Get Main Stack Pointer - \details Returns the current value of the Main Stack Pointer (MSP). - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSP(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer (non-secure) - \details Returns the current value of the non-secure Main Stack Pointer (MSP) when in secure state. - \return MSP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, msp_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Main Stack Pointer - \details Assigns the given value to the Main Stack Pointer (MSP). - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __set_MSP(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp, %0" : : "r" (topOfMainStack) : ); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Main Stack Pointer (MSP) when in secure state. - \param [in] topOfMainStack Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSP_NS(uint32_t topOfMainStack) -{ - __ASM volatile ("MSR msp_ns, %0" : : "r" (topOfMainStack) : ); -} -#endif - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Stack Pointer (non-secure) - \details Returns the current value of the non-secure Stack Pointer (SP) when in secure state. - \return SP Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_SP_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, sp_ns" : "=r" (result) ); - return(result); -} - - -/** - \brief Set Stack Pointer (non-secure) - \details Assigns the given value to the non-secure Stack Pointer (SP) when in secure state. - \param [in] topOfStack Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_SP_NS(uint32_t topOfStack) -{ - __ASM volatile ("MSR sp_ns, %0" : : "r" (topOfStack) : ); -} -#endif - - -/** - \brief Get Priority Mask - \details Returns the current state of the priority mask bit from the Priority Mask Register. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __get_PRIMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Priority Mask (non-secure) - \details Returns the current state of the non-secure priority mask bit from the Priority Mask Register when in secure state. - \return Priority Mask value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PRIMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, primask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Priority Mask - \details Assigns the given value to the Priority Mask Register. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __set_PRIMASK(uint32_t priMask) -{ - __ASM volatile ("MSR primask, %0" : : "r" (priMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Priority Mask (non-secure) - \details Assigns the given value to the non-secure Priority Mask Register when in secure state. - \param [in] priMask Priority Mask - */ -__STATIC_FORCEINLINE void __TZ_set_PRIMASK_NS(uint32_t priMask) -{ - __ASM volatile ("MSR primask_ns, %0" : : "r" (priMask) : "memory"); -} -#endif - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) -/** - \brief Enable FIQ - \details Enables FIQ interrupts by clearing the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __enable_fault_irq __enable_fiq /* see arm_compat.h */ - - -/** - \brief Disable FIQ - \details Disables FIQ interrupts by setting the F-bit in the CPSR. - Can only be executed in Privileged modes. - */ -#define __disable_fault_irq __disable_fiq /* see arm_compat.h */ - - -/** - \brief Get Base Priority - \details Returns the current value of the Base Priority register. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __get_BASEPRI(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Base Priority (non-secure) - \details Returns the current value of the non-secure Base Priority register when in secure state. - \return Base Priority register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_BASEPRI_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, basepri_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Base Priority - \details Assigns the given value to the Base Priority register. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI(uint32_t basePri) -{ - __ASM volatile ("MSR basepri, %0" : : "r" (basePri) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Base Priority (non-secure) - \details Assigns the given value to the non-secure Base Priority register when in secure state. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __TZ_set_BASEPRI_NS(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_ns, %0" : : "r" (basePri) : "memory"); -} -#endif - - -/** - \brief Set Base Priority with condition - \details Assigns the given value to the Base Priority register only if BASEPRI masking is disabled, - or the new value increases the BASEPRI priority level. - \param [in] basePri Base Priority value to set - */ -__STATIC_FORCEINLINE void __set_BASEPRI_MAX(uint32_t basePri) -{ - __ASM volatile ("MSR basepri_max, %0" : : "r" (basePri) : "memory"); -} - - -/** - \brief Get Fault Mask - \details Returns the current value of the Fault Mask register. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __get_FAULTMASK(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask" : "=r" (result) ); - return(result); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Fault Mask (non-secure) - \details Returns the current value of the non-secure Fault Mask register when in secure state. - \return Fault Mask register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_FAULTMASK_NS(void) -{ - uint32_t result; - - __ASM volatile ("MRS %0, faultmask_ns" : "=r" (result) ); - return(result); -} -#endif - - -/** - \brief Set Fault Mask - \details Assigns the given value to the Fault Mask register. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __set_FAULTMASK(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask, %0" : : "r" (faultMask) : "memory"); -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Fault Mask (non-secure) - \details Assigns the given value to the non-secure Fault Mask register when in secure state. - \param [in] faultMask Fault Mask value to set - */ -__STATIC_FORCEINLINE void __TZ_set_FAULTMASK_NS(uint32_t faultMask) -{ - __ASM volatile ("MSR faultmask_ns, %0" : : "r" (faultMask) : "memory"); -} -#endif - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Get Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the Process Stack Pointer Limit (PSPLIM). - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_PSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim" : "=r" (result) ); - return result; -#endif -} - -#if (defined (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Process Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always in non-secure - mode. - - \details Returns the current value of the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \return PSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_PSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, psplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Process Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the Process Stack Pointer Limit (PSPLIM). - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_PSPLIM(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim, %0" : : "r" (ProcStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Process Stack Pointer (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored in non-secure - mode. - - \details Assigns the given value to the non-secure Process Stack Pointer Limit (PSPLIM) when in secure state. - \param [in] ProcStackPtrLimit Process Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __TZ_set_PSPLIM_NS(uint32_t ProcStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure PSPLIM is RAZ/WI - (void)ProcStackPtrLimit; -#else - __ASM volatile ("MSR psplim_ns, %0\n" : : "r" (ProcStackPtrLimit)); -#endif -} -#endif - - -/** - \brief Get Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the Main Stack Pointer Limit (MSPLIM). - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __get_MSPLIM(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim" : "=r" (result) ); - return result; -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Get Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence zero is returned always. - - \details Returns the current value of the non-secure Main Stack Pointer Limit(MSPLIM) when in secure state. - \return MSPLIM Register value - */ -__STATIC_FORCEINLINE uint32_t __TZ_get_MSPLIM_NS(void) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - return 0U; -#else - uint32_t result; - __ASM volatile ("MRS %0, msplim_ns" : "=r" (result) ); - return result; -#endif -} -#endif - - -/** - \brief Set Main Stack Pointer Limit - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the Main Stack Pointer Limit (MSPLIM). - \param [in] MainStackPtrLimit Main Stack Pointer Limit value to set - */ -__STATIC_FORCEINLINE void __set_MSPLIM(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) && \ - (!defined (__ARM_FEATURE_CMSE) || (__ARM_FEATURE_CMSE < 3))) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim, %0" : : "r" (MainStackPtrLimit)); -#endif -} - - -#if (defined (__ARM_FEATURE_CMSE ) && (__ARM_FEATURE_CMSE == 3)) -/** - \brief Set Main Stack Pointer Limit (non-secure) - Devices without ARMv8-M Main Extensions (i.e. Cortex-M23) lack the non-secure - Stack Pointer Limit register hence the write is silently ignored. - - \details Assigns the given value to the non-secure Main Stack Pointer Limit (MSPLIM) when in secure state. - \param [in] MainStackPtrLimit Main Stack Pointer value to set - */ -__STATIC_FORCEINLINE void __TZ_set_MSPLIM_NS(uint32_t MainStackPtrLimit) -{ -#if (!((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__ ) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) ) - // without main extensions, the non-secure MSPLIM is RAZ/WI - (void)MainStackPtrLimit; -#else - __ASM volatile ("MSR msplim_ns, %0" : : "r" (MainStackPtrLimit)); -#endif -} -#endif - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Get FPSCR - \details Returns the current value of the Floating Point Status/Control register. - \return Floating Point Status/Control register value - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __get_FPSCR (uint32_t)__builtin_arm_get_fpscr -#else -#define __get_FPSCR() ((uint32_t)0U) -#endif - -/** - \brief Set FPSCR - \details Assigns the given value to the Floating Point Status/Control register. - \param [in] fpscr Floating Point Status/Control value to set - */ -#if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \ - (defined (__FPU_USED ) && (__FPU_USED == 1U)) ) -#define __set_FPSCR __builtin_arm_set_fpscr -#else -#define __set_FPSCR(x) ((void)(x)) -#endif - - -/*@} end of CMSIS_Core_RegAccFunctions */ - - -/* ########################## Core Instruction Access ######################### */ -/** \defgroup CMSIS_Core_InstructionInterface CMSIS Core Instruction Interface - Access to dedicated instructions - @{ -*/ - -/* Define macros for porting to both thumb1 and thumb2. - * For thumb1, use low register (r0-r7), specified by constraint "l" - * Otherwise, use general registers, specified by constraint "r" */ -#if defined (__thumb__) && !defined (__thumb2__) -#define __CMSIS_GCC_OUT_REG(r) "=l" (r) -#define __CMSIS_GCC_RW_REG(r) "+l" (r) -#define __CMSIS_GCC_USE_REG(r) "l" (r) -#else -#define __CMSIS_GCC_OUT_REG(r) "=r" (r) -#define __CMSIS_GCC_RW_REG(r) "+r" (r) -#define __CMSIS_GCC_USE_REG(r) "r" (r) -#endif - -/** - \brief No Operation - \details No Operation does nothing. This instruction can be used for code alignment purposes. - */ -#define __NOP __builtin_arm_nop - -/** - \brief Wait For Interrupt - \details Wait For Interrupt is a hint instruction that suspends execution until one of a number of events occurs. - */ -#define __WFI __builtin_arm_wfi - - -/** - \brief Wait For Event - \details Wait For Event is a hint instruction that permits the processor to enter - a low-power state until one of a number of events occurs. - */ -#define __WFE __builtin_arm_wfe - - -/** - \brief Send Event - \details Send Event is a hint instruction. It causes an event to be signaled to the CPU. - */ -#define __SEV __builtin_arm_sev - - -/** - \brief Instruction Synchronization Barrier - \details Instruction Synchronization Barrier flushes the pipeline in the processor, - so that all instructions following the ISB are fetched from cache or memory, - after the instruction has been completed. - */ -#define __ISB() __builtin_arm_isb(0xF) - -/** - \brief Data Synchronization Barrier - \details Acts as a special kind of Data Memory Barrier. - It completes when all explicit memory accesses before this instruction complete. - */ -#define __DSB() __builtin_arm_dsb(0xF) - - -/** - \brief Data Memory Barrier - \details Ensures the apparent order of the explicit memory operations before - and after the instruction, without ensuring their completion. - */ -#define __DMB() __builtin_arm_dmb(0xF) - - -/** - \brief Reverse byte order (32 bit) - \details Reverses the byte order in unsigned integer value. For example, 0x12345678 becomes 0x78563412. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV(value) __builtin_bswap32(value) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order within each halfword of a word. For example, 0x12345678 becomes 0x34127856. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REV16(value) __ROR(__REV(value), 16) - - -/** - \brief Reverse byte order (16 bit) - \details Reverses the byte order in a 16-bit value and returns the signed 16-bit result. For example, 0x0080 becomes 0x8000. - \param [in] value Value to reverse - \return Reversed value - */ -#define __REVSH(value) (int16_t)__builtin_bswap16(value) - - -/** - \brief Rotate Right in unsigned value (32 bit) - \details Rotate Right (immediate) provides the value of the contents of a register rotated by a variable number of bits. - \param [in] op1 Value to rotate - \param [in] op2 Number of Bits to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __ROR(uint32_t op1, uint32_t op2) -{ - op2 %= 32U; - if (op2 == 0U) - { - return op1; - } - return (op1 >> op2) | (op1 << (32U - op2)); -} - - -/** - \brief Breakpoint - \details Causes the processor to enter Debug state. - Debug tools can use this to investigate system state when the instruction at a particular address is reached. - \param [in] value is ignored by the processor. - If required, a debugger can use it to store additional information about the breakpoint. - */ -#define __BKPT(value) __ASM volatile ("bkpt "#value) - - -/** - \brief Reverse bit order of value - \details Reverses the bit order of the given value. - \param [in] value Value to reverse - \return Reversed value - */ -#define __RBIT __builtin_arm_rbit - -/** - \brief Count leading zeros - \details Counts the number of leading zeros of a data value. - \param [in] value Value to count the leading zeros - \return number of leading zeros in value - */ -__STATIC_FORCEINLINE uint8_t __CLZ(uint32_t value) -{ - /* Even though __builtin_clz produces a CLZ instruction on ARM, formally - __builtin_clz(0) is undefined behaviour, so handle this case specially. - This guarantees ARM-compatible results if happening to compile on a non-ARM - target, and ensures the compiler doesn't decide to activate any - optimisations using the logic "value was passed to __builtin_clz, so it - is non-zero". - ARM Compiler 6.10 and possibly earlier will optimise this test away, leaving a - single CLZ instruction. - */ - if (value == 0U) - { - return 32U; - } - return __builtin_clz(value); -} - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief LDR Exclusive (8 bit) - \details Executes a exclusive LDR instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDREXB (uint8_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (16 bit) - \details Executes a exclusive LDR instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDREXH (uint16_t)__builtin_arm_ldrex - - -/** - \brief LDR Exclusive (32 bit) - \details Executes a exclusive LDR instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDREXW (uint32_t)__builtin_arm_ldrex - - -/** - \brief STR Exclusive (8 bit) - \details Executes a exclusive STR instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXB (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (16 bit) - \details Executes a exclusive STR instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXH (uint32_t)__builtin_arm_strex - - -/** - \brief STR Exclusive (32 bit) - \details Executes a exclusive STR instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STREXW (uint32_t)__builtin_arm_strex - - -/** - \brief Remove the exclusive lock - \details Removes the exclusive lock which is created by LDREX. - */ -#define __CLREX __builtin_arm_clrex - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -#define __SSAT __builtin_arm_ssat - - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -#define __USAT __builtin_arm_usat - - -/** - \brief Rotate Right with Extend (32 bit) - \details Moves each bit of a bitstring right by one bit. - The carry input is shifted in at the left end of the bitstring. - \param [in] value Value to rotate - \return Rotated value - */ -__STATIC_FORCEINLINE uint32_t __RRX(uint32_t value) -{ - uint32_t result; - - __ASM volatile ("rrx %0, %1" : __CMSIS_GCC_OUT_REG (result) : __CMSIS_GCC_USE_REG (value) ); - return(result); -} - - -/** - \brief LDRT Unprivileged (8 bit) - \details Executes a Unprivileged LDRT instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDRBT(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrbt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint8_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (16 bit) - \details Executes a Unprivileged LDRT instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDRHT(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrht %0, %1" : "=r" (result) : "Q" (*ptr) ); - return ((uint16_t) result); /* Add explicit type cast here */ -} - - -/** - \brief LDRT Unprivileged (32 bit) - \details Executes a Unprivileged LDRT instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDRT(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldrt %0, %1" : "=r" (result) : "Q" (*ptr) ); - return(result); -} - - -/** - \brief STRT Unprivileged (8 bit) - \details Executes a Unprivileged STRT instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRBT(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("strbt %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (16 bit) - \details Executes a Unprivileged STRT instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRHT(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("strht %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) ); -} - - -/** - \brief STRT Unprivileged (32 bit) - \details Executes a Unprivileged STRT instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STRT(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("strt %1, %0" : "=Q" (*ptr) : "r" (value) ); -} - -#else /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/** - \brief Signed Saturate - \details Saturates a signed value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (1..32) - \return Saturated value - */ -__STATIC_FORCEINLINE int32_t __SSAT(int32_t val, uint32_t sat) -{ - if ((sat >= 1U) && (sat <= 32U)) - { - const int32_t max = (int32_t)((1U << (sat - 1U)) - 1U); - const int32_t min = -1 - max ; - if (val > max) - { - return max; - } - else if (val < min) - { - return min; - } - } - return val; -} - -/** - \brief Unsigned Saturate - \details Saturates an unsigned value. - \param [in] value Value to be saturated - \param [in] sat Bit position to saturate to (0..31) - \return Saturated value - */ -__STATIC_FORCEINLINE uint32_t __USAT(int32_t val, uint32_t sat) -{ - if (sat <= 31U) - { - const uint32_t max = ((1U << sat) - 1U); - if (val > (int32_t)max) - { - return max; - } - else if (val < 0) - { - return 0U; - } - } - return (uint32_t)val; -} - -#endif /* ((defined (__ARM_ARCH_7M__ ) && (__ARM_ARCH_7M__ == 1)) || \ - (defined (__ARM_ARCH_7EM__ ) && (__ARM_ARCH_7EM__ == 1)) || \ - (defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - - -#if ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) - -/** - \brief Load-Acquire (8 bit) - \details Executes a LDAB instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -__STATIC_FORCEINLINE uint8_t __LDAB(volatile uint8_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldab %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint8_t) result); -} - - -/** - \brief Load-Acquire (16 bit) - \details Executes a LDAH instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -__STATIC_FORCEINLINE uint16_t __LDAH(volatile uint16_t *ptr) -{ - uint32_t result; - - __ASM volatile ("ldah %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return ((uint16_t) result); -} - - -/** - \brief Load-Acquire (32 bit) - \details Executes a LDA instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -__STATIC_FORCEINLINE uint32_t __LDA(volatile uint32_t *ptr) -{ - uint32_t result; - - __ASM volatile ("lda %0, %1" : "=r" (result) : "Q" (*ptr) : "memory" ); - return(result); -} - - -/** - \brief Store-Release (8 bit) - \details Executes a STLB instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLB(uint8_t value, volatile uint8_t *ptr) -{ - __ASM volatile ("stlb %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (16 bit) - \details Executes a STLH instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STLH(uint16_t value, volatile uint16_t *ptr) -{ - __ASM volatile ("stlh %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Store-Release (32 bit) - \details Executes a STL instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - */ -__STATIC_FORCEINLINE void __STL(uint32_t value, volatile uint32_t *ptr) -{ - __ASM volatile ("stl %1, %0" : "=Q" (*ptr) : "r" ((uint32_t)value) : "memory" ); -} - - -/** - \brief Load-Acquire Exclusive (8 bit) - \details Executes a LDAB exclusive instruction for 8 bit value. - \param [in] ptr Pointer to data - \return value of type uint8_t at (*ptr) - */ -#define __LDAEXB (uint8_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (16 bit) - \details Executes a LDAH exclusive instruction for 16 bit values. - \param [in] ptr Pointer to data - \return value of type uint16_t at (*ptr) - */ -#define __LDAEXH (uint16_t)__builtin_arm_ldaex - - -/** - \brief Load-Acquire Exclusive (32 bit) - \details Executes a LDA exclusive instruction for 32 bit values. - \param [in] ptr Pointer to data - \return value of type uint32_t at (*ptr) - */ -#define __LDAEX (uint32_t)__builtin_arm_ldaex - - -/** - \brief Store-Release Exclusive (8 bit) - \details Executes a STLB exclusive instruction for 8 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXB (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (16 bit) - \details Executes a STLH exclusive instruction for 16 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEXH (uint32_t)__builtin_arm_stlex - - -/** - \brief Store-Release Exclusive (32 bit) - \details Executes a STL exclusive instruction for 32 bit values. - \param [in] value Value to store - \param [in] ptr Pointer to location - \return 0 Function succeeded - \return 1 Function failed - */ -#define __STLEX (uint32_t)__builtin_arm_stlex - -#endif /* ((defined (__ARM_ARCH_8M_MAIN__ ) && (__ARM_ARCH_8M_MAIN__ == 1)) || \ - (defined (__ARM_ARCH_8M_BASE__ ) && (__ARM_ARCH_8M_BASE__ == 1)) || \ - (defined (__ARM_ARCH_8_1M_MAIN__) && (__ARM_ARCH_8_1M_MAIN__ == 1)) ) */ - -/*@}*/ /* end of group CMSIS_Core_InstructionInterface */ - - -/* ################### Compiler specific Intrinsics ########################### */ -/** \defgroup CMSIS_SIMD_intrinsics CMSIS SIMD Intrinsics - Access to dedicated SIMD instructions - @{ -*/ - -#if (defined (__ARM_FEATURE_DSP) && (__ARM_FEATURE_DSP == 1)) - -#define __SADD8 __builtin_arm_sadd8 -#define __QADD8 __builtin_arm_qadd8 -#define __SHADD8 __builtin_arm_shadd8 -#define __UADD8 __builtin_arm_uadd8 -#define __UQADD8 __builtin_arm_uqadd8 -#define __UHADD8 __builtin_arm_uhadd8 -#define __SSUB8 __builtin_arm_ssub8 -#define __QSUB8 __builtin_arm_qsub8 -#define __SHSUB8 __builtin_arm_shsub8 -#define __USUB8 __builtin_arm_usub8 -#define __UQSUB8 __builtin_arm_uqsub8 -#define __UHSUB8 __builtin_arm_uhsub8 -#define __SADD16 __builtin_arm_sadd16 -#define __QADD16 __builtin_arm_qadd16 -#define __SHADD16 __builtin_arm_shadd16 -#define __UADD16 __builtin_arm_uadd16 -#define __UQADD16 __builtin_arm_uqadd16 -#define __UHADD16 __builtin_arm_uhadd16 -#define __SSUB16 __builtin_arm_ssub16 -#define __QSUB16 __builtin_arm_qsub16 -#define __SHSUB16 __builtin_arm_shsub16 -#define __USUB16 __builtin_arm_usub16 -#define __UQSUB16 __builtin_arm_uqsub16 -#define __UHSUB16 __builtin_arm_uhsub16 -#define __SASX __builtin_arm_sasx -#define __QASX __builtin_arm_qasx -#define __SHASX __builtin_arm_shasx -#define __UASX __builtin_arm_uasx -#define __UQASX __builtin_arm_uqasx -#define __UHASX __builtin_arm_uhasx -#define __SSAX __builtin_arm_ssax -#define __QSAX __builtin_arm_qsax -#define __SHSAX __builtin_arm_shsax -#define __USAX __builtin_arm_usax -#define __UQSAX __builtin_arm_uqsax -#define __UHSAX __builtin_arm_uhsax -#define __USAD8 __builtin_arm_usad8 -#define __USADA8 __builtin_arm_usada8 -#define __SSAT16 __builtin_arm_ssat16 -#define __USAT16 __builtin_arm_usat16 -#define __UXTB16 __builtin_arm_uxtb16 -#define __UXTAB16 __builtin_arm_uxtab16 -#define __SXTB16 __builtin_arm_sxtb16 -#define __SXTAB16 __builtin_arm_sxtab16 -#define __SMUAD __builtin_arm_smuad -#define __SMUADX __builtin_arm_smuadx -#define __SMLAD __builtin_arm_smlad -#define __SMLADX __builtin_arm_smladx -#define __SMLALD __builtin_arm_smlald -#define __SMLALDX __builtin_arm_smlaldx -#define __SMUSD __builtin_arm_smusd -#define __SMUSDX __builtin_arm_smusdx -#define __SMLSD __builtin_arm_smlsd -#define __SMLSDX __builtin_arm_smlsdx -#define __SMLSLD __builtin_arm_smlsld -#define __SMLSLDX __builtin_arm_smlsldx -#define __SEL __builtin_arm_sel -#define __QADD __builtin_arm_qadd -#define __QSUB __builtin_arm_qsub - -#define __PKHBT(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0x0000FFFFUL) | \ - ((((uint32_t)(ARG2)) << (ARG3)) & 0xFFFF0000UL) ) - -#define __PKHTB(ARG1,ARG2,ARG3) ( ((((uint32_t)(ARG1)) ) & 0xFFFF0000UL) | \ - ((((uint32_t)(ARG2)) >> (ARG3)) & 0x0000FFFFUL) ) - -#define __SXTB16_RORn(ARG1, ARG2) __SXTB16(__ROR(ARG1, ARG2)) - -__STATIC_FORCEINLINE int32_t __SMMLA (int32_t op1, int32_t op2, int32_t op3) -{ - int32_t result; - - __ASM volatile ("smmla %0, %1, %2, %3" : "=r" (result): "r" (op1), "r" (op2), "r" (op3) ); - return(result); -} - -#endif /* (__ARM_FEATURE_DSP == 1) */ -/*@} end of group CMSIS_SIMD_intrinsics */ - - -#endif /* __CMSIS_ARMCLANG_H */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_compiler.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_compiler.h deleted file mode 100644 index adbf296f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/DSP/Include/cmsis_compiler.h +++ /dev/null @@ -1,283 +0,0 @@ -/**************************************************************************//** - * @file cmsis_compiler.h - * @brief CMSIS compiler generic header file - * @version V5.1.0 - * @date 09. October 2018 - ******************************************************************************/ -/* - * Copyright (c) 2009-2018 Arm Limited. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef __CMSIS_COMPILER_H -#define __CMSIS_COMPILER_H - -#include - -/* - * Arm Compiler 4/5 - */ -#if defined ( __CC_ARM ) - #include "cmsis_armcc.h" - - -/* - * Arm Compiler 6.6 LTM (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6010050) && (__ARMCC_VERSION < 6100100) - #include "cmsis_armclang_ltm.h" - - /* - * Arm Compiler above 6.10.1 (armclang) - */ -#elif defined (__ARMCC_VERSION) && (__ARMCC_VERSION >= 6100100) - #include "cmsis_armclang.h" - - -/* - * GNU Compiler - */ -#elif defined ( __GNUC__ ) - #include "cmsis_gcc.h" - - -/* - * IAR Compiler - */ -#elif defined ( __ICCARM__ ) - #include - - -/* - * TI Arm Compiler - */ -#elif defined ( __TI_ARM__ ) - #include - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __attribute__((packed)) - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __attribute__((packed)) - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __attribute__((packed)) - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __attribute__((packed)) T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void*)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __attribute__((aligned(x))) - #endif - #ifndef __RESTRICT - #define __RESTRICT __restrict - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * TASKING Compiler - */ -#elif defined ( __TASKING__ ) - /* - * The CMSIS functions have been implemented as intrinsics in the compiler. - * Please use "carm -?i" to get an up to date list of all intrinsics, - * Including the CMSIS ones. - */ - - #ifndef __ASM - #define __ASM __asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - #define __NO_RETURN __attribute__((noreturn)) - #endif - #ifndef __USED - #define __USED __attribute__((used)) - #endif - #ifndef __WEAK - #define __WEAK __attribute__((weak)) - #endif - #ifndef __PACKED - #define __PACKED __packed__ - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT struct __packed__ - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION union __packed__ - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - struct __packed__ T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #define __ALIGNED(x) __align(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -/* - * COSMIC Compiler - */ -#elif defined ( __CSMC__ ) - #include - - #ifndef __ASM - #define __ASM _asm - #endif - #ifndef __INLINE - #define __INLINE inline - #endif - #ifndef __STATIC_INLINE - #define __STATIC_INLINE static inline - #endif - #ifndef __STATIC_FORCEINLINE - #define __STATIC_FORCEINLINE __STATIC_INLINE - #endif - #ifndef __NO_RETURN - // NO RETURN is automatically detected hence no warning here - #define __NO_RETURN - #endif - #ifndef __USED - #warning No compiler specific solution for __USED. __USED is ignored. - #define __USED - #endif - #ifndef __WEAK - #define __WEAK __weak - #endif - #ifndef __PACKED - #define __PACKED @packed - #endif - #ifndef __PACKED_STRUCT - #define __PACKED_STRUCT @packed struct - #endif - #ifndef __PACKED_UNION - #define __PACKED_UNION @packed union - #endif - #ifndef __UNALIGNED_UINT32 /* deprecated */ - @packed struct T_UINT32 { uint32_t v; }; - #define __UNALIGNED_UINT32(x) (((struct T_UINT32 *)(x))->v) - #endif - #ifndef __UNALIGNED_UINT16_WRITE - __PACKED_STRUCT T_UINT16_WRITE { uint16_t v; }; - #define __UNALIGNED_UINT16_WRITE(addr, val) (void)((((struct T_UINT16_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT16_READ - __PACKED_STRUCT T_UINT16_READ { uint16_t v; }; - #define __UNALIGNED_UINT16_READ(addr) (((const struct T_UINT16_READ *)(const void *)(addr))->v) - #endif - #ifndef __UNALIGNED_UINT32_WRITE - __PACKED_STRUCT T_UINT32_WRITE { uint32_t v; }; - #define __UNALIGNED_UINT32_WRITE(addr, val) (void)((((struct T_UINT32_WRITE *)(void *)(addr))->v) = (val)) - #endif - #ifndef __UNALIGNED_UINT32_READ - __PACKED_STRUCT T_UINT32_READ { uint32_t v; }; - #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ *)(const void *)(addr))->v) - #endif - #ifndef __ALIGNED - #warning No compiler specific solution for __ALIGNED. __ALIGNED is ignored. - #define __ALIGNED(x) - #endif - #ifndef __RESTRICT - #warning No compiler specific solution for __RESTRICT. __RESTRICT is ignored. - #define __RESTRICT - #endif - #ifndef __COMPILER_BARRIER - #warning No compiler specific solution for __COMPILER_BARRIER. __COMPILER_BARRIER is ignored. - #define __COMPILER_BARRIER() (void)0 - #endif - - -#else - #error Unknown compiler. -#endif - - -#endif /* __CMSIS_COMPILER_H */ - diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_tables.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_tables.h deleted file mode 100644 index d6880699..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_tables.h +++ /dev/null @@ -1,56 +0,0 @@ -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_tables.h - * Description: Extern declaration for NN tables - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef _ARM_NN_TABLES_H -#define _ARM_NN_TABLES_H - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" - -/** -* @brief tables for various activation functions -* -*/ - -extern const q15_t sigmoidTable_q15[256]; -extern const q7_t sigmoidTable_q7[256]; - -extern const q7_t tanhTable_q7[256]; -extern const q15_t tanhTable_q15[256]; - - /** - * @brief 2-way tables for various activation functions - * - * 2-way table, H table for value larger than 1/4 - * L table for value smaller than 1/4, H table for remaining - * We have this only for the q15_t version. It does not make - * sense to have it for q7_t type - */ -extern const q15_t sigmoidHTable_q15[192]; -extern const q15_t sigmoidLTable_q15[128]; - -#endif /* ARM_NN_TABLES_H */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_types.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_types.h deleted file mode 100644 index 4b216c93..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nn_types.h +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_types.h - * Description: Public header file to contain the CMSIS-NN structs for the - * TensorFlowLite micro compliant functions - * - * $Date: April 23, 2020 - * $Revision: V.0.5.0 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - - -#ifndef _ARM_NN_TYPES_H -#define _ARM_NN_TYPES_H - -/** CMSIS-NN object to contain the width and height of a tile */ -typedef struct -{ - int32_t w; /**< Width */ - int32_t h; /**< Height */ -} cmsis_nn_tile; - -/** CMSIS-NN object used for the function context. */ -typedef struct -{ - void *buf; /**< Pointer to a buffer needed for the optimization */ - int32_t size; /**< Buffer size */ -} cmsis_nn_context; - -/** CMSIS-NN object to contain the dimensions of the tensors */ -typedef struct -{ - int32_t n; /**< Generic dimension to contain either the batch size or output channels. Please refer to the function documentation for more information */ - int32_t h; /**< Height */ - int32_t w; /**< Width */ - int32_t c; /**< Input channels */ -} cmsis_nn_dims; - -/** CMSIS-NN object for the per-channel quantization parameters */ -typedef struct -{ - int32_t *multiplier; /**< Multiplier values */ - int32_t *shift; /**< Shift values */ -} cmsis_nn_per_channel_quant_params; - -/** CMSIS-NN object for the per-tensor quantization parameters */ -typedef struct -{ - int32_t multiplier; /**< Multiplier value */ - int32_t shift; /**< Shift value */ -} cmsis_nn_per_tensor_quant_params; - -/** CMSIS-NN object for the quantized Relu activation */ -typedef struct -{ - int32_t min; /**< Min value used to clamp the result */ - int32_t max; /**< Max value used to clamp the result */ -} cmsis_nn_activation; - -/** CMSIS-NN object for the convolution layer parameters */ -typedef struct -{ - int32_t input_offset; /**< Zero value for the input tensor */ - int32_t output_offset; /**< Zero value for the output tensor */ - cmsis_nn_tile stride; - cmsis_nn_tile padding; - cmsis_nn_tile dilation; - cmsis_nn_activation activation; -} cmsis_nn_conv_params; - -/** CMSIS-NN object for Depthwise convolution layer parameters */ -typedef struct -{ - int32_t input_offset; /**< Zero value for the input tensor */ - int32_t output_offset; /**< Zero value for the output tensor */ - int32_t ch_mult; /**< Channel Multiplier. ch_mult * in_ch = out_ch */ - cmsis_nn_tile stride; - cmsis_nn_tile padding; - cmsis_nn_tile dilation; - cmsis_nn_activation activation; -} cmsis_nn_dw_conv_params; -/** CMSIS-NN object for pooling layer parameters */ -typedef struct -{ - cmsis_nn_tile stride; - cmsis_nn_tile padding; - cmsis_nn_activation activation; -} cmsis_nn_pool_params; - -/** CMSIS-NN object for Fully Connected layer parameters */ -typedef struct -{ - int32_t input_offset; /**< Zero value for the input tensor */ - int32_t filter_offset; /**< Zero value for the filter tensor */ - int32_t output_offset; /**< Zero value for the output tensor */ - cmsis_nn_activation activation; -} cmsis_nn_fc_params; - -#endif // _ARM_NN_TYPES_H - - diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnfunctions.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnfunctions.h deleted file mode 100644 index 1ddc46fc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnfunctions.h +++ /dev/null @@ -1,2068 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nnfunctions.h - * Description: Public header file for CMSIS NN Library - * - * $Date: June 11, 2020 - * $Revision: V.6.0.1 - * - * Target Processor: Cortex-M CPUs - * -------------------------------------------------------------------- */ - -/** - \mainpage CMSIS NN Software Library - * - * Introduction - * ------------ - * - * This user manual describes the CMSIS NN software library, - * a collection of efficient neural network kernels developed to maximize the - * performance and minimize the memory footprint of neural networks on Cortex-M processor cores. - * - * The library is divided into a number of functions each covering a specific category: - * - Convolution Functions - * - Activation Functions - * - Fully-connected Layer Functions - * - Pooling Functions - * - Softmax Functions - * - Basic math Functions - * - * The library has separate functions for operating on different weight and activation data - * types including 8-bit integers (q7_t) and 16-bit integers (q15_t). The descrition of the - * kernels are included in the function description. The implementation details are also - * described in this paper [1]. - * - * Function Classification - * -------- - * The functions can be classified into two segments - * - Legacy functions supporting ARM's internal symmetric quantization(8 bits). - * - Functions that support TensorFlow Lite framework with symmetric quantization(8 bits). - * - * The legacy functions can be identified with their suffix of _q7 or _q15 and are no new development is done there. The article in [2] describes in detail - * how to run a network using the legacy functions. - * - * The functions supporting TensorFlow Lite framework is identified by the _s8 suffix and can be invoked from TFL micro. The functions are bit exact to - * TensorFlow Lite. Refer to the TensorFlow's documentation in [3] on how to run a TensorFlow Lite model using optimized CMSIS-NN kernels. - * - * Block Diagram - * -------- - * \image html CMSIS-NN-OVERVIEW.PNG - * - * Examples - * -------- - * - * The library ships with a number of examples which demonstrate how to use the library functions. - * - * Pre-processor Macros - * ------------ - * - * Each library project have different pre-processor macros. - * - * - ARM_MATH_DSP: - * - * Define macro ARM_MATH_DSP, If the silicon supports DSP instructions(DSP extension). - * - * - ARM_MATH_MVEI: - * - * Define macro ARM_MATH_MVEI, If the silicon supports M-Profile Vector Extension. - - * - ARM_MATH_AUTOVECTORIZE - * Used in conjucture with ARM_MATH_MVEI to let the compiler auto vectorize for the functions that uses inline assembly. - * It does not affect functions that use C or intrinsics. - * - ARM_MATH_BIG_ENDIAN: - * - * Define macro ARM_MATH_BIG_ENDIAN to build the library for big endian targets. This is supported only for the legacy functions i.e, functions targetted at - * TensorFlow Lite do not support big endianness. By default library builds for little endian targets. - * - * - ARM_NN_TRUNCATE: - * - * Define macro ARM_NN_TRUNCATE to use floor instead of round-to-the-nearest-int for the computation. - * - * Upcoming Interface Change - * -------- - * Starting from the 1.4.0 next release, CMSIS-NN will gradually switch to a new API interface to: - * - * -# have a stable API - * -# avoid passing many variables by value - * -# improve security - * -# improve validation - * -# improve code readability - * - * The upcoming API interface change will be based on "struct" and only affect the TensorFlowLite micro compliant APIs [4] (functions with _s8 suffix) - * - * Below you can find a snapshot of how the new API interface will look like (names can change) - * - * i.e. arm_convolve_1x1_s8_fast - * - * Current API interface | New API interface proposal - * ------------- | ------------- - * const q7_t *input | const cmsis_nn_context &ctx - * const uint16_t input_x | const cmsis_nn_conv_params ¶ms - * const uint16_t input_y | const cmsis_nn_dims &input_dims - * const uint16_t input_ch | const q7_t *input_data - * const uint16_t input_batches | const cmsis_nn_dims &filter_dims - * const q7_t *kernel | const q7_t *filter_data - * const uint16_t output_ch | const cmsis_nn_dims &bias_dims - * const uint16_t pad_x | const q31_t *bias_data - * const uint16_t pad_y | const cmsis_nn_dims &output_dims - * const uint16_t stride_x | q7_t *output_data - * const uint16_t stride_y |
- * const int32_t *bias |
- * q7_t *output |
- * const int32_t *output_shift |
- * const int32_t *output_mult |
- * const int32_t out_offset |
- * const int32_t input_offset |
- * const int32_t out_activation_min |
- * const int32_t out_activation_max |
- * const uint16_t output_x |
- * const uint16_t output_y |
- * q15_t *buffer_a |
- * - * Copyright Notice - * ------------ - * - * Copyright (C) 2010-2019 Arm Limited. All rights reserved. - * - * [1] CMSIS-NN: Efficient Neural Network Kernels for Arm Cortex-M CPUs https://arxiv.org/abs/1801.06601 - * - * [2] Converting a Neural Network for Arm Cortex-M with CMSIS-NN - * https://developer.arm.com/solutions/machine-learning-on-arm/developer-material/how-to-guides/converting-a-neural-network-for-arm-cortex-m-with-cmsis-nn/single-page - * [3] https://www.tensorflow.org/lite/microcontrollers/library - * - * [4] https://github.com/ARM-software/CMSIS_5/tree/develop/CMSIS/NN#legacy-vs-tfl-micro-compliant-apis - */ - -/** - * @defgroup groupNN Neural Network Functions - * A collection of functions to perform basic operations for neural network layers. Functions with a _s8 suffix support - * TensorFlow Lite framework. - */ - -#ifndef _ARM_NNFUNCTIONS_H -#define _ARM_NNFUNCTIONS_H - -#include "arm_nnsupportfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nn_tables.h" -#include "arm_nn_types.h" - -#define USE_INTRINSIC - -//#define ARM_NN_TRUNCATE /* This config the rounding model to floor or round to the nearest int */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** - * @defgroup NNConv Convolution Functions - * - * Collection of convolution, depthwise convolution functions and their variants. - * - * The convolution is implemented in 2 steps: im2col and GEMM - * - * im2col is a process of converting each patch of image data into - * a column. After im2col, the convolution is computed as matrix-matrix - * multiplication. - * - * To reduce the memory footprint, the im2col is performed partially. - * Each iteration, only a few column (i.e., patches) are generated and - * computed with GEMM kernels similar to CMSIS-DSP arm_mat_mult functions. - * - */ - - /** - * @brief s8 convolution layer wrapper function with the main purpose to call the optimal kernel available in cmsis-nn to perform the convolution. - * - * @param[in, out] ctx Function context that contains the additional buffer if required by the implementation. - arm_convolve_wrapper_s8_get_buffer_size will return the buffer_size if required - * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...). - * Range of conv_params->input_offset : [-127, 128] - * Range of conv_params->output_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the spatial filter dimensions - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT] - * @param[out] output_data Output data pointer. Data type: int8 - * - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH if argument constraints fail. or, - * ARM_MATH_SUCCESS on successful completion. - * - */ - arm_status arm_convolve_wrapper_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for arm_convolve_wrapper_s8 - * - * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...). - * Range of conv_params->input_offset : [-127, 128] - * Range of conv_params->output_offset : [-128, 127] - * @param[in] input_dims Input (activation) dimensions. Format: [N, H, W, C_IN] - * @param[in] filter_dims Filter dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the spatial filter dimensions - * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT] - * - * @return The function returns required buffer size(bytes) - * - */ - int32_t arm_convolve_wrapper_s8_get_buffer_size(const cmsis_nn_conv_params* conv_params, - const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims, - const cmsis_nn_dims* output_dims); - - /** - * @brief Basic s8 convolution function - * @param[in, out] ctx Function context that contains the additional buffer if required by the implementation. - arm_convolve_s8_get_buffer_size will return the buffer_size if required - * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...). - * Range of conv_params->input_offset : [-127, 128] - * Range of conv_params->output_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the spatial filter dimensions - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT] - * @param[out] output_data Output data pointer. Data type: int8 - - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * 1. Supported framework: TensorFlow Lite micro - * 2. q7 is used as data type eventhough it is s8 data. It is done so to be consistent with existing APIs. - * 3. Additional memory is required for optimization. Refer to argument 'ctx' for details. - * - */ - arm_status arm_convolve_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for s8 convolution function - * - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, HK, WK, C_IN] where HK and WK are the spatial filter dimensions - * @return The function returns required buffer size(bytes) - * - */ - int32_t arm_convolve_s8_get_buffer_size(const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims); - - /** - * @brief Basic Q7 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - * - */ - arm_status arm_convolve_HWC_q7_basic(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Basic Q7 convolution function (non-square shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimension x - * @param[in] dim_im_in_y input tensor dimension y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - */ - arm_status arm_convolve_HWC_q7_basic_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Basic Q15 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - * - */ - arm_status arm_convolve_HWC_q15_basic(const q15_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast Q7 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 4 - * ch_im_out is multiple of 2 - */ - arm_status arm_convolve_HWC_q7_fast(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast Q7 convolution function (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimension x - * @param[in] dim_im_in_y input tensor dimension y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 4 - * ch_im_out is multiple of 2 - */ - - arm_status arm_convolve_HWC_q7_fast_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast Q7 version of 1x1 convolution (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimension x - * @param[in] dim_im_in_y input tensor dimension y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH if argument constraints fail. or, - * ARM_MATH_SUCCESS on successful completion. - * - * This function implement convolution with 1x1 kernel size (i.e., dim_kernel_x=1 - * and dim_kernel_y=1). It can be used for - * second half of MobileNets after depthwise separable convolution. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 4 - * ch_im_out is multiple of 2 - */ - arm_status arm_convolve_1x1_HWC_q7_fast_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast s8 version for 1x1 convolution (non-square shape) - * - * @param[in, out] ctx Function context that contains the additional buffer if required by the implementation. - arm_convolve_1x1_s8_fast_get_buffer_size will return the buffer_size if required - * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...). - * Range of conv_params->input_offset : [-127, 128] - * Range of conv_params->output_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, 1, 1, C_IN] - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT] - * @param[out] output_data Output data pointer. Data type: int8 - * - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH if argument constraints fail. or, - * ARM_MATH_SUCCESS on successful completion. - * - * @details - * - Supported framework : TensorFlow Lite Micro - * - The following constrains on the arguments apply - * -# input_dims->c is a multiple of 4 - * -# conv_params->padding.w = conv_params->padding.h = 0 - * -# conv_params->stride.w = conv_params->stride.h = 1 - * - */ - arm_status arm_convolve_1x1_s8_fast(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for arm_convolve_1x1_s8_fast - * - * @param[in] input_dims Input (activation) dimensions - * @return The function returns the required buffer size in bytes - * - */ - int32_t arm_convolve_1x1_s8_fast_get_buffer_size(const cmsis_nn_dims* input_dims); - - /** - * @brief 1xn convolution - * - * @param[in, out] ctx Function context that contains the additional buffer if required by the implementation. - arm_convolve_1_x_n_s8_get_buffer_size will return the buffer_size if required - * @param[in] conv_params Convolution parameters (e.g. strides, dilations, pads,...). - * Range of conv_params->input_offset : [-127, 128] - * Range of conv_params->output_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, 1, WK, C_IN] where WK is the horizontal spatial filter dimension - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [N, H, W, C_OUT] - * @param[out] output_data Output data pointer. Data type: int8 - * - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH if argument constraints fail. or, - * ARM_MATH_SUCCESS on successful completion. - * - * @details - * - Supported framework : TensorFlow Lite Micro - * - The following constrains on the arguments apply - * -# input_dims->n equals 1 - * -# ouput_dims->w is a multiple of 4 - * -# Explicit constraints(since it is for 1xN convolution) - * -## input_dims->h equals 1 - * -## output_dims->h equals 1 - * -## filter_dims->h equals 1 - *@todo Remove constraint on output_dims->w to make the function generic. - * - */ - arm_status arm_convolve_1_x_n_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data); - - /** - * @brief Get the required additional buffer size for 1xn convolution - * - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * @param[in] filter_dims Filter tensor dimensions. Format: [C_OUT, 1, WK, C_IN] where WK is the horizontal spatial filter dimension - * @return The function returns required buffer size(bytes) - * - */ - int32_t arm_convolve_1_x_n_s8_get_buffer_size(const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims); - - /** - * @brief Q7 version of convolution for RGB image - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This kernel is written exclusively for convolution with ch_im_in - * equals 3. This applies on the first layer of CNNs which has input - * image with RGB format. - */ - - arm_status arm_convolve_HWC_q7_RGB(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast Q15 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 2 - * ch_im_out is multiple of 2 - */ - - arm_status arm_convolve_HWC_q15_fast(const q15_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Fast Q15 convolution function (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimension x - * @param[in] dim_im_in_y input tensor dimension y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in is multiple of 2 - * - * ch_im_out is multipe of 2 - * - */ - - arm_status - arm_convolve_HWC_q15_fast_nonsquare(const q15_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Q7 depthwise separable convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 2 - * ch_im_out is multiple of 2 - */ - - arm_status arm_depthwise_separable_conv_HWC_q7(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Q7 depthwise separable convolution function (non-square shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimension x - * @param[in] dim_im_in_y input tensor dimension y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding sizes x - * @param[in] padding_y padding sizes y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 2 - * ch_im_out is multiple of 2 - */ - arm_status arm_depthwise_separable_conv_HWC_q7_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB); - - /** - * @brief Wrapper function to pick the right optimized s8 depthwise convolution function - * - * @param[in, out] ctx Function context (e.g. temporary buffer). Check the function - * definition file to see if an additional buffer is required. - * Optional function {API}_get_buffer_size() provides the buffer - * size if required. - * @param[in] dw_conv_params Depthwise convolution parameters (e.g. strides, dilations, pads,...) - * dw_conv_params->dilation is not used. - * Range of dw_conv_params->input_offset : [-127, 128] - * Range of dw_conv_params->output_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each - * output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [H, W, C_IN] - * Batch argument N is not used and assumed to be 1. - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [1, H, W, C_OUT] - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [1, H, W, C_OUT] - * @param[in, out] output_data Output data pointer. Data type: int8 - * @return The function returns - * ARM_MATH_SUCCESS - Successful completion. - * - * @details - * - Supported framework: TensorFlow Lite - * - Picks one of the the following functions - * -# arm_depthwise_conv_s8() - * -# arm_depthwise_conv_3x3_s8() - Cortex-M CPUs with DSP extension only - * -# arm_depthwise_conv_s8_opt() - * - q7 is used as data type eventhough it is s8 data. It is done so to be consistent with existing APIs. - * - Check details of arm_depthwise_conv_s8_opt() for potential data that can be accessed outside of the boundary. - */ - arm_status arm_depthwise_conv_wrapper_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Get size of additional buffer required by arm_depthwise_conv_wrapper_s8() - * - * @param[in] dw_conv_params Depthwise convolution parameters (e.g. strides, dilations, pads,...) - * dw_conv_params->dilation is not used. - * Range of dw_conv_params->input_offset : [-127, 128] - * Range of dw_conv_params->input_offset : [-128, 127] - * @param[in] input_dims Input (activation) tensor dimensions. Format: [H, W, C_IN] - * Batch argument N is not used and assumed to be 1. - * @param[in] filter_dims Filter tensor dimensions. Format: [1, H, W, C_OUT] - * @param[in] output_dims Output tensor dimensions. Format: [1, H, W, C_OUT] - * @return Size of additional memory required for optimizations in bytes. - * - */ - int32_t arm_depthwise_conv_wrapper_s8_get_buffer_size(const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_dims *input_dims, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims); - - /** - * @brief Basic s8 depthwise convolution function that doesn't have any constraints on the input dimensions. - * - * @param[in, out] ctx Function context (e.g. temporary buffer). Check the function - * definition file to see if an additional buffer is required. - * Optional function {API}_get_buffer_size() provides the buffer - * size if an additional buffer is required. - * exists if additional memory is. - * @param[in] dw_conv_params Depthwise convolution parameters (e.g. strides, dilations, pads,...) - * dw_conv_params->dilation is not used. - * Range of dw_conv_params->input_offset : [-127, 128] - * Range of dw_conv_params->input_offset : [-128, 127] - * @param[in] quant_params Per-channel quantization info. - * It contains the multiplier and shift values to be applied to each - * output channel - * @param[in] input_dims Input (activation) tensor dimensions. Format: [1, H, W, C_IN] - * Batch argument N is not used. - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [1, H, W, C_OUT] - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [1, H, W, C_OUT] - * @param[in, out] output_data Output data pointer. Data type: int8 - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - Supported framework: TensorFlow Lite - * - q7 is used as data type eventhough it is s8 data. It is done so to be consistent with existing APIs. - */ - arm_status arm_depthwise_conv_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Optimized s8 depthwise convolution function for 3x3 kernel size with some constraints on - * the input arguments(documented below). Refer arm_depthwise_conv_s8() for function - * argument details. - * - * @return The function returns one of the following - * ARM_MATH_SIZE_MISMATCH - Unsupported dimension of tensors - * ARM_MATH_ARGUMENT_ERROR - Unsupported pad size along the x axis - * ARM_MATH_SUCCESS - Successful operation - * - * @details - * - Supported framework : TensorFlow Lite Micro - * - The following constrains on the arguments apply - * -# Number of input channel equals number of output channels - * -# Filter height and width equals 3 - * -# Padding along x is either 0 or 1. - * - */ - arm_status arm_depthwise_conv_3x3_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Optimized s8 depthwise convolution function with constraint that in_channel equals out_channel. - * Refer arm_depthwise_conv_s8() for function argument details. - * - * @return The function returns one of the following - * ARM_MATH_SIZE_MISMATCH - input channel != output channel or - * ch_mult != 1 - * ARM_MATH_SUCCESS - Successful operation - * - * @note If number of channels is not a multiple of 4, upto 3 elements outside the boundary will be read out - * for the following if MVE optimizations(Arm Helium Technology) are used. - * - Output shift - * - Output multiplier - * - Output bias - * - kernel - * @details - * - Supported framework: TensorFlow Lite - * - The following constrains on the arguments apply - * -# Number of input channel equals number of output channels or ch_mult equals 1 - * - q7 is used as data type eventhough it is s8 data. It is done so to be consistent with existing APIs. - * - Reccomended when number of channels is 4 or greater. - * - */ - arm_status arm_depthwise_conv_s8_opt(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for optimized s8 depthwise convolution - * function with constraint that in_channel equals out_channel. - * @param[in] input_dims Input (activation) tensor dimensions. Format: [1, H, W, C_IN] - * Batch argument N is not used. - * @param[in] filter_dims Filter tensor dimensions. Format: [1, H, W, C_OUT] - * @return The function returns required buffer size in bytes - * - */ - int32_t arm_depthwise_conv_s8_opt_get_buffer_size(const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims); - - /** - * @defgroup FC Fully-connected Layer Functions - * - * Collection of fully-connected and matrix multiplication functions. - * - * Fully-connected layer is basically a matrix-vector multiplication - * with bias. The matrix is the weights and the input/output vectors - * are the activation values. Supported {weight, activation} precisions - * include {8-bit, 8-bit}, {16-bit, 16-bit}, and {8-bit, 16-bit}. - * - * Here we have two types of kernel functions. The basic function - * implements the function using regular GEMV approach. The opt functions - * operates with weights in interleaved formats. - * - */ - - /** - * @brief Q7 basic fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_q7(const q7_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut, - q15_t * vec_buffer); - - /** - * @brief Basic s8 Fully Connected function. - * - * @param[in, out] ctx Function context (e.g. temporary buffer). Check the function - * definition file to see if an additional buffer is required. - * Optional function {API}_get_buffer_size() provides the buffer - * size if an additional buffer is required. - * @param[in] fc_params Fully Connected layer parameters (e.g. strides, dilations, pads,...) - * Range of fc_params->input_offset : [-127, 128] - * Range of fc_params->filter_offset : [-127, 128] - * Range of fc_params->output_offset : [-128, 127] - * @param[in] quant_params Per-tensor quantization info. - * It contains the multiplier and shift values to be applied to the output tensor. - * @param[in] input_dims Input (activation) tensor dimensions. Format: [N, H, W, C_IN] - * Input dimension is taken as Nx(H * W * C_IN) - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Two dimensional filter dimensions. Format: [N, C] - * N : accumulation depth and equals (H * W * C_IN) from input_dims - * C : output depth and equals C_OUT in output_dims - * H & W : Not used - * @param[in] filter_data Filter data pointer. Data type: int8 - * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] - * N, H, W : Not used - * @param[in] bias_data Bias data pointer. Data type: int32 - * @param[in] output_dims Output tensor dimensions. Format: [N, C_OUT] - * N : Batches - * C_OUT : Output depth - * H & W : Not used. - * @param[in, out] output_data Output data pointer. Data type: int8 - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - Supported framework: TensorFlow Lite - * - q7 is used as data type eventhough it is s8 data. It is done so to be consistent with existing APIs. - */ - arm_status - arm_fully_connected_s8(const cmsis_nn_context *ctx, - const cmsis_nn_fc_params *fc_params, - const cmsis_nn_per_tensor_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for S8 basic fully-connected and - * matrix multiplication layer function for TF Lite - * @param[in] filter_dims dimension of filter - * @return The function returns required buffer size in bytes - * - */ - int32_t arm_fully_connected_s8_get_buffer_size(const cmsis_nn_dims *filter_dims); - - /** - * @brief Q7 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_q7_opt(const q7_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut, - q15_t * vec_buffer); - - /** - * @brief Q15 basic fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_q15(const q15_t * pV, - const q15_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q15_t * bias, - q15_t * pOut, - q15_t * vec_buffer); - - /** - * @brief Q15 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_q15_opt(const q15_t * pV, - const q15_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q15_t * bias, - q15_t * pOut, - q15_t * vec_buffer); - - /** - * @brief Mixed Q15-Q7 fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_mat_q7_vec_q15(const q15_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q15_t * pOut, - q15_t * vec_buffer); - - /** - * @brief Mixed Q15-Q7 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - */ - - arm_status arm_fully_connected_mat_q7_vec_q15_opt(const q15_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q15_t * pOut, - q15_t * vec_buffer); - -/** - * @brief Matrix-Multiplication Kernels for Convolution - * - * These functions are used within convolution layer functions for - * matrix multiplication. - * - * The implementation is similar to CMSIS-DSP arm_mat_mult functions - * with one Q7 and one Q15 operands. The Q15 operand is the im2col - * output which is always with 2 columns. - * - */ - - /** - * @brief Matrix-multiplication function for convolution - * @param[in] pA pointer to operand A - * @param[in] pInBuffer pointer to operand B, always conssists of 2 vectors - * @param[in] ch_im_out numRow of A - * @param[in] numCol_A numCol of A - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias the bias - * @param[in,out] pOut pointer to output - * @return The function returns the incremented output pointer - */ - - q7_t *arm_nn_mat_mult_kernel_q7_q15(const q7_t * pA, - const q15_t * pInBuffer, - const uint16_t ch_im_out, - const uint16_t numCol_A, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut); - /** - * @brief Matrix-multiplication function for convolution with per-channel requantization. - * @param[in] input_a pointer to operand A - * @param[in] input_b pointer to operand B, always consists of 2 vectors. - * @param[in] output_ch number of rows of A - * @param[in] out_shift pointer to per output channel requantization shift parameter. - * @param[in] out_mult pointer to per output channel requantization multiplier parameter. - * @param[in] out_offset output tensor offset. - * @param[in] activation_min minimum value to clamp the output to. Range : int8 - * @param[in] activation_max maximum value to clamp the output to. Range : int8 - * @param[in] num_col_a number of columns of A - * @param[in] output_bias per output channel bias. Range : int32 - * @param[in,out] out_0 pointer to output - * @return The function returns one of the two - * 1. The incremented output pointer for a successful operation or - * 2. NULL if implementation is not available. - * - * @details This function does the matrix multiplication of weight matrix for all output channels - * with 2 columns from im2col and produces two elements/output_channel. The outputs are - * clamped in the range provided by activation min and max. - * Supported framework: TensorFlow Lite micro. - */ - q7_t *arm_nn_mat_mult_kernel_s8_s16(const q7_t *input_a, - const q15_t *input_b, - const uint16_t output_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int16_t activation_min, - const int16_t activation_max, - const uint16_t num_col_a, - const int32_t *const output_bias, - q7_t *out_0); - - /** - * @brief Matrix-multiplication of re-ordered input B with A. - * - * @details For arguments, refer arm_nn_mat_mult_kernel_s8_s16. The re-ordering is a consequence - * of sign extension done by the SXTB16 command on input_b. The outputs are clamped in the range - * provided by activation min and max. - * * @details - * - Supported framework : TensorFlow Lite Micro - * - The following constrains on the arguments apply - * -# num_col_a is a multiple of 4 - * -# output_ch is a multiple of 2 - * - */ - q7_t *arm_nn_mat_mult_kernel_s8_s16_reordered(const q7_t *input_a, - const q15_t *input_b, - const uint16_t output_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int16_t activation_min, - const int16_t activation_max, - const uint16_t num_col_a, - const int32_t *const output_bias, - q7_t *out_0); - - /** - * @brief Matrix-multiplication function for convolution with reordered columns - * @param[in] pA pointer to operand A - * @param[in] pInBuffer pointer to operand B, always conssists of 2 vectors - * @param[in] ch_im_out numRow of A - * @param[in] numCol_A numCol of A - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias the bias - * @param[in,out] pOut pointer to output - * @return The function returns the incremented output pointer - * - * @details This function assumes that data in pInBuffer are reordered - */ - q7_t *arm_nn_mat_mult_kernel_q7_q15_reordered(const q7_t * pA, - const q15_t * pInBuffer, - const uint16_t ch_im_out, - const uint16_t numCol_A, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut); - -#ifdef __cplusplus -} -#endif - -/* - * Other functions - * These layers are typically not timing critical - * Basic implementation is supported here - */ - -#ifdef __cplusplus -extern "C" -{ -#endif - -/** - * @defgroup BasicMath Basic math functions - * - * Element wise add and multiplication functions. - * - */ - -/** - * @brief s8 element wise add of two vectors - * @param[in] input_1_vect pointer to input vector 1 - * @param[in] input_2_vect pointer to input vector 2 - * @param[in] input_1_offset offset for input 1. Range: Range: -127 to 128 - * @param[in] input_1_mult multiplier for input 1 - * @param[in] input_1_shift shift for input 1 - * @param[in] input_2_offset offset for input 2. Range: Range: -127 to 128 - * @param[in] input_2_mult multiplier for input 2 - * @param[in] input_2_shift shift for input 2 - * @param[in] left_shift input left shift - * @param[in,out] output pointer to output vector - * @param[in] out_offset output offset - * @param[in] out_mult output multiplier - * @param[in] out_shift output shift - * @param[in] out_activation_min minimum value to clamp output to - * @param[in] out_activation_max maximum value to clamp output to - * @param[in] block_size number of samples - * @return The function returns ARM_MATH_SUCCESS - */ - arm_status arm_elementwise_add_s8(const int8_t *input_1_vect, - const int8_t *input_2_vect, - const int32_t input_1_offset, - const int32_t input_1_mult, - const int32_t input_1_shift, - const int32_t input_2_offset, - const int32_t input_2_mult, - const int32_t input_2_shift, - const int32_t left_shift, - int8_t *output, - const int32_t out_offset, - const int32_t out_mult, - const int32_t out_shift, - const int32_t out_activation_min, - const int32_t out_activation_max, - const uint32_t block_size); - -/** - * @brief s8 element wise multiplication - * @param[in] input_1_vect pointer to input vector 1 - * @param[in] input_2_vect pointer to input vector 2 - * @param[in] input_1_offset offset for input 1. Range: Range: -127 to 128 - * @param[in] input_2_offset offset for input 2. Range: Range: -127 to 128 - * @param[in,out] output pointer to output vector - * @param[in] out_offset output offset - * @param[in] out_mult output multiplier - * @param[in] out_shift output shift - * @param[in] out_activation_min minimum value to clamp output to - * @param[in] out_activation_max maximum value to clamp output to - * @param[in] block_size number of samples - * @return The function returns ARM_MATH_SUCCESS - * - * @details Supported framework: TensorFlow Lite micro - */ - arm_status arm_elementwise_mul_s8(const int8_t *input_1_vect, - const int8_t *input_2_vect, - const int32_t input_1_offset, - const int32_t input_2_offset, - int8_t *output, - const int32_t out_offset, - const int32_t out_mult, - const int32_t out_shift, - const int32_t out_activation_min, - const int32_t out_activation_max, - const uint32_t block_size); -/** - * @defgroup Acti Activation Functions - * - * Perform activation layers, including ReLU (Rectified Linear Unit), - * sigmoid and tanh - * - */ - - /** - * @brief Q7 RELU function - * @param[in,out] data pointer to input - * @param[in] size number of elements - * @return none. - */ - - void arm_relu_q7(q7_t *data, uint16_t size); - - /** - * @brief s8 ReLU6 function - * @param[in,out] data pointer to input - * @param[in] size number of elements - */ - - void arm_relu6_s8(q7_t *data, uint16_t size); - - /** - * @brief Q15 RELU function - * @param[in,out] data pointer to input - * @param[in] size number of elements - * @return none. - */ - - void arm_relu_q15(q15_t *data, uint16_t size); - - /** - * @brief Q7 neural network activation function using direct table look-up - * @param[in,out] data pointer to input - * @param[in] size number of elements - * @param[in] int_width bit-width of the integer part, assume to be smaller than 3 - * @param[in] type type of activation functions - * @return none. - */ - - void arm_nn_activations_direct_q7(q7_t * data, uint16_t size, uint16_t int_width, - arm_nn_activation_type type); - - /** - * @brief Q15 neural network activation function using direct table look-up - * @param[in,out] data pointer to input - * @param[in] size number of elements - * @param[in] int_width bit-width of the integer part, assume to be smaller than 3 - * @param[in] type type of activation functions - * @return none. - * - * @details - * - * This is the direct table look-up approach. - * - * Assume here the integer part of the fixed-point is <= 3. - * More than 3 just not making much sense, makes no difference with - * saturation followed by any of these activation functions. - */ - - void arm_nn_activations_direct_q15(q15_t * data, uint16_t size, uint16_t int_width, - arm_nn_activation_type type); - -/** - * @defgroup Pooling Pooling Functions - * - * Perform pooling functions, including max pooling and average pooling - * - */ - - /** - * @brief Q7 max pooling function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] Im_out pointer to output tensor - * @return none. - * - */ - - void arm_maxpool_q7_HWC(q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const uint16_t dim_im_out, - q7_t * bufferA, - q7_t * Im_out); - - /** - * @brief Q7 average pooling function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimension - * @param[in] ch_im_in number of input tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] Im_out pointer to output tensor - * @return none. - * - */ - - void arm_avepool_q7_HWC(q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const uint16_t dim_im_out, - q7_t * bufferA, - q7_t * Im_out); - - /** - * @brief s8 average pooling function. - * - * @param[in, out] ctx Function context (e.g. temporary buffer). Check the function - * definition file to see if an additional buffer is required. - * Optional function {API}_get_buffer_size() provides the buffer - * size if an additional buffer is required. - * @param[in] pool_params Pooling parameters - * @param[in] input_dims Input (activation) tensor dimensions. Format: [H, W, C_IN] - * Argument 'N' is not used. - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [H, W] - * Argument N and C are not used. - * @param[in] output_dims Output tensor dimensions. Format: [H, W, C_OUT] - * Argument N is not used. - * C_OUT equals C_IN. - * @param[in, out] output_data Output data pointer. Data type: int8 - * @return The function returns - * ARM_MATH_SUCCESS - Successful operation - * - * @details - * - Supported Framework: TensorFlow Lite - * - */ - arm_status arm_avgpool_s8(const cmsis_nn_context *ctx, - const cmsis_nn_pool_params *pool_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims, - q7_t *output_data); - - /** - * @brief Get the required buffer size for S8 average pooling function - * @param[in] dim_dst_width output tensor dimension - * @param[in] ch_src number of input tensor channels - * @return The function returns required buffer size in bytes - * - */ - int32_t arm_avgpool_s8_get_buffer_size(const int dim_dst_width, - const int ch_src); - - /** - * @brief s8 max pooling function. - * - * @param[in, out] ctx Function context (e.g. temporary buffer). Check the function - * definition file to see if an additional buffer is required. - * Optional function {API}_get_buffer_size() provides the buffer - * size if an additional buffer is required. - * @param[in] pool_params Pooling parameters - * @param[in] input_dims Input (activation) tensor dimensions. Format: [H, W, C_IN] - * Argument 'N' is not used. - * @param[in] input_data Input (activation) data pointer. Data type: int8 - * @param[in] filter_dims Filter tensor dimensions. Format: [H, W] - * Argument N and C are not used. - * @param[in] output_dims Output tensor dimensions. Format: [H, W, C_OUT] - * Argument N is not used. - * C_OUT equals C_IN. - * @param[in, out] output_data Output data pointer. Data type: int8 - * @return The function returns - * ARM_MATH_SUCCESS - Successful operation - * - * @details - * - Supported Framework: TensorFlow Lite - * - */ - arm_status arm_max_pool_s8(const cmsis_nn_context *ctx, - const cmsis_nn_pool_params *pool_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims, - q7_t *output_data); -/** - * @defgroup Softmax Softmax Functions - * - * EXP(2) based softmax functions. - * - */ - - /** - * @brief Q7 softmax function - * @param[in] vec_in pointer to input vector - * @param[in] dim_vec input vector dimension - * @param[out] p_out pointer to output vector - * - * @note This function is an optimized version which is not bit-accurate with - * TensorFlow Lite's kernel - * - */ - -void arm_softmax_q7(const q7_t * vec_in, const uint16_t dim_vec, q7_t * p_out); - - /** - * @brief Q7 softmax function with batch parameter - * @param[in] vec_in pointer to input vector - * @param[in] nb_batches number of batches - * @param[in] dim_vec input vector dimension - * @param[out] p_out pointer to output vector - * @return none. - * - * @note This function is an optimized version which is not bit-accurate with - * TensorFlow Lite's kernel - * - */ - -void arm_softmax_with_batch_q7(const q7_t * vec_in, const uint16_t nb_batches,const uint16_t dim_vec, q7_t * p_out ); - /** - * @brief Q15 softmax function - * @param[in] vec_in pointer to input vector - * @param[in] dim_vec input vector dimension - * @param[out] p_out pointer to output vector - * @return none. - * - * @note This function is an optimized version which is not bit-accurate with - * TensorFlow Lite's kernel - * - */ - -void arm_softmax_q15(const q15_t * vec_in, const uint16_t dim_vec, q15_t * p_out); - - /** - * @brief S8 softmax function - * @param[in] input Pointer to the input tensor - * @param[in] num_rows Number of rows in the input tensor - * @param[in] row_size Number of elements in each input row - * @param[in] mult Input quantization multiplier - * @param[in] shift Input quantization shift within the range [0, 31] - * @param[in] diff_min Minimum difference with max in row. Used to check if - * the quantized exponential operation can be performed - * @param[out] output Pointer to the output tensor - * - * @note Supported framework: TensorFlow Lite micro (bit-accurate) - * - */ - -void arm_softmax_s8(const int8_t *input, - const int32_t num_rows, - const int32_t row_size, - const int32_t mult, - const int32_t shift, - const int32_t diff_min, - int8_t *output); - - /** - * @brief U8 softmax function - * @param[in] input Pointer to the input tensor - * @param[in] num_rows Number of rows in the input tensor - * @param[in] row_size Number of elements in each input row - * @param[in] mult Input quantization multiplier - * @param[in] shift Input quantization shift within the range [0, 31] - * @param[in] diff_min Minimum difference with max in row. Used to check if - * the quantized exponential operation can be performed - * @param[out] output Pointer to the output tensor - * - * @note Supported framework: TensorFlow Lite micro (bit-accurate) - * - */ - -void arm_softmax_u8(const uint8_t *input, - const int32_t num_rows, - const int32_t row_size, - const int32_t mult, - const int32_t shift, - const int32_t diff_min, - uint8_t *output); - - /** - * @brief uint8 depthwise convolution function with asymmetric quantization - * Unless specified otherwise, arguments are mandatory. - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_ch Channels in input tensor - * @param[in] kernel Pointer to kernel weights - * @param[in] kernel_x Width of kernel - * @param[in] kernel_y Height of kernel - * @param[in] ch_mult Number of channel multiplier - * @param[in] pad_x Padding sizes x - * @param[in] pad_y Padding sizes y - * @param[in] stride_x stride along the width - * @param[in] stride_y stride along the height - * @param[in] dilation_x Dilation along width. Not used and intended for future enhancement. - * @param[in] dilation_y Dilation along height. Not used and intended for future enhancement. - * @param[in] bias Pointer to optional bias values. If no bias is - * availble, NULL is expected - * @param[in] input_offset Input tensor zero offset - * @param[in] filter_offset Kernel tensor zero offset - * @param[in] output_offset Output tensor zero offset - * @param[in,out] output Pointer to output tensor - * @param[in] output_x Width of output tensor - * @param[in] output_y Height of output tensor - * @param[in] output_activation_min Minimum value to clamp the output to. Range : {0, 255} - * @param[in] output_activation_max Minimum value to clamp the output to. Range : {0, 255} - * @param[in] out_shift Amount of right-shift for output - * @param[in] out_mult Output multiplier for requantization - * @return The function returns the following - * ARM_MATH_SUCCESS - Successful operation - * - */ - arm_status arm_depthwise_conv_u8_basic_ver1(const uint8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_ch, - const uint8_t *kernel, - const uint16_t kernel_x, - const uint16_t kernel_y, - const int16_t ch_mult, - const int16_t pad_x, - const int16_t pad_y, - const int16_t stride_x, - const int16_t stride_y, - const int16_t dilation_x, - const int16_t dilation_y, - const int32_t *bias, - const int32_t input_offset, - const int32_t filter_offset, - const int32_t output_offset, - uint8_t *output, - const uint16_t output_x, - const uint16_t output_y, - const int32_t output_activation_min, - const int32_t output_activation_max, - const int32_t out_shift, - const int32_t out_mult); - -/** - * @defgroup Reshape Reshape Functions - * - */ - - /** - * @brief Reshape a s8 vector into another with different shape - * @param[in] input points to the s8 input vector - * @param[out] output points to the s8 output vector - * @param[in] total_size total size of the input and output vectors in bytes - * - * @note The output is expected to be in a memory area that does not overlap with the input's - * - */ - void arm_reshape_s8(const int8_t *input, - int8_t *output, - const uint32_t total_size); - -/** - * @defgroup Concatenation Concatenation Functions - * - */ - - /** - * @brief int8/uint8 concatenation function to be used for concatenating N-tensors along the X axis - * This function should be called for each input tensor to concatenate. The argument offset_x - * will be used to store the input tensor in the correct position in the output tensor - * - * i.e. offset_x = 0 - * for(i = 0 i < num_input_tensors; ++i) - * { - * arm_concatenation_s8_x(&input[i], ..., &output, ..., ..., offset_x) - * offset_x += input_x[i] - * } - * - * This function assumes that the output tensor has: - * -# The same height of the input tensor - * -# The same number of channels of the input tensor - * -# The same batch size of the input tensor - * - * Unless specified otherwise, arguments are mandatory. - * - * @note This function, data layout independent, can be used to concatenate either int8 or uint8 tensors because does not involve any arithmetic operation - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_z Channels in input tensor - * @param[in] input_w Batch size in input tensor - * @param[out] output Pointer to output tensor - * @param[in] output_x Width of output tensor - * @param[in] offset_x The offset (in number of elements) on the X axis to start concatenating the input tensor - * It is user responsibility to provide the correct value - * - * Input constraints - * offset_x is less than output_x - * - */ - void arm_concatenation_s8_x(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_x, - const uint32_t offset_x); - - /** - * @brief int8/uint8 concatenation function to be used for concatenating N-tensors along the Y axis - * This function should be called for each input tensor to concatenate. The argument offset_y - * will be used to store the input tensor in the correct position in the output tensor - * - * i.e. offset_y = 0 - * for(i = 0 i < num_input_tensors; ++i) - * { - * arm_concatenation_s8_y(&input[i], ..., &output, ..., ..., offset_y) - * offset_y += input_y[i] - * } - * - * This function assumes that the output tensor has: - * -# The same width of the input tensor - * -# The same number of channels of the input tensor - * -# The same batch size of the input tensor - * - * Unless specified otherwise, arguments are mandatory. - * - * @note This function, data layout independent, can be used to concatenate either int8 or uint8 tensors because does not involve any arithmetic operation - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_z Channels in input tensor - * @param[in] input_w Batch size in input tensor - * @param[out] output Pointer to output tensor - * @param[in] output_y Height of output tensor - * @param[in] offset_y The offset on the Y axis to start concatenating the input tensor - * It is user responsibility to provide the correct value - * - * Input constraints - * offset_y is less than output_y - * - */ - void arm_concatenation_s8_y(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_y, - const uint32_t offset_y); - - /** - * @brief int8/uint8 concatenation function to be used for concatenating N-tensors along the Z axis - * This function should be called for each input tensor to concatenate. The argument offset_z - * will be used to store the input tensor in the correct position in the output tensor - * - * i.e. offset_z = 0 - * for(i = 0 i < num_input_tensors; ++i) - * { - * arm_concatenation_s8_z(&input[i], ..., &output, ..., ..., offset_z) - * offset_z += input_z[i] - * } - * - * This function assumes that the output tensor has: - * -# The same width of the input tensor - * -# The same height of the input tensor - * -# The same batch size of the input tensor - * - * Unless specified otherwise, arguments are mandatory. - * - * @note This function, data layout independent, can be used to concatenate either int8 or uint8 tensors because does not involve any arithmetic operation - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_z Channels in input tensor - * @param[in] input_w Batch size in input tensor - * @param[out] output Pointer to output tensor - * @param[in] output_z Channels in output tensor - * @param[in] offset_z The offset on the Z axis to start concatenating the input tensor - * It is user responsibility to provide the correct value - * - * Input constraints - * offset_z is less than output_z - * - */ - void arm_concatenation_s8_z(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_z, - const uint32_t offset_z); - - /** - * @brief int8/uint8 concatenation function to be used for concatenating N-tensors along the W axis (Batch size) - * This function should be called for each input tensor to concatenate. The argument offset_w - * will be used to store the input tensor in the correct position in the output tensor - * - * i.e. offset_w = 0 - * for(i = 0 i < num_input_tensors; ++i) - * { - * arm_concatenation_s8_w(&input[i], ..., &output, ..., ..., offset_w) - * offset_w += input_w[i] - * } - * - * This function assumes that the output tensor has: - * -# The same width of the input tensor - * -# The same height of the input tensor - * -# The same number o channels of the input tensor - * - * Unless specified otherwise, arguments are mandatory. - * - * @note This function, data layout independent, can be used to concatenate either int8 or uint8 tensors because does not involve any arithmetic operation - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_z Channels in input tensor - * @param[in] input_w Batch size in input tensor - * @param[out] output Pointer to output tensor - * @param[in] offset_w The offset on the W axis to start concatenating the input tensor - * It is user responsibility to provide the correct value - * - */ - void arm_concatenation_s8_w(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint32_t offset_w); -#ifdef __cplusplus -} -#endif - -#endif diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h deleted file mode 100644 index c14f382b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h +++ /dev/null @@ -1,905 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nnsupportfunctions.h - * Description: Public header file of support functions for CMSIS NN Library - * - * $Date: May 11, 2020 - * $Revision: V.4.0.4 - * - * Target Processor: Cortex-M CPUs - * -------------------------------------------------------------------- */ - -#ifndef _ARM_NNSUPPORTFUNCTIONS_H_ -#define _ARM_NNSUPPORTFUNCTIONS_H_ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/DSP/Include/arm_common_tables.h" - -#ifdef __cplusplus -extern "C" -{ -#endif - -#define LEFT_SHIFT(_shift) (_shift > 0 ? _shift : 0) -#define RIGHT_SHIFT(_shift) (_shift > 0 ? 0 : -_shift) -#define MASK_IF_ZERO(x) (x) == 0 ? ~0 : 0 -#define MASK_IF_NON_ZERO(x) (x) != 0 ? ~0 : 0 -#define SELECT_USING_MASK(mask, a, b) ((mask) & (a)) ^ (~(mask) & (b)) - -#define MAX(A,B) ((A) > (B) ? (A) : (B)) -#define MIN(A,B) ((A) < (B) ? (A) : (B)) -#define CLAMP(x, h, l) MAX(MIN((x), (h)), (l)) - -/** - * @brief Union for SIMD access of q31/q15/q7 types - */ -union arm_nnword -{ - q31_t word; - /**< q31 type */ - q15_t half_words[2]; - /**< q15 type */ - q7_t bytes[4]; - /**< q7 type */ -}; - -/** - * @brief Struct for specifying activation function types - * - */ -typedef enum -{ - ARM_SIGMOID = 0, - /**< Sigmoid activation function */ - ARM_TANH = 1, - /**< Tanh activation function */ -} arm_nn_activation_type; - -/** - * @defgroup nndata_convert Neural Network Data Conversion Functions - * - * Perform data type conversion in-between neural network operations - * - */ - -/** - * @brief Converts the elements of the q7 vector to q15 vector without left-shift - * @param[in] *pSrc points to the q7 input vector - * @param[out] *pDst points to the q15 output vector - * @param[in] blockSize length of the input vector - * - */ -void arm_q7_to_q15_no_shift(const q7_t *pSrc, q15_t *pDst, uint32_t blockSize); - -/** - * @brief Non-saturating addition of elements of a q7 vector - * @param[in] *input Pointer to the q7 input vector - * @param[out] *output Pointer to the q31 output variable. - * @param[in] block_size length of the input vector - * \par Description: - * - * 2^24 samples can be added without saturating the result. - * - * The equation used for the conversion process is: - * - *
- *  sum = input[0] + input[1] + .. + input[block_size -1]
- * 
- * - * */ -void arm_nn_add_q7(const q7_t *input, q31_t *output, uint32_t block_size); - -/** - * @brief Converts the elements of the q7 vector to reordered q15 vector without left-shift - * @param[in] *pSrc points to the q7 input vector - * @param[out] *pDst points to the q15 output vector - * @param[in] blockSize length of the input vector - * @return none. - * - */ -void arm_q7_to_q15_reordered_no_shift(const q7_t * pSrc, q15_t * pDst, uint32_t blockSize); - -/** - * @brief Converts the elements from a q7 vector to a q15 vector with an added offset - * @param[in] src pointer to the q7 input vector - * @param[out] dst pointer to the q15 output vector - * @param[in] block_size length of the input vector - * @param[in] offset q7 offset to be added to each input vector element. - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
- *  dst[n] = (q15_t) src[n] + offset;   0 <= n < block_size.
- * 
- * - */ -void arm_q7_to_q15_with_offset(const q7_t *src, q15_t *dst, uint32_t block_size, q15_t offset); - -/** - * @brief Converts the elements of the q7 vector to reordered q15 vector with an added offset - * @param[in] src pointer to the q7 input vector - * @param[out] dst pointer to the q15 output vector - * @param[in] block_size length of the input vector - * @param[in] offset offset to be added to each input vector element. - * @return none. - * - * @details This function does the q7 to q15 expansion with re-ordering of bytes. Re-ordering is a consequence of - * the sign extension intrinsic(DSP extension). The tail (i.e., last (N % 4) elements) retains its original - * order. - * - */ -void arm_q7_to_q15_reordered_with_offset(const q7_t *src, q15_t *dst, uint32_t block_size, q15_t offset); - -/** - * @brief Converts the elements from a q7 vector and accumulate to a q15 vector - * @param[in] *src points to the q7 input vector - * @param[out] *dst points to the q15 output vector - * @param[in] block_size length of the input vector - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
- *  dst[n] += (q15_t) src[n] ;   0 <= n < block_size.
- * 
- * - */ -void arm_nn_accumulate_q7_to_q15(q15_t *dst, const q7_t *src, uint32_t block_size); - -/** - * @brief Depthwise conv on an im2col buffer where the input channel equals output channel. - * @param[in] row pointer to row - * @param[in] col pointer to im2col buffer, always consists of 2 columns. - * @param[in] num_ch number of channels - * @param[in] out_shift pointer to per output channel requantization shift parameter. - * @param[in] out_mult pointer to per output channel requantization multiplier parameter. - * @param[in] out_offset output tensor offset. - * @param[in] activation_min minimum value to clamp the output to. Range : int8 - * @param[in] activation_max maximum value to clamp the output to. Range : int8 - * @param[in] kernel_size number of elements in one column. - * @param[in] output_bias per output channel bias. Range : int32 - * @param[out] out pointer to output - * @return The function returns one of the two - * 1. The incremented output pointer for a successful operation or - * 2. NULL if implementation is not available. - * - * @details Supported framework: TensorFlow Lite micro. - */ -q7_t *arm_nn_depthwise_conv_s8_core(const q7_t *row, - const q15_t *col, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t kernel_size, - const int32_t *const output_bias, - q7_t *out); - -/** - * @brief General Matrix-multiplication function with per-channel requantization. - * @param[in] input_row pointer to row operand - * @param[in] input_col pointer to col operand - * @param[in] output_ch number of rows of input_row - * @param[in] col_batches number of column batches. Range: 1 to 4 - * @param[in] output_shift pointer to per output channel requantization shift parameter. - * @param[in] output_mult pointer to per output channel requantization multiplier parameter. - * @param[in] out_offset output tensor offset. - * @param[in] col_offset input tensor(col) offset. - * @param[in] row_offset kernel offset(row). Not used. - * @param[in] out_activation_min minimum value to clamp the output to. Range : int8 - * @param[in] out_activation_max maximum value to clamp the output to. Range : int8 - * @param[in] row_len number of elements in each row - * @param[in] bias per output channel bias. Range : int32 - * @param[in,out] out pointer to output - * @return The function returns one of the two - * 1. The incremented output pointer for a successful operation or - * 2. NULL if implementation is not available. - * - * @details Supported framework: TensorFlow Lite -*/ -q7_t *arm_nn_mat_mult_s8(const q7_t *input_row, - const q7_t *input_col, - const uint16_t output_ch, - const uint16_t col_batches, - const int32_t *output_shift, - const int32_t *output_mult, - const int32_t out_offset, - const int32_t col_offset, - const int32_t row_offset, - const int16_t out_activation_min, - const int16_t out_activation_max, - const uint16_t row_len, - const int32_t *const bias, - q7_t *out); - -/** - * @brief General Matrix-multiplication without requantization for one row & one column - * @param[in] row_elements number of row elements - * @param[in] row_base pointer to row operand - * @param[in] col_base pointer to col operand - * @param[out] sum_col pointer to store sum of column elements - * @param[out] output pointer to store result of multiply-accumulate - * @return The function returns the multiply-accumulated result of the row by column. - * - * @details Pseudo-code - * *output = 0 - * sum_col = 0 - * for (i = 0; i < row_elements; i++) - * *output += row_base[i] * col_base[i] - * sum_col += col_base[i] - * -*/ -arm_status arm_nn_mat_mul_core_1x_s8(int32_t row_elements, - const int8_t *row_base, - const int8_t *col_base, - int32_t *const sum_col, - int32_t *const output); - -/** - * @brief General Matrix-multiplication without requantization for four rows and one column - * @param[in] row_elements number of row elements - * @param[in] offset offset between rows. Can be the same as row_elements. - * For e.g, in a 1x1 conv scenario with stride as 1. - * @param[in] row_base pointer to row operand - * @param[in] col_base pointer to col operand - * @param[out] sum_col pointer to store sum of column elements - * @param[out] output pointer to store result(4 int32's) of multiply-accumulate - * @return The function returns the multiply-accumulated result of the row by column - * - * @details Pseudo-code - * output[0] = 0 - * .. - * output[3] = 0 - * sum_col = 0 - * for (i = 0; i < row_elements; i++) - * output[0] += row_base[i] * col_base[i] - * .. - * output[3] += row_base[i + (row_elements * 3)] * col_base[i] - * sum_col += col_base[i] -*/ -arm_status arm_nn_mat_mul_core_4x_s8(const int32_t row_elements, - const int32_t offset, - const int8_t *row_base, - const int8_t *col_base, - int32_t *const sum_col, - int32_t *const output); - -/** -* @brief General Matrix-multiplication function with per-channel requantization. -* This function assumes: -* - LHS input matrix NOT transposed (nt) -* - RHS input matrix transposed (t) -* -* @note This operation also performs the broadcast bias addition before the requantization -* -* @param[in] lhs Pointer to the LHS input matrix -* @param[in] rhs Pointer to the RHS input matrix -* @param[in] bias Pointer to the bias vector. The length of this vector is equal to the number of output columns (or RHS input rows) -* @param[out] dst Pointer to the output matrix with "m" rows and "n" columns -* @param[in] dst_multipliers Pointer to the multipliers vector needed for the per-channel requantization. The length of this vector is equal to -* the number of output columns (or RHS input rows) -* @param[in] dst_shifts Pointer to the shifts vector needed for the per-channel requantization. The length of this vector is equal to -* the number of output columns (or RHS input rows) -* @param[in] lhs_rows Number of LHS input rows -* @param[in] rhs_rows Number of RHS input rows -* @param[in] rhs_cols Number of LHS/RHS input columns -* @param[in] lhs_offset Offset to be applied to the LHS input value -* @param[in] dst_offset Offset to be applied the output result -* @param[in] activation_min Minimum value to clamp down the output. Range : int8 -* @param[in] activation_max Maximum value to clamp up the output. Range : int8 -* -* @return The function returns ARM_MATH_SUCCESS -* -*/ -arm_status arm_nn_mat_mult_nt_t_s8(const q7_t *lhs, - const q7_t *rhs, - const q31_t *bias, - q7_t *dst, - const int32_t *dst_multipliers, - const int32_t *dst_shifts, - const int32_t lhs_rows, - const int32_t rhs_rows, - const int32_t rhs_cols, - const int32_t lhs_offset, - const int32_t dst_offset, - const int32_t activation_min, - const int32_t activation_max); - -/** - * @brief s8 Vector by Matrix (transposed) multiplication - * - * @param[in] lhs Input left-hand side vector - * @param[in] rhs Input right-hand side matrix (transposed) - * @param[in] bias Input bias - * @param[out] dst Output vector - * @param[in] lhs_offset Offset to be added to the input values of the left-hand side vector. Range: -127 to 128 - * @param[in] rhs_offset Offset to be added to the input values of the right-hand side matrix. Range: -127 to 128 - * @param[in] dst_offset Offset to be added to the output values. Range: -127 to 128 - * @param[in] dst_multiplier Output multiplier - * @param[in] dst_shift Output shift - * @param[in] rhs_cols Number of columns in the right-hand side input matrix - * @param[in] rhs_rows Number of rows in the right-hand side input matrix - * @param[in] activation_min Minimum value to clamp the output to. Range: int8 - * @param[in] activation_max Maximum value to clamp the output to. Range: int8 - * - * @return The function returns ARM_MATH_SUCCESS - * - */ -arm_status arm_nn_vec_mat_mult_t_s8(const q7_t *lhs, - const q7_t *rhs, - const q31_t *bias, - q7_t *dst, - const int32_t lhs_offset, - const int32_t rhs_offset, - const int32_t dst_offset, - const int32_t dst_multiplier, - const int32_t dst_shift, - const int32_t rhs_cols, - const int32_t rhs_rows, - const int32_t activation_min, - const int32_t activation_max); - -/** - * @brief Depthwise convolution of transposed rhs matrix with 4 lhs matrices. To be used in padded cases where - * the padding is -lhs_offset(Range: int8). Dimensions are the same for lhs and rhs. - * - * @param[in] lhs Input left-hand side matrix - * @param[in] rhs Input right-hand side matrix (transposed) - * @param[in] lhs_offset LHS matrix offset(input offset). Range: -127 to 128 - * @param[in] num_ch Number of channels in LHS/RHS - * @param[in] out_shift Per channel output shift. Length of vector is equal to number of channels - * @param[in] out_mult Per channel output multiplier. Length of vector is equal to number of channels - * @param[in] out_offset Offset to be added to the output values. Range: -127 to 128 - * @param[in] activation_min Minimum value to clamp the output to. Range: int8 - * @param[in] activation_max Maximum value to clamp the output to. Range: int8 - * @param[in] row_x_col (row_dimension * col_dimension) of LHS/RHS matrix - * @param[in] output_bias Per channel output bias. Length of vector is equal to number of channels - * @param[in] out Output pointer - * - * @return The function returns one of the two - * - Updated output pointer if an implementaiton is available - * - NULL if no implementation is available. - * - * @note If number of channels is not a multiple of 4, upto 3 elements outside the boundary will be read out - * for the following. - * - Output shift - * - Output multiplier - * - Output bias - * - rhs - */ -q7_t *arm_nn_depthwise_conv_nt_t_padded_s8(const q7_t *lhs, - const q7_t *rhs, - const int32_t lhs_offset, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t row_x_col, - const int32_t *const output_bias, - q7_t *out); - -/** - * @brief Depthwise convolution of transposed rhs matrix with 4 lhs matrices. To be used in non-padded cases. - * Dimensions are the same for lhs and rhs. - * - * @param[in] lhs Input left-hand side matrix - * @param[in] rhs Input right-hand side matrix (transposed) - * @param[in] lhs_offset LHS matrix offset(input offset). Range: -127 to 128 - * @param[in] num_ch Number of channels in LHS/RHS - * @param[in] out_shift Per channel output shift. Length of vector is equal to number of channels. - * @param[in] out_mult Per channel output multiplier. Length of vector is equal to number of channels. - * @param[in] out_offset Offset to be added to the output values. Range: -127 to 128 - * @param[in] activation_min Minimum value to clamp the output to. Range: int8 - * @param[in] activation_max Maximum value to clamp the output to. Range: int8 - * @param[in] row_x_col (row_dimension * col_dimension) of LHS/RHS matrix - * @param[in] output_bias Per channel output bias. Length of vector is equal to number of channels. - * @param[in] out Output pointer - * - * @return The function returns one of the two - * - Updated output pointer if an implementaiton is available - * - NULL if no implementation is available. - * - * @note If number of channels is not a multiple of 4, upto 3 elements outside the boundary will be read out - * for the following. - * - Output shift - * - Output multiplier - * - Output bias - * - rhs - */ -q7_t *arm_nn_depthwise_conv_nt_t_s8(const q7_t *lhs, - const q7_t *rhs, - const int32_t lhs_offset, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t row_x_col, - const int32_t *const output_bias, - q7_t *out); - -/** - @brief Read 2 q15 elements and post increment pointer. - @param[in] in_q15 Pointer to pointer that holds address of input. - @return q31 value - */ -__STATIC_FORCEINLINE q31_t arm_nn_read_q15x2_ia(const q15_t **in_q15) -{ - q31_t val; - - memcpy(&val, *in_q15, 4); - *in_q15 += 2; - - return (val); -} - -/** - @brief Read 4 q7 from q7 pointer and post increment pointer. - @param[in] in_q7 Pointer to pointer that holds address of input. - @return q31 value - */ -__STATIC_FORCEINLINE q31_t arm_nn_read_q7x4_ia(const q7_t **in_q7) -{ - q31_t val; - memcpy(&val, *in_q7, 4); - *in_q7 += 4; - - return (val); -} - -/** - @brief Read 2 q15 from q15 pointer. - @param[in] in_q15 pointer to address of input. - @return q31 value - */ -__STATIC_FORCEINLINE q31_t arm_nn_read_q15x2(const q15_t *in_q15) -{ - q31_t val; - memcpy(&val, in_q15, 4); - - return (val); -} - -/** - @brief Read 4 q7 values. - @param[in] in_q7 pointer to address of input. - @return q31 value - */ -__STATIC_FORCEINLINE q31_t arm_nn_read_q7x4(const q7_t *in_q7) -{ - q31_t val; - memcpy(&val, in_q7, 4); - - return (val); -} - -/** - * @brief memset optimized for MVE - * @param[in, out] dst Destination pointer - * @param[in] val Value to set - * @param[in] block_size Number of bytes to copy. - * - */ -__STATIC_FORCEINLINE void arm_memset_q7(q7_t *dst, - const q7_t val, - uint32_t block_size) -{ -#if defined(ARM_MATH_MVEI) - __asm volatile ( - " vdup.8 q0, %[set_val] \n" - " wlstp.8 lr, %[cnt], 1f \n" - "2: \n" - " vstrb.8 q0, [%[in]], 16 \n" - " letp lr, 2b \n" - "1: \n" - :[in] "+r"(dst) - :[cnt] "r"(block_size), [set_val] "r"(val) - :"q0", "memory", "r14"); -#else - memset(dst, val, block_size); -#endif -} - -#if defined (ARM_MATH_DSP) - -/** - * @brief read and expand one q7 word into two q15 words - */ - -__STATIC_FORCEINLINE const q7_t *read_and_pad(const q7_t *source, q31_t * out1, q31_t * out2) -{ - q31_t inA = arm_nn_read_q7x4_ia(&source); - q31_t inAbuf1 = __SXTB16(__ROR((uint32_t)inA, 8)); - q31_t inAbuf2 = __SXTB16(inA); - -#ifndef ARM_MATH_BIG_ENDIAN - *out2 = (int32_t) (__PKHTB (inAbuf1, inAbuf2, 16)); - *out1 = (int32_t) (__PKHBT (inAbuf2, inAbuf1, 16)); -#else - *out1 = (int32_t) (__PKHTB(inAbuf1, inAbuf2, 16)); - *out2 = (int32_t) (__PKHBT(inAbuf2, inAbuf1, 16)); -#endif - - return source; -} - -/** - * @brief read and expand one q7 word into two q15 words with reordering - */ - -__STATIC_FORCEINLINE const q7_t *read_and_pad_reordered(const q7_t *source, q31_t * out1, q31_t * out2) -{ - q31_t inA = arm_nn_read_q7x4_ia(&source); -#ifndef ARM_MATH_BIG_ENDIAN - *out2 = __SXTB16(__ROR((uint32_t)inA, 8)); - *out1 = __SXTB16(inA); -#else - *out1 = __SXTB16(__ROR((uint32_t)inA, 8)); - *out2 = __SXTB16(inA); -#endif - - return source; -} - -/** - * @brief read and expand one q7 word into two q15 words with reordering and add an offset - */ -__STATIC_FORCEINLINE const q7_t *read_and_pad_reordered_with_offset(const q7_t *source, q31_t * out1, q31_t * out2, q31_t offset) -{ - q31_t inA = arm_nn_read_q7x4_ia(&source); - -#ifndef ARM_MATH_BIG_ENDIAN - *out2 = __SXTB16(__ROR((uint32_t)inA, 8)); - *out1 = __SXTB16(inA); -#else - *out1 = __SXTB16(__ROR((uint32_t)inA, 8)); - *out2 = __SXTB16(inA); -#endif - *out1 = __QADD16(*out1,offset); - *out2 = __QADD16(*out2,offset); - - return source; -} - -#endif - - - -/** - * @defgroup NNBasicMath Basic Math Functions for Neural Network Computation - * - * Basic Math Functions for Neural Network Computation - * - */ - -/** - * @brief q7 vector multiplication with variable output shifts - * @param[in] *pSrcA pointer to the first input vector - * @param[in] *pSrcB pointer to the second input vector - * @param[out] *pDst pointer to the output vector - * @param[in] out_shift amount of right-shift for output - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_nn_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - const uint16_t out_shift, - uint32_t blockSize); - -/** - * @brief q7 vector multiplication with variable output shifts - * @param[in] *pSrcA pointer to the first input vector - * @param[in] *pSrcB pointer to the second input vector - * @param[out] *pDst pointer to the output vector - * @param[in] out_shift amount of right-shift for output - * @param[in] blockSize number of samples in each vector - * @return none. - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable q7 range [0x80 0x7F] will be saturated. - */ - -void arm_nn_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - const uint16_t out_shift, - uint32_t blockSize); - -/** - * @brief macro for adding rounding offset - */ -#ifndef ARM_NN_TRUNCATE - #define NN_ROUND(out_shift) ( (0x1u << out_shift) >> 1 ) -#else - #define NN_ROUND(out_shift) 0 -#endif - -// Macros for shortening quantization functions' names and avoid long lines -#define MUL_SAT(a, b) arm_nn_sat_doubling_high_mult((a), (b)) -#define MUL_SAT_MVE(a, b) arm_sat_doubling_high_mult_mve_32x4((a), (b)) -#define MUL_POW2(a, b) arm_nn_mult_by_power_of_two((a), (b)) - - -#define DIV_POW2(a, b) arm_nn_divide_by_power_of_two((a), (b)) -#define DIV_POW2_MVE(a, b) arm_divide_by_power_of_two_mve((a), (b)) - - -#define EXP_ON_NEG(x) arm_nn_exp_on_negative_values((x)) -#define ONE_OVER1(x) arm_nn_one_over_one_plus_x_for_x_in_0_1((x)) - -/** - * @brief Saturating doubling high multiply. Result matches - * NEON instruction VQRDMULH. - * @param[in] m1 Multiplicand - * @param[in] m2 Multiplier - * @return Result of multiplication. - * - */ -__STATIC_FORCEINLINE q31_t arm_nn_sat_doubling_high_mult(const q31_t m1, const q31_t m2) -{ - q31_t result = 0; - // Rounding offset to add for a right shift of 31 - q63_t mult = 1 << 30; - - if ((m1 < 0) ^ (m2 < 0)) - { - mult = 1 - mult; - } - // Gets resolved as a SMLAL instruction - mult = mult + (q63_t)m1 * m2; - - // Utilize all of the upper 32 bits. This is the doubling step - // as well. - result = (int32_t) (mult / (1ll << 31)); - - if ((m1 == m2) && (m1 == (int32_t)Q31_MIN)) - { - result = Q31_MAX; - } - return result; -} - -/** - * @brief Rounding divide by power of two. - * @param[in] dividend - Dividend - * @param[in] exponent - Divisor = power(2, exponent) - * Range: [0, 31] - * @return Rounded result of division. Midpoint is rounded away from zero. - * - */ -__STATIC_FORCEINLINE q31_t arm_nn_divide_by_power_of_two(const q31_t dividend, const q31_t exponent) -{ - q31_t result = 0; - const q31_t remainder_mask = (1 << exponent) - 1; - int32_t remainder = remainder_mask & dividend; - - // Basic division - result = dividend >> exponent; - - // Adjust 'result' for rounding (mid point away from zero) - q31_t threshold = remainder_mask >> 1; - if (result < 0) - { - threshold++; - } - if (remainder > threshold) - { - result++; - } - - return result; -} - -/** - * @brief Requantize a given value. - * @param[in] val Value to be requantized - * @param[in] multiplier multiplier - * @param[in] shift left or right shift for 'val * multiplier' - * - * @return Returns (val * multiplier)/(2 ^ shift) - * - */ -__STATIC_FORCEINLINE q31_t arm_nn_requantize(const q31_t val, const q31_t multiplier, const q31_t shift) -{ - return arm_nn_divide_by_power_of_two(arm_nn_sat_doubling_high_mult(val * (1 << LEFT_SHIFT(shift)), multiplier), - RIGHT_SHIFT(shift)); -} - -/** - * @brief memcpy optimized for MVE - * @param[in, out] dst Destination pointer - * @param[in] src Source pointer. - * @param[in] block_size Number of bytes to copy. - * - */ -__STATIC_FORCEINLINE void arm_memcpy_q7(q7_t *__RESTRICT dst, - const q7_t *__RESTRICT src, - uint32_t block_size) -{ -#if defined(ARM_MATH_MVEI) - __asm volatile ( - " wlstp.8 lr, %[cnt], 1f \n" - "2: \n" - " vldrb.8 q0, [%[in]], 16 \n" - " vstrb.8 q0, [%[out]], 16 \n" - " letp lr, 2b \n" - "1: \n" - :[in] "+r"(src) - ,[out] "+r"(dst) - :[cnt] "r"(block_size) - :"q0", "memory", "r14"); -#else - memcpy(dst, src, block_size); -#endif -} - -#if defined(ARM_MATH_MVEI) -/** - * @brief Vector saturating doubling high multiply returning high half. - * @param[in] m1 Multiplicand - * @param[in] m2 Multiplier - * @return Result of multiplication. - * - */ -__STATIC_FORCEINLINE int32x4_t arm_sat_doubling_high_mult_mve(const int32x4_t m1, const q31_t m2) -{ - return vqrdmulhq_n_s32(m1, m2); -} - -/** - * @brief Vector rounding divide by power of two. - * @param[in] dividend - Dividend vector - * @param[in] exponent - Divisor = power(2, exponent) - * Range: [0, 31] - * @return Rounded result of division. Midpoint is rounded away from zero. - * - */ -__STATIC_FORCEINLINE int32x4_t arm_divide_by_power_of_two_mve(const int32x4_t dividend, const q31_t exponent) -{ - const int32x4_t shift = vdupq_n_s32(-exponent); - const int32x4_t fixup = vshrq_n_s32(vandq_s32(dividend, shift), 31); - const int32x4_t fixed_up_dividend = vqaddq_s32(dividend, fixup); - return vrshlq_s32(fixed_up_dividend, shift); -} - -/** - * @brief Requantize a given vector. - * @param[in] val Vector to be requantized - * @param[in] multiplier multiplier - * @param[in] shift shift - * - * @return Returns (val * multiplier)/(2 ^ shift) - * - */ -__STATIC_FORCEINLINE int32x4_t arm_requantize_mve(const int32x4_t val, const q31_t multiplier, const q31_t shift) -{ - return arm_divide_by_power_of_two_mve( - arm_sat_doubling_high_mult_mve(vshlq_s32(val, vdupq_n_s32(LEFT_SHIFT(shift))), multiplier), - RIGHT_SHIFT(shift)); -} - -__STATIC_FORCEINLINE int32x4_t arm_sat_doubling_high_mult_mve_32x4(const int32x4_t m1, const int32x4_t m2) -{ - return vqrdmulhq_s32(m1, m2); -} - -__STATIC_FORCEINLINE int32x4_t arm_divide_by_power_of_two_mve_32x4(const int32x4_t dividend, const int32x4_t exponent) -{ - const int32x4_t shift = -exponent; - const int32x4_t fixup = vshrq_n_s32(vandq_s32(dividend, shift), 31); - const int32x4_t fixed_up_dividend = vqaddq_s32(dividend, fixup); - return vrshlq_s32(fixed_up_dividend, shift); -} - -__STATIC_FORCEINLINE int32x4_t arm_requantize_mve_32x4(const int32x4_t val, const int32x4_t multiplier, const int32x4_t shift) -{ - const int32x4_t zz = vdupq_n_s32(0); - const mve_pred16_t p = vcmpgtq_n_s32(shift, 0); - - const int32x4_t left_shift = vpselq_s32(shift, zz, p); - const int32x4_t right_shift = -vpselq_s32(zz, shift, p); - - return arm_divide_by_power_of_two_mve_32x4(arm_sat_doubling_high_mult_mve_32x4(vshlq_s32(val, left_shift), multiplier), right_shift); -} -#endif - -// @note The following functions are used only for softmax layer, scaled bits = 5 assumed - -__STATIC_FORCEINLINE int32_t arm_nn_exp_on_negative_values(int32_t val) -{ - int32_t mask = 0; - int32_t shift = 24; - - const int32_t val_mod_minus_quarter = (val & ((1 << shift) - 1)) - (1 << shift); - const int32_t remainder = val_mod_minus_quarter - val; - const int32_t x = (val_mod_minus_quarter << 5) + (1 << 28); - const int32_t x2 = MUL_SAT(x, x); - - int32_t result = 1895147668 + MUL_SAT(1895147668, x + - DIV_POW2(MUL_SAT(DIV_POW2(MUL_SAT(x2, x2), 2) + MUL_SAT(x2, x), 715827883) + x2, 1)); - -#define SELECT_IF_NON_ZERO(x) \ -{ \ - mask = MASK_IF_NON_ZERO(remainder & (1 << shift++)); \ - result = SELECT_USING_MASK(mask, MUL_SAT(result, x), result); \ -} - - SELECT_IF_NON_ZERO(1672461947) - SELECT_IF_NON_ZERO(1302514674) - SELECT_IF_NON_ZERO(790015084) - SELECT_IF_NON_ZERO(290630308) - SELECT_IF_NON_ZERO(39332535) - SELECT_IF_NON_ZERO(720401) - SELECT_IF_NON_ZERO(242) - -#undef SELECT_IF_NON_ZERO - - mask = MASK_IF_ZERO(val); - return SELECT_USING_MASK(mask, Q31_MAX, result); -} - -__STATIC_FORCEINLINE q31_t arm_nn_mult_by_power_of_two(const int32_t val, const int32_t exp) -{ - const int32_t thresh = ((1 << (31 - exp)) - 1); - int32_t result = val << exp; - result = SELECT_USING_MASK(MASK_IF_NON_ZERO(val > thresh), Q31_MAX, result); - result = SELECT_USING_MASK(MASK_IF_NON_ZERO(val < -thresh), Q31_MIN, result); - return result; -} - -__STATIC_FORCEINLINE int32_t arm_nn_one_over_one_plus_x_for_x_in_0_1(int32_t val) -{ - const int64_t sum = (int64_t)val + (int64_t)Q31_MAX; - const int32_t half_denominator = (int32_t)((sum + (sum >= 0 ? 1 : -1)) / 2L); - int32_t x = 1515870810 + MUL_SAT(half_denominator, -1010580540); - - const int32_t shift = (1 << 29); - x += MUL_POW2(MUL_SAT(x, shift - MUL_SAT(half_denominator, x)), 2); - x += MUL_POW2(MUL_SAT(x, shift - MUL_SAT(half_denominator, x)), 2); - x += MUL_POW2(MUL_SAT(x, shift - MUL_SAT(half_denominator, x)), 2); - - return MUL_POW2(x, 1); -} - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q15.c deleted file mode 100644 index 69c68777..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q15.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_activations_q15.c - * Description: Q15 neural network activation function using direct table look-up - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/DSP/Include/arm_common_tables.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Acti - * @{ - */ - -/** - * @brief neural network activation function using direct table look-up - * - * @note Refer header file for details. - * - */ - -void arm_nn_activations_direct_q15(q15_t * data, uint16_t size, uint16_t int_width, arm_nn_activation_type type) -{ - uint16_t i = size; - q15_t *pIn = data; - q15_t *pOut = data; - uint16_t shift_size = 8 + 3 - int_width; - uint32_t bit_mask = 0x7FF >> int_width; - uint32_t full_frac = bit_mask + 1; - const q15_t *lookup_table; - - switch (type) - { - case ARM_SIGMOID: - lookup_table = sigmoidTable_q15; - break; - case ARM_TANH: - default: - lookup_table = tanhTable_q15; - break; - } - - while (i) - { - q15_t out; - q15_t in = *pIn++; - q15_t frac = (uint32_t) in & bit_mask; - q15_t value = lookup_table[(uint8_t)(in >> shift_size)]; - if ((in >> shift_size) != 0x7f) - { - q15_t value2 = lookup_table[(uint8_t)(1 + ((uint8_t)(in >> shift_size)))]; - /* doing the interpolation here for better accuracy */ - out = ((q31_t) (full_frac - frac) * value + (q31_t) value2 * frac) >> shift_size; - } else - { - /* the largest positive value does not have a right side for linear interpolation */ - out = value; - } - - *pOut++ = out; - i--; - } - -} - -/** - * @} end of Acti group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q7.c deleted file mode 100644 index 19476ed5..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_nn_activations_q7.c +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_activations_q7.c - * Description: Q7 neural network activation function using direct table look-up - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/DSP/Include/arm_common_tables.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Acti - * @{ - */ - - /** - * @brief Q7 neural network activation function using direct table look-up - * @param[in,out] data pointer to input - * @param[in] size number of elements - * @param[in] int_width bit-width of the integer part, assume to be smaller than 3 - * @param[in] type type of activation functions - * - * @details - * - * This is the direct table look-up approach. - * - * Assume here the integer part of the fixed-point is <= 3. - * More than 3 just not making much sense, makes no difference with - * saturation followed by any of these activation functions. - */ - -void arm_nn_activations_direct_q7(q7_t * data, uint16_t size, uint16_t int_width, arm_nn_activation_type type) -{ - uint16_t i = size; - q7_t *pIn = data; - q7_t *pOut = data; - q7_t in; - q7_t out; - uint16_t shift_size = 3 - int_width; - const q7_t *lookup_table; - switch (type) - { - case ARM_SIGMOID: - lookup_table = sigmoidTable_q7; - break; - case ARM_TANH: - default: - lookup_table = tanhTable_q7; - break; - } - while (i) - { - in = *pIn++; - out = lookup_table[(uint8_t) (in >> shift_size)]; - *pOut++ = out; - i--; - } -} - -/** - * @} end of Acti group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu6_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu6_s8.c deleted file mode 100644 index 63f29f48..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu6_s8.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_relu6_s8.c - * Description: Basic s8 version of ReLU6 - * - * $Date: Spetember 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Acti - * @{ - */ - - /* - * Basic ReLU6 function - * - * Refer to header file for details. - * - */ - -void arm_relu6_s8(q7_t *data, uint16_t size) -{ - int32_t i; - - for (i = 0; i < size; i++) - { - int32_t ip = data[i]; - - ip = MAX(ip, 0); - data[i] = MIN(ip, 6); - } -} - -/** - * @} end of Acti group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q15.c deleted file mode 100644 index be5450de..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q15.c +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_relu_q15.c - * Description: Q15 version of ReLU - * - * $Date: February 27, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Acti - * @{ - */ - -/** - * @brief Q15 RELU function - * @param[in,out] data pointer to input - * @param[in] size number of elements - * - * @details - * - * Optimized relu with QSUB instructions. - * - */ - -void arm_relu_q15(q15_t *data, uint16_t size) -{ - -#if defined(ARM_MATH_DSP) - /* Run the following code for M cores with DSP extension */ - - uint16_t i = size >> 1; - q15_t *input = data; - q15_t *output = data; - q31_t in; - q31_t buf; - q31_t mask; - - while (i) - { - in = read_q15x2_ia(&input); - - /* extract the first bit */ - buf = __ROR(in & 0x80008000, 15); - - /* if MSB=1, mask will be 0xFF, 0x0 otherwise */ - mask = __QSUB16(0x00000000, buf); - - write_q15x2_ia(&output, in & (~mask)); - i--; - } - - if (size & 0x1) - { - if (*input < 0) - { - *input = 0; - } - input++; - } -#else - /* Run the following code as reference implementation for M cores without DSP extension */ - uint16_t i; - - for (i = 0; i < size; i++) - { - if (data[i] < 0) - data[i] = 0; - } - -#endif /* ARM_MATH_DSP */ -} - -/** - * @} end of Acti group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q7.c deleted file mode 100644 index 724d7b49..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ActivationFunctions/arm_relu_q7.c +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_relu_q7.c - * Description: Q7 version of ReLU - * - * $Date: May 29, 2020 - * $Revision: V.1.0.2 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Acti - * @{ - */ - - /** - * @brief Q7 RELU function - * @param[in,out] data pointer to input - * @param[in] size number of elements - * - * @details - * - * Optimized relu with QSUB instructions. - * - */ - -void arm_relu_q7(q7_t *data, uint16_t size) -{ - -#if defined(ARM_MATH_DSP) - /* Run the following code for M cores with DSP extension */ - - uint16_t i = size >> 2; - q7_t *input = data; - q7_t *output = data; - q31_t in; - q31_t buf; - q31_t mask; - - while (i) - { - in = read_q7x4_ia(&input); - - /* extract the first bit */ - buf = (int32_t)__ROR((uint32_t)in & 0x80808080, 7); - - /* if MSB=1, mask will be 0xFF, 0x0 otherwise */ - mask = __QSUB8(0x00000000, buf); - - write_q7x4_ia(&output, in & (~mask)); - - i--; - } - - i = size & 0x3; - while (i) - { - if (*input < 0) - { - *input = 0; - } - input++; - i--; - } - -#else - /* Run the following code as reference implementation for cores without DSP extension */ - - uint16_t i; - - for (i = 0; i < size; i++) - { - if (data[i] < 0) - data[i] = 0; - } - -#endif -} - -/** - * @} end of Acti group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_add_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_add_s8.c deleted file mode 100644 index 3e42638d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_add_s8.c +++ /dev/null @@ -1,252 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_elementwise_add_s8 - * Description: Element wise add - * - * $Date: February 27, 2020 - * $Revision: V.2.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" -#if defined(ARM_MATH_MVEI) -#include "cmsis/CMSIS/DSP/Include/arm_helium_utils.h" -#endif - -#if defined(ARM_MATH_MVEI) -#define SAT_INPUT_VECT(__INPUT_V, __MULT, __SHIFT) \ - __INPUT_V = arm_sat_doubling_high_mult_mve(__INPUT_V, __MULT); \ - __INPUT_V = arm_divide_by_power_of_two_mve(__INPUT_V, -__SHIFT); -#endif - -#define SAT_INPUT(__INPUT, __MULT, __SHIFT) \ - __INPUT = arm_nn_sat_doubling_high_mult(__INPUT, __MULT); \ - __INPUT = arm_nn_divide_by_power_of_two(__INPUT, -__SHIFT); - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup BasicMath - * @{ - */ - -/* - * s8 element wise add - * - * Refer header file for details. - * - */ - -/* Note: __SHIFT is expected to be <=0 */ - - -arm_status -arm_elementwise_add_s8(const int8_t *input_1_vect, - const int8_t *input_2_vect, - const int32_t input_1_offset, - const int32_t input_1_mult, - const int32_t input_1_shift, - const int32_t input_2_offset, - const int32_t input_2_mult, - const int32_t input_2_shift, - const int32_t left_shift, - int8_t *output, - const int32_t out_offset, - const int32_t out_mult, - const int32_t out_shift, - const int32_t out_activation_min, - const int32_t out_activation_max, - const uint32_t block_size) -{ -#if defined(ARM_MATH_MVEI) - int32_t count = (int32_t)block_size; - - while (count > 0) - { - int32x4_t vect_1; - int32x4_t vect_2; - - mve_pred16_t p = vctp32q((uint32_t)count); - - vect_1 = vldrbq_z_s32(input_1_vect, p); - vect_2 = vldrbq_z_s32(input_2_vect, p); - - vect_1 = vaddq_s32(vect_1, vdupq_n_s32(input_1_offset)); - vect_2 = vaddq_s32(vect_2, vdupq_n_s32(input_2_offset)); - - vect_1 = vshlq_r_s32(vect_1, left_shift); - vect_2 = vshlq_r_s32(vect_2, left_shift); - - SAT_INPUT_VECT(vect_1, input_1_mult, input_1_shift); - SAT_INPUT_VECT(vect_2, input_2_mult, input_2_shift); - - vect_1 = vaddq_s32(vect_1, vect_2); - SAT_INPUT_VECT(vect_1, out_mult, out_shift); - - vect_1 = vaddq_n_s32(vect_1, out_offset); - - vect_1 = vmaxq_s32(vect_1, vdupq_n_s32(out_activation_min)); - vect_1 = vminq_s32(vect_1, vdupq_n_s32(out_activation_max)); - - input_1_vect += 4; - input_2_vect += 4; - vstrbq_p_s32(output, vect_1, p); - - output += 4; - count -= 4; - } -#else - uint32_t loop_count; - int32_t input_1; - int32_t input_2; - int32_t sum; - -#if defined(ARM_MATH_DSP) - int32_t a_1, b_1, a_2, b_2; - - int32_t offset_1_packed, offset_2_packed; - - int8_t r1, r2, r3, r4; - - offset_1_packed = (input_1_offset << 16U) | (input_1_offset & 0x0FFFFL); - offset_2_packed = (input_2_offset << 16U) | (input_2_offset & 0x0FFFFL); - - loop_count = block_size >> 2; - - while (loop_count > 0U) - { - /* 4 outputs are calculated in one loop. The order of calculation is follows the order of output sign extension - intrinsic */ - input_1_vect = read_and_pad_reordered(input_1_vect, &b_1, &a_1); - input_2_vect = read_and_pad_reordered(input_2_vect, &b_2, &a_2); - - a_1 = __SADD16(a_1, offset_1_packed); - b_1 = __SADD16(b_1, offset_1_packed); - - a_2 = __SADD16(a_2, offset_2_packed); - b_2 = __SADD16(b_2, offset_2_packed); - - /* Sum 1 */ - input_1 = (int16_t)(b_1 & 0x0FFFFL) << left_shift; - SAT_INPUT(input_1, input_1_mult, input_1_shift); - - input_2 = (int16_t)(b_2 & 0x0FFFFL) << left_shift; - SAT_INPUT(input_2, input_2_mult, input_2_shift); - - sum = input_1 + input_2; - SAT_INPUT(sum, out_mult, out_shift); - sum += out_offset; - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - r1 = (q7_t)sum; - - /* Sum 3 */ - input_1 = (int16_t)((b_1 >> 16) & 0x0FFFFL) << left_shift; - SAT_INPUT(input_1, input_1_mult, input_1_shift); - - input_2 = (int16_t)((b_2 >> 16) & 0x0FFFFL) << left_shift; - SAT_INPUT(input_2, input_2_mult, input_2_shift); - - sum = input_1 + input_2; - SAT_INPUT(sum, out_mult, out_shift); - sum += out_offset; - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - r3 = (q7_t)sum; - - /* Sum 2 */ - input_1 = (int16_t)(a_1 & 0x0FFFFL) << left_shift; - SAT_INPUT(input_1, input_1_mult, input_1_shift); - - input_2 = (int16_t)(a_2 & 0x0FFFFL) << left_shift; - SAT_INPUT(input_2, input_2_mult, input_2_shift); - - sum = input_1 + input_2; - SAT_INPUT(sum, out_mult, out_shift); - sum += out_offset; - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - r2 = (q7_t)sum; - - /* Sum 4 */ - input_1 = (int16_t)((a_1 >> 16) & 0x0FFFFL) << left_shift; - SAT_INPUT(input_1, input_1_mult, input_1_shift); - - input_2 = (int16_t)((a_2 >> 16) & 0x0FFFFL) << left_shift; - SAT_INPUT(input_2, input_2_mult, input_2_shift); - - sum = input_1 + input_2; - SAT_INPUT(sum, out_mult, out_shift); - sum += out_offset; - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - r4 = (q7_t)sum; - - write_q7x4_ia(&output, __PACKq7(r1, r2, r3, r4)); - - loop_count--; - } - - loop_count = block_size & 0x3; -#else - loop_count = block_size; -#endif - - while (loop_count > 0U) - { - /* C = A + B */ - - input_1 = (*input_1_vect++ + input_1_offset) << left_shift; - input_2 = (*input_2_vect++ + input_2_offset) << left_shift; - - input_1 = arm_nn_sat_doubling_high_mult(input_1, input_1_mult); - input_1 = arm_nn_divide_by_power_of_two(input_1, -input_1_shift); - - input_2 = arm_nn_sat_doubling_high_mult(input_2, input_2_mult); - input_2 = arm_nn_divide_by_power_of_two(input_2, -input_2_shift); - - sum = input_1 + input_2; - SAT_INPUT(sum, out_mult, out_shift); - sum += out_offset; - - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - - *output++ = (q7_t)sum; - - /* Decrement loop counter */ - loop_count--; - } - -#endif /* ARM_MATH_MVEI */ - - return (ARM_MATH_SUCCESS); -} - -/** - * @} end of BasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_mul_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_mul_s8.c deleted file mode 100644 index 55303b77..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/BasicMathFunctions/arm_elementwise_mul_s8.c +++ /dev/null @@ -1,202 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_elementwise_mul_s8 - * Description: Element wise multiplication - * - * $Date: May 29, 2020 - * $Revision: V.1.0.3 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup BasicMath - * @{ - */ - -/** - * @brief s8 element wise multiplication of two vectors - * - * @note Refer header file for details. - * - */ - -arm_status -arm_elementwise_mul_s8(const int8_t *input_1_vect, - const int8_t *input_2_vect, - const int32_t input_1_offset, - const int32_t input_2_offset, - int8_t *output, - const int32_t out_offset, - const int32_t out_mult, - const int32_t out_shift, - const int32_t out_activation_min, - const int32_t out_activation_max, - const uint32_t block_size) -{ - - int32_t loop_count; -#if defined(ARM_MATH_MVEI) - - loop_count = (block_size + 3) / 4; - uint32_t num_elements = block_size; - - for (int i = 0; i < loop_count; i++) - { - mve_pred16_t p = vctp32q(num_elements); - - int32x4_t input_1 = vldrbq_z_s32(input_1_vect, p); - input_1 = vaddq_n_s32(input_1, input_1_offset); - - int32x4_t input_2 = vldrbq_z_s32(input_2_vect, p); - input_2 = vaddq_n_s32(input_2, input_2_offset); - - int32x4_t res_0 = vmulq_s32(input_1, input_2); - - res_0 = arm_requantize_mve_32x4(res_0, vdupq_n_s32(out_mult), vdupq_n_s32(out_shift)); - - res_0 += vdupq_n_s32(out_offset); - - res_0 = vmaxq_s32(res_0, vdupq_n_s32(out_activation_min)); - res_0 = vminq_s32(res_0, vdupq_n_s32(out_activation_max)); - - vstrbq_p_s32(output, res_0, p); - input_1_vect += 4; - input_2_vect += 4; - output += 4; - num_elements -= 4; - } - -#else - int32_t input_1; - int32_t input_2; - int32_t mul_res; - -#if defined(ARM_MATH_DSP) - int32_t a_1, b_1, a_2, b_2; - - int32_t offset_1_packed, offset_2_packed; - - int8_t r1, r2, r3, r4; - - offset_1_packed = (input_1_offset << 16U) | (input_1_offset & 0x0FFFFL); - offset_2_packed = (input_2_offset << 16U) | (input_2_offset & 0x0FFFFL); - - loop_count = block_size >> 2; - - while (loop_count > 0U) - { - /* 4 outputs are calculated in one loop. The order of calculation is follows the order of output sign extension - intrinsic */ - input_1_vect = read_and_pad_reordered(input_1_vect, &b_1, &a_1); - input_2_vect = read_and_pad_reordered(input_2_vect, &b_2, &a_2); - - a_1 = __SADD16(a_1, offset_1_packed); - b_1 = __SADD16(b_1, offset_1_packed); - - a_2 = __SADD16(a_2, offset_2_packed); - b_2 = __SADD16(b_2, offset_2_packed); - - /* Mul 1 */ - input_1 = (int16_t)(b_1 & 0x0FFFFL); - input_2 = (int16_t)(b_2 & 0x0FFFFL); - - mul_res = input_1 * input_2; - mul_res = arm_nn_requantize(mul_res, out_mult, out_shift) + out_offset; - - mul_res = MAX(mul_res, out_activation_min); - mul_res = MIN(mul_res, out_activation_max); - r1 = (q7_t)mul_res; - - /* Mul 3 */ - input_1 = (int16_t)((b_1 >> 16U) & 0x0FFFFL); - input_2 = (int16_t)((b_2 >> 16U) & 0x0FFFFL); - - mul_res = input_1 * input_2; - mul_res = arm_nn_requantize(mul_res, out_mult, out_shift) + out_offset; - mul_res = MAX(mul_res, out_activation_min); - mul_res = MIN(mul_res, out_activation_max); - r3 = (q7_t)mul_res; - - /* Mul 2 */ - input_1 = (int16_t)(a_1 & 0x0FFFFL); - input_2 = (int16_t)(a_2 & 0x0FFFFL); - - mul_res = input_1 * input_2; - mul_res = arm_nn_requantize(mul_res, out_mult, out_shift) + out_offset; - mul_res = MAX(mul_res, out_activation_min); - mul_res = MIN(mul_res, out_activation_max); - r2 = (q7_t)mul_res; - - /* Mul 4 */ - input_1 = (int16_t)((a_1 >> 16U) & 0x0FFFFL); - input_2 = (int16_t)((a_2 >> 16U) & 0x0FFFFL); - - mul_res = input_1 * input_2; - mul_res = arm_nn_requantize(mul_res, out_mult, out_shift) + out_offset; - mul_res = MAX(mul_res, out_activation_min); - mul_res = MIN(mul_res, out_activation_max); - r4 = (q7_t)mul_res; - - write_q7x4_ia(&output, __PACKq7(r1, r2, r3, r4)); - - loop_count--; - } - - loop_count = block_size & 0x3; -#else - loop_count = block_size; -#endif - - while (loop_count > 0U) - { - /* C = A * B */ - - input_1 = *input_1_vect++ + input_1_offset; - input_2 = *input_2_vect++ + input_2_offset; - - mul_res = input_1 * input_2; - mul_res = arm_nn_requantize(mul_res, out_mult, out_shift) + out_offset; - - mul_res = MAX(mul_res, out_activation_min); - mul_res = MIN(mul_res, out_activation_max); - - *output++ = (q7_t)mul_res; - - /* Decrement loop counter */ - loop_count--; - } -#endif - return ARM_MATH_SUCCESS; -} - -/** - * @} end of BasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_w.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_w.c deleted file mode 100644 index 20b68bc7..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_w.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_concatenation_s8_w.c - * Description: s8 version of concatenation along the W axis - * - * $Date: October 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Concatenation - * @{ - */ - - /* - * s8 version of concatenation along the W axis - * - * Refer to header file for details. - * - */ -void arm_concatenation_s8_w(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint32_t offset_w) -{ - const uint32_t input_copy_size = input_x * input_y * input_z * input_w; - - output += offset_w * (input_x * input_y * input_z); - - memcpy(output, input, input_copy_size); -} - -/** - * @} end of Concatenation group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_x.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_x.c deleted file mode 100644 index b1ff364a..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_x.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_concatenation_s8_x.c - * Description: s8 version of concatenation along the X axis - * - * $Date: October 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Concatenation - * @{ - */ - - /* - * s8 version of concatenation along the X axis - * - * Refer to header file for details. - * - */ -void arm_concatenation_s8_x(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_x, - const uint32_t offset_x) -{ - const uint32_t num_iterations = input_y * input_z * input_w; - - output += offset_x; - - uint32_t i; - - // Copy per row - for (i = 0; i < num_iterations; ++i) - { - memcpy(output, input, input_x); - input += input_x; - output += output_x; - } -} - -/** - * @} end of Concatenation group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_y.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_y.c deleted file mode 100644 index 47913687..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_y.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_concatenation_s8_y.c - * Description: s8 version of concatenation along the Y axis - * - * $Date: October 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Concatenation - * @{ - */ - - /* - * s8 version of concatenation along the Y axis - * - * Refer to header file for details. - * - */ -void arm_concatenation_s8_y(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_y, - const uint32_t offset_y) -{ - const uint32_t num_iterations = input_z * input_w; - const uint32_t input_copy_size = input_x * input_y; - const uint32_t output_stride = input_x * output_y; - - output += offset_y * input_x; - uint32_t i; - - // Copy per tile - for (i = 0; i < num_iterations; ++i) - { - memcpy(output, input, input_copy_size); - input += input_copy_size; - output += output_stride; - } -} - -/** - * @} end of Concatenation group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_z.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_z.c deleted file mode 100644 index 0d0bf500..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConcatenationFunctions/arm_concatenation_s8_z.c +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_concatenation_s8_z.c - * Description: s8 version of concatenation along the Z axis - * - * $Date: October 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Concatenation - * @{ - */ - - /* - * s8 version of concatenation along the Z axis - * - * Refer to header file for details. - * - */ -void arm_concatenation_s8_z(const int8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_z, - const uint16_t input_w, - int8_t *output, - const uint16_t output_z, - const uint32_t offset_z) -{ - const uint32_t input_copy_size = input_x * input_y * input_z; - const uint32_t output_stride = input_x * input_y * output_z; - - output += offset_z * (input_x * input_y); - - uint32_t i; - - for (i = 0; i < input_w; ++i) - { - memcpy(output, input, input_copy_size); - input += input_copy_size; - output += output_stride; - } -} - -/** - * @} end of Concatenation group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1_x_n_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1_x_n_s8.c deleted file mode 100644 index f2af65bb..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1_x_n_s8.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_1_x_n_s8.c - * Description: s8 version of 1xN convolution using symmetric quantization. - * - * $Date: May 18, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nn_types.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * 1xN s8 convolution function. - * - * Refer header file for details. - * - */ - -arm_status arm_convolve_1_x_n_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data) -{ - (void)bias_dims; - arm_status status = ARM_MATH_SUCCESS; - if (output_dims->w % 4 != 0) - { - status = ARM_MATH_SIZE_MISMATCH; - goto out; - } - -#if defined(ARM_MATH_MVEI) - q15_t *buffer_a = (q15_t *)ctx->buf; - - const uint16_t input_x = input_dims->w; - const uint16_t kernel_x = filter_dims->w; - const uint16_t output_x = output_dims->w; - const uint16_t output_ch = output_dims->c; - const uint16_t input_ch = input_dims->c; - const uint16_t pad_x = conv_params->padding.w; - const uint16_t stride_x = conv_params->stride.w; - - const int32_t input_offset = conv_params->input_offset; - const int32_t out_offset = conv_params->output_offset; - const int32_t out_activation_min = conv_params->activation.min; - const int32_t out_activation_max = conv_params->activation.max; - int32_t *output_mult = quant_params->multiplier; - int32_t *output_shift = quant_params->shift; - - for (int i_out_x = 0; i_out_x <= (output_x - 4); i_out_x += 4) - { - int32_t input_begin_idx[4]; - int32_t ker_begin_idx[4]; - int32_t ker_end_idx[4]; - - for (int i = 0; i < 4; i++) - { - const int32_t est_input_x_idx = stride_x * (i_out_x + i) - pad_x; - input_begin_idx[i] = MAX(0, est_input_x_idx); - ker_begin_idx[i] = MAX(0, -est_input_x_idx); - ker_end_idx[i] = MIN(kernel_x, input_x - est_input_x_idx); - } - - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32x4_t s_offset; - int32_t acc[4]; - if ((ker_begin_idx[0] != 0) || (ker_end_idx[3] != kernel_x)) - { - int32_t sum_row[4]; - - (void)arm_nn_mat_mul_core_1x_s8((ker_end_idx[0] - ker_begin_idx[0]) * input_ch, - input_data + input_begin_idx[0] * input_ch, - filter_data + (input_ch * kernel_x * i_out_ch) + (ker_begin_idx[0] * input_ch), - &sum_row[0], - &acc[0]); - (void)arm_nn_mat_mul_core_1x_s8((ker_end_idx[1] - ker_begin_idx[1]) * input_ch, - input_data + input_begin_idx[1] * input_ch, - filter_data + (input_ch * kernel_x * i_out_ch) + (ker_begin_idx[1] * input_ch), - &sum_row[1], - &acc[1]); - - (void)arm_nn_mat_mul_core_1x_s8((ker_end_idx[2] - ker_begin_idx[2]) * input_ch, - input_data + input_begin_idx[2] * input_ch, - filter_data + (input_ch * kernel_x * i_out_ch) + (ker_begin_idx[2] * input_ch), - &sum_row[2], - &acc[2]); - - (void)arm_nn_mat_mul_core_1x_s8((ker_end_idx[3] - ker_begin_idx[3]) * input_ch, - input_data + input_begin_idx[3] * input_ch, - filter_data + (input_ch * kernel_x * i_out_ch) + (ker_begin_idx[3] * input_ch), - &sum_row[3], - &acc[3]); - - s_offset = vldrwq_s32(sum_row); - } - else - { - int32_t sum_row; - (void)arm_nn_mat_mul_core_4x_s8(kernel_x * input_ch, - stride_x * input_ch, - input_data + input_begin_idx[0] * input_ch, - filter_data + (input_ch * kernel_x * i_out_ch), - &sum_row, - acc); - - s_offset = vdupq_n_s32(sum_row); - } - int32x4_t res = vldrwq_s32(acc); - s_offset = vmulq_n_s32(s_offset, input_offset); - - res = vaddq_n_s32(res, bias_data[i_out_ch]); - res = vaddq_s32(res, s_offset); - res = arm_requantize_mve(res, output_mult[i_out_ch], output_shift[i_out_ch]); - res = vaddq_n_s32(res, out_offset); - - res = vmaxq_s32(res, vdupq_n_s32(out_activation_min)); - res = vminq_s32(res, vdupq_n_s32(out_activation_max)); - - const uint32x4_t scatter_offset = {0, output_ch, output_ch * 2, output_ch * 3}; - vstrbq_scatter_offset_s32(output_data, scatter_offset, res); - output_data++; - } - output_data += (3 * output_ch); - } - -#else - status = arm_convolve_s8(ctx, - conv_params, - quant_params, - input_dims, - input_data, - filter_dims, - filter_data, - bias_dims, - bias_data, - output_dims, - output_data); -#endif - -out: - /* Return to application */ - return status; -} - -int32_t arm_convolve_1_x_n_s8_get_buffer_size(const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims) -{ -#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI) - return (2 * input_dims->c * filter_dims->w * filter_dims->h) * sizeof(int16_t); -#else - (void)input_dims; - (void)filter_dims; - return 0; -#endif -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_HWC_q7_fast_nonsquare.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_HWC_q7_fast_nonsquare.c deleted file mode 100644 index 0725e615..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_HWC_q7_fast_nonsquare.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_1x1_HWC_q7_fast_nonsquare.c - * Description: Fast Q7 version of 1x1 convolution (non-square shape) - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/** - * @brief Fast Q7 version of 1x1 convolution (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimention x - * @param[in] dim_im_in_y input tensor dimention y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is optimized for convolution with 1x1 kernel size (i.e., dim_kernel_x=1 - * and dim_kernel_y=1). It can be used for the second half of MobileNets [1] after depthwise - * separable convolution. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 4 - * ch_im_out is multiple of 2 - * - * [1] MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications - * https://arxiv.org/abs/1704.04861 - */ - -arm_status arm_convolve_1x1_HWC_q7_fast_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - (void)dim_im_in_y; - int16_t i_out_y, i_out_x; - int16_t i_ch_out; - - /* ----------------------- - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0 || dim_kernel_x != 1 || dim_kernel_y != 1 - || padding_x != 0 || padding_y != 0 || stride_x != 1 || stride_y != 1) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - /* This part implements the im2col function */ - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + (i_out_y * dim_im_in_x + i_out_x) * ch_im_in, pBuffer, - ch_im_in); - pBuffer += ch_im_in; - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* check if there is left-over for compute */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - for (i_ch_out = 0; i_ch_out < ch_im_out; i_ch_out++) - { - q31_t sum = ((q31_t)(bias[i_ch_out]) << bias_shift) + NN_ROUND(out_shift); - const q15_t *pB = bufferA; - /* basically each time it process 4 entries */ - uint16_t colCnt = ch_im_in * dim_kernel_x * dim_kernel_y >> 2; - - while (colCnt) - { - - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad_reordered(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia(&pB); - - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = ch_im_in * dim_kernel_y * dim_kernel_x & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut = (q7_t) __SSAT((sum >> out_shift), 8); - pOut++; - - } - - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0 || dim_kernel_x != 1 || dim_kernel_y != 1 - || padding_x != 0 || padding_y != 0 || stride_x != 1 || stride_y != 1) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out_y; j++) - { - for (k = 0; k < dim_im_out_x; k++) - { - conv_out = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel_y; m++) - { - for (n = 0; n < dim_kernel_x; n++) - { - // if-for implementation - in_row = stride_y * j + m - padding_y; - in_col = stride_x * k + n - padding_x; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + l] * - wt[i * ch_im_in * dim_kernel_y * dim_kernel_x + (m * dim_kernel_y + n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_s8_fast.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_s8_fast.c deleted file mode 100644 index 75e4c8e3..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_1x1_s8_fast.c +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_1x1_s8_fast.c - * Description: Fast q7 version of 1x1 convolution (non-square shape) - * - * $Date: May 29, 2020 - * $Revision: V.2.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nn_types.h" - -#define DIM_KER_X (1U) -#define DIM_KER_Y (1U) - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * Fast s8 version for 1x1 convolution (non-square shape) - * - * Refer header file for details. - * - */ - -arm_status arm_convolve_1x1_s8_fast(const cmsis_nn_context *ctx, - const cmsis_nn_conv_params *conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input_data, - const cmsis_nn_dims *filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims *bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims *output_dims, - q7_t *output_data) -{ - if (input_dims->c % 4 != 0 || - conv_params->padding.w != 0 || conv_params->padding.h != 0 || - conv_params->stride.w != 1 || conv_params->stride.h != 1) - { - return ARM_MATH_SIZE_MISMATCH; - } - - (void)ctx; - (void)filter_dims; - (void)bias_dims; - -#if defined(ARM_MATH_MVEI) - - const int32_t col_len = input_dims->w * input_dims->h * input_dims->n; - const int32_t output_ch = output_dims->c; - const int32_t input_ch = input_dims->c; - const int32_t input_offset = conv_params->input_offset; - const int32_t out_offset = conv_params->output_offset; - const int32_t out_activation_min = conv_params->activation.min; - const int32_t out_activation_max = conv_params->activation.max; - int32_t *output_mult = quant_params->multiplier; - int32_t *output_shift = quant_params->shift; - - for (int i_items = 0; i_items <= (col_len - 4); i_items += 4) - { - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32_t sum_row = 0; - int32_t temp_out[4]; - - (void)arm_nn_mat_mul_core_4x_s8(input_ch, - input_ch, - input_data + i_items * input_ch, - filter_data + i_out_ch * input_ch, - &sum_row, - temp_out); - int32x4_t res = vldrwq_s32(temp_out); - - res = vaddq_n_s32(res, bias_data[i_out_ch]); - sum_row = sum_row * input_offset; - res = vaddq_n_s32(res, sum_row); - res = arm_requantize_mve(res, output_mult[i_out_ch], output_shift[i_out_ch]); - res = vaddq_n_s32(res, out_offset); - - res = vmaxq_s32(res, vdupq_n_s32(out_activation_min)); - res = vminq_s32(res, vdupq_n_s32(out_activation_max)); - - const uint32x4_t scatter_offset = {0, (uint32_t)output_ch, - (uint32_t)output_ch * 2, - (uint32_t)output_ch * 3}; - vstrbq_scatter_offset_s32(output_data, scatter_offset, res); - output_data++; - } - output_data += (3 * output_ch); - } - - /* Handle left over elements */ - for (int i_items = (col_len & ~0x3); i_items < col_len; i_items++) - { - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32_t sum_row = 0; - - int32_t acc; - (void)arm_nn_mat_mul_core_1x_s8(input_ch, - input_data + i_items * input_ch, - filter_data + i_out_ch * input_ch, - &sum_row, - &acc); - - acc += bias_data[i_out_ch]; - sum_row = (sum_row * input_offset); - acc += sum_row; - acc = arm_nn_requantize(acc, output_mult[i_out_ch], output_shift[i_out_ch]); - acc += out_offset; - - acc = MAX(acc, out_activation_min); - acc = MIN(acc, out_activation_max); - *output_data++ = acc; - } - } - -#else - /* Run the following code as reference implementation for Cortex-M processors with or without DSP extension */ - - const int32_t lhs_rows = input_dims->w * input_dims->h * input_dims->n; - const int32_t rhs_rows = output_dims->c; - const int32_t rhs_cols = input_dims->c; - - arm_nn_mat_mult_nt_t_s8(input_data, - filter_data, - bias_data, - output_data, - quant_params->multiplier, - quant_params->shift, - lhs_rows, - rhs_rows, - rhs_cols, - conv_params->input_offset, - conv_params->output_offset, - conv_params->activation.min, - conv_params->activation.max); - -#endif - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -int32_t arm_convolve_1x1_s8_fast_get_buffer_size(const cmsis_nn_dims *input_dims) -{ - (void)input_dims; - return 0; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_basic.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_basic.c deleted file mode 100644 index d7d25f44..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_basic.c +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q15_basic.c - * Description: Q15 version of convolution - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Basic Q15 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * bufferA size: ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * This basic version is designed to work for any input tensor and weight - * dimension. - */ - -arm_status -arm_convolve_HWC_q15_basic(const q15_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - uint16_t im2col_out_pixel_index = 0; - q15_t *pBuffer = bufferA; - q15_t *pOut = Im_out; - q15_t *im_buffer = bufferA; - const q15_t *pA; - int i; - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* Filling 0 for out-of-bound paddings */ - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - /* arm_copy_q15((q15_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); */ - memcpy(pBuffer, (q15_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, sizeof(q15_t)*ch_im_in); - } - pBuffer += ch_im_in; - } - } - - pA = wt; - for (i = 0; i < ch_im_out; i++) - { - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - const q15_t *pB = im_buffer; - uint16_t colCnt = ch_im_in * dim_kernel * dim_kernel >> 2; - while (colCnt) - { - q31_t inA1 = arm_nn_read_q15x2_ia(&pA); - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inA2 = arm_nn_read_q15x2_ia(&pA); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB); - - sum = __SMLAD(inA1, inB1, sum); - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = ch_im_in * dim_kernel * dim_kernel & 0x3; - while (colCnt) - { - q15_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut = (q15_t) __SSAT((sum >> out_shift), 16); - pOut++; - } - - /* counter reset */ - pBuffer = im_buffer; - im2col_out_pixel_index++; - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out; j++) - { - for (k = 0; k < dim_im_out; k++) - { - conv_out = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel; m++) - { - for (n = 0; n < dim_kernel; n++) - { - in_row = stride * j + m - padding; - in_col = stride * k + n - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q15_t) __SSAT((conv_out >> out_shift), 16); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast.c deleted file mode 100644 index 221d64f0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast.c +++ /dev/null @@ -1,255 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q15_fast.c - * Description: Fast Q15 version of convolution - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Fast Q15 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in is multiple of 2 - * - * ch_im_out is multipe of 2 - * - */ - -arm_status -arm_convolve_HWC_q15_fast(const q15_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - q15_t *pBuffer = bufferA; - q15_t *im_buffer = bufferA; - q15_t *pOut = Im_out; - - if (ch_im_in % 2 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - /* arm_copy_q15((q15_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); */ - memcpy(pBuffer, (q15_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, sizeof(q15_t)*ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (i_out_x & 0x1) - { - int i; - /* initialize the matrix pointers for A */ - const q15_t *pA = wt; - - /* set up the second output pointers */ - q15_t *pOut2 = pOut + ch_im_out; - - /* this loop over rows in A */ - for (i = 0; i < ch_im_out; i += 2) - { - /* setup pointers for B */ - const q15_t *pB = im_buffer; - const q15_t *pB2 = pB + ch_im_in * dim_kernel * dim_kernel; - - /* aling the second pointer for A */ - const q15_t *pA2 = pA + ch_im_in * dim_kernel * dim_kernel; - - /* init the sum with bias */ - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)bias[i + 1] << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)bias[i + 1] << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = ch_im_in * dim_kernel * dim_kernel >> 1; - /* accumulate over the vector */ - while (colCnt) - { - q31_t inA1 = arm_nn_read_q15x2_ia(&pA); - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inA2 = arm_nn_read_q15x2_ia(&pA2); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB2); - - sum = __SMLAD(inA1, inB1, sum); - sum2 = __SMLAD(inA1, inB2, sum2); - sum3 = __SMLAD(inA2, inB1, sum3); - sum4 = __SMLAD(inA2, inB2, sum4); - - colCnt--; - } /* while over colCnt */ - colCnt = ch_im_in * dim_kernel * dim_kernel & 0x1; - while (colCnt) - { - q15_t inA1 = *pA++; - q15_t inB1 = *pB++; - q15_t inA2 = *pA2++; - q15_t inB2 = *pB2++; - - sum += inA1 * inB1; - sum2 += inA1 * inB2; - sum3 += inA2 * inB1; - sum4 += inA2 * inB2; - colCnt--; - } /* while over colCnt */ - *pOut++ = (q15_t) __SSAT(sum >> out_shift, 16); - *pOut++ = (q15_t) __SSAT(sum3 >> out_shift, 16); - *pOut2++ = (q15_t) __SSAT(sum2 >> out_shift, 16); - *pOut2++ = (q15_t) __SSAT(sum4 >> out_shift, 16); - - /* skip the row computed with A2 */ - pA += ch_im_in * dim_kernel * dim_kernel; - } /* for over ch_im_out */ - - pOut += ch_im_out; - /* counter reset */ - pBuffer = im_buffer; - } - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - if (ch_im_in % 2 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out; j++) - { - for (k = 0; k < dim_im_out; k++) - { - conv_out = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel; m++) - { - for (n = 0; n < dim_kernel; n++) - { - in_row = stride * j + m - padding; - in_col = stride * k + n - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q15_t) __SSAT((conv_out >> out_shift), 16); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast_nonsquare.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast_nonsquare.c deleted file mode 100644 index 8b1fdc7d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q15_fast_nonsquare.c +++ /dev/null @@ -1,265 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q15_fast.c - * Description: Fast Q15 version of convolution - * - * $Date: 24. May 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Fast Q15 convolution function (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimention x - * @param[in] dim_im_in_y input tensor dimention y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in is multiple of 2 - * - * ch_im_out is multipe of 2 - * - */ - -arm_status -arm_convolve_HWC_q15_fast_nonsquare(const q15_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q15_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q15_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q15_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - q15_t *pBuffer = bufferA; - q15_t *im_buffer = bufferA; - q15_t *pOut = Im_out; - - if (ch_im_in % 2 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in_y || i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - /* arm_copy_q15((q15_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, pBuffer, ch_im_in); */ - memcpy(pBuffer, (q15_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, sizeof(q15_t)*ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (i_out_x & 0x1) - { - int i; - /* initialize the matrix pointers for A */ - const q15_t *pA = wt; - - /* set up the second output pointers */ - q15_t *pOut2 = pOut + ch_im_out; - - /* this loop over rows in A */ - for (i = 0; i < ch_im_out; i += 2) - { - /* setup pointers for B */ - const q15_t *pB = im_buffer; - const q15_t *pB2 = pB + ch_im_in * dim_kernel_y * dim_kernel_x; - - /* aling the second pointer for A */ - const q15_t *pA2 = pA + ch_im_in * dim_kernel_y * dim_kernel_x; - - /* init the sum with bias */ - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)bias[i + 1] << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)bias[i + 1] << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = ch_im_in * dim_kernel_y * dim_kernel_x >> 1; - /* accumulate over the vector */ - while (colCnt) - { - q31_t inA1 = arm_nn_read_q15x2_ia(&pA); - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inA2 = arm_nn_read_q15x2_ia(&pA2); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB2); - - sum = __SMLAD(inA1, inB1, sum); - sum2 = __SMLAD(inA1, inB2, sum2); - sum3 = __SMLAD(inA2, inB1, sum3); - sum4 = __SMLAD(inA2, inB2, sum4); - - colCnt--; - } /* while over colCnt */ - colCnt = ch_im_in * dim_kernel_y * dim_kernel_x & 0x1; - while (colCnt) - { - q15_t inA1 = *pA++; - q15_t inB1 = *pB++; - q15_t inA2 = *pA2++; - q15_t inB2 = *pB2++; - - sum += inA1 * inB1; - sum2 += inA1 * inB2; - sum3 += inA2 * inB1; - sum4 += inA2 * inB2; - colCnt--; - } /* while over colCnt */ - *pOut++ = (q15_t) __SSAT(sum >> out_shift, 16); - *pOut++ = (q15_t) __SSAT(sum3 >> out_shift, 16); - *pOut2++ = (q15_t) __SSAT(sum2 >> out_shift, 16); - *pOut2++ = (q15_t) __SSAT(sum4 >> out_shift, 16); - - /* skip the row computed with A2 */ - pA += ch_im_in * dim_kernel_y * dim_kernel_x; - } /* for over ch_im_out */ - - pOut += ch_im_out; - /* counter reset */ - pBuffer = im_buffer; - } - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - if (ch_im_in % 2 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out_y; j++) - { - for (k = 0; k < dim_im_out_x; k++) - { - conv_out = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel_y; m++) - { - for (n = 0; n < dim_kernel_x; n++) - { - in_row = stride_y * j + m - padding_y; - in_col = stride_x * k + n - padding_x; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel_x * dim_kernel_y + (m * dim_kernel_x + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q15_t) __SSAT((conv_out >> out_shift), 16); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_RGB.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_RGB.c deleted file mode 100644 index 912f8347..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_RGB.c +++ /dev/null @@ -1,279 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q7_RGB.c - * Description: Q7 version of convolution for RGB image - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Q7 convolution function for RGB image - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in equals 3 - * - * This kernel is written exclusively for convolution with ch_im_in - * equals 3. This applies on the first layer of CNNs which has input - * image with RGB format. - */ - -arm_status -arm_convolve_HWC_q7_RGB(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, const uint16_t dim_im_out, q15_t * bufferA, q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - // check if number of input channels is 3 - if (ch_im_in != 3) - { - return ARM_MATH_SIZE_MISMATCH; - } - // This part implements the im2col function - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* Equivalent to arm_fill_q15(0, pBuffer, ch_im_in) with assumption: ch_im_in = 3 */ - *__SIMD32(pBuffer) = 0x0; - *(pBuffer + 2) = 0; - pBuffer += 3; - } else - { - /* - * Equivalent to: - * arm_q7_to_q15_no_shift( (q7_t*)Im_in+(i_ker_y*dim_im_in+i_ker_x)*3, pBuffer, 3); - */ - - const q7_t *pPixel = Im_in + (i_ker_y * dim_im_in + i_ker_x) * 3; - q31_t buf = arm_nn_read_q7x4(pPixel); - - union arm_nnword top; - union arm_nnword bottom; - - top.word = __SXTB16(buf); - bottom.word = __SXTB16(__ROR(buf, 8)); - -#ifndef ARM_MATH_BIG_ENDIAN - /* - * little-endian, | omit | 3rd | 2nd | 1st | - * MSB LSB - * top | 3rd | 1st |; bottom | omit | 2nd | - * - * version 1, need to swap 2nd and 3rd weight - * *__SIMD32(pBuffer) = top.word; - * *(pBuffer+2) = bottom.half_words[0]; - * - * version 2, no weight shuffling required - */ - *pBuffer++ = top.half_words[0]; - *__SIMD32(pBuffer) = __PKHBT(bottom.word, top.word, 0); -#else - /* - * big-endian, | 1st | 2nd | 3rd | omit | - * MSB LSB - * top | 2nd | omit |; bottom | 1st | 3rd | - * - * version 1, need to swap 2nd and 3rd weight - * *__SIMD32(pBuffer) = bottom.word; - * *(pBuffer+2) = top.half_words[1]; - * - * version 2, no weight shuffling required - */ - *pBuffer++ = bottom.half_words[0]; - *__SIMD32(pBuffer) = __PKHTB(top.word, bottom.word, 0); -#endif - pBuffer += 2; - } - } - } - - if (pBuffer == bufferA + 2 * 3 * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15(wt, bufferA, - ch_im_out, - 3 * dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* left-over because odd number of output pixels */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - int i; - - for (i = 0; i < ch_im_out; i++) - { - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - q15_t *pB = bufferA; - /* basically each time it process 4 entries */ - uint16_t colCnt = 3 * dim_kernel * dim_kernel >> 2; - - while (colCnt) - { - - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia((const q15_t **)&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia((const q15_t **)&pB); - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = 3 * dim_kernel * dim_kernel & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - } - } -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - // check if number of input channels is 3 - if (ch_im_in != 3) - { - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out; j++) - { - for (k = 0; k < dim_im_out; k++) - { - conv_out = (bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel; m++) - { - for (n = 0; n < dim_kernel; n++) - { - /* if-for implementation */ - in_row = stride * j + m - padding; - in_col = stride * k + n - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return (ARM_MATH_SUCCESS); -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic.c deleted file mode 100644 index 2e6147b0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic.c +++ /dev/null @@ -1,231 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q7_basic.c - * Description: Q7 version of convolution - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Basic Q7 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * This basic version is designed to work for any input tensor and weight - * dimension. - */ - -arm_status -arm_convolve_HWC_q7_basic(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* Filling 0 for out-of-bound paddings */ - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - /* Copying the pixel data to column */ - arm_q7_to_q15_no_shift((q7_t *) - Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - /* Computation is filed for every 2 columns */ - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15(wt, bufferA, - ch_im_out, - ch_im_in * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* left-over because odd number of output pixels */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - int i; - - for (i = 0; i < ch_im_out; i++) - { - /* Load the accumulator with bias first */ - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - - /* Point to the beging of the im2col buffer */ - const q15_t *pB = bufferA; - - /* Each time it process 4 entries */ - uint16_t colCnt = ch_im_in * dim_kernel * dim_kernel >> 2; - - while (colCnt) - { - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia(&pB); - - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = ch_im_in * dim_kernel * dim_kernel & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - } - } -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out; j++) - { - for (k = 0; k < dim_im_out; k++) - { - conv_out = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel; m++) - { - for (n = 0; n < dim_kernel; n++) - { - // if-for implementation - in_row = stride * j + m - padding; - in_col = stride * k + n - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic_nonsquare.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic_nonsquare.c deleted file mode 100644 index d50318db..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_basic_nonsquare.c +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q7_basic.c - * Description: Q7 version of convolution - * - * $Date: 13. July 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Basic Q7 convolution function (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimention x - * @param[in] dim_im_in_y input tensor dimention y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns ARM_MATH_SUCCESS - */ - -arm_status arm_convolve_HWC_q7_basic_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in_y || i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* Filling 0 for out-of-bound paddings */ - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - /* Copying the pixel data to column */ - arm_q7_to_q15_no_shift((q7_t *) - Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - /* Computation is filed for every 2 columns */ - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_y * dim_kernel_x) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15(wt, bufferA, - ch_im_out, - ch_im_in * - dim_kernel_y * dim_kernel_x, bias_shift, out_shift, bias, pOut); - - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* left-over because odd number of output pixels */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - int i; - - for (i = 0; i < ch_im_out; i++) - { - /* Load the accumulator with bias first */ - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - - /* Point to the beging of the im2col buffer */ - const q15_t *pB = bufferA; - - /* Each time it process 4 entries */ - uint16_t colCnt = ch_im_in * dim_kernel_y * dim_kernel_x >> 2; - - while (colCnt) - { - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia(&pB); - - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = ch_im_in * dim_kernel_y * dim_kernel_x & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - } - } -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out_y; j++) - { - for (k = 0; k < dim_im_out_x; k++) - { - conv_out = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel_y; m++) - { - for (n = 0; n < dim_kernel_x; n++) - { - // if-for implementation - in_row = stride_y * j + m - padding_y; - in_col = stride_x * k + n - padding_x; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + l] * - wt[i * ch_im_in * dim_kernel_y * dim_kernel_x + - (m * dim_kernel_x + n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast.c deleted file mode 100644 index 0352d6f8..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast.c +++ /dev/null @@ -1,408 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q7_fast.c - * Description: Fast Q7 version of convolution - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - - /** - * @brief Fast Q7 convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in is multiple of 4 ( because of the SIMD32 read and swap ) - * - * ch_im_out is multipe of 2 ( bacause 2x2 mat_mult kernel ) - * - * The im2col converts the Q7 tensor input into Q15 column, which is stored in - * bufferA. There is reordering happenning during this im2col process with - * arm_q7_to_q15_reordered_no_shift. For every four elements, the second and - * third elements are swapped. - * - * The computation kernel arm_nn_mat_mult_kernel_q7_q15_reordered does the - * GEMM computation with the reordered columns. - * - * To speed-up the determination of the padding condition, we split the - * computation into 3x3 parts, i.e., {top, mid, bottom} X {left, mid, right}. - * This reduces the total number of boundary condition checks and improves - * the data copying performance. - */ - -arm_status -arm_convolve_HWC_q7_fast(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - /* - * Here we split the entire matrix into three regions depending on the padding situation - * Top: i_out_y from 0 to padding - 1 - * Middle: i_out_y from padding to dim_im_out-padding-1 - * Bottom: i_out_y from dim_im_out-padding to dim_im_out-1 - */ - - /* top part */ - for (i_out_y = 0; i_out_y < padding; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift - ((q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, - bufferA, - ch_im_out, - ch_im_in - * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* middle part, here we also divide the x into left, mid and right */ - for (; i_out_y < dim_im_out - padding; i_out_y++) - { - - /* left part */ - for (i_out_x = 0; i_out_x < padding; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift - ((q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, - bufferA, - ch_im_out, - ch_im_in - * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - - /* mid part */ - for (; i_out_x < dim_im_out - padding; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in - + - (i_ker_y * - dim_im_in + - i_out_x * - stride - padding) * ch_im_in, pBuffer, ch_im_in * dim_kernel); - pBuffer += ch_im_in * dim_kernel; - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, - bufferA, - ch_im_out, - ch_im_in - * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - - /* right part */ - for (; i_out_x < dim_im_out; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift - ((q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, - bufferA, - ch_im_out, - ch_im_in - * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - for (; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift - ((q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel * dim_kernel) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, - bufferA, - ch_im_out, - ch_im_in - * - dim_kernel * dim_kernel, bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* check if there is left-over for compute */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - int i; - - for (i = 0; i < ch_im_out; i++) - { - q31_t sum = ((q31_t)bias[i] << bias_shift) + NN_ROUND(out_shift); - const q15_t *pB = bufferA; - /* each time it process 4 entries */ - uint16_t colCnt = ch_im_in * dim_kernel * dim_kernel >> 2; - - while (colCnt) - { - - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad_reordered(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = ch_im_in * dim_kernel * dim_kernel & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut = (q7_t) __SSAT((sum >> out_shift), 8); - pOut++; - - } - - } -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out; j++) - { - for (k = 0; k < dim_im_out; k++) - { - conv_out = (bias[i] << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel; m++) - { - for (n = 0; n < dim_kernel; n++) - { - // if-for implementation - in_row = stride * j + m - padding; - in_col = stride * k + n - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += - Im_in[(in_row * dim_im_in + in_col) * ch_im_in + - l] * wt[i * ch_im_in * dim_kernel * dim_kernel + (m * dim_kernel + - n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast_nonsquare.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast_nonsquare.c deleted file mode 100644 index 31b4fdc2..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_HWC_q7_fast_nonsquare.c +++ /dev/null @@ -1,379 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_HWC_q7_fast_nonsquare.c - * Description: Fast Q7 version of convolution (non-sqaure shape) - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/** - * @brief Fast Q7 convolution function (non-sqaure shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimention x - * @param[in] dim_im_in_y input tensor dimention y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding size x - * @param[in] padding_y padding size y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is multiple of 4 - * ch_im_out is multiple of 2 - */ - -arm_status arm_convolve_HWC_q7_fast_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* ----------------------- - * Here we use bufferA as q15_t internally as computation are done with q15_t level - * im2col are done to output in q15_t format from q7_t input - */ - - q15_t *pBuffer = bufferA; - q7_t *pOut = Im_out; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - /* - * Here we split the entire matrix into three regions depending on the padding situation - * Top: i_out_y from 0 to padding - 1 - * Middle: i_out_y from padding to dim_im_out-padding-1 - * Bottom: i_out_y from dim_im_out-padding to dim_im_out-1 - */ - - /* top part */ - for (i_out_y = 0; i_out_y < padding_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; - i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in_y || i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, - pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in * dim_kernel_x * dim_kernel_y, - bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* middle part, here we also divide the x into left, mid and right */ - for (; i_out_y < dim_im_out_y - padding_y; i_out_y++) - { - - /* left part */ - for (i_out_x = 0; i_out_x < padding_x; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; - i_ker_x++) - { - if (i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, - pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in * dim_kernel_x * dim_kernel_y, - bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - - /* mid part */ - for (; i_out_x < dim_im_out_x - padding_x; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + - (i_ker_y * dim_im_in_x + i_out_x * stride_x - padding_x) * ch_im_in, - pBuffer, ch_im_in * dim_kernel_x); - pBuffer += ch_im_in * dim_kernel_x; - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in * dim_kernel_x * dim_kernel_y, - bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - - /* right part */ - for (; i_out_x < dim_im_out_x; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; - i_ker_x++) - { - if (i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, - pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in * dim_kernel_x * dim_kernel_y, - bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - for (; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - /* This part implements the im2col function */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; - i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in_y || i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q15(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, sizeof(q15_t)*ch_im_in); - } else - { - arm_q7_to_q15_reordered_no_shift((q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, - pBuffer, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - if (pBuffer == bufferA + 2 * ch_im_in * dim_kernel_x * dim_kernel_y) - { - pOut = - arm_nn_mat_mult_kernel_q7_q15_reordered(wt, bufferA, ch_im_out, ch_im_in * dim_kernel_x * dim_kernel_y, - bias_shift, out_shift, bias, pOut); - /* counter reset */ - pBuffer = bufferA; - } - } - } - - /* check if there is left-over for compute */ - if (pBuffer != bufferA) - { - const q7_t *pA = wt; - int i; - for (i = 0; i < ch_im_out; i++) - { - q31_t sum = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - const q15_t *pB = bufferA; - /* basically each time it process 4 entries */ - uint16_t colCnt = ch_im_in * dim_kernel_x * dim_kernel_y >> 2; - - while (colCnt) - { - - q31_t inA1, inA2; - q31_t inB1, inB2; - - pA = read_and_pad_reordered(pA, &inA1, &inA2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA1, inB1, sum); - inB2 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inA2, inB2, sum); - - colCnt--; - } - colCnt = (ch_im_in * dim_kernel_y * dim_kernel_x) & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - sum += inA1 * inB1; - colCnt--; - } - *pOut = (q7_t) __SSAT((sum >> out_shift), 8); - pOut++; - - } - - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i, j, k, l, m, n; - int conv_out; - int in_row, in_col; - - if (ch_im_in % 4 != 0 || ch_im_out % 2 != 0) - { - /* check if the input dimension meets the constraints */ - return ARM_MATH_SIZE_MISMATCH; - } - - for (i = 0; i < ch_im_out; i++) - { - for (j = 0; j < dim_im_out_y; j++) - { - for (k = 0; k < dim_im_out_x; k++) - { - conv_out = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - for (m = 0; m < dim_kernel_y; m++) - { - for (n = 0; n < dim_kernel_x; n++) - { - /* if-for implementation */ - in_row = stride_y * j + m - padding_y; - in_col = stride_x * k + n - padding_x; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x) - { - for (l = 0; l < ch_im_in; l++) - { - conv_out += Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + l] * - wt[i * ch_im_in * dim_kernel_y * dim_kernel_x + (m * dim_kernel_x + n) * ch_im_in + l]; - } - } - } - } - Im_out[i + (j * dim_im_out_x + k) * ch_im_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_s8.c deleted file mode 100644 index fd304734..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_s8.c +++ /dev/null @@ -1,372 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_s8.c - * Description: s8 version of convolution using symmetric quantization. - * - * $Date: May 29, 2020 - * $Revision: V.2.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nn_types.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * Basic s8 convolution function. - * - * Refer header file for details. Optimal use case for the DSP/MVE implementation is when input and output channels - * are multiples of 4 or atleast greater than 4. - * - */ - -arm_status arm_convolve_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data) -{ - q15_t *buffer_a = (q15_t *)ctx->buf; - - const uint16_t input_batches = input_dims->n; - const uint16_t input_x = input_dims->w; - const uint16_t input_y = input_dims->h; - const uint16_t input_ch = input_dims->c; - const uint16_t kernel_x = filter_dims->w; - const uint16_t kernel_y = filter_dims->h; - const uint16_t output_x = output_dims->w; - const uint16_t output_y = output_dims->h; - const uint16_t output_ch = output_dims->c; - - const uint16_t pad_x = conv_params->padding.w; - const uint16_t pad_y = conv_params->padding.h; - const uint16_t stride_x = conv_params->stride.w; - const uint16_t stride_y = conv_params->stride.h; - - const int32_t input_offset = conv_params->input_offset; - const int32_t out_offset = conv_params->output_offset; - const int32_t out_activation_min = conv_params->activation.min; - const int32_t out_activation_max = conv_params->activation.max; - int32_t *output_mult = quant_params->multiplier; - int32_t *output_shift = quant_params->shift; - - int i_batch; - for (i_batch = 0; i_batch < input_batches; i_batch++) - { -#if defined(ARM_MATH_MVEI) - (void)bias_dims; - /* Generate upto four columns from the input tensor a GEMM computation */ - q7_t *im2col_buf = (q7_t *)buffer_a; - q7_t *out = output_data; - int32_t buffer_fill_cnt = 0; - int32_t padded = 0; - const int32_t num_elem = kernel_x * kernel_y * input_ch; - - /* This part implements the im2col function */ - for (int i_out_y = 0; i_out_y < output_y; i_out_y++) - { - for (int i_out_x = 0; i_out_x < output_x; i_out_x++) - { - for (int i_ker_y = i_out_y * stride_y - pad_y; i_ker_y < i_out_y * stride_y - pad_y + kernel_y; i_ker_y++) - { - for (int i_ker_x = i_out_x * stride_x - pad_x; i_ker_x < i_out_x * stride_x - pad_x + kernel_x; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= input_y || i_ker_x < 0 || i_ker_x >= input_x) - { - memset(im2col_buf, (int8_t)-input_offset, sizeof(q7_t) * input_ch); - padded = 1; - } - else - { - arm_memcpy_q7(im2col_buf, input_data + (i_ker_y * input_x + i_ker_x) * input_ch, input_ch); - } - im2col_buf += input_ch; - } - } - - buffer_fill_cnt++; - - /* Computation is filed for every 4 columns */ - if (buffer_fill_cnt == 4 && (padded == 0)) - { - buffer_fill_cnt = 0; - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32_t sum_row; - int32_t acc[4]; - - (void)arm_nn_mat_mul_core_4x_s8(num_elem, - num_elem, - (q7_t *)buffer_a, - filter_data + num_elem * i_out_ch, - &sum_row, - acc); - int32x4_t s_offset = vdupq_n_s32(sum_row); - - int32x4_t res = vldrwq_s32(acc); - s_offset = vmulq_n_s32(s_offset, input_offset); - - res = vaddq_n_s32(res, bias_data[i_out_ch]); - res = vaddq_s32(res, s_offset); - res = arm_requantize_mve(res, output_mult[i_out_ch], output_shift[i_out_ch]); - res = vaddq_n_s32(res, out_offset); - - res = vmaxq_s32(res, vdupq_n_s32(out_activation_min)); - res = vminq_s32(res, vdupq_n_s32(out_activation_max)); - - const uint32x4_t scatter_offset = {0, output_ch, output_ch * 2, output_ch * 3}; - vstrbq_scatter_offset_s32(out, scatter_offset, res); - out++; - } - out += (3 * output_ch); - im2col_buf = (q7_t *)buffer_a; - } - else if (buffer_fill_cnt == 4 && (padded != 0)) - { - buffer_fill_cnt = 0; - out = arm_nn_mat_mult_s8(filter_data, - (q7_t *)buffer_a, - output_ch, - 4, - output_shift, - output_mult, - out_offset, - input_offset, - 0, - out_activation_min, - out_activation_max, - num_elem, - bias_data, - out); - - im2col_buf = (q7_t *)buffer_a; - padded = 0; - } - } - } - /* Handle left over columns */ - if (buffer_fill_cnt != 0) - { - out = arm_nn_mat_mult_s8(filter_data, - (q7_t *)buffer_a, - output_ch, - buffer_fill_cnt, - output_shift, - output_mult, - out_offset, - input_offset, - 0, - out_activation_min, - out_activation_max, - num_elem, - bias_data, - out); - } - -#elif defined(ARM_MATH_DSP) - (void)bias_dims; - int32_t i_out_y, i_out_x, i_ker_y, i_ker_x; - - /* Generate two columns from the input tensor a GEMM computation */ - q15_t *two_column_buf = buffer_a; - q7_t *out = output_data; - - /* This part implements the im2col function */ - for (i_out_y = 0; i_out_y < output_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < output_x; i_out_x++) - { - for (i_ker_y = i_out_y * stride_y - pad_y; i_ker_y < i_out_y * stride_y - pad_y + kernel_y; i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - pad_x; i_ker_x < i_out_x * stride_x - pad_x + kernel_x; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= input_y || i_ker_x < 0 || i_ker_x >= input_x) - { - /* Filling 0 for out-of-bound paddings */ - memset(two_column_buf, 0, sizeof(q15_t) * input_ch); - } - else - { - /* Copying the pixel data to column */ - arm_q7_to_q15_with_offset(input_data + (i_ker_y * input_x + i_ker_x) * input_ch, two_column_buf, input_ch, input_offset); - } - two_column_buf += input_ch; - } - } - - /* Computation is filed for every 2 columns */ - if (two_column_buf == buffer_a + 2 * input_ch * kernel_y * kernel_x) - { - out = - arm_nn_mat_mult_kernel_s8_s16(filter_data, - buffer_a, - output_ch, - output_shift, - output_mult, - out_offset, - out_activation_min, - out_activation_max, - input_ch * kernel_y * kernel_x, - bias_data, - out); - - /* counter reset */ - two_column_buf = buffer_a; - } - } - } - - /* left-over because odd number of output pixels */ - if (two_column_buf != buffer_a) - { - const q7_t *ker_a = filter_data; - int i; - - for (i = 0; i < output_ch; i++) - { - /* Load the accumulator with bias first */ - q31_t sum = bias_data[i]; - - /* Point to the beginning of the im2col buffer where the input is available as a rearranged column */ - const q15_t *ip_as_col = buffer_a; - - /* 4 multiply and accumulates are done in one loop. */ - uint16_t col_count = (input_ch * kernel_y * kernel_x) >> 2; - - while (col_count) - { - q31_t ker_a1, ker_a2; - q31_t ip_b1, ip_b2; - - ker_a = read_and_pad(ker_a, &ker_a1, &ker_a2); - - ip_b1 = arm_nn_read_q15x2_ia(&ip_as_col); - sum = __SMLAD(ker_a1, ip_b1, sum); - ip_b2 = arm_nn_read_q15x2_ia(&ip_as_col); - sum = __SMLAD(ker_a2, ip_b2, sum); - - col_count--; - } - /* Handle left over mac */ - col_count = input_ch * kernel_y * kernel_x & 0x3; - while (col_count) - { - q7_t ker_a1 = *ker_a++; - q15_t ip_b1 = *ip_as_col++; - sum += ker_a1 * ip_b1; - col_count--; - } - - sum = arm_nn_requantize(sum, output_mult[i], output_shift[i]); - sum += out_offset; - sum = MAX(sum, out_activation_min); - sum = MIN(sum, out_activation_max); - *out++ = (q7_t)sum; - } - } -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - (void)buffer_a; - int32_t i_out_ch, i_out_y, i_out_x, i_input_ch, i_ker_y, i_ker_x; - int32_t conv_out; - - for (i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - for (i_out_y = 0; i_out_y < output_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < output_x; i_out_x++) - { - conv_out = bias_data[i_out_ch]; - - const int32_t base_idx_y = stride_y * i_out_y - pad_y; - const int32_t base_idx_x = stride_x * i_out_x - pad_x; - - const int32_t ker_y_start = MAX(0, -base_idx_y); - const int32_t ker_x_start = MAX(0, -base_idx_x); - - const int32_t ker_y_end = MIN(kernel_y, input_y - base_idx_y); - const int32_t ker_x_end = MIN(kernel_x, input_x - base_idx_x); - - for (i_ker_y = ker_y_start; i_ker_y < ker_y_end; i_ker_y++) - { - for (i_ker_x = ker_x_start; i_ker_x < ker_x_end; i_ker_x++) - { - const int32_t in_row = base_idx_y + i_ker_y; - const int32_t in_col = base_idx_x + i_ker_x; - for (i_input_ch = 0; i_input_ch < input_ch; i_input_ch++) - { - conv_out += - (input_data[(in_row * input_x + in_col) * input_ch + i_input_ch] + input_offset) * - filter_data[i_out_ch * input_ch * kernel_y * kernel_x + - (i_ker_y * kernel_x + i_ker_x) * input_ch + i_input_ch]; - } - } - } - conv_out = arm_nn_requantize(conv_out, output_mult[i_out_ch], output_shift[i_out_ch]); - conv_out += out_offset; - conv_out = MAX(conv_out, out_activation_min); - conv_out = MIN(conv_out, out_activation_max); - output_data[i_out_ch + (i_out_y * output_x + i_out_x) * output_ch] = (int8_t)conv_out; - } - } - } -#endif - /* Advance to the next batch */ - input_data += (input_x * input_y * input_ch); - output_data += (output_x * output_y * output_ch); - } - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -int32_t arm_convolve_s8_get_buffer_size(const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims) -{ -#if defined(ARM_MATH_DSP) - return (2 * input_dims->c * filter_dims->w * filter_dims->h) * (int32_t)sizeof(int16_t); -#else - (void)input_dims; - (void)filter_dims; - return 0; -#endif -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_wrapper_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_wrapper_s8.c deleted file mode 100644 index 5cef066c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_convolve_wrapper_s8.c +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_convolve_wrapper_s8.c - * Description: s8 convolution layer wrapper function with the main purpose to call the optimal kernel available in cmsis-nn to perform the convolution. - * - * $Date: May 18, 2020 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nn_types.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * Convolution layer - * - * Refer header file for details. - * - */ - -arm_status arm_convolve_wrapper_s8(const cmsis_nn_context* ctx, - const cmsis_nn_conv_params* conv_params, - const cmsis_nn_per_channel_quant_params* quant_params, - const cmsis_nn_dims* input_dims, - const q7_t *input_data, - const cmsis_nn_dims* filter_dims, - const q7_t *filter_data, - const cmsis_nn_dims* bias_dims, - const int32_t *bias_data, - const cmsis_nn_dims* output_dims, - q7_t *output_data) -{ - if ((conv_params->padding.w == 0) && - (conv_params->padding.h == 0) && - (input_dims->c % 4 == 0) && - (conv_params->stride.w == 1) && - (conv_params->stride.h == 1) && - (filter_dims->w == 1) && - (filter_dims->h == 1)) - { - return arm_convolve_1x1_s8_fast(ctx, - conv_params, - quant_params, - input_dims, - input_data, - filter_dims, - filter_data, - bias_dims, - bias_data, - output_dims, - output_data); - } - else if ((output_dims->h == 1) && - (input_dims->h == 1) && - (filter_dims->h == 1) && - (output_dims->w % 4 == 0) && - (input_dims->n == 1)) - { - return arm_convolve_1_x_n_s8(ctx, - conv_params, - quant_params, - input_dims, - input_data, - filter_dims, - filter_data, - bias_dims, - bias_data, - output_dims, - output_data); - } - else - { - return arm_convolve_s8(ctx, - conv_params, - quant_params, - input_dims, - input_data, - filter_dims, - filter_data, - bias_dims, - bias_data, - output_dims, - output_data); - } -} - -int32_t arm_convolve_wrapper_s8_get_buffer_size(const cmsis_nn_conv_params* conv_params, - const cmsis_nn_dims* input_dims, - const cmsis_nn_dims* filter_dims, - const cmsis_nn_dims* output_dims) -{ - if ((conv_params->padding.w == 0) && - (conv_params->padding.h == 0) && - (input_dims->c % 4 == 0) && - (conv_params->stride.w == 1) && - (conv_params->stride.h == 1) && - (filter_dims->w == 1) && - (filter_dims->h == 1)) - { - return arm_convolve_1x1_s8_fast_get_buffer_size(input_dims); - } - else if ((output_dims->h == 1) && - (input_dims->h == 1) && - (filter_dims->h == 1) && - (output_dims->w % 4 == 0) && - (input_dims->n == 1)) - { - return arm_convolve_1_x_n_s8_get_buffer_size(input_dims, filter_dims); - } - else - { - return arm_convolve_s8_get_buffer_size(input_dims, filter_dims); - } -} - -/** - * @} end of NNConv group - */ - diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_3x3_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_3x3_s8.c deleted file mode 100644 index 5705b4bb..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_3x3_s8.c +++ /dev/null @@ -1,213 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_conv_3x3_s8.c - * Description: Optimized s8 depthwise convolution function for channel - * multiplier of 1 and 3x3 kernel size. - * - * $Date: May 14, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * Optimized s8 depthwise convolution function with constraint that - * in_channel == out_channel and kernel_x == kernel_y == 3 with pads at most 1 - * - * Refer prototype header file for details. - * - */ - -arm_status arm_depthwise_conv_3x3_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input, - const cmsis_nn_dims *filter_dims, - const q7_t *kernel, - const cmsis_nn_dims *bias_dims, - const int32_t *bias, - const cmsis_nn_dims *output_dims, - q7_t *output) -{ - (void)ctx; - (void)bias_dims; - - const int32_t input_x = input_dims->w; - const int32_t input_y = input_dims->h; - const int32_t input_ch = input_dims->c; - const int32_t output_ch = output_dims->c; - const int32_t pad_x = dw_conv_params->padding.w; - const int32_t pad_y = dw_conv_params->padding.h; - const int32_t stride_x = dw_conv_params->stride.w; - const int32_t stride_y = dw_conv_params->stride.h; - const int32_t *output_shift = quant_params->shift; - const int32_t *output_mult = quant_params->multiplier; - const int32_t output_x = output_dims->w; - const int32_t output_y = output_dims->h; - const int32_t output_offset = dw_conv_params->output_offset; - const int32_t input_offset = dw_conv_params->input_offset; - const int32_t output_activation_min = dw_conv_params->activation.min; - const int32_t output_activation_max = dw_conv_params->activation.max; - - /* Check input constraints input_ch == output_ch */ - if (input_ch != output_ch) - { - return ARM_MATH_SIZE_MISMATCH; - } - /* Check input constraints pad_x <= 1 */ - if (pad_x > 1 || filter_dims->w != 3 || filter_dims->h != 3) - { - return ARM_MATH_ARGUMENT_ERROR; - } - - for (int32_t in_h = -pad_y, out_h = 0, out_idx = 0; out_h < output_y; in_h += stride_y, ++out_h) - { - for (int32_t in_w = -pad_x, out_w = 0, ker_h_start = MAX(0, -in_h); out_w < output_x; in_w += stride_x, ++out_w) - { - int32_t in_ch = 0; - int32_t ker_w_start = MAX(0, -in_w); - - for (; in_ch <= (input_ch - 4); in_ch += 4) - { - int32_t out_buff0 = bias[in_ch + 0]; - int32_t out_buff1 = bias[in_ch + 1]; - int32_t out_buff2 = bias[in_ch + 2]; - int32_t out_buff3 = bias[in_ch + 3]; - - const int8_t *input_ptr = input + (in_h + ker_h_start) * (input_ch * input_x) + in_w * input_ch + in_ch; - const int8_t *kernel_ptr = kernel + ker_h_start * (input_ch * 3) + in_ch; - - for (int32_t ker_h = ker_h_start; ker_h < MIN(3, input_y - in_h); ++ker_h) - { - int32_t in_val = 0; - int32_t ker_val = 0; - - if (ker_w_start == 0) - { - in_val = arm_nn_read_q7x4(input_ptr); - ker_val = arm_nn_read_q7x4(kernel_ptr); - - out_buff0 += ((int8_t)in_val + input_offset) * (int8_t)ker_val; - out_buff1 += ((int8_t)(in_val >> 8) + input_offset) * (int8_t)(ker_val >> 8); - out_buff2 += ((int8_t)(in_val >> 16) + input_offset) * (int8_t)(ker_val >> 16); - out_buff3 += ((int8_t)(in_val >> 24) + input_offset) * (int8_t)(ker_val >> 24); - } - - in_val = arm_nn_read_q7x4(input_ptr + input_ch); - ker_val = arm_nn_read_q7x4(kernel_ptr + input_ch); - - out_buff0 += ((int8_t)in_val + input_offset) * (int8_t)ker_val; - out_buff1 += ((int8_t)(in_val >> 8) + input_offset) * (int8_t)(ker_val >> 8); - out_buff2 += ((int8_t)(in_val >> 16) + input_offset) * (int8_t)(ker_val >> 16); - out_buff3 += ((int8_t)(in_val >> 24) + input_offset) * (int8_t)(ker_val >> 24); - - if ((input_x - in_w) >= 3) - { - in_val = arm_nn_read_q7x4(input_ptr + (input_ch << 1)); - ker_val = arm_nn_read_q7x4(kernel_ptr + (input_ch << 1)); - - out_buff0 += ((int8_t)in_val + input_offset) * (int8_t)ker_val; - out_buff1 += ((int8_t)(in_val >> 8) + input_offset) * (int8_t)(ker_val >> 8); - out_buff2 += ((int8_t)(in_val >> 16) + input_offset) * (int8_t)(ker_val >> 16); - out_buff3 += ((int8_t)(in_val >> 24) + input_offset) * (int8_t)(ker_val >> 24); - } - - input_ptr += (input_ch * input_x); - kernel_ptr += (input_ch * 3); - } - - out_buff0 = arm_nn_requantize(out_buff0, output_mult[in_ch + 0], output_shift[in_ch + 0]); - out_buff1 = arm_nn_requantize(out_buff1, output_mult[in_ch + 1], output_shift[in_ch + 1]); - out_buff2 = arm_nn_requantize(out_buff2, output_mult[in_ch + 2], output_shift[in_ch + 2]); - out_buff3 = arm_nn_requantize(out_buff3, output_mult[in_ch + 3], output_shift[in_ch + 3]); - - out_buff0 += output_offset; - out_buff1 += output_offset; - out_buff2 += output_offset; - out_buff3 += output_offset; - - out_buff0 = MIN(MAX(out_buff0, output_activation_min), output_activation_max); - out_buff1 = MIN(MAX(out_buff1, output_activation_min), output_activation_max); - out_buff2 = MIN(MAX(out_buff2, output_activation_min), output_activation_max); - out_buff3 = MIN(MAX(out_buff3, output_activation_min), output_activation_max); - - output[out_idx++] = (int8_t)out_buff0; - output[out_idx++] = (int8_t)out_buff1; - output[out_idx++] = (int8_t)out_buff2; - output[out_idx++] = (int8_t)out_buff3; - } - - // Leftover - for (; in_ch < input_ch; ++in_ch) - { - int32_t out_buff = bias[in_ch]; - - const int8_t *input_ptr = input + (in_h + ker_h_start) * (input_ch * input_x) + in_w * input_ch + in_ch; - const int8_t *kernel_ptr = kernel + ker_h_start * (input_ch * 3) + in_ch; - - for (int32_t ker_h = ker_h_start; ker_h < MIN(3, input_y - in_h); ++ker_h) - { - if (ker_w_start == 0) - { - out_buff += (*(input_ptr) + input_offset) * *(kernel_ptr); - } - - out_buff += (*(input_ptr + input_ch) + input_offset) * *(kernel_ptr + input_ch); - - if ((input_x - in_w) >= 3) - { - out_buff += (*(input_ptr + (input_ch << 1)) + input_offset) * *(kernel_ptr + (input_ch << 1)); - } - - input_ptr += (input_ch * input_x); - kernel_ptr += (input_ch * 3); - } - - out_buff = arm_nn_requantize(out_buff, output_mult[in_ch], output_shift[in_ch]); - out_buff += output_offset; - out_buff = MIN(MAX(out_buff, output_activation_min), output_activation_max); - output[out_idx++] = (int8_t)out_buff; - } - } - } - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8.c deleted file mode 100644 index 4819a0cc..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8.c +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_conv_s8.c - * Description: s8 version of depthwise convolution. - * - * $Date: May 14, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -static void depthwise_conv_s8_mult_4(const int8_t *input, - const int32_t input_x, - const int32_t input_y, - const int32_t input_ch, - const int8_t *kernel, - const int32_t output_ch, - const int32_t ch_mult, - const int32_t kernel_x, - const int32_t kernel_y, - const int32_t pad_x, - const int32_t pad_y, - const int32_t stride_x, - const int32_t stride_y, - const int32_t *bias, - int8_t *output, - const int32_t *output_shift, - const int32_t *output_mult, - const int32_t output_x, - const int32_t output_y, - const int32_t output_offset, - const int32_t input_offset, - const int32_t output_activation_min, - const int32_t output_activation_max) -{ - for (int32_t in_h = -pad_y, out_h = 0, out_idx = 0; out_h < output_y; in_h += stride_y, ++out_h) - { - for (int32_t in_w = -pad_x, out_w = 0, ker_h_start = MAX(0, -in_h); out_w < output_x; in_w += stride_x, ++out_w) - { - for (int32_t in_ch = 0, out_ch = 0, ker_w_start = MAX(0, -in_w); out_ch < output_ch; ++in_ch, out_ch += ch_mult) - { - for (int mult_tile = 0; mult_tile < ch_mult; mult_tile += 4) - { - int32_t out_buff[4]; - - out_buff[0] = bias[out_ch + 0 + mult_tile]; - out_buff[1] = bias[out_ch + 1 + mult_tile]; - out_buff[2] = bias[out_ch + 2 + mult_tile]; - out_buff[3] = bias[out_ch + 3 + mult_tile]; - - for (int32_t ker_h = ker_h_start; ker_h < MIN(kernel_y, input_y - in_h); ++ker_h) - { - int32_t ker_idx = ker_h * (output_ch * kernel_x) + ker_w_start * output_ch + out_ch; - int32_t in_idx = (in_h + ker_h) * (input_ch * input_x) + in_w * input_ch + in_ch; - - for (int32_t ker_w = ker_w_start; ker_w < MIN(kernel_x, input_x - in_w); ++ker_w, ker_idx += output_ch) - { - int32_t in_val = input[in_idx + ker_w * input_ch] + input_offset; - out_buff[0] += in_val * kernel[ker_idx + 0 + mult_tile]; - out_buff[1] += in_val * kernel[ker_idx + 1 + mult_tile]; - out_buff[2] += in_val * kernel[ker_idx + 2 + mult_tile]; - out_buff[3] += in_val * kernel[ker_idx + 3 + mult_tile]; - } - } -#if defined(ARM_MATH_MVEI) - (void)out_idx; - int32x4_t res = vldrwq_s32(out_buff); - res = arm_requantize_mve_32x4(res, vldrwq_s32(&output_mult[out_ch + mult_tile]), vldrwq_s32(&output_shift[out_ch + mult_tile])); - res = vaddq_n_s32(res, output_offset); - - res = vmaxq_s32(res, vdupq_n_s32(output_activation_min)); - res = vminq_s32(res, vdupq_n_s32(output_activation_max)); - vstrbq_s32(output, res); - output += 4; -#else - out_buff[0] = arm_nn_requantize(out_buff[0], output_mult[out_ch + 0 + mult_tile], output_shift[out_ch + 0 + mult_tile]); - out_buff[1] = arm_nn_requantize(out_buff[1], output_mult[out_ch + 1 + mult_tile], output_shift[out_ch + 1 + mult_tile]); - out_buff[2] = arm_nn_requantize(out_buff[2], output_mult[out_ch + 2 + mult_tile], output_shift[out_ch + 2 + mult_tile]); - out_buff[3] = arm_nn_requantize(out_buff[3], output_mult[out_ch + 3 + mult_tile], output_shift[out_ch + 3 + mult_tile]); - - out_buff[0] += output_offset; - out_buff[1] += output_offset; - out_buff[2] += output_offset; - out_buff[3] += output_offset; - - out_buff[0] = MIN(MAX(out_buff[0], output_activation_min), output_activation_max); - out_buff[1] = MIN(MAX(out_buff[1], output_activation_min), output_activation_max); - out_buff[2] = MIN(MAX(out_buff[2], output_activation_min), output_activation_max); - out_buff[3] = MIN(MAX(out_buff[3], output_activation_min), output_activation_max); - - output[out_idx++] = (int8_t)out_buff[0]; - output[out_idx++] = (int8_t)out_buff[1]; - output[out_idx++] = (int8_t)out_buff[2]; - output[out_idx++] = (int8_t)out_buff[3]; - -#endif - } - } - } - } -} - -static void depthwise_conv_s8_generic(const q7_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_ch, - const q7_t *kernel, - const uint16_t output_ch, - const uint16_t ch_mult, - const uint16_t kernel_x, - const uint16_t kernel_y, - const uint16_t pad_x, - const uint16_t pad_y, - const uint16_t stride_x, - const uint16_t stride_y, - const int32_t *bias, - q7_t *output, - const int32_t *output_shift, - const int32_t *output_mult, - const uint16_t output_x, - const uint16_t output_y, - const int32_t output_offset, - const int32_t input_offset, - const int32_t output_activation_min, - const int32_t output_activation_max) -{ - (void)output_ch; - int i_out = 0; - for (int i_out_y = 0; i_out_y < output_y; i_out_y++) - { - const int16_t base_idx_y = (i_out_y * stride_y) - pad_y; - for (int i_out_x = 0; i_out_x < output_x; i_out_x++) - { - const int16_t base_idx_x = (i_out_x * stride_x) - pad_x; - for (int i_input_ch = 0; i_input_ch < input_ch; i_input_ch++) - { - for (int i_ch_mult = 0; i_ch_mult < ch_mult; i_ch_mult++) - { - const int idx_out_ch = i_ch_mult + i_input_ch * ch_mult; - int32_t acc_0; - /* Condition for kernel start dimension: (base_idx_ + ker__start) >= 0 */ - const int ker_y_start = MAX(0, -base_idx_y); - const int ker_x_start = MAX(0, -base_idx_x); - /* Condition for kernel end dimension: (base_idx_ + ker__end) < input_ */ - const int ker_y_end = MIN(kernel_y, input_y - base_idx_y); - const int ker_x_end = MIN(kernel_x, input_x - base_idx_x); - acc_0 = bias[idx_out_ch]; - - for (int i_ker_y = ker_y_start; i_ker_y < ker_y_end; i_ker_y++) - { - const int32_t idx_y = base_idx_y + i_ker_y; - for (int i_ker_x = ker_x_start; i_ker_x < ker_x_end; i_ker_x++) - { - const int32_t idx_x = base_idx_x + i_ker_x; - int32_t idx_0 = (idx_y * input_x + idx_x) * input_ch + i_input_ch; - int32_t ker_idx_0 = (i_ker_y * kernel_x + i_ker_x) * (input_ch * ch_mult) + idx_out_ch; - - acc_0 += (input[idx_0] + input_offset) * kernel[ker_idx_0]; - } - } - - /* Requantize and clamp output to provided range */ - acc_0 = arm_nn_requantize(acc_0, output_mult[idx_out_ch], output_shift[idx_out_ch]); - acc_0 += output_offset; - acc_0 = MAX(acc_0, output_activation_min); - acc_0 = MIN(acc_0, output_activation_max); - - output[i_out++] = acc_0; - } - } - } - } -} - -/* - * Basic s8 depthwise convolution function. - * - * Refer header file for details. - * Optimization using DSP extension is not available for the generic case where channel multiplier is > 1. - * - */ -arm_status arm_depthwise_conv_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input, - const cmsis_nn_dims *filter_dims, - const q7_t *kernel, - const cmsis_nn_dims *bias_dims, - const int32_t *bias, - const cmsis_nn_dims *output_dims, - q7_t *output) -{ - (void)dw_conv_params->dilation; - (void)ctx; - - if (dw_conv_params->ch_mult % 4 == 0) - { - depthwise_conv_s8_mult_4(input, input_dims->w, input_dims->h, input_dims->c, kernel, output_dims->c, dw_conv_params->ch_mult, filter_dims->w, filter_dims->h, - dw_conv_params->padding.w, dw_conv_params->padding.h, dw_conv_params->stride.w, dw_conv_params->stride.h, bias, output, - quant_params->shift, quant_params->multiplier, output_dims->w, output_dims->h, dw_conv_params->output_offset, - dw_conv_params->input_offset, dw_conv_params->activation.min, dw_conv_params->activation.max); - } - else - { - depthwise_conv_s8_generic(input, input_dims->w, input_dims->h, input_dims->c, kernel, output_dims->c, dw_conv_params->ch_mult, filter_dims->w, filter_dims->h, - dw_conv_params->padding.w, dw_conv_params->padding.h, dw_conv_params->stride.w, dw_conv_params->stride.h, bias, output, - quant_params->shift, quant_params->multiplier, output_dims->w, output_dims->h, dw_conv_params->output_offset, - dw_conv_params->input_offset, dw_conv_params->activation.min, dw_conv_params->activation.max); - } - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8_opt.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8_opt.c deleted file mode 100644 index 3587b9c9..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_s8_opt.c +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_conv_s8_opt.c - * Description: Optimized s8 depthwise separable convolution function for - * channel multiplier of 1. - * - * $Date: May 29, 2020 - * $Revision: V.2.0.1 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * Optimized s8 depthwise convolution function with constraint that in_channel equals out_channel - * - * Refer prototype header file for details. - * - */ - -arm_status arm_depthwise_conv_s8_opt(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input, - const cmsis_nn_dims *filter_dims, - const q7_t *kernel, - const cmsis_nn_dims *bias_dims, - const int32_t *bias, - const cmsis_nn_dims *output_dims, - q7_t *output) -{ - const int32_t input_x = input_dims->w; - const int32_t input_y = input_dims->h; - const int32_t input_ch = input_dims->c; - const int32_t output_ch = output_dims->c; - const int32_t kernel_x = filter_dims->w; - const int32_t kernel_y = filter_dims->h; - const int32_t pad_x = dw_conv_params->padding.w; - const int32_t pad_y = dw_conv_params->padding.h; - const int32_t stride_x = dw_conv_params->stride.w; - const int32_t stride_y = dw_conv_params->stride.h; - const int32_t *output_shift = quant_params->shift; - const int32_t *output_mult = quant_params->multiplier; - const int32_t output_x = output_dims->w; - const int32_t output_y = output_dims->h; - const int32_t output_offset = dw_conv_params->output_offset; - const int32_t input_offset = dw_conv_params->input_offset; - const int32_t output_activation_min = dw_conv_params->activation.min; - const int32_t output_activation_max = dw_conv_params->activation.max; - q15_t *buffer_a = (q15_t *)ctx->buf; - - /* Check input constraints input_ch == output_ch */ - if (input_ch != output_ch) - { - return ARM_MATH_SIZE_MISMATCH; - } -#ifdef ARM_MATH_MVEI - (void)bias_dims; - /* Generate two columns from the input tensor */ - q7_t *lhs_buffer = (q7_t *)buffer_a; - q7_t *out = output; - int padded = 0; - int buffer_count = 0; - const int32_t kernel_size = kernel_x * kernel_y; - - /* This part implements the im2col function */ - for (int i_out_y = 0, base_idx_y = -pad_y; i_out_y < output_y; base_idx_y += stride_y, i_out_y++) - { - for (int i_out_x = 0, base_idx_x = -pad_x; i_out_x < output_x; base_idx_x += stride_x, i_out_x++) - { - for (int i_ker_y = base_idx_y; i_ker_y < base_idx_y + kernel_y; i_ker_y++) - { - for (int i_ker_x = base_idx_x; i_ker_x < base_idx_x + kernel_x; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= input_y || i_ker_x < 0 || i_ker_x >= input_x) - { - arm_memset_q7(lhs_buffer, (int8_t)-input_offset, (uint32_t)input_ch); - padded = 1; - } - else - { - arm_memcpy_q7(lhs_buffer, input + (i_ker_y * input_x + i_ker_x) * input_ch, (uint32_t)input_ch); - } - lhs_buffer += input_ch; - } - } - buffer_count++; - - if (buffer_count == 4) - { - lhs_buffer = (q7_t *)buffer_a; - if (padded == 0) - { - out = arm_nn_depthwise_conv_nt_t_s8(lhs_buffer, - kernel, - input_offset, - input_ch, - output_shift, - output_mult, - output_offset, - output_activation_min, - output_activation_max, - kernel_size, - bias, - out); - } - else - { - out = arm_nn_depthwise_conv_nt_t_padded_s8(lhs_buffer, - kernel, - input_offset, - input_ch, - output_shift, - output_mult, - output_offset, - output_activation_min, - output_activation_max, - kernel_size, - bias, - out); - padded = 0; - } - buffer_count = 0; - } - } - } - - /* Handle left over buffers */ - lhs_buffer = (q7_t *)buffer_a; - - for (int i_buf = 0; i_buf < buffer_count; i_buf++) - { - int32_t loop_count = (input_ch + 3) / 4; - - int32_t num_ch_to_process = input_ch; - for (int i_loop_cnt = 0, offset = 0; i_loop_cnt < loop_count; - num_ch_to_process -= 4, offset += 4, i_loop_cnt++) - { - const int8_t *col_0 = lhs_buffer + (kernel_size * input_ch * i_buf) + offset; - const int8_t *row_0 = kernel + offset; - int32x4_t out_0 = vldrwq_s32(&bias[offset]); - - for (int i_ker = 0; i_ker < kernel_size; i_ker++) - { - const int32x4_t ker_0 = vldrbq_s32(row_0); - - int32x4_t ip_0 = vldrbq_s32(col_0); - ip_0 = vaddq_n_s32(ip_0, input_offset); - out_0 += vmulq_s32(ip_0, ker_0); - - col_0 += input_ch; - row_0 += input_ch; - } - - const int32x4_t mult = vldrwq_s32(&output_mult[offset]); - const int32x4_t shift = vldrwq_s32(&output_shift[offset]); - - out_0 = arm_requantize_mve_32x4(out_0, mult, shift); - out_0 = vaddq_n_s32(out_0, output_offset); - out_0 = vmaxq_s32(out_0, vdupq_n_s32(output_activation_min)); - out_0 = vminq_s32(out_0, vdupq_n_s32(output_activation_max)); - mve_pred16_t p = vctp32q((uint32_t)num_ch_to_process); - vstrbq_p_s32(out, out_0, p); - - out += 4; - } - - const int tail_ch = input_ch & 0x3; - if (tail_ch != 0) - { - out -= (4 - tail_ch); - } - } - -#elif defined(ARM_MATH_DSP) - (void)bias_dims; - /* Run the following code in cores using DSP extension */ - q15_t *const col_buffer_start = buffer_a; - q15_t *col_buffer = col_buffer_start; - const int32_t *const bias_start_pos = bias; - const q31_t *const out_mult_start_pos = output_mult; - const q31_t *const out_shift_start_pos = output_shift; - uint16_t row_count; - uint16_t row_shift; - - for (int i_out_y = 0; i_out_y < output_y; i_out_y++) - { - const int16_t base_idx_y = (i_out_y * stride_y) - pad_y; - for (int i_out_x = 0; i_out_x < output_x; i_out_x++) - { - const int16_t base_idx_x = (i_out_x * stride_x) - pad_x; - - /* Out of bounds is only considered for the y axis as it provides a contiguous zero'ing opportunity than along - the x axis */ - const int ker_y_start = MAX(0, -base_idx_y); - /* Condition for kernel end dimension: (base_idx_y + ker_y_end) < input_y */ - const int ker_y_end = MIN(kernel_y, input_y - base_idx_y); - - int32_t index = 0; - if (ker_y_start != 0) - { - memset(&col_buffer[index], 0, (kernel_x * input_ch) * ker_y_start * sizeof(q15_t)); - index += (kernel_x * input_ch) * ker_y_start; - } - - for (int i_ker_y = ker_y_start; i_ker_y < ker_y_end; i_ker_y++) - { - const int32_t idx_y = base_idx_y + i_ker_y; - - for (int i_ker_x = 0; i_ker_x < kernel_x; i_ker_x++) - { - const int32_t idx_x = base_idx_x + i_ker_x; - if (idx_x < 0 || idx_x >= input_x) - { - memset(&col_buffer[index], 0, input_ch * sizeof(q15_t)); - } - else - { - arm_q7_to_q15_with_offset((q7_t *)input + (idx_y * input_x + idx_x) * input_ch, &col_buffer[index], input_ch, input_offset); - } - index += input_ch; - } - } - - const int diff = kernel_y - ker_y_end; - if (diff != 0) - { - memset(&col_buffer[index], 0, (kernel_x * input_ch) * diff * sizeof(q15_t)); - } - - row_count = output_ch / 4; - row_shift = 0; - bias = bias_start_pos; - output_mult = out_mult_start_pos; - output_shift = out_shift_start_pos; - - while (row_count) - { - q31_t sum = *bias++; - q31_t sum_2 = *bias++; - q31_t sum_3 = *bias++; - q31_t sum_4 = *bias++; - - uint16_t col_count = (kernel_x * kernel_y) / 2; - q15_t *col_pos = col_buffer_start + row_shift; - const q7_t *row_pos = kernel + row_shift; - row_shift += 4; - - while (col_count) - { - /* General idea is to read 4 + 4 (input, kernel) pair and re-arrange them in the right order to - use in a SMLAD instruction . One run of this loop produces 4 partial outputs with 8 MACs. */ - /* Note: variable names can be improved here to align with rows and columns. */ - q31_t ip_a1, ip_a2, ip_b1, ip_b2, op_a, op_b, op_c; - /* Read 4 weights */ - ip_b1 = arm_nn_read_q7x4(row_pos); - ip_a1 = arm_nn_read_q7x4(row_pos + input_ch); - op_a = arm_nn_read_q15x2(col_pos); - op_b = arm_nn_read_q15x2(col_pos + input_ch); - - ip_a2 = __SXTB16(ip_b1); - ip_b1 = __SXTB16(__ROR(ip_b1, 8)); - - ip_b2 = __SXTB16(ip_a1); - ip_a1 = __SXTB16(__ROR(ip_a1, 8)); - - op_c = __PKHBT(op_b, op_a, 16); - op_a = __PKHTB(op_b, op_a, 16); - op_b = __PKHBT(ip_b2, ip_a2, 16); - sum = __SMLAD(op_c, op_b, sum); - - op_b = __PKHBT(ip_b1, ip_a1, 16); - sum_2 = __SMLAD(op_a, op_b, sum_2); - - op_a = arm_nn_read_q15x2(col_pos + 2); - op_b = arm_nn_read_q15x2(col_pos + input_ch + 2); - - op_c = __PKHBT(op_b, op_a, 16); - op_a = __PKHTB(op_b, op_a, 16); - op_b = __PKHTB(ip_a2, ip_b2, 16); - sum_3 = __SMLAD(op_c, op_b, sum_3); - - op_b = __PKHTB(ip_a1, ip_b1, 16); - sum_4 = __SMLAD(op_a, op_b, sum_4); - - row_pos += input_ch << 1; - col_pos += input_ch << 1; - col_count--; - } - - col_count = (kernel_x * kernel_y) & 0x1; - while (col_count) - { - sum += row_pos[0] * col_pos[0]; - sum_2 += row_pos[1] * col_pos[1]; - sum_3 += row_pos[2] * col_pos[2]; - sum_4 += row_pos[3] * col_pos[3]; - - row_pos += input_ch; - col_pos += input_ch; - - col_count--; - } - sum = arm_nn_requantize(sum, *output_mult++, *output_shift++); - sum += output_offset; - sum = MAX(sum, output_activation_min); - sum = MIN(sum, output_activation_max); - *output++ = (q7_t)sum; - - sum_2 = arm_nn_requantize(sum_2, *output_mult++, *output_shift++); - sum_2 += output_offset; - sum_2 = MAX(sum_2, output_activation_min); - sum_2 = MIN(sum_2, output_activation_max); - *output++ = (q7_t)sum_2; - sum_3 = arm_nn_requantize(sum_3, *output_mult++, *output_shift++); - sum_3 += output_offset; - sum_3 = MAX(sum_3, output_activation_min); - sum_3 = MIN(sum_3, output_activation_max); - *output++ = (q7_t)sum_3; - - sum_4 = arm_nn_requantize(sum_4, *output_mult++, *output_shift++); - sum_4 += output_offset; - sum_4 = MAX(sum_4, output_activation_min); - sum_4 = MIN(sum_4, output_activation_max); - *output++ = (q7_t)sum_4; - - row_count--; - } - - row_count = output_ch & 0x3; - while (row_count) - { - q15_t *col_pos = col_buffer_start + row_shift; - const q7_t *row_pos = kernel + row_shift; - q31_t sum = *bias++; - const uint16_t col_count = (kernel_x * kernel_y); - row_shift += 1; - - for (int i = 0; i < col_count; i++) - { - sum += row_pos[i * input_ch] * col_pos[i * input_ch]; - } - sum = arm_nn_requantize(sum, *output_mult++, *output_shift++); - sum += output_offset; - sum = MAX(sum, output_activation_min); - sum = MIN(sum, output_activation_max); - *output++ = (q7_t)sum; - - row_count--; - } - - // clear counter and pointers - col_buffer = col_buffer_start; - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - return arm_depthwise_conv_s8(ctx, - dw_conv_params, - quant_params, - input_dims, - input, - filter_dims, - kernel, - bias_dims, - bias, - output_dims, - output); -#endif /* ARM_MATH_MVEI | ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -int32_t arm_depthwise_conv_s8_opt_get_buffer_size(const cmsis_nn_dims *input_dims, - const cmsis_nn_dims *filter_dims) -{ -#if defined(ARM_MATH_MVEI) - /* The + 4 accounts for out of bounds read of the lhs buffers in the *_nt_t_* functions. */ - return (2 * input_dims->c * filter_dims->w * filter_dims->h) * (int32_t)sizeof(int16_t) + 4; -#elif defined(ARM_MATH_DSP) - return (input_dims->c * filter_dims->w * filter_dims->h) * sizeof(int16_t); -#else - (void)input_dims; - (void)filter_dims; - return 0; -#endif -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_u8_basic_ver1.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_u8_basic_ver1.c deleted file mode 100644 index d5fa36c6..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_u8_basic_ver1.c +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_conv_u8_basic_ver1.c - * Description: u8 depthwise convolution function - * - * $Date: May 29, 2020 - * $Revision: V.1.1.0 - * - * Target : Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -static void depthwise_conv_u8_mult_4(const uint8_t *input, - const int32_t input_x, - const int32_t input_y, - const int32_t input_ch, - const uint8_t *kernel, - const int32_t output_ch, - const int32_t ch_mult, - const int32_t kernel_x, - const int32_t kernel_y, - const int32_t pad_x, - const int32_t pad_y, - const int32_t stride_x, - const int32_t stride_y, - const int32_t *bias, - uint8_t *output, - const int32_t output_shift, - const int32_t output_mult, - const int32_t output_x, - const int32_t output_y, - const int32_t output_offset, - const int32_t input_offset, - const int32_t filter_offset, - const int32_t output_activation_min, - const int32_t output_activation_max) -{ - for (int32_t in_h = -pad_y, out_h = 0, out_idx = 0; out_h < output_y; in_h += stride_y, ++out_h) - { - for (int32_t in_w = -pad_x, out_w = 0, ker_h_start = MAX(0, -in_h); out_w < output_x; in_w += stride_x, ++out_w) - { - for (int32_t in_ch = 0, out_ch = 0, ker_w_start = MAX(0, -in_w); out_ch < output_ch; ++in_ch, out_ch += ch_mult) - { - for (int mult_tile = 0; mult_tile < ch_mult; mult_tile += 4) - { - int32_t out_buff[4]; - - out_buff[0] = 0; - out_buff[1] = 0; - out_buff[2] = 0; - out_buff[3] = 0; - - for (int32_t ker_h = ker_h_start; ker_h < MIN(kernel_y, input_y - in_h); ++ker_h) - { - int32_t ker_idx = ker_h * (output_ch * kernel_x) + ker_w_start * output_ch + out_ch; - int32_t in_idx = (in_h + ker_h) * (input_ch * input_x) + in_w * input_ch + in_ch; - - for (int32_t ker_w = ker_w_start; ker_w < MIN(kernel_x, input_x - in_w); ++ker_w, ker_idx += output_ch) - { - int32_t in_val = input[in_idx + ker_w * input_ch] + input_offset; - out_buff[0] += in_val * (kernel[ker_idx + 0 + mult_tile] + filter_offset); - out_buff[1] += in_val * (kernel[ker_idx + 1 + mult_tile] + filter_offset); - out_buff[2] += in_val * (kernel[ker_idx + 2 + mult_tile] + filter_offset); - out_buff[3] += in_val * (kernel[ker_idx + 3 + mult_tile] + filter_offset); - } - } - - if (bias != NULL) - { - out_buff[0] += bias[out_ch + 0 + mult_tile]; - out_buff[1] += bias[out_ch + 1 + mult_tile]; - out_buff[2] += bias[out_ch + 2 + mult_tile]; - out_buff[3] += bias[out_ch + 3 + mult_tile]; - } - out_buff[0] = arm_nn_requantize(out_buff[0], output_mult, output_shift); - out_buff[1] = arm_nn_requantize(out_buff[1], output_mult, output_shift); - out_buff[2] = arm_nn_requantize(out_buff[2], output_mult, output_shift); - out_buff[3] = arm_nn_requantize(out_buff[3], output_mult, output_shift); - - out_buff[0] += output_offset; - out_buff[1] += output_offset; - out_buff[2] += output_offset; - out_buff[3] += output_offset; - - out_buff[0] = MIN(MAX(out_buff[0], output_activation_min), output_activation_max); - out_buff[1] = MIN(MAX(out_buff[1], output_activation_min), output_activation_max); - out_buff[2] = MIN(MAX(out_buff[2], output_activation_min), output_activation_max); - out_buff[3] = MIN(MAX(out_buff[3], output_activation_min), output_activation_max); - - output[out_idx++] = (uint8_t)out_buff[0]; - output[out_idx++] = (uint8_t)out_buff[1]; - output[out_idx++] = (uint8_t)out_buff[2]; - output[out_idx++] = (uint8_t)out_buff[3]; - } - } - } - } -} - -static void depthwise_conv_u8_generic(const uint8_t *input, - const int32_t input_x, - const int32_t input_y, - const int32_t input_ch, - const uint8_t *kernel, - const int32_t output_ch, - const int32_t ch_mult, - const int32_t kernel_x, - const int32_t kernel_y, - const int32_t pad_x, - const int32_t pad_y, - const int32_t stride_x, - const int32_t stride_y, - const int32_t *bias, - uint8_t *output, - const int32_t output_shift, - const int32_t output_mult, - const int32_t output_x, - const int32_t output_y, - const int32_t output_offset, - const int32_t input_offset, - const int32_t filter_offset, - const int32_t output_activation_min, - const int32_t output_activation_max) -{ - (void)output_ch; - int i_out = 0; - for (int i_out_y = 0; i_out_y < output_y; i_out_y++) - { - const int16_t base_idx_y = (i_out_y * stride_y) - pad_y; - for (int i_out_x = 0; i_out_x < output_x; i_out_x++) - { - const int16_t base_idx_x = (i_out_x * stride_x) - pad_x; - for (int i_input_ch = 0; i_input_ch < input_ch; i_input_ch++) - { - for (int i_ch_mult = 0; i_ch_mult < ch_mult; i_ch_mult++) - { - const int idx_out_ch = i_ch_mult + i_input_ch * ch_mult; - int32_t acc_0; - /* Condition for kernel start dimension: (base_idx_ + ker__start) >= 0 */ - const int ker_y_start = MAX(0, -base_idx_y); - const int ker_x_start = MAX(0, -base_idx_x); - /* Condition for kernel end dimension: (base_idx_ + ker__end) < input_ */ - const int ker_y_end = MIN(kernel_y, input_y - base_idx_y); - const int ker_x_end = MIN(kernel_x, input_x - base_idx_x); - acc_0 = 0; - - for (int i_ker_y = ker_y_start; i_ker_y < ker_y_end; i_ker_y++) - { - const int32_t idx_y = base_idx_y + i_ker_y; - for (int i_ker_x = ker_x_start; i_ker_x < ker_x_end; i_ker_x++) - { - const int32_t idx_x = base_idx_x + i_ker_x; - int32_t idx_0 = (idx_y * input_x + idx_x) * input_ch + i_input_ch; - int32_t ker_idx_0 = (i_ker_y * kernel_x + i_ker_x) * (input_ch * ch_mult) + idx_out_ch; - - acc_0 += (input[idx_0] + input_offset) * (kernel[ker_idx_0] + filter_offset); - } - } - if (bias != NULL) - { - acc_0 += bias[idx_out_ch]; - } - - /* Requantize and clamp output to provided range */ - acc_0 = arm_nn_requantize(acc_0, output_mult, output_shift); - acc_0 += output_offset; - acc_0 = MAX(acc_0, output_activation_min); - acc_0 = MIN(acc_0, output_activation_max); - - output[i_out++] = acc_0; - } - } - } - } -} - -/** - * @brief uint8 depthwise convolution function with asymmetric quantization - * - * @param[in] input Pointer to input tensor - * @param[in] input_x Width of input tensor - * @param[in] input_y Height of input tensor - * @param[in] input_ch Channels in input tensor - * @param[in] kernel Pointer to kernel weights - * @param[in] kernel_x Width of kernel - * @param[in] kernel_y Height of kernel - * @param[in] ch_mult Number of channel multiplier - * @param[in] pad_x Padding sizes x - * @param[in] pad_y Padding sizes y - * @param[in] stride_x Convolution stride along the width - * @param[in] stride_y Convolution stride along the height - * @param[in] dilation_x Dilation along width. Not used and intended for future enhancement. - * @param[in] dilation_y Dilation along height. Not used and intended for future enhancement. - * @param[in] bias Pointer to optional bias values. If no bias is - * availble, NULL is expected - * @param[in] input_offset Input tensor zero offset - * @param[in] filter_offset Kernel tensor zero offset - * @param[in] output_offset Output tensor zero offset - * @param[in,out] output Pointer to output tensor - * @param[in] output_x Width of output tensor - * @param[in] output_y Height of output tensor - * @param[in] output_activation_min Minimum value to clamp the output to. Range : {0, 255} - * @param[in] output_activation_max Minimum value to clamp the output to. Range : {0, 255} - * @param[in] output_shift Amount of right-shift for output - * @param[in] output_mult Output multiplier for requantization - * @return The function returns one of the following - * ARM_MATH_SIZE_MISMATCH - Not supported dimension of tensors - * ARM_MATH_SUCCESS - Successful operation - * ARM_MATH_ARGUMENT_ERROR - Implementation not available - * - * - */ - -arm_status arm_depthwise_conv_u8_basic_ver1(const uint8_t *input, - const uint16_t input_x, - const uint16_t input_y, - const uint16_t input_ch, - const uint8_t *kernel, - const uint16_t kernel_x, - const uint16_t kernel_y, - const int16_t ch_mult, - const int16_t pad_x, - const int16_t pad_y, - const int16_t stride_x, - const int16_t stride_y, - const int16_t dilation_x, - const int16_t dilation_y, - const int32_t *bias, - const int32_t input_offset, - const int32_t filter_offset, - const int32_t output_offset, - uint8_t *output, - const uint16_t output_x, - const uint16_t output_y, - const int32_t output_activation_min, - const int32_t output_activation_max, - const int32_t output_shift, - const int32_t output_mult) -{ - (void)dilation_x; - (void)dilation_y; - - if (ch_mult % 4 == 0) - { - depthwise_conv_u8_mult_4(input, input_x, input_y, input_ch, kernel, ch_mult * input_ch, ch_mult, - kernel_x, kernel_y, pad_x, pad_y, stride_x, stride_y, bias, output, - output_shift, output_mult, output_x, output_y, output_offset, input_offset, - filter_offset, output_activation_min, output_activation_max); - } - else - { - depthwise_conv_u8_generic(input, input_x, input_y, input_ch, kernel, ch_mult * input_ch, ch_mult, - kernel_x, kernel_y, pad_x, pad_y, stride_x, stride_y, bias, - output, output_shift, output_mult, output_x, output_y, output_offset, - input_offset, filter_offset, output_activation_min, output_activation_max); - } - - /* Return to application */ - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_wrapper_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_wrapper_s8.c deleted file mode 100644 index 42d425f0..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_conv_wrapper_s8.c +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_conv_wrapper_s8.c - * Description: Wrapper API to select appropriate depthwise conv API based - * on dimensions. - * - * $Date: May 29, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/* - * s8 Depthwise conv wrapper function - * - * Refer header file for details. - * - */ -arm_status arm_depthwise_conv_wrapper_s8(const cmsis_nn_context *ctx, - const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_per_channel_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input, - const cmsis_nn_dims *filter_dims, - const q7_t *filter, - const cmsis_nn_dims *bias_dims, - const int32_t *bias, - const cmsis_nn_dims *output_dims, - q7_t *output) -{ - arm_status status = ARM_MATH_SUCCESS; - if (1 == dw_conv_params->ch_mult) - { -#if !defined(ARM_MATH_MVEI) - if ((filter_dims->w == 3) && (filter_dims->h == 3) && (dw_conv_params->padding.h <= 1)) - { - status = arm_depthwise_conv_3x3_s8(ctx, - dw_conv_params, - quant_params, - input_dims, - input, - filter_dims, - filter, - bias_dims, - bias, - output_dims, - output); - } - else -#endif - { - status = arm_depthwise_conv_s8_opt(ctx, - dw_conv_params, - quant_params, - input_dims, - input, - filter_dims, - filter, - bias_dims, - bias, - output_dims, - output); - } - } - else - { - status = arm_depthwise_conv_s8(ctx, - dw_conv_params, - quant_params, - input_dims, - input, - filter_dims, - filter, - bias_dims, - bias, - output_dims, - output); - } - - /* Return to application */ - return status; -} - -int32_t arm_depthwise_conv_wrapper_s8_get_buffer_size(const cmsis_nn_dw_conv_params *dw_conv_params, - const cmsis_nn_dims *input_dims, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims) -{ - (void)dw_conv_params; - int32_t size = 0; - - if (input_dims->c == output_dims->c) - { - size = arm_depthwise_conv_s8_opt_get_buffer_size(input_dims, filter_dims); - } - - return size; -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7.c deleted file mode 100644 index 2767ff47..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7.c +++ /dev/null @@ -1,418 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_separable_conv_HWC_q7.c - * Description: Q7 depthwise separable convolution function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/** - * @brief Q7 depthwise separable convolution function - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * @details - * - * Buffer size: - * - * bufferA size: 2*ch_im_in*dim_kernel*dim_kernel - * - * bufferB size: 0 - * - * Input dimension constraints: - * - * ch_im_in equals ch_im_out - * - * Implementation: - * There are 3 nested loop here: - * Inner loop: calculate each output value with MAC instruction over an accumulator - * Mid loop: loop over different output channel - * Outer loop: loop over different output (x, y) - */ - -arm_status arm_depthwise_separable_conv_HWC_q7(const q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out, - q15_t * bufferA, - q7_t * bufferB) -{ - (void)bufferB; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_out_y, i_out_x; - int16_t i_ker_y, i_ker_x; - q7_t *colBuffer = (q7_t *) bufferA; - q7_t *pBuffer = colBuffer; - const q7_t *pBias = bias; - q7_t *pOut = Im_out; - uint16_t rowCnt; - uint16_t row_shift; - - /* do some checking here, basically ch_im_in == ch_im_out */ - if (ch_im_in != ch_im_out) - { - return ARM_MATH_SIZE_MISMATCH; - } - - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - /* we first do im2col here */ - for (i_ker_y = i_out_y * stride - padding; i_ker_y < i_out_y * stride - padding + dim_kernel; i_ker_y++) - { - for (i_ker_x = i_out_x * stride - padding; i_ker_x < i_out_x * stride - padding + dim_kernel; i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in || i_ker_x < 0 || i_ker_x >= dim_im_in) - { - /* arm_fill_q7(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, ch_im_in); - } else - { - /* arm_copy_q7((q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, pBuffer, ch_im_in); */ - memcpy(pBuffer, (q7_t *) Im_in + (i_ker_y * dim_im_in + i_ker_x) * ch_im_in, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - /* we will do the computation here for each channel */ - rowCnt = ch_im_out >> 2; - row_shift = 0; - pBias = bias; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = (dim_kernel * dim_kernel) >> 1; - q7_t *pB = colBuffer + row_shift; - const q7_t *pA = wt + row_shift; - row_shift += 4; - -#ifdef USE_INTRINSIC - -#ifndef ARM_MATH_BIG_ENDIAN - - while (colCnt) - { - q31_t inA1, inA2, inB1, inB2, opA, opB; - - inB1 = arm_nn_read_q7x4(pB); - pB += ch_im_in; - opB = arm_nn_read_q7x4(pB); - pB += ch_im_in; - inB2 = __PKHTB(opB, inB1, 16); - inB1 = __PKHBT(inB1, opB, 16); - inA1 = arm_nn_read_q7x4(pA); - pA += ch_im_in; - opB = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inA2 = __PKHTB(opB, inA1, 16); - inA1 = __PKHBT(inA1, opB, 16); - opA = __SXTB16(inA1); - opB = __SXTB16(inB1); - sum = __SMLAD(opA, opB, sum); - opA = __SXTB16(__ROR(inA1, 8)); - opB = __SXTB16(__ROR(inB1, 8)); - sum2 = __SMLAD(opA, opB, sum2); - opA = __SXTB16(inA2); - opB = __SXTB16(inB2); - sum3 = __SMLAD(opA, opB, sum3); - opA = __SXTB16(__ROR(inA2, 8)); - opB = __SXTB16(__ROR(inB2, 8)); - sum4 = __SMLAD(opA, opB, sum4); - colCnt--; - } -#else - - while (colCnt) - { - q31_t inA1, inA2, inB1, inB2, opA, opB; - - inB1 = arm_nn_read_q7x4(pB); - pB += ch_im_in; - opB = arm_nn_read_q7x4(pB); - pB += ch_im_in; - inB2 = __PKHBT(opB, inB1, 16); - inB1 = __PKHTB(inB1, opB, 16); - inA1 = arm_nn_read_q7x4(pA); - pA += ch_im_in; - opB = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inA2 = __PKHBT(opB, inA1, 16); - inA1 = __PKHTB(inA1, opB, 16); - opA = __SXTB16(inA1); - opB = __SXTB16(inB1); - sum2 = __SMLAD(opA, opB, sum2); - opA = __SXTB16(__ROR(inA1, 8)); - opB = __SXTB16(__ROR(inB1, 8)); - sum = __SMLAD(opA, opB, sum); - opA = __SXTB16(inA2); - opB = __SXTB16(inB2); - sum4 = __SMLAD(opA, opB, sum4); - opA = __SXTB16(__ROR(inA2, 8)); - opB = __SXTB16(__ROR(inB2, 8)); - sum3 = __SMLAD(opA, opB, sum3); - colCnt--; - } - -#endif /* ARM_MATH_BIG_ENDIAN */ - -#else - -#ifndef ARM_MATH_BIG_ENDIAN - /* - * r0 r1 r2 r3 r4 r5 - * inA1, inA2, inB1, inB2, opA, opB - */ - - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r2, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "ldr.w r5, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "pkhtb r3, r5, r2, ASR #16\n" - "pkhbt r2, r2, r5, LSL #16\n" - "ldr.w r0, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "ldr.w r5, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "pkhtb r1, r5, r0, ASR #16\n" - "pkhbt r0, r0, r5, LSL #16\n" - "sxtb16 r4, r0\n" - "sxtb16 r5, r2\n" - "smlad %[sum], r4, r5, %[sum]\n" - "mov.w r4, r0, ror #8\n" - "mov.w r5, r2, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum2], r4, r5, %[sum2]\n" - "sxtb16 r4, r1\n" - "sxtb16 r5, r3\n" - "smlad %[sum3], r4, r5, %[sum3]\n" - "mov.w r4, r1, ror #8\n" - "mov.w r5, r3, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum4], r4, r5, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] - "+r"(sum),[sum2] "+r"(sum2), - [sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB), - [pA] "+r"(pA):[colCnt] - "r"(colCnt),[ch_im_in] "r"(ch_im_in):"r0", "r1", "r2", "r3", "r4", "r5"); -#else - /* - * r0 r1 r2 r3 r4 r5 - * inA1, inA2, inB1, inB2, opA, opB - */ - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r2, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "ldr.w r5, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "pkhbt r3, r5, r2, LSL #16\n" - "pkhtb r2, r2, r5, ASR #16\n" - "ldr.w r0, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "ldr.w r5, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "pkhbt r1, r5, r0, LSL #16\n" - "pkhtb r0, r0, r5, ASR #16\n" - "sxtb16 r4, r0\n" - "sxtb16 r5, r2\n" - "smlad %[sum2], r4, r5, %[sum2]\n" - "mov.w r4, r0, ror #8\n" - "mov.w r5, r2, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum], r4, r5, %[sum]\n" - "sxtb16 r4, r1\n" - "sxtb16 r5, r3\n" - "smlad %[sum4], r4, r5, %[sum4]\n" - "mov.w r4, r1, ror #8\n" - "mov.w r5, r3, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum3], r4, r5, %[sum3]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] - "+r"(sum),[sum2] "+r"(sum2), - [sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB), - [pA] "+r"(pA):[colCnt] - "r"(colCnt),[ch_im_in] "r"(ch_im_in):"r0", "r1", "r2", "r3", "r4", "r5"); - -#endif /* ARM_MATH_BIG_ENDIAN */ - -#endif /* USE_INTRINSIC */ - - colCnt = (dim_kernel * dim_kernel) & 0x1; - while (colCnt) - { - union arm_nnword inA, inB; - inA.word = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inB.word = arm_nn_read_q7x4(pB); - pB += ch_im_in; - sum += inA.bytes[0] * inB.bytes[0]; - sum2 += inA.bytes[1] * inB.bytes[1]; - sum3 += inA.bytes[2] * inB.bytes[2]; - sum4 += inA.bytes[3] * inB.bytes[3]; - colCnt--; - } - - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum3 >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum4 >> out_shift), 8); - - rowCnt--; - } - - rowCnt = ch_im_out & 0x3; - while (rowCnt) - { - q7_t *pB = colBuffer + row_shift; - const q7_t *pA = wt + row_shift; - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = (dim_kernel * dim_kernel); - - row_shift += 1; - - while (colCnt) - { - q7_t A1 = *pA; - q7_t B1 = *pB; - pA += ch_im_in; - pB += ch_im_in; - sum += A1 * B1; - - colCnt--; - } - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - rowCnt--; - } - - /* clear counter and pointers */ - pBuffer = colBuffer; - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i_out_y, i_out_x, i_ch_out, i_ker_x, i_ker_y; - int conv_out; - - /* do some checking here, basically ch_im_in == ch_im_out */ - if (ch_im_in != ch_im_out) - { - return ARM_MATH_SIZE_MISMATCH; - } - - for (i_out_y = 0; i_out_y < dim_im_out; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out; i_out_x++) - { - for (i_ch_out = 0; i_ch_out < ch_im_out; i_ch_out++) - { - // for each output - conv_out = ((q31_t)(bias[i_ch_out]) << bias_shift) + NN_ROUND(out_shift); - for (i_ker_y = 0; i_ker_y < dim_kernel; i_ker_y++) - { - for (i_ker_x = 0; i_ker_x < dim_kernel; i_ker_x++) - { - int in_row = stride * i_out_y + i_ker_y - padding; - int in_col = stride * i_out_x + i_ker_x - padding; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in && in_col < dim_im_in) - { - conv_out += - Im_in[(in_row * - dim_im_in + - in_col) * - ch_im_in + - i_ch_out] * wt[(i_ker_y * dim_kernel + i_ker_x) * ch_im_out + i_ch_out]; - } - } - } - Im_out[(i_out_y * dim_im_out + - i_out_x) * ch_im_out + i_ch_out] = (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return ARM_MATH_SUCCESS; - -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7_nonsquare.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7_nonsquare.c deleted file mode 100644 index adeb8c45..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_depthwise_separable_conv_HWC_q7_nonsquare.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_depthwise_separable_conv_HWC_q7_nonsquare.c - * Description: Q7 depthwise separable convolution function (non-square shape) - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup NNConv - * @{ - */ - -/** - * @brief Q7 depthwise separable convolution function (non-square shape) - * @param[in] Im_in pointer to input tensor - * @param[in] dim_im_in_x input tensor dimention x - * @param[in] dim_im_in_y input tensor dimention y - * @param[in] ch_im_in number of input tensor channels - * @param[in] wt pointer to kernel weights - * @param[in] ch_im_out number of filters, i.e., output tensor channels - * @param[in] dim_kernel_x filter kernel size x - * @param[in] dim_kernel_y filter kernel size y - * @param[in] padding_x padding sizes x - * @param[in] padding_y padding sizes y - * @param[in] stride_x convolution stride x - * @param[in] stride_y convolution stride y - * @param[in] bias pointer to bias - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in,out] Im_out pointer to output tensor - * @param[in] dim_im_out_x output tensor dimension x - * @param[in] dim_im_out_y output tensor dimension y - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] bufferB pointer to buffer space for output - * @return The function returns either - * ARM_MATH_SIZE_MISMATCH or ARM_MATH_SUCCESS based on the outcome of size checking. - * - * This function is the version with full list of optimization tricks, but with - * some contraints: - * ch_im_in is equal to ch_im_out - * - */ - -arm_status arm_depthwise_separable_conv_HWC_q7_nonsquare(const q7_t * Im_in, - const uint16_t dim_im_in_x, - const uint16_t dim_im_in_y, - const uint16_t ch_im_in, - const q7_t * wt, - const uint16_t ch_im_out, - const uint16_t dim_kernel_x, - const uint16_t dim_kernel_y, - const uint16_t padding_x, - const uint16_t padding_y, - const uint16_t stride_x, - const uint16_t stride_y, - const q7_t * bias, - const uint16_t bias_shift, - const uint16_t out_shift, - q7_t * Im_out, - const uint16_t dim_im_out_x, - const uint16_t dim_im_out_y, - q15_t * bufferA, - q7_t * bufferB) -{ - - (void)bufferB; - -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - -/* - * Implementation: - * There are 3 nested loop here: - * Inner loop: calculate each output value with MAC instruction over an accumulator - * Mid loop: loop over different output channel - * Outer loop: loop over different output (x, y) - * - */ - - int16_t i_out_y, i_out_x; - int16_t i_ker_y, i_ker_x; - q7_t *colBuffer = (q7_t *) bufferA; - q7_t *pBuffer = colBuffer; - const q7_t *pBias = bias; - q7_t *pOut = Im_out; - uint16_t rowCnt; - uint16_t row_shift; - - /* do some checking here, basically ch_im_in == ch_im_out */ - if (ch_im_in != ch_im_out) - { - return ARM_MATH_SIZE_MISMATCH; - } - - for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - /* we first do im2col here */ - for (i_ker_y = i_out_y * stride_y - padding_y; i_ker_y < i_out_y * stride_y - padding_y + dim_kernel_y; - i_ker_y++) - { - for (i_ker_x = i_out_x * stride_x - padding_x; i_ker_x < i_out_x * stride_x - padding_x + dim_kernel_x; - i_ker_x++) - { - if (i_ker_y < 0 || i_ker_y >= dim_im_in_y || i_ker_x < 0 || i_ker_x >= dim_im_in_x) - { - /* arm_fill_q7(0, pBuffer, ch_im_in); */ - memset(pBuffer, 0, ch_im_in); - } else - { - /* arm_copy_q7((q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, pBuffer, ch_im_in); */ - memcpy(pBuffer, (q7_t *) Im_in + (i_ker_y * dim_im_in_x + i_ker_x) * ch_im_in, ch_im_in); - } - pBuffer += ch_im_in; - } - } - - /* we will do the computation here for each channel */ - rowCnt = ch_im_out >> 2; - row_shift = 0; - pBias = bias; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = (dim_kernel_x * dim_kernel_y) >> 1; - q7_t *pB = colBuffer + row_shift; - const q7_t *pA = wt + row_shift; - row_shift += 4; - -#ifdef USE_INTRINSIC - -#ifndef ARM_MATH_BIG_ENDIAN - - while (colCnt) - { - q31_t inA1, inA2, inB1, inB2, opA, opB; - - inB1 = arm_nn_read_q7x4(pB); - pB += ch_im_in; - opB = arm_nn_read_q7x4(pB); - pB += ch_im_in; - inB2 = __PKHTB(opB, inB1, 16); - inB1 = __PKHBT(inB1, opB, 16); - inA1 = arm_nn_read_q7x4(pA); - pA += ch_im_in; - opB = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inA2 = __PKHTB(opB, inA1, 16); - inA1 = __PKHBT(inA1, opB, 16); - opA = __SXTB16(inA1); - opB = __SXTB16(inB1); - sum = __SMLAD(opA, opB, sum); - opA = __SXTB16(__ROR(inA1, 8)); - opB = __SXTB16(__ROR(inB1, 8)); - sum2 = __SMLAD(opA, opB, sum2); - opA = __SXTB16(inA2); - opB = __SXTB16(inB2); - sum3 = __SMLAD(opA, opB, sum3); - opA = __SXTB16(__ROR(inA2, 8)); - opB = __SXTB16(__ROR(inB2, 8)); - sum4 = __SMLAD(opA, opB, sum4); - colCnt--; - } -#else - - while (colCnt) - { - q31_t inA1, inA2, inB1, inB2, opA, opB; - - inB1 = arm_nn_read_q7x4(pB); - pB += ch_im_in; - opB = arm_nn_read_q7x4(pB); - pB += ch_im_in; - inB2 = __PKHBT(opB, inB1, 16); - inB1 = __PKHTB(inB1, opB, 16); - inA1 = arm_nn_read_q7x4(pA); - pA += ch_im_in; - opB = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inA2 = __PKHBT(opB, inA1, 16); - inA1 = __PKHTB(inA1, opB, 16); - opA = __SXTB16(inA1); - opB = __SXTB16(inB1); - sum2 = __SMLAD(opA, opB, sum2); - opA = __SXTB16(__ROR(inA1, 8)); - opB = __SXTB16(__ROR(inB1, 8)); - sum = __SMLAD(opA, opB, sum); - opA = __SXTB16(inA2); - opB = __SXTB16(inB2); - sum4 = __SMLAD(opA, opB, sum4); - opA = __SXTB16(__ROR(inA2, 8)); - opB = __SXTB16(__ROR(inB2, 8)); - sum3 = __SMLAD(opA, opB, sum3); - colCnt--; - } - -#endif /* ARM_MATH_BIG_ENDIAN */ - -#else - -#ifndef ARM_MATH_BIG_ENDIAN - // r0 r1 r2 r3 r4 r5 - // inA1, inA2, inB1, inB2, opA, opB - asm volatile ("COL_LOOP:\n" - "ldr.w r2, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "ldr.w r5, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "pkhtb r3, r5, r2, ASR #16\n" - "pkhbt r2, r2, r5, LSL #16\n" - "ldr.w r0, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "ldr.w r5, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "pkhtb r1, r5, r0, ASR #16\n" - "pkhbt r0, r0, r5, LSL #16\n" - "sxtb16 r4, r0\n" - "sxtb16 r5, r2\n" - "smlad %[sum], r4, r5, %[sum]\n" - "mov.w r4, r0, ror #8\n" - "mov.w r5, r2, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum2], r4, r5, %[sum2]\n" - "sxtb16 r4, r1\n" - "sxtb16 r5, r3\n" - "smlad %[sum3], r4, r5, %[sum3]\n" - "mov.w r4, r1, ror #8\n" - "mov.w r5, r3, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum4], r4, r5, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP\n":[sum] "+r"(sum),[sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt), - [ch_im_in] "r"(ch_im_in):"r0", "r1", "r2", "r3", "r4", "r5"); -#else - // r0 r1 r2 r3 r4 r5 - // inA1, inA2, inB1, inB2, opA, opB - asm volatile ("COL_LOOP:\n" - "ldr.w r2, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "ldr.w r5, [%[pB], #0]\n" - "add.w %[pB], %[pB], %[ch_im_in]\n" - "pkhbt r3, r5, r2, LSL #16\n" - "pkhtb r2, r2, r5, ASR #16\n" - "ldr.w r0, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "ldr.w r5, [%[pA], #0]\n" - "add.w %[pA], %[pA], %[ch_im_in]\n" - "pkhbt r1, r5, r0, LSL #16\n" - "pkhtb r0, r0, r5, ASR #16\n" - "sxtb16 r4, r0\n" - "sxtb16 r5, r2\n" - "smlad %[sum2], r4, r5, %[sum2]\n" - "mov.w r4, r0, ror #8\n" - "mov.w r5, r2, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum], r4, r5, %[sum]\n" - "sxtb16 r4, r1\n" - "sxtb16 r5, r3\n" - "smlad %[sum4], r4, r5, %[sum4]\n" - "mov.w r4, r1, ror #8\n" - "mov.w r5, r3, ror #8\n" - "sxtb16 r4, r4\n" - "sxtb16 r5, r5\n" - "smlad %[sum3], r4, r5, %[sum3]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP\n":[sum] "+r"(sum),[sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt), - [ch_im_in] "r"(ch_im_in):"r0", "r1", "r2", "r3", "r4", "r5"); -#endif /*ARM_MATH_BIG_ENDIAN */ - -#endif /* USE_INTRINSIC */ - - colCnt = (dim_kernel_x * dim_kernel_y) & 0x1; - while (colCnt) - { - union arm_nnword inA, inB; - inA.word = arm_nn_read_q7x4(pA); - pA += ch_im_in; - inB.word = arm_nn_read_q7x4(pB); - pB += ch_im_in; - sum += inA.bytes[0] * inB.bytes[0]; - sum2 += inA.bytes[1] * inB.bytes[1]; - sum3 += inA.bytes[2] * inB.bytes[2]; - sum4 += inA.bytes[3] * inB.bytes[3]; - colCnt--; - } - - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum3 >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum4 >> out_shift), 8); - - rowCnt--; - } - - rowCnt = ch_im_out & 0x3; - while (rowCnt) - { - q7_t *pB = colBuffer + row_shift; - const q7_t *pA = wt + row_shift; - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = (dim_kernel_x * dim_kernel_y); - - row_shift += 1; - - while (colCnt) - { - q7_t A1 = *pA; - q7_t B1 = *pB; - pA += ch_im_in; - pB += ch_im_in; - sum += A1 * B1; - - colCnt--; - } - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - rowCnt--; - } - - // clear counter and pointers - pBuffer = colBuffer; - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int i_out_y, i_out_x, i_ch_out; - int i_ker_y, i_ker_x; - - /* do some checking here, basically ch_im_in == ch_im_out */ - if (ch_im_in != ch_im_out) - { - return ARM_MATH_SIZE_MISMATCH; - } - - for (i_out_y = 0; i_out_y < dim_im_out_y; i_out_y++) - { - for (i_out_x = 0; i_out_x < dim_im_out_x; i_out_x++) - { - for (i_ch_out = 0; i_ch_out < ch_im_out; i_ch_out++) - { - // for each output - int conv_out = ((q31_t)(bias[i_ch_out]) << bias_shift) + NN_ROUND(out_shift); - for (i_ker_y = 0; i_ker_y < dim_kernel_y; i_ker_y++) - { - for (i_ker_x = 0; i_ker_x < dim_kernel_x; i_ker_x++) - { - int in_row = stride_y * i_out_y + i_ker_y - padding_y; - int in_col = stride_x * i_out_x + i_ker_x - padding_x; - if (in_row >= 0 && in_col >= 0 && in_row < dim_im_in_y && in_col < dim_im_in_x) - { - conv_out += Im_in[(in_row * dim_im_in_x + in_col) * ch_im_in + i_ch_out] * - wt[(i_ker_y * dim_kernel_x + i_ker_x) * ch_im_out + i_ch_out]; - } - } - } - Im_out[(i_out_y * dim_im_out_x + i_out_x) * ch_im_out + i_ch_out] = - (q7_t) __SSAT((conv_out >> out_shift), 8); - } - } - } - -#endif /* ARM_MATH_DSP */ - - - /* Return to application */ - return ARM_MATH_SUCCESS; - -} - -/** - * @} end of NNConv group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_depthwise_conv_s8_core.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_depthwise_conv_s8_core.c deleted file mode 100644 index f9106341..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_depthwise_conv_s8_core.c +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_depthwise_conv_s8_core.c - * Description: Depthwise convolution on im2col buffers. - * - * $Date: May 29, 2020 - * $Revision: V.1.0.3 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/* - * Depthwise conv on an im2col buffer where the input channel equals - * output channel. - * - * Refer header file for details. - * - */ - -q7_t *arm_nn_depthwise_conv_s8_core(const q7_t *row, - const q15_t *col, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t kernel_size, - const int32_t *const output_bias, - q7_t *out) -{ -#if defined(ARM_MATH_MVEI) - int32_t ch_per_loop = num_ch / 4; - - const int32_t *bias = output_bias; - int8_t *out_tmp = out; - - int32_t idx = 0; - - while (ch_per_loop > 0) - { - int32x4_t ip_0; - int32x4_t ip_1; - int32_t ker_loop = kernel_size / 3; - int32x4_t out_0 = vldrwq_s32(bias); - int32x4_t out_1 = out_0; - bias += 4; - - const int32_t offset = idx * 4; - const int8_t *row_0 = row + offset; - const int16_t *col_0 = col + offset; - const int16_t *col_1 = col + kernel_size * num_ch + offset; - - int32x4_t ker_0 = vldrbq_s32(row_0); - - while (ker_loop > 0) - { - const int8_t *row_1 = row_0 + num_ch; - const int8_t *row_2 = row_0 + 2 * num_ch; - const int32x4_t ker_1 = vldrbq_s32(row_1); - const int32x4_t ker_2 = vldrbq_s32(row_2); - - ip_0 = vldrhq_s32(col_0); - ip_1 = vldrhq_s32(col_1); - col_0 += num_ch; - col_1 += num_ch; - - out_0 += vmulq_s32(ip_0, ker_0); - out_1 += vmulq_s32(ip_1, ker_0); - - ip_0 = vldrhq_s32(col_0); - ip_1 = vldrhq_s32(col_1); - col_0 += num_ch; - col_1 += num_ch; - - out_0 += vmulq_s32(ip_0, ker_1); - out_1 += vmulq_s32(ip_1, ker_1); - - ip_0 = vldrhq_s32(col_0); - ip_1 = vldrhq_s32(col_1); - col_0 += num_ch; - col_1 += num_ch; - - out_0 += vmulq_s32(ip_0, ker_2); - out_1 += vmulq_s32(ip_1, ker_2); - row_0 += 3 * num_ch; - - ker_0 = vldrbq_s32(row_0); - ker_loop--; - } - - idx++; - /* Handle tail kernel elements */ - ker_loop = kernel_size - ((kernel_size / 3) * 3); - while (ker_loop > 0) - { - ip_0 = vldrhq_s32(col_0); - ip_1 = vldrhq_s32(col_1); - - out_0 += vmulq_s32(ip_0, ker_0); - out_1 += vmulq_s32(ip_1, ker_0); - - col_0 += num_ch; - col_1 += num_ch; - - ip_0 = vldrhq_s32(col_0); - ip_1 = vldrhq_s32(col_1); - - row_0 += num_ch; - ker_0 = vldrbq_s32(row_0); - ker_loop--; - } - const int32x4_t mult = vldrwq_s32(out_mult); - const int32x4_t shift = vldrwq_s32(out_shift); - out_mult += 4; - out_shift += 4; - - out_0 = arm_requantize_mve_32x4(out_0, mult, shift); - out_1 = arm_requantize_mve_32x4(out_1, mult, shift); - - out_0 = vaddq_n_s32(out_0, out_offset); - out_0 = vmaxq_s32(out_0, vdupq_n_s32(activation_min)); - out_0 = vminq_s32(out_0, vdupq_n_s32(activation_max)); - vstrbq_s32(out_tmp, out_0); - - out_1 = vaddq_n_s32(out_1, out_offset); - out_1 = vmaxq_s32(out_1, vdupq_n_s32(activation_min)); - out_1 = vminq_s32(out_1, vdupq_n_s32(activation_max)); - vstrbq_s32(out_tmp + num_ch, out_1); - - out_tmp += 4; - ch_per_loop--; - } - - int32_t tail_ch = num_ch & 3; - if (tail_ch != 0) - { - int32_t ch_idx = (num_ch & ~3); - int32x4_t col_0_sum; - int32x4_t col_1_sum; - - const int32_t single_buffer_size = kernel_size * num_ch; - for (int i = 0; i < tail_ch; i++) - { - const int16_t *col_pos_0 = col + ch_idx; - const int16_t *col_pos_1 = col_pos_0 + single_buffer_size; - - const int8_t *row_pos = row + ch_idx; - int32_t sum_0 = bias[i]; - int32_t sum_1 = bias[i]; - - for (int j = 0; j < kernel_size; j++) - { - const int8_t row_val = row_pos[j * num_ch]; - sum_0 += row_val * col_pos_0[j * num_ch]; - sum_1 += row_val * col_pos_1[j * num_ch]; - } - col_0_sum[i] = sum_0; - col_1_sum[i] = sum_1; - - ch_idx++; - } - const mve_pred16_t p = vctp32q((uint32_t)tail_ch); - const int32x4_t mult = vldrwq_z_s32(out_mult, p); - const int32x4_t shift = vldrwq_z_s32(out_shift, p); - - col_0_sum = arm_requantize_mve_32x4(col_0_sum, mult, shift); - col_1_sum = arm_requantize_mve_32x4(col_1_sum, mult, shift); - - col_0_sum = vaddq_n_s32(col_0_sum, out_offset); - col_0_sum = vmaxq_s32(col_0_sum, vdupq_n_s32(activation_min)); - col_0_sum = vminq_s32(col_0_sum, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out_tmp, col_0_sum, p); - - col_1_sum = vaddq_n_s32(col_1_sum, out_offset); - col_1_sum = vmaxq_s32(col_1_sum, vdupq_n_s32(activation_min)); - col_1_sum = vminq_s32(col_1_sum, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out_tmp + num_ch, col_1_sum, p); - - out_tmp += tail_ch; - } - - return out_tmp + num_ch; -#else - (void)row; - (void)col; - (void)num_ch; - (void)out_shift; - (void)out_mult; - (void)out_offset; - (void)activation_min; - (void)activation_max; - (void)kernel_size; - (void)output_bias; - (void)out; - return NULL; -#endif -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15.c deleted file mode 100644 index 49b3ba47..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_kernel_q7_q15.c - * Description: Matrix-multiplication function for convolution - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - - /** - * @brief Matrix-multiplication function for convolution. - * - * @details Refer to header file for details. - * - */ - -q7_t *arm_nn_mat_mult_kernel_q7_q15(const q7_t * pA, - const q15_t * pInBuffer, - const uint16_t ch_im_out, - const uint16_t numCol_A, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut) -{ -#if defined (ARM_MATH_DSP) - /* set up the second output pointers */ - q7_t *pOut2 = pOut + ch_im_out; - const q7_t *pBias = bias; - - uint16_t rowCnt = ch_im_out >> 1; - /* this loop over rows in A */ - while (rowCnt) - { - /* setup pointers for B */ - const q15_t *pB = pInBuffer; - const q15_t *pB2 = pB + numCol_A; - - /* align the second pointer for A */ - const q7_t *pA2 = pA + numCol_A; - - /* init the sum with bias */ - q31_t sum = ((q31_t)(*pBias) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = numCol_A >> 2; - /* accumulate over the vector */ - while (colCnt) - { - q31_t inA11, inA12, inA21, inA22; - - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB2); - - pA = read_and_pad(pA, &inA11, &inA12); - pA2 = read_and_pad(pA2, &inA21, &inA22); - - sum = __SMLAD(inA11, inB1, sum); - sum2 = __SMLAD(inA11, inB2, sum2); - sum3 = __SMLAD(inA21, inB1, sum3); - sum4 = __SMLAD(inA21, inB2, sum4); - - inB1 = arm_nn_read_q15x2_ia(&pB); - inB2 = arm_nn_read_q15x2_ia(&pB2); - - sum = __SMLAD(inA12, inB1, sum); - sum2 = __SMLAD(inA12, inB2, sum2); - sum3 = __SMLAD(inA22, inB1, sum3); - sum4 = __SMLAD(inA22, inB2, sum4); - - colCnt--; - } /* while over colCnt */ - colCnt = numCol_A & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - q7_t inA2 = *pA2++; - q15_t inB2 = *pB2++; - - sum += inA1 * inB1; - sum2 += inA1 * inB2; - sum3 += inA2 * inB1; - sum4 += inA2 * inB2; - colCnt--; - } /* while over colCnt */ - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum3 >> out_shift), 8); - *pOut2++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - *pOut2++ = (q7_t) __SSAT((sum4 >> out_shift), 8); - - /* skip the row computed with A2 */ - pA += numCol_A; - rowCnt--; - } /* for over ch_im_out */ - - /* compute left-over row if any */ - if (ch_im_out & 0x1) - { - /* setup pointers for B */ - const q15_t *pB = pInBuffer; - const q15_t *pB2 = pB + numCol_A; - - /* load the bias */ - q31_t sum = ((q31_t)(*pBias) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = numCol_A >> 2; - while (colCnt) - { - q31_t inA11, inA12; - - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB2); - - pA = read_and_pad(pA, &inA11, &inA12); - - sum = __SMLAD(inA11, inB1, sum); - sum2 = __SMLAD(inA11, inB2, sum2); - - inB1 = arm_nn_read_q15x2_ia(&pB); - inB2 = arm_nn_read_q15x2_ia(&pB2); - - sum = __SMLAD(inA12, inB1, sum); - sum2 = __SMLAD(inA12, inB2, sum2); - - colCnt--; - } - colCnt = numCol_A & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - q15_t inB2 = *pB2++; - - sum += inA1 * inB1; - sum2 += inA1 * inB2; - colCnt--; - } - - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pOut2++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - } - - pOut += ch_im_out; - - /* return the new output pointer with offset */ - return pOut; -#else - /* To be completed */ - return NULL; -#endif /* ARM_MATH_DSP */ - -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15_reordered.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15_reordered.c deleted file mode 100644 index b5bbc397..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_q7_q15_reordered.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_kernel_q7_q15_reordered.c - * Description: Matrix-multiplication function for convolution with reordered columns - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/DSP/Include/arm_math.h" - - /** - * @brief Matrix-multiplication function for convolution with re-ordered input. - * - * @details Refer to header file for details. - * - */ - -q7_t *arm_nn_mat_mult_kernel_q7_q15_reordered(const q7_t * pA, - const q15_t * pInBuffer, - const uint16_t ch_im_out, - const uint16_t numCol_A, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut) -{ - -#if defined (ARM_MATH_DSP) - /* set up the second output pointers */ - q7_t *pOut2 = pOut + ch_im_out; - int i; - - /* this loop over rows in A */ - for (i = 0; i < ch_im_out; i += 2) - { - /* setup pointers for B */ - const q15_t *pB = pInBuffer; - const q15_t *pB2 = pB + numCol_A; - - /* align the second pointer for A */ - const q7_t *pA2 = pA + numCol_A; - - /* init the sum with bias */ - q31_t sum = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(bias[i + 1]) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(bias[i + 1]) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = numCol_A >> 2; - /* accumulate over the vector */ - while (colCnt) - { - q31_t inA11, inA12, inA21, inA22; - - q31_t inB1 = arm_nn_read_q15x2_ia(&pB); - q31_t inB2 = arm_nn_read_q15x2_ia(&pB2); - - pA = read_and_pad_reordered(pA, &inA11, &inA12); - pA2 = read_and_pad_reordered(pA2, &inA21, &inA22); - - sum = __SMLAD(inA11, inB1, sum); - sum2 = __SMLAD(inA11, inB2, sum2); - sum3 = __SMLAD(inA21, inB1, sum3); - sum4 = __SMLAD(inA21, inB2, sum4); - - inB1 = arm_nn_read_q15x2_ia(&pB); - inB2 = arm_nn_read_q15x2_ia(&pB2); - - sum = __SMLAD(inA12, inB1, sum); - sum2 = __SMLAD(inA12, inB2, sum2); - sum3 = __SMLAD(inA22, inB1, sum3); - sum4 = __SMLAD(inA22, inB2, sum4); - - colCnt--; - } /* while over colCnt */ - colCnt = numCol_A & 0x3; - while (colCnt) - { - q7_t inA1 = *pA++; - q15_t inB1 = *pB++; - q7_t inA2 = *pA2++; - q15_t inB2 = *pB2++; - - sum += inA1 * inB1; - sum2 += inA1 * inB2; - sum3 += inA2 * inB1; - sum4 += inA2 * inB2; - colCnt--; - } /* while over colCnt */ - *pOut++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pOut++ = (q7_t) __SSAT((sum3 >> out_shift), 8); - *pOut2++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - *pOut2++ = (q7_t) __SSAT((sum4 >> out_shift), 8); - - /* skip the row computed with A2 */ - pA += numCol_A; - } /* for over ch_im_out */ - - pOut += ch_im_out; - - /* return the new output pointer with offset */ - return pOut; -#else - /* To be completed */ - return NULL; -#endif /* ARM_MATH_DSP */ -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16.c deleted file mode 100644 index 9aa17c96..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16.c +++ /dev/null @@ -1,391 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_kernel_s8_s16.c - * Description: Matrix-multiplication function for convolution - * - * $Date: May 29, 2020 - * $Revision: V.1.0.2 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/* - * Matrix-multiplication function for convolution with per-channel requantization. - * - * Refer header file for details. - * - */ - -q7_t *arm_nn_mat_mult_kernel_s8_s16(const q7_t *input_a, - const q15_t *input_b, - const uint16_t output_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int16_t activation_min, - const int16_t activation_max, - const uint16_t num_col_a, - const int32_t *const output_bias, - q7_t *out_0) -{ -#if defined(ARM_MATH_MVEI) -#define ROW_PER_LOOP (4) -#define COL_PER_LOOP (8) - - const q7_t *ip_a0_s8 = input_a; - q7_t *out_1 = out_0 + output_ch; - - const int32_t *bias = output_bias; - - int32_t row_count = output_ch / ROW_PER_LOOP; - - while (row_count) - { - const q15_t *ip_b0_s16 = input_b; - const q15_t *ip_b1_s16 = input_b + num_col_a; - - const q7_t *ip_a1_s8 = ip_a0_s8 + num_col_a; - const q7_t *ip_a2_s8 = ip_a0_s8 + num_col_a * 2; - const q7_t *ip_a3_s8 = ip_a0_s8 + num_col_a * 3; - - q31_t ch_0_out_n = bias[0]; - q31_t ch_1_out_n = bias[1]; - q31_t ch_2_out_n = bias[2]; - q31_t ch_3_out_n = bias[3]; - - q31_t ch_0_out_n1 = ch_0_out_n; - q31_t ch_1_out_n1 = ch_1_out_n; - q31_t ch_2_out_n1 = ch_2_out_n; - q31_t ch_3_out_n1 = ch_3_out_n; - bias += 4; - - int32_t col_count = num_col_a / COL_PER_LOOP; - - while (col_count) - { - // Load inputs - const int16x8_t ip_b0 = vld1q_s16(ip_b0_s16); - ip_b0_s16 += COL_PER_LOOP; - const int16x8_t ip_b1 = vld1q_s16(ip_b1_s16); - ip_b1_s16 += COL_PER_LOOP; - - // Load filters - const int16x8_t ip_a0 = vldrbq_s16(ip_a0_s8); - ip_a0_s8 += COL_PER_LOOP; - const int16x8_t ip_a1 = vldrbq_s16(ip_a1_s8); - ip_a1_s8 += COL_PER_LOOP; - const int16x8_t ip_a2 = vldrbq_s16(ip_a2_s8); - ip_a2_s8 += COL_PER_LOOP; - const int16x8_t ip_a3 = vldrbq_s16(ip_a3_s8); - ip_a3_s8 += COL_PER_LOOP; - - // MAC - ch_0_out_n += vmladavq_s16(ip_b0, ip_a0); - ch_1_out_n += vmladavq_s16(ip_b0, ip_a1); - ch_2_out_n += vmladavq_s16(ip_b0, ip_a2); - ch_3_out_n += vmladavq_s16(ip_b0, ip_a3); - ch_0_out_n1 += vmladavq_s16(ip_b1, ip_a0); - ch_1_out_n1 += vmladavq_s16(ip_b1, ip_a1); - ch_2_out_n1 += vmladavq_s16(ip_b1, ip_a2); - ch_3_out_n1 += vmladavq_s16(ip_b1, ip_a3); - - col_count--; - } - - /* Handle tail */ - col_count = (num_col_a & (COL_PER_LOOP - 1)) - 1; - while (col_count >= 0) - { - const int32_t b0 = ip_b0_s16[col_count]; - const int32_t b1 = ip_b1_s16[col_count]; - - ch_0_out_n += b0 * ip_a0_s8[col_count]; - ch_1_out_n += b0 * ip_a1_s8[col_count]; - ch_2_out_n += b0 * ip_a2_s8[col_count]; - ch_3_out_n += b0 * ip_a3_s8[col_count]; - - ch_0_out_n1 += b1 * ip_a0_s8[col_count]; - ch_1_out_n1 += b1 * ip_a1_s8[col_count]; - ch_2_out_n1 += b1 * ip_a2_s8[col_count]; - ch_3_out_n1 += b1 * ip_a3_s8[col_count]; - col_count--; - } - ip_a0_s8 += (num_col_a & (COL_PER_LOOP - 1)); - - int32x4_t out_vec_0; - int32x4_t out_vec_1; - out_vec_0[0] = ch_0_out_n; - out_vec_0[1] = ch_1_out_n; - out_vec_0[2] = ch_2_out_n; - out_vec_0[3] = ch_3_out_n; - - out_vec_1[0] = ch_0_out_n1; - out_vec_1[1] = ch_1_out_n1; - out_vec_1[2] = ch_2_out_n1; - out_vec_1[3] = ch_3_out_n1; - - int32x4_t mult = vldrwq_s32(out_mult); - int32x4_t shift = vldrwq_s32(out_shift); - out_mult += ROW_PER_LOOP; - out_shift += ROW_PER_LOOP; - - out_vec_0 = arm_requantize_mve_32x4(out_vec_0, mult, shift); - out_vec_1 = arm_requantize_mve_32x4(out_vec_1, mult, shift); - - out_vec_0 = vaddq_n_s32(out_vec_0, out_offset); - out_vec_0 = vmaxq_s32(out_vec_0, vdupq_n_s32(activation_min)); - out_vec_0 = vminq_s32(out_vec_0, vdupq_n_s32(activation_max)); - vstrbq_s32(out_0, out_vec_0); - out_0 += ROW_PER_LOOP; - - out_vec_1 = vaddq_n_s32(out_vec_1, out_offset); - out_vec_1 = vmaxq_s32(out_vec_1, vdupq_n_s32(activation_min)); - out_vec_1 = vminq_s32(out_vec_1, vdupq_n_s32(activation_max)); - vstrbq_s32(out_1, out_vec_1); - out_1 += ROW_PER_LOOP; - row_count--; - ip_a0_s8 += (num_col_a * 3); - } - - row_count = output_ch & (ROW_PER_LOOP - 1); - - if (row_count) - { - ip_a0_s8 = input_a + num_col_a * (output_ch & ~3); - const mve_pred16_t p = vctp32q((uint32_t)row_count); - int32x4_t out_vec_0 = vdupq_n_s32(0); - int32x4_t out_vec_1 = vdupq_n_s32(0); - int32x4_t mult_tail; - int32x4_t shift_tail; - - for (int i_ch = 0; i_ch < row_count; i_ch++) - { - int32_t output_0 = bias[i_ch]; - int32_t output_1 = bias[i_ch]; - const q15_t *ip_b0_s16 = input_b; - const q15_t *ip_b1_s16 = input_b + num_col_a; - - for (int i_idx = 0; i_idx < num_col_a; i_idx++) - { - output_0 += ip_b0_s16[i_idx] * ip_a0_s8[i_idx]; - output_1 += ip_b1_s16[i_idx] * ip_a0_s8[i_idx]; - } - - ip_a0_s8 += num_col_a; - out_vec_0[i_ch] = output_0; - out_vec_1[i_ch] = output_1; - mult_tail[i_ch] = out_mult[i_ch]; - shift_tail[i_ch] = out_shift[i_ch]; - } - out_vec_0 = arm_requantize_mve_32x4(out_vec_0, mult_tail, shift_tail); - out_vec_1 = arm_requantize_mve_32x4(out_vec_1, mult_tail, shift_tail); - - out_vec_0 = vaddq_n_s32(out_vec_0, out_offset); - out_vec_0 = vmaxq_s32(out_vec_0, vdupq_n_s32(activation_min)); - out_vec_0 = vminq_s32(out_vec_0, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out_0, out_vec_0, p); - - out_vec_1 = vaddq_n_s32(out_vec_1, out_offset); - out_vec_1 = vmaxq_s32(out_vec_1, vdupq_n_s32(activation_min)); - out_vec_1 = vminq_s32(out_vec_1, vdupq_n_s32(activation_max)); - - vstrbq_p_s32(out_1, out_vec_1, p); - out_1 += row_count; - } - - return out_1; - -#elif defined(ARM_MATH_DSP) - /* set up the second output pointers */ - q7_t *out_1 = out_0 + output_ch; - const int32_t *bias = output_bias; - - uint16_t row_count = output_ch / 2; - const q7_t *ip_a0 = input_a; - /* this loop over rows in A */ - while (row_count) - { - /* setup pointers for B */ - const q15_t *ip_b0 = input_b; - const q15_t *ip_b1 = ip_b0 + num_col_a; - - /* align the second pointer for A */ - const q7_t *ip_a1 = ip_a0 + num_col_a; - - /* Init accumulator with bias for channel N and N + 1 */ - q31_t ch_0_out_0 = *bias; - q31_t ch_0_out_1 = *bias++; - q31_t ch_1_out_0 = *bias; - q31_t ch_1_out_1 = *bias++; - - uint16_t col_count = num_col_a / 4; - /* accumulate over the vector */ - while (col_count) - { - q31_t a01, a02, a11, a12; - q31_t b0 = arm_nn_read_q15x2_ia(&ip_b0); - q31_t b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ip_a0 = read_and_pad(ip_a0, &a01, &a02); - ip_a1 = read_and_pad(ip_a1, &a11, &a12); - - ch_0_out_0 = __SMLAD(a01, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a01, b1, ch_0_out_1); - ch_1_out_0 = __SMLAD(a11, b0, ch_1_out_0); - ch_1_out_1 = __SMLAD(a11, b1, ch_1_out_1); - - b0 = arm_nn_read_q15x2_ia(&ip_b0); - b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ch_0_out_0 = __SMLAD(a02, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a02, b1, ch_0_out_1); - ch_1_out_0 = __SMLAD(a12, b0, ch_1_out_0); - ch_1_out_1 = __SMLAD(a12, b1, ch_1_out_1); - - col_count--; - } /* while over col_count */ - col_count = num_col_a & 0x3; - while (col_count) - { - q7_t a0 = *ip_a0++; - q15_t b0 = *ip_b0++; - q7_t a1 = *ip_a1++; - q15_t b1 = *ip_b1++; - - ch_0_out_0 += a0 * b0; - ch_0_out_1 += a0 * b1; - ch_1_out_0 += a1 * b0; - ch_1_out_1 += a1 * b1; - col_count--; - } /* while over col_count */ - - ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift); - ch_0_out_0 += out_offset; - ch_0_out_0 = MAX(ch_0_out_0, activation_min); - ch_0_out_0 = MIN(ch_0_out_0, activation_max); - *out_0++ = (q7_t)ch_0_out_0; - - ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift); - ch_0_out_1 += out_offset; - ch_0_out_1 = MAX(ch_0_out_1, activation_min); - ch_0_out_1 = MIN(ch_0_out_1, activation_max); - *out_1++ = (q7_t)ch_0_out_1; - out_mult++; - out_shift++; - - ch_1_out_0 = arm_nn_requantize(ch_1_out_0, *out_mult, *out_shift); - ch_1_out_0 += out_offset; - ch_1_out_0 = MAX(ch_1_out_0, activation_min); - ch_1_out_0 = MIN(ch_1_out_0, activation_max); - *out_0++ = (q7_t)ch_1_out_0; - - ch_1_out_1 = arm_nn_requantize(ch_1_out_1, *out_mult, *out_shift); - ch_1_out_1 += out_offset; - ch_1_out_1 = MAX(ch_1_out_1, activation_min); - ch_1_out_1 = MIN(ch_1_out_1, activation_max); - *out_1++ = (q7_t)ch_1_out_1; - out_mult++; - out_shift++; - - /* skip row */ - ip_a0 += num_col_a; - row_count--; - } - - /* compute the last odd numbered row if any */ - if (output_ch & 0x1) - { - /* setup pointers for B */ - const q15_t *ip_b0 = input_b; - const q15_t *ip_b1 = ip_b0 + num_col_a; - - /* load the bias */ - q31_t ch_0_out_0 = *bias; - q31_t ch_0_out_1 = *bias++; - - uint16_t col_count = num_col_a >> 2; - while (col_count) - { - q31_t a01, a02; - q31_t b0 = arm_nn_read_q15x2_ia(&ip_b0); - q31_t b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ip_a0 = read_and_pad(ip_a0, &a01, &a02); - - ch_0_out_0 = __SMLAD(a01, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a01, b1, ch_0_out_1); - - b0 = arm_nn_read_q15x2_ia(&ip_b0); - b1 = arm_nn_read_q15x2_ia(&ip_b1); - ch_0_out_0 = __SMLAD(a02, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a02, b1, ch_0_out_1); - - col_count--; - } - col_count = num_col_a & 0x3; - while (col_count) - { - q7_t a0 = *ip_a0++; - q15_t b0 = *ip_b0++; - q15_t b1 = *ip_b1++; - - ch_0_out_0 += a0 * b0; - ch_0_out_1 += a0 * b1; - col_count--; - } - ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift); - ch_0_out_0 += out_offset; - ch_0_out_0 = MAX(ch_0_out_0, activation_min); - ch_0_out_0 = MIN(ch_0_out_0, activation_max); - *out_0++ = (q7_t)ch_0_out_0; - - ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift); - ch_0_out_1 += out_offset; - ch_0_out_1 = MAX(ch_0_out_1, activation_min); - ch_0_out_1 = MIN(ch_0_out_1, activation_max); - *out_1++ = (q7_t)ch_0_out_1; - out_mult++; - out_shift++; - } - - out_0 += output_ch; - - /* return the new output pointer with offset */ - return out_0; -#else - (void)input_a; - (void)input_b; - (void)output_ch; - (void)out_shift; - (void)out_mult; - (void)out_offset; - (void)activation_min; - (void)activation_max; - (void)num_col_a; - (void)output_bias; - (void)out_0; - /* To be completed */ - return NULL; -#endif -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16_reordered.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16_reordered.c deleted file mode 100644 index dc5d36d4..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_kernel_s8_s16_reordered.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_kernel_s8_s16_reordered.c - * Description: Matrix-multiplication function for convolution with reordered columns - * - * $Date: February 27, 2020 - * $Revision: V.1.0.2 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/DSP/Include/arm_math.h" - -/* - * Matrix-multiplication with re-ordered input and bias inputs for convolution with per-channel - * requantization. The re-ordering is a consequence of sign extension is done by the SXTB16 command. - * - * Refer header file for details. This function differs from arm_nn_mat_mult_kernel_s8_s16(), in that it uses - * read_and_pad_reordered() instead of arm_nn_mat_mult_kernel_s8_s16(). Investigating the cycles impact and - * unifying these two functions is a potential future improvement. - * - */ - -q7_t *arm_nn_mat_mult_kernel_s8_s16_reordered(const q7_t *input_a, - const q15_t *input_b, - const uint16_t output_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int16_t activation_min, - const int16_t activation_max, - const uint16_t num_col_a, - const int32_t *const output_bias, - q7_t *out_0) -{ -#if defined(ARM_MATH_DSP) - /* set up the second output pointers */ - q7_t *out_1 = out_0 + output_ch; - const int32_t *bias = output_bias; - - uint16_t row_count = output_ch / 2; - const q7_t *ip_a0 = input_a; - /* this loop over rows in A */ - while (row_count) - { - /* setup pointers for B */ - const q15_t *ip_b0 = input_b; - const q15_t *ip_b1 = ip_b0 + num_col_a; - - /* align the second pointer for A */ - const q7_t *ip_a1 = ip_a0 + num_col_a; - - /* Init accumulator with bias for channel N and N + 1 */ - q31_t ch_0_out_0 = *bias; - q31_t ch_0_out_1 = *bias++; - q31_t ch_1_out_0 = *bias; - q31_t ch_1_out_1 = *bias++; - - uint16_t col_count = num_col_a / 4; - /* accumulate over the vector */ - while (col_count) - { - q31_t a01, a02, a11, a12; - q31_t b0 = arm_nn_read_q15x2_ia(&ip_b0); - q31_t b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ip_a0 = read_and_pad_reordered(ip_a0, &a01, &a02); - ip_a1 = read_and_pad_reordered(ip_a1, &a11, &a12); - - ch_0_out_0 = __SMLAD(a01, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a01, b1, ch_0_out_1); - ch_1_out_0 = __SMLAD(a11, b0, ch_1_out_0); - ch_1_out_1 = __SMLAD(a11, b1, ch_1_out_1); - - b0 = arm_nn_read_q15x2_ia(&ip_b0); - b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ch_0_out_0 = __SMLAD(a02, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a02, b1, ch_0_out_1); - ch_1_out_0 = __SMLAD(a12, b0, ch_1_out_0); - ch_1_out_1 = __SMLAD(a12, b1, ch_1_out_1); - - col_count--; - } /* while over col_count */ - - ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift); - ch_0_out_0 += out_offset; - ch_0_out_0 = MAX(ch_0_out_0, activation_min); - ch_0_out_0 = MIN(ch_0_out_0, activation_max); - *out_0++ = (q7_t)ch_0_out_0; - - ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift); - ch_0_out_1 += out_offset; - ch_0_out_1 = MAX(ch_0_out_1, activation_min); - ch_0_out_1 = MIN(ch_0_out_1, activation_max); - *out_1++ = (q7_t)ch_0_out_1; - out_mult++; - out_shift++; - - ch_1_out_0 = arm_nn_requantize(ch_1_out_0, *out_mult, *out_shift); - ch_1_out_0 += out_offset; - ch_1_out_0 = MAX(ch_1_out_0, activation_min); - ch_1_out_0 = MIN(ch_1_out_0, activation_max); - *out_0++ = (q7_t)ch_1_out_0; - - ch_1_out_1 = arm_nn_requantize(ch_1_out_1, *out_mult, *out_shift); - ch_1_out_1 += out_offset; - ch_1_out_1 = MAX(ch_1_out_1, activation_min); - ch_1_out_1 = MIN(ch_1_out_1, activation_max); - *out_1++ = (q7_t)ch_1_out_1; - out_mult++; - out_shift++; - - /* skip row */ - ip_a0 += num_col_a; - row_count--; - } - - if (output_ch & 1) - { - /* setup pointers for B */ - const q15_t *ip_b0 = input_b; - const q15_t *ip_b1 = ip_b0 + num_col_a; - - /* Init accumulator with bias for channel N + 1 */ - q31_t ch_0_out_0 = *bias; - q31_t ch_0_out_1 = ch_0_out_0; - - int32_t col_count = num_col_a / 4; - while (col_count) - { - q31_t a01, a02; - q31_t b0 = arm_nn_read_q15x2_ia(&ip_b0); - q31_t b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ip_a0 = read_and_pad_reordered(ip_a0, &a01, &a02); - - ch_0_out_0 = __SMLAD(a01, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a01, b1, ch_0_out_1); - - b0 = arm_nn_read_q15x2_ia(&ip_b0); - b1 = arm_nn_read_q15x2_ia(&ip_b1); - - ch_0_out_0 = __SMLAD(a02, b0, ch_0_out_0); - ch_0_out_1 = __SMLAD(a02, b1, ch_0_out_1); - - col_count--; - } /* while over col_count */ - - ch_0_out_0 = arm_nn_requantize(ch_0_out_0, *out_mult, *out_shift); - ch_0_out_0 += out_offset; - ch_0_out_0 = MAX(ch_0_out_0, activation_min); - ch_0_out_0 = MIN(ch_0_out_0, activation_max); - *out_0++ = (q7_t)ch_0_out_0; - - ch_0_out_1 = arm_nn_requantize(ch_0_out_1, *out_mult, *out_shift); - ch_0_out_1 += out_offset; - ch_0_out_1 = MAX(ch_0_out_1, activation_min); - ch_0_out_1 = MIN(ch_0_out_1, activation_max); - *out_1++ = (q7_t)ch_0_out_1; - } - - out_0 += output_ch; - - /* return the new output pointer with offset */ - return out_0; -#else - (void)input_a; - (void)input_b; - (void)output_ch; - (void)out_shift; - (void)out_mult; - (void)out_offset; - (void)activation_min; - (void)activation_max; - (void)num_col_a; - (void)output_bias; - (void)out_0; - /* To be completed */ - return NULL; -#endif -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_s8.c deleted file mode 100644 index d0271d06..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ConvolutionFunctions/arm_nn_mat_mult_s8.c +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_s8.c - * Description: General Matrix-multiplication function - * - * $Date: May 29, 2020 - * $Revision: V.2.0.3 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/* - * s8 General matrix multiplication function with per-channel requantization for upto 4 column batches. - * - * Refer header file for details. - * - */ - -q7_t *arm_nn_mat_mult_s8(const q7_t *input_row, - const q7_t *input_col, - const uint16_t output_ch, - const uint16_t col_batches, - const int32_t *output_shift, - const int32_t *output_mult, - const int32_t out_offset, - const int32_t col_offset, - const int32_t row_offset, - const int16_t activation_min, - const int16_t activation_max, - const uint16_t row_len, - const int32_t *const bias, - q7_t *out) -{ -#if defined(ARM_MATH_MVEI) - (void)row_offset; - if (col_batches == 4) - { - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32_t row_len_tmp = row_len; - const int8_t *ip_r0 = input_row + (i_out_ch * row_len); - const int8_t *ip_c0 = input_col; - const int8_t *ip_c1 = input_col + row_len; - const int8_t *ip_c2 = input_col + (2 * row_len); - const int8_t *ip_c3 = input_col + (3 * row_len); - - int32_t acc_0 = bias[i_out_ch]; - int32_t acc_1 = bias[i_out_ch]; - int32_t acc_2 = bias[i_out_ch]; - int32_t acc_3 = bias[i_out_ch]; - const int32_t row_loop_cnt = (row_len + 7) / 8; - - for (int i_row_loop = 0; i_row_loop < row_loop_cnt; i_row_loop++) - { - mve_pred16_t p = vctp16q((uint32_t)row_len_tmp); - const int16x8_t offset = vdupq_m_n_s16(vuninitializedq_s16(), col_offset, p); - row_len_tmp -= 8; - - int16x8_t r0 = vldrbq_z_s16(ip_r0, p); - ip_r0 += 8; - - int16x8_t c0 = vldrbq_z_s16(ip_c0, p); - ip_c0 += 8; - c0 = vaddq_m_s16(vuninitializedq_s16(), c0, offset, p); - - int16x8_t c1 = vldrbq_z_s16(ip_c1, p); - ip_c1 += 8; - c1 = vaddq_m_s16(vuninitializedq_s16(), c1, offset, p); - - int16x8_t c2 = vldrbq_z_s16(ip_c2, p); - ip_c2 += 8; - c2 = vaddq_m_s16(vuninitializedq_s16(), c2, offset, p); - - int16x8_t c3 = vldrbq_z_s16(ip_c3, p); - ip_c3 += 8; - c3 = vaddq_m_s16(vuninitializedq_s16(), c3, offset, p); - - acc_0 = vmladavaq_p_s16(acc_0, r0, c0, p); - acc_1 = vmladavaq_p_s16(acc_1, r0, c1, p); - acc_2 = vmladavaq_p_s16(acc_2, r0, c2, p); - acc_3 = vmladavaq_p_s16(acc_3, r0, c3, p); - } - - int32x4_t res = {acc_0, acc_1, acc_2, acc_3}; - res = arm_requantize_mve(res, output_mult[i_out_ch], output_shift[i_out_ch]); - res = vaddq_n_s32(res, out_offset); - - res = vmaxq_s32(res, vdupq_n_s32(activation_min)); - res = vminq_s32(res, vdupq_n_s32(activation_max)); - - const uint32x4_t scatter_offset = {0, output_ch, output_ch * 2, output_ch * 3}; - vstrbq_scatter_offset_s32(&out[i_out_ch], scatter_offset, res); - } - out += 4 * output_ch; - } - else - { - for (int i_col_batch = (col_batches & ~0x3); i_col_batch < (col_batches & 0x3); i_col_batch++) - { - for (int i_out_ch = 0; i_out_ch < output_ch; i_out_ch++) - { - int32_t row_len_tmp = row_len; - - const int8_t *ip_r0 = input_row + (i_out_ch * row_len); - const int8_t *ip_c0 = input_col + (i_col_batch * row_len); - int32_t acc_0 = bias[i_out_ch]; - const int32_t row_loop_cnt = (row_len + 7) / 8; - - for (int i_row_loop = 0; i_row_loop < row_loop_cnt; i_row_loop++) - { - const mve_pred16_t p = vctp16q((uint32_t)row_len_tmp); - const int16x8_t offset = vdupq_m_n_s16(vuninitializedq_s16(), col_offset, p); - row_len_tmp -= 8; - - int16x8_t r0 = vldrbq_z_s16(ip_r0, p); - ip_r0 += 8; - int16x8_t c0 = vldrbq_z_s16(ip_c0, p); - ip_c0 += 8; - - c0 = vaddq_m_s16(vuninitializedq_s16(), c0, offset, p); - acc_0 = vmladavaq_p_s16(acc_0, r0, c0, p); - } - - acc_0 = arm_nn_requantize(acc_0, output_mult[i_out_ch], output_shift[i_out_ch]); - acc_0 += out_offset; - acc_0 = MAX(acc_0, activation_min); - acc_0 = MIN(acc_0, activation_max); - out[i_out_ch] = (q7_t)acc_0; - } - out += output_ch; - } - } - return out; - -#else - (void)input_row; - (void)input_col; - (void)output_ch; - (void)col_batches; - (void)output_shift; - (void)output_mult; - (void)out_offset; - (void)col_offset; - (void)row_offset; - (void)activation_min; - (void)activation_max; - (void)row_len; - (void)bias; - (void)out; - return NULL; -#endif -} diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15.c deleted file mode 100644 index 92bffbfd..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15.c +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_mat_q7_vec_q15.c - * Description: Mixed Q15-Q7 fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Mixed Q15-Q7 fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * vec_buffer size: 0 - * - * Q7_Q15 version of the fully connected layer - * - * Weights are in q7_t and Activations are in q15_t - * - */ - -arm_status -arm_fully_connected_mat_q7_vec_q15(const q15_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q15_t * pOut, - q15_t * vec_buffer) -{ - (void)vec_buffer; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q7_t *pB = pM; - const q7_t *pB2; - q15_t *pO = pOut; - const q7_t *pBias = bias; - const q15_t *pA = pV; - - uint16_t rowCnt = num_of_rows >> 1; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - pB2 = pB + dim_vec; - - while (colCnt) - { - q31_t inV, inM11, inM12, inM21, inM22; - pB = read_and_pad(pB, &inM11, &inM12); - pB2 = read_and_pad(pB2, &inM21, &inM22); - - inV = arm_nn_read_q15x2_ia(&pA); - - sum = __SMLAD(inV, inM11, sum); - sum2 = __SMLAD(inV, inM21, sum2); - - inV = arm_nn_read_q15x2_ia(&pA); - - sum = __SMLAD(inV, inM12, sum); - sum2 = __SMLAD(inV, inM22, sum2); - - colCnt--; - } - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - q7_t inM2 = *pB2++; - - sum += inV * inM; - sum2 += inV * inM2; - colCnt--; - } /* while over colCnt */ - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum2 >> out_shift), 16)); - - /*adjust the pointers and counters */ - pB += dim_vec; - rowCnt--; - } - - /* left-over part of the rows */ - rowCnt = num_of_rows & 0x1; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - - while (colCnt) - { - q31_t inV1, inV2, inM11, inM12; - - pB = read_and_pad(pB, &inM11, &inM12); - - inV1 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV1, inM11, sum); - - inV2 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV2, inM12, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - sum += inV * inM; - colCnt--; - } - - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - - rowCnt--; - } - -#else - int i, j; - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - for (i = 0; i < num_of_rows; i++) - { - int ip_out = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - for (j = 0; j < dim_vec; j++) - { - ip_out += pV[j] * pM[i * dim_vec + j]; - } - pOut[i] = (q15_t) __SSAT((ip_out >> out_shift), 16); - } - -#endif /* ARM_MATH_DSP */ - - /* Return to ARM_MATH_SUCCESS */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15_opt.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15_opt.c deleted file mode 100644 index f2debef1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_mat_q7_vec_q15_opt.c +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_mat_q7_vec_q15_opt.c - * Description: Mixed Q15-Q7 opt fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Mixed Q15-Q7 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * vec_buffer size: 0 - * - * Q7_Q15 version of the fully connected layer - * - * Weights are in q7_t and Activations are in q15_t - * - * Limitation: x4 version requires weight reordering to work - * - * Here we use only one pointer to read 4 rows in the weight - * matrix. So if the original q7_t matrix looks like this: - * - * | a11 | a12 | a13 | a14 | a15 | a16 | a17 | - * - * | a21 | a22 | a23 | a24 | a25 | a26 | a27 | - * - * | a31 | a32 | a33 | a34 | a35 | a36 | a37 | - * - * | a41 | a42 | a43 | a44 | a45 | a46 | a47 | - * - * | a51 | a52 | a53 | a54 | a55 | a56 | a57 | - * - * | a61 | a62 | a63 | a64 | a65 | a66 | a67 | - * - * We operates on multiple-of-4 rows, so the first four rows becomes - * - * | a11 | a21 | a12 | a22 | a31 | a41 | a32 | a42 | - * - * | a13 | a23 | a14 | a24 | a33 | a43 | a34 | a44 | - * - * | a15 | a25 | a16 | a26 | a35 | a45 | a36 | a46 | - * - * The column left over will be in-order. - * which is: - * | a17 | a27 | a37 | a47 | - * - * For the left-over rows, we do 1x1 computation, so the data remains - * as its original order. - * - * So the stored weight matrix looks like this: - * - * | a11 | a21 | a12 | a22 | a31 | a41 | - * - * | a32 | a42 | a13 | a23 | a14 | a24 | - * - * | a33 | a43 | a34 | a44 | a15 | a25 | - * - * | a16 | a26 | a35 | a45 | a36 | a46 | - * - * | a17 | a27 | a37 | a47 | a51 | a52 | - * - * | a53 | a54 | a55 | a56 | a57 | a61 | - * - * | a62 | a63 | a64 | a65 | a66 | a67 | - * - */ - -arm_status -arm_fully_connected_mat_q7_vec_q15_opt(const q15_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, const q7_t * bias, q15_t * pOut, q15_t * vec_buffer) -{ - - (void)vec_buffer; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q7_t *pB = pM; - q15_t *pO = pOut; - const q7_t *pBias = bias; - const q15_t *pA = pV; - - uint16_t rowCnt = num_of_rows >> 2; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 1; - - pA = pV; - -#ifdef USE_INTRINSIC - -#ifndef ARM_MATH_BIG_ENDIAN - - while (colCnt) - { - q31_t inM11, inM12, inM13, inM14; - q31_t inV; - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM11, inV, sum); - sum2 = __SMLAD(inM12, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM13, inV, sum3); - sum4 = __SMLAD(inM14, inV, sum4); - colCnt--; - } - -#else - - while (colCnt) - { - q31_t inM11, inM12, inM13, inM14; - q31_t inV; - - inV = *__SIMD32(pA)++; - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM12, inV, sum); - sum2 = __SMLAD(inM11, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM14, inV, sum3); - sum4 = __SMLAD(inM13, inV, sum4); - colCnt--; - } - -#endif /* ARM_MATH_BIG_ENDIAN */ - -#else - - /* - * register needed: - * loop counter: colCnt - * accumulators: sum, sum2, sum3, sum4 - * pointers: pB, pA - * weight data: inM11, inM12, inM13, inM14 - * activation data: inV - */ - -#ifndef ARM_MATH_BIG_ENDIAN - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r4, [%[pA]], #4\n" - "ldr.w r1, [%[pB]], #8\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r1, %[sum]\n" - "smlad %[sum2], r4, r0, %[sum2]\n" - "ldr.w r3, [%[pB], #-4]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r3, %[sum3]\n" - "smlad %[sum4], r4, r2, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] "+r"(sum), - [sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt):"r0", "r1", "r2", "r3", "r4"); -#else - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r4, [%[pA]], #4\n" - "ldr.w r1, [%[pB]], #8\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r0, %[sum]\n" - "smlad %[sum2], r4, r1, %[sum2]\n" - "ldr.w r3, [%[pB], #-4]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r2, %[sum3]\n" - "smlad %[sum4], r4, r3, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] "+r"(sum), - [sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt):"r0", "r1", "r2", "r3", "r4"); -#endif /* ARM_MATH_BIG_ENDIAN */ - -#endif /* USE_INTRINSIC */ - - colCnt = dim_vec & 0x1; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - q7_t inM2 = *pB++; - q7_t inM3 = *pB++; - q7_t inM4 = *pB++; - - sum += inV * inM; - sum2 += inV * inM2; - sum3 += inV * inM3; - sum4 += inV * inM4; - colCnt--; - } /* while over colCnt */ - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum2 >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum3 >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum4 >> out_shift), 16)); - - /* adjust the pointers and counters */ - rowCnt--; - } - - /* left-over part of the rows */ - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - - while (colCnt) - { - q31_t inV1, inV2, inM11, inM12; - - pB = read_and_pad(pB, &inM11, &inM12); - - inV1 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV1, inM11, sum); - - inV2 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV2, inM12, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - sum += inV * inM; - colCnt--; - } - - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - - rowCnt--; - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - uint16_t rowCnt = num_of_rows >> 2; - const q7_t *pB = pM; - const q15_t *pA; - q15_t *pO = pOut; - const q7_t *pBias = bias; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = dim_vec >> 1; - - pA = pV; - - while (colCnt) - { - q15_t inA1 = *pA++; - q15_t inA2 = *pA++; - - q7_t inB1 = *pB++; - q7_t inB3 = *pB++; - q7_t inB2 = *pB++; - q7_t inB4 = *pB++; - - sum += inA1 * inB1 + inA2 * inB2; - sum2 += inA1 * inB3 + inA2 * inB4; - - inB1 = *pB++; - inB3 = *pB++; - inB2 = *pB++; - inB4 = *pB++; - - sum3 += inA1 * inB1 + inA2 * inB2; - sum4 += inA1 * inB3 + inA2 * inB4; - - colCnt--; - } - - colCnt = dim_vec & 0x1; - while (colCnt) - { - q15_t inA = *pA++; - q7_t inB = *pB++; - sum += inA * inB; - inB = *pB++; - sum2 += inA * inB; - inB = *pB++; - sum3 += inA * inB; - inB = *pB++; - sum4 += inA * inB; - - colCnt--; - } - *pO++ = (q15_t) __SSAT((sum >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum2 >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum3 >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum4 >> out_shift), 16); - - rowCnt--; - } - - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - int ip_out = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - int j; - - pA = pV; - for (j = 0; j < dim_vec; j++) - { - q15_t inA = *pA++; - q7_t inB = *pB++; - ip_out += inA * inB; - } - *pO++ = (q15_t) __SSAT((ip_out >> out_shift), 16); - - rowCnt--; - } - -#endif /* ARM_MATH_DSP */ - - /* Return to ARM_MATH_SUCCESS */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15.c deleted file mode 100644 index 79413cbd..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15.c +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_q15.c - * Description: Q15 basic fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Q15 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * - * @details - * - * Buffer size: - * - * vec_buffer size: 0 - * - */ - -arm_status -arm_fully_connected_q15(const q15_t * pV, - const q15_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q15_t * bias, - q15_t * pOut, - q15_t * vec_buffer) -{ - (void)vec_buffer; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q15_t *pB = pM; - const q15_t *pB2 = pB + dim_vec; - q15_t *pO = pOut; - const q15_t *pA; - const q15_t *pBias = bias; - uint16_t rowCnt = num_of_rows >> 1; - - /* this loop loops over different output */ - while (rowCnt) { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - pB2 = pB + dim_vec; - - while (colCnt) - { - q31_t inV1, inM1, inM2; - inV1 = arm_nn_read_q15x2_ia(&pA); - inM1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inV1, inM1, sum); - inM2 = arm_nn_read_q15x2_ia(&pB2); - sum2 = __SMLAD(inV1, inM2, sum2); - - inV1 = arm_nn_read_q15x2_ia(&pA); - inM1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inV1, inM1, sum); - inM2 = arm_nn_read_q15x2_ia(&pB2); - sum2 = __SMLAD(inV1, inM2, sum2); - - colCnt--; - } - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q15_t inM = *pB++; - q15_t inM2 = *pB2++; - - sum += inV * inM; - sum2 += inV * inM2; - colCnt--; - } /* while over colCnt */ - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum2>> out_shift), 16)); - - /* adjust the pointers and counters */ - pB = pB + dim_vec; - rowCnt --; - } - - rowCnt = num_of_rows & 0x1; - - while (rowCnt) { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - - while (colCnt) { - q31_t inV1, inM1; - inV1 = arm_nn_read_q15x2_ia(&pA); - inM1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inV1, inM1, sum); - - inV1 = arm_nn_read_q15x2_ia(&pA); - inM1 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inV1, inM1, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while(colCnt) { - q15_t inV = *pA++; - q15_t inM = *pB++; - - sum += inV * inM; - - colCnt--; - } - - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - - rowCnt --; - } - -#else - int i, j; - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - for (i = 0; i < num_of_rows; i++) - { - int ip_out = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - for (j = 0; j < dim_vec; j++) - { - ip_out += pV[j] * pM[i * dim_vec + j]; - } - pOut[i] = (q15_t) __SSAT((ip_out >> out_shift), 16); - } - -#endif /* ARM_MATH_DSP */ - - /* Return to application */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15_opt.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15_opt.c deleted file mode 100644 index d495342e..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q15_opt.c +++ /dev/null @@ -1,332 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_q15_opt.c - * Description: Q15 opt fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Q15 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * - * @details - * - * Buffer size: - * - * vec_buffer size: 0 - * - * Here we use only one pointer to read 4 rows in the weight - * matrix. So if the original matrix looks like this: - * - * | a11 | a12 | a13 | - * - * | a21 | a22 | a23 | - * - * | a31 | a32 | a33 | - * - * | a41 | a42 | a43 | - * - * | a51 | a52 | a53 | - * - * | a61 | a62 | a63 | - * - * We operates on multiple-of-4 rows, so the first four rows becomes - * - * | a11 | a12 | a21 | a22 | a31 | a32 | a41 | a42 | - * - * | a13 | a23 | a33 | a43 | - * - * Remaining rows are kept the same original order. - * - * So the stored weight matrix looks like this: - * - * - * | a11 | a12 | a21 | a22 | a31 | a32 | a41 | a42 | - * - * | a13 | a23 | a33 | a43 | a51 | a52 | a53 | a61 | - * - * | a62 | a63 | - */ - -arm_status -arm_fully_connected_q15_opt(const q15_t * pV, - const q15_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q15_t * bias, - q15_t * pOut, - q15_t * vec_buffer) -{ - (void)vec_buffer; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q15_t *pB = pM; - q15_t *pO = pOut; - const q15_t *pBias = bias; - const q15_t *pA = pV; - - uint16_t rowCnt = num_of_rows >> 2; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 1; - - pA = pV; - -#ifdef USE_INTRINSIC - - while (colCnt) - { - q31_t inM11, inM12, inM13, inM14; - q31_t inV; - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q15x2_ia(&pB); - sum = __SMLAD(inV, inM11, sum); - inM12 = arm_nn_read_q15x2_ia(&pB); - sum2 = __SMLAD(inV, inM12, sum2); - inM13 = arm_nn_read_q15x2_ia(&pB); - sum3 = __SMLAD(inV, inM13, sum3); - inM14 = arm_nn_read_q15x2_ia(&pB); - sum4 = __SMLAD(inV, inM14, sum4); - colCnt--; - } - -#else - - /* - * register needed: - * loop counter: colCnt - * accumulators: sum, sum2, sum3, sum4 - * pointers: pB, pA - * weight data: inM11, inM12, inM13, inM14 - * activation data: inV - */ - - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r4, [%[pA]], #4\n" - "ldr.w r0, [%[pB]], #16\n" - "smlad %[sum], r4, r0, %[sum]\n" - "ldr.w r1, [%[pB] , #-12]\n" - "smlad %[sum2], r4, r1, %[sum2]\n" - "ldr.w r2, [%[pB] , #-8]\n" - "smlad %[sum3], r4, r2, %[sum3]\n" - "ldr.w r3, [%[pB] , #-4]\n" - "smlad %[sum4], r4, r3, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] "+r"(sum), - [sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt):"r0", "r1", "r2", "r3", "r4"); - -#endif /* USE_INTRINSIC */ - - colCnt = dim_vec & 0x1; - while (colCnt) - { - - q15_t inV = *pA++; - q15_t inM = *pB++; - q15_t inM2 = *pB++; - q15_t inM3 = *pB++; - q15_t inM4 = *pB++; - - sum += inV * inM; - sum2 += inV * inM2; - sum3 += inV * inM3; - sum4 += inV * inM4; - colCnt--; - } /* while over colCnt */ - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum2 >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum3 >> out_shift), 16)); - *pO++ = (q15_t) (__SSAT((sum4 >> out_shift), 16)); - - /* adjust the pointers and counters */ - rowCnt--; - } - - /* left-over part of the rows */ - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - - while (colCnt) - { - q31_t inV1, inV2, inM1, inM2; - - inM1 = arm_nn_read_q15x2_ia(&pB); - inV1 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV1, inM1, sum); - - inM2 = arm_nn_read_q15x2_ia(&pB); - inV2 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV2, inM2, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q15_t inM = *pB++; - sum += inV * inM; - colCnt--; - } - - *pO++ = (q15_t) (__SSAT((sum >> out_shift), 16)); - - rowCnt--; - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - uint16_t rowCnt = num_of_rows >> 2; - const q15_t *pB = pM; - const q15_t *pA; - q15_t *pO = pOut; - const q15_t *pBias = bias; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 1; - - pA = pV; - while (colCnt) - { - q15_t inA1 = *pA++; - q15_t inA2 = *pA++; - - q15_t inB1 = *pB++; - q15_t inB2 = *pB++; - sum += inA1 * inB1 + inA2 * inB2; - - inB1 = *pB++; - inB2 = *pB++; - sum2 += inA1 * inB1 + inA2 * inB2; - - inB1 = *pB++; - inB2 = *pB++; - sum3 += inA1 * inB1 + inA2 * inB2; - - inB1 = *pB++; - inB2 = *pB++; - sum4 += inA1 * inB1 + inA2 * inB2; - - colCnt--; - } - colCnt = dim_vec & 0x1; - while (colCnt) - { - q15_t inA = *pA++; - q15_t inB = *pB++; - sum += inA * inB; - inB = *pB++; - sum2 += inA * inB; - inB = *pB++; - sum3 += inA * inB; - inB = *pB++; - sum4 += inA * inB; - colCnt--; - } - *pO++ = (q15_t) __SSAT((sum >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum2 >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum3 >> out_shift), 16); - *pO++ = (q15_t) __SSAT((sum4 >> out_shift), 16); - - rowCnt--; - } - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - int ip_out = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - int j; - - pA = pV; - for (j = 0; j < dim_vec; j++) - { - q15_t inA = *pA++; - q15_t inB = *pB++; - ip_out += inA * inB; - } - *pO++ = (q15_t) __SSAT((ip_out >> out_shift), 16); - - rowCnt--; - } - -#endif /* ARM_MATH_DSP */ - - /* Return to ARM_MATH_SUCCESS */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7.c deleted file mode 100644 index 12dc6f1c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7.c +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_q7.c - * Description: Q7 basic fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Q7 basic fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * vec_buffer size: dim_vec - * - * This basic function is designed to work with regular weight - * matrix without interleaving. - * - */ - -arm_status -arm_fully_connected_q7(const q7_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, const q7_t * bias, q7_t * pOut, q15_t * vec_buffer) -{ - -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q7_t *pB = pM; - const q7_t *pB2; - q7_t *pO = pOut; - const q7_t *pBias = bias; - const q15_t *pA; - uint16_t rowCnt = num_of_rows >> 1; - - /* expand the vector into the buffer */ - arm_q7_to_q15_reordered_no_shift(pV, vec_buffer, dim_vec); - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = dim_vec >> 2; - - pA = vec_buffer; - pB2 = pB + dim_vec; - - while (colCnt) - { - q31_t inV, inM11, inM12, inM21, inM22; - pB = read_and_pad_reordered(pB, &inM11, &inM12); - pB2 = read_and_pad_reordered(pB2, &inM21, &inM22); - - inV = arm_nn_read_q15x2_ia(&pA); - - sum = __SMLAD(inV, inM11, sum); - sum2 = __SMLAD(inV, inM21, sum2); - - inV = arm_nn_read_q15x2_ia(&pA); - - sum = __SMLAD(inV, inM12, sum); - sum2 = __SMLAD(inV, inM22, sum2); - - colCnt--; - } - colCnt = dim_vec & 0x3; - while (colCnt) - { - q7_t inV = *pA++; - q15_t inM = *pB++; - q15_t inM2 = *pB2++; - - sum += inV * inM; - sum2 += inV * inM2; - colCnt--; - } /* while over colCnt */ - *pO++ = (q7_t) (__SSAT((sum >> out_shift), 8)); - *pO++ = (q7_t) (__SSAT((sum2 >> out_shift), 8)); - - /* adjust the pointers and counters */ - pB += dim_vec; - rowCnt--; - } - - /* left-over part of the rows */ - rowCnt = num_of_rows & 0x1; - - while (rowCnt) - { - uint16_t colCnt = dim_vec >> 2; - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - pA = vec_buffer; - - while (colCnt) - { - q31_t inV1, inV2, inM11, inM12; - - pB = read_and_pad_reordered(pB, &inM11, &inM12); - - inV1 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV1, inM11, sum); - - inV2 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV2, inM12, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while (colCnt) - { - q7_t inV = *pA++; - q15_t inM = *pB++; - sum += inV * inM; - colCnt--; - } - - *pO++ = (q7_t) (__SSAT((sum >> out_shift), 8)); - - rowCnt--; - } - -#else - int i, j; - - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - for (i = 0; i < num_of_rows; i++) - { - int ip_out = ((q31_t)(bias[i]) << bias_shift) + NN_ROUND(out_shift); - for (j = 0; j < dim_vec; j++) - { - ip_out += pV[j] * pM[i * dim_vec + j]; - } - pOut[i] = (q7_t) __SSAT((ip_out >> out_shift), 8); - } - -#endif /* ARM_MATH_DSP */ - - /* Return to ARM_MATH_SUCCESS */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7_opt.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7_opt.c deleted file mode 100644 index ee7faa9d..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_q7_opt.c +++ /dev/null @@ -1,484 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_q7_opt.c - * Description: Q7 basic fully-connected layer function - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - - /** - * @brief Q7 opt fully-connected layer function - * @param[in] pV pointer to input vector - * @param[in] pM pointer to matrix weights - * @param[in] dim_vec length of the vector - * @param[in] num_of_rows number of rows in weight matrix - * @param[in] bias_shift amount of left-shift for bias - * @param[in] out_shift amount of right-shift for output - * @param[in] bias pointer to bias - * @param[in,out] pOut pointer to output vector - * @param[in,out] vec_buffer pointer to buffer space for input - * @return The function returns ARM_MATH_SUCCESS - * - * @details - * - * Buffer size: - * - * vec_buffer size: dim_vec - * - * This opt function is designed to work with interleaved weight - * matrix. The vector input is assumed in q7_t format, we call - * arm_q7_to_q15_no_shift_shuffle function to expand into - * q15_t format with certain weight re-ordering, refer to the function - * comments for more details. - * Here we use only one pointer to read 4 rows in the weight - * matrix. So if the original q7_t matrix looks like this: - * - * | a11 | a12 | a13 | a14 | a15 | a16 | a17 | - * - * | a21 | a22 | a23 | a24 | a25 | a26 | a27 | - * - * | a31 | a32 | a33 | a34 | a35 | a36 | a37 | - * - * | a41 | a42 | a43 | a44 | a45 | a46 | a47 | - * - * | a51 | a52 | a53 | a54 | a55 | a56 | a57 | - * - * | a61 | a62 | a63 | a64 | a65 | a66 | a67 | - * - * - * We operates on multiple-of-4 rows, so the first four rows becomes - * - * | a11 | a21 | a13 | a23 | a31 | a41 | a33 | a43 | - * - * | a12 | a22 | a14 | a24 | a32 | a42 | a34 | a44 | - * - * | a15 | a25 | a35 | a45 | a16 | a26 | a36 | a46 | - * - * So within the kernel, we first read the re-ordered vector in as: - * - * | b1 | b3 | and | b2 | b4 | - * - * the four q31_t weights will look like - * - * | a11 | a13 |, | a21 | a23 |, | a31 | a33 |, | a41 | a43 | - * - * | a12 | a14 |, | a22 | a24 |, | a32 | a34 |, | a42 | a44 | - * - * The column left over will be in-order. - * which is: - * - * | a17 | a27 | a37 | a47 | - * - * For the left-over rows, we do 1x1 computation, so the data remains - * as its original order. - * - * So the stored weight matrix looks like this: - * - * | a11 | a21 | a13 | a23 | a31 | a41 | - * - * | a33 | a43 | a12 | a22 | a14 | a24 | - * - * | a32 | a42 | a34 | a44 | a15 | a25 | - * - * | a35 | a45 | a16 | a26 | a36 | a46 | - * - * | a17 | a27 | a37 | a47 | a51 | a52 | - * - * | a53 | a54 | a55 | a56 | a57 | a61 | - * - * | a62 | a63 | a64 | a65 | a66 | a67 | - * - * - */ - -arm_status -arm_fully_connected_q7_opt(const q7_t * pV, - const q7_t * pM, - const uint16_t dim_vec, - const uint16_t num_of_rows, - const uint16_t bias_shift, - const uint16_t out_shift, - const q7_t * bias, - q7_t * pOut, - q15_t * vec_buffer) -{ - -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - const q7_t *pB = pM; - q7_t *pO = pOut; - const q7_t *pBias = bias; - const q15_t *pA; - uint16_t rowCnt = num_of_rows >> 2; - - arm_q7_to_q15_reordered_no_shift(pV, vec_buffer, dim_vec); - - while (rowCnt) - { - - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = vec_buffer; - -#ifdef USE_INTRINSIC - -#ifndef ARM_MATH_BIG_ENDIAN - while (colCnt) - { - q31_t inM11, inM12, inM13, inM14; - q31_t inV; - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM11, inV, sum); - sum2 = __SMLAD(inM12, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM13, inV, sum3); - sum4 = __SMLAD(inM14, inV, sum4); - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM11, inV, sum); - sum2 = __SMLAD(inM12, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM13, inV, sum3); - sum4 = __SMLAD(inM14, inV, sum4); - colCnt--; - } -#else - while (colCnt) - { - q31_t inM11, inM12, inM13, inM14; - q31_t inV; - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM12, inV, sum); - sum2 = __SMLAD(inM11, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM14, inV, sum3); - sum4 = __SMLAD(inM13, inV, sum4); - - inV = arm_nn_read_q15x2_ia(&pA); - inM11 = arm_nn_read_q7x4_ia(&pB); - inM12 = __SXTB16(__ROR(inM11, 8)); - inM11 = __SXTB16(inM11); - sum = __SMLAD(inM12, inV, sum); - sum2 = __SMLAD(inM11, inV, sum2); - inM13 = arm_nn_read_q7x4_ia(&pB); - inM14 = __SXTB16(__ROR(inM13, 8)); - inM13 = __SXTB16(inM13); - sum3 = __SMLAD(inM14, inV, sum3); - sum4 = __SMLAD(inM13, inV, sum4); - colCnt--; - } -#endif /* ARM_MATH_BIG_ENDIAN */ - -#else - - /* - * register needed: - * loop counter: colCnt - * accumulators: sum, sum2, sum3, sum4 - * pointers: pB, pA - * weight data: inM11, inM12, inM13, inM14 - * activation data: inV - */ - -#ifndef ARM_MATH_BIG_ENDIAN - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r4, [%[pA]], #8\n" - "ldr.w r1, [%[pB]], #16\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r1, %[sum]\n" - "smlad %[sum2], r4, r0, %[sum2]\n" - "ldr.w r3, [%[pB], #-12]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r3, %[sum3]\n" - "smlad %[sum4], r4, r2, %[sum4]\n" - "ldr.w r4, [%[pA], #-4]\n" - "ldr.w r1, [%[pB], #-8]\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r1, %[sum]\n" - "smlad %[sum2], r4, r0, %[sum2]\n" - "ldr.w r3, [%[pB], #-4]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r3, %[sum3]\n" - "smlad %[sum4], r4, r2, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] "+r"(sum), - [sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt):"r0", "r1", "r2", "r3", "r4"); -#else - asm volatile ("COL_LOOP_%=:\n" - "ldr.w r4, [%[pA]], #8\n" - "ldr.w r1, [%[pB]], #16\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r0, %[sum]\n" - "smlad %[sum2], r4, r1, %[sum2]\n" - "ldr.w r3, [%[pB], #-12]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r2, %[sum3]\n" - "smlad %[sum4], r4, r3, %[sum4]\n" - "ldr.w r4, [%[pA], #-4]\n" - "ldr.w r1, [%[pB], #-8]\n" - "mov.w r0, r1, ror #8\n" - "sxtb16 r0, r0\n" - "sxtb16 r1, r1\n" - "smlad %[sum], r4, r0, %[sum]\n" - "smlad %[sum2], r4, r1, %[sum2]\n" - "ldr.w r3, [%[pB], #-4]\n" - "mov.w r2, r3, ror #8\n" - "sxtb16 r2, r2\n" - "sxtb16 r3, r3\n" - "smlad %[sum3], r4, r2, %[sum3]\n" - "smlad %[sum4], r4, r3, %[sum4]\n" - "subs %[colCnt], #1\n" - "bne COL_LOOP_%=\n":[sum] "+r"(sum), - [sum2] "+r"(sum2),[sum3] "+r"(sum3), - [sum4] "+r"(sum4),[pB] "+r"(pB),[pA] "+r"(pA):[colCnt] "r"(colCnt):"r0", "r1", "r2", "r3", "r4"); -#endif /* ARM_MATH_BIG_ENDIAN */ - -#endif /* USE_INTRINSIC */ - - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - q7_t inM2 = *pB++; - q7_t inM3 = *pB++; - q7_t inM4 = *pB++; - - sum += inV * inM; - sum2 += inV * inM2; - sum3 += inV * inM3; - sum4 += inV * inM4; - colCnt--; - } /* while over colCnt */ - *pO++ = (q7_t) (__SSAT((sum >> out_shift), 8)); - *pO++ = (q7_t) (__SSAT((sum2 >> out_shift), 8)); - *pO++ = (q7_t) (__SSAT((sum3 >> out_shift), 8)); - *pO++ = (q7_t) (__SSAT((sum4 >> out_shift), 8)); - - /* adjust the pointers and counters */ - rowCnt--; - } - - /* left-over part of the rows */ - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - uint16_t colCnt = dim_vec >> 2; - - pA = vec_buffer; - - while (colCnt) - { - q31_t inV1, inV2, inM11, inM12; - - pB = read_and_pad_reordered(pB, &inM11, &inM12); - - inV1 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV1, inM11, sum); - - inV2 = arm_nn_read_q15x2_ia(&pA); - sum = __SMLAD(inV2, inM12, sum); - - colCnt--; - } - - /* left-over of the vector */ - colCnt = dim_vec & 0x3; - while (colCnt) - { - q15_t inV = *pA++; - q7_t inM = *pB++; - sum += inV * inM; - colCnt--; - } - - *pO++ = (q7_t) (__SSAT((sum >> out_shift), 8)); - - rowCnt--; - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - uint16_t rowCnt = num_of_rows >> 2; - const q7_t *pB = pM; - const q7_t *pA; - q7_t *pO = pOut; - const q7_t *pBias = bias; - - while (rowCnt) - { - q31_t sum = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum2 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum3 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - q31_t sum4 = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - uint16_t colCnt = dim_vec >> 2; - - pA = pV; - - while (colCnt) - { - q7_t inA1 = *pA++; - q7_t inA3 = *pA++; - q7_t inA2 = *pA++; - q7_t inA4 = *pA++; - - q7_t inB1 = *pB++; - q7_t inB3 = *pB++; - q7_t inB2 = *pB++; - q7_t inB4 = *pB++; - - sum += inA1 * inB1 + inA2 * inB2; - sum2 += inA1 * inB3 + inA2 * inB4; - - inB1 = *pB++; - inB3 = *pB++; - inB2 = *pB++; - inB4 = *pB++; - - sum3 += inA1 * inB1 + inA2 * inB2; - sum4 += inA1 * inB3 + inA2 * inB4; - - inB1 = *pB++; - inB3 = *pB++; - inB2 = *pB++; - inB4 = *pB++; - - sum += inA3 * inB1 + inA4 * inB2; - sum2 += inA3 * inB3 + inA4 * inB4; - - inB1 = *pB++; - inB3 = *pB++; - inB2 = *pB++; - inB4 = *pB++; - - sum3 += inA3 * inB1 + inA4 * inB2; - sum4 += inA3 * inB3 + inA4 * inB4; - - colCnt--; - } - colCnt = dim_vec & 0x3; - while (colCnt) - { - q7_t inA = *pA++; - q7_t inB = *pB++; - sum += inA * inB; - inB = *pB++; - sum2 += inA * inB; - inB = *pB++; - sum3 += inA * inB; - inB = *pB++; - sum4 += inA * inB; - - colCnt--; - } - *pO++ = (q7_t) __SSAT((sum >> out_shift), 8); - *pO++ = (q7_t) __SSAT((sum2 >> out_shift), 8); - *pO++ = (q7_t) __SSAT((sum3 >> out_shift), 8); - *pO++ = (q7_t) __SSAT((sum4 >> out_shift), 8); - - rowCnt--; - } - - rowCnt = num_of_rows & 0x3; - - while (rowCnt) - { - int ip_out = ((q31_t)(*pBias++) << bias_shift) + NN_ROUND(out_shift); - - int j; - - pA = pV; - for (j = 0; j < dim_vec; j++) - { - q7_t inA = *pA++; - q7_t inB = *pB++; - ip_out += inA * inB; - } - *pO++ = (q7_t) __SSAT((ip_out >> out_shift), 8); - - rowCnt--; - } - -#endif /* ARM_MATH_DSP */ - - /* Return to ARM_MATH_SUCCESS */ - return (ARM_MATH_SUCCESS); - -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_s8.c deleted file mode 100644 index 9775aaaa..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/FullyConnectedFunctions/arm_fully_connected_s8.c +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_fully_connected_s8 - * Description: Fully connected function compatible with TF Lite. - * - * $Date: May 2, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M and Cortex-A cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup FC - * @{ - */ - -/* - * S8 basic fully-connected and matrix multiplication layer function for TensorFlow Lite - * - * Refer header file for details. - * - */ - -arm_status -arm_fully_connected_s8(const cmsis_nn_context *ctx, - const cmsis_nn_fc_params *fc_params, - const cmsis_nn_per_tensor_quant_params *quant_params, - const cmsis_nn_dims *input_dims, - const q7_t *input, - const cmsis_nn_dims *filter_dims, - const q7_t *kernel, - const cmsis_nn_dims *bias_dims, - const int32_t *bias, - const cmsis_nn_dims *output_dims, - q7_t *output) -{ - (void)bias_dims; - (void)ctx; - int32_t batch_cnt = input_dims->n; - - while (batch_cnt) - { - arm_nn_vec_mat_mult_t_s8(input, - kernel, - bias, - output, - fc_params->input_offset, - fc_params->filter_offset, - fc_params->output_offset, - quant_params->multiplier, - quant_params->shift, - filter_dims->n, /* col_dim or accum_depth */ - output_dims->c, /* row_dim or output_depth */ - fc_params->activation.min, - fc_params->activation.max); - input += filter_dims->n; - output += output_dims->c; - batch_cnt--; - } - return (ARM_MATH_SUCCESS); -} - -int32_t arm_fully_connected_s8_get_buffer_size(const cmsis_nn_dims *filter_dims) -{ - (void)filter_dims; - return 0; -} - -/** - * @} end of FC group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_accumulate_q7_to_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_accumulate_q7_to_q15.c deleted file mode 100644 index 7d14834e..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_accumulate_q7_to_q15.c +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_accumulate_q7_to_q15.c - * Description: Accumulate q7 vector into q15 one. - * - * $Date: May 29, 2020 - * $Revision: V.1.0.1 - * - * pSrc Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -void arm_nn_accumulate_q7_to_q15(q15_t *pDst, const q7_t *pSrc, uint32_t length) -{ - q15_t *pCnt = pDst; - const q7_t *pV = pSrc; - q31_t v1, v2, vo1, vo2; - int32_t cnt = length >> 2; - q31_t in; - - while (cnt > 0l) - { - q31_t value = arm_nn_read_q7x4_ia(&pV); - v1 = __SXTB16(__ROR((uint32_t)value, 8)); - v2 = __SXTB16(value); -#ifndef ARM_MATH_BIG_ENDIAN - vo2 = (q31_t)__PKHTB(v1, v2, 16); - vo1 = (q31_t)__PKHBT(v2, v1, 16); -#else - vo1 = (q31_t)__PKHTB(v1, v2, 16); - vo2 = (q31_t)__PKHBT(v2, v1, 16); -#endif - - in = arm_nn_read_q15x2(pCnt); - write_q15x2_ia(&pCnt, __QADD16(vo1, in)); - - in = arm_nn_read_q15x2(pCnt); - write_q15x2_ia(&pCnt, __QADD16(vo2, in)); - - cnt--; - } - cnt = length & 0x3; - while (cnt > 0l) - { - *pCnt++ += *pV++; - cnt--; - } -} - -/** - * @} end of NNBasicMath group - */ \ No newline at end of file diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_add_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_add_q7.c deleted file mode 100644 index ea549f94..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_add_q7.c +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_add_q7.c - * Description: Non saturating addition of elements of a q7 vector. - * - * $Date: July 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -void arm_nn_add_q7(const q7_t *input, q31_t *output, uint32_t block_size) -{ - uint32_t block_count; - q31_t result = 0; -#if defined(ARM_MATH_DSP) - /* Loop unrolling: Compute 4 outputs at a time */ - block_count = block_size >> 2U; - - while (block_count > 0U) - { - const int32_t mult_q15x2 = (1UL << 16) | 1UL; - q31_t in_q7x4 = arm_nn_read_q7x4_ia(&input); - q31_t temp_q15x2 = __SXTAB16(__SXTB16(in_q7x4), - __ROR((uint32_t)in_q7x4, 8)); - - result = __SMLAD(temp_q15x2, mult_q15x2, result); - - /* Decrement loop counter */ - block_count--; - } - - /* Loop unrolling: Compute remaining outputs */ - block_count = block_size & 0x3; -#else - block_count = block_size; -#endif - while (block_count > 0U) - { - /* Add and store result in destination buffer. */ - result += *input++; - - /* Decrement loop counter */ - block_count--; - } - - *output = result; -} - -/** - * @} end of NNBasicMath group - */ \ No newline at end of file diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_padded_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_padded_s8.c deleted file mode 100644 index 15e6b6dd..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_padded_s8.c +++ /dev/null @@ -1,169 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_depthwise_conv_nt_t_padded_s8.c - * Description: Depthwise convolution with padded matrices. - * - * $Date: March 17, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M processors with MVE extension - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * Depthwise convolution of transposed rhs matrix with 4 lhs matrices. One or more of the rhs matrices are padded. - * Dimensions are the same for lhs and rhs. - * - * Refer header file for details. - * - */ - -q7_t *arm_nn_depthwise_conv_nt_t_padded_s8(const q7_t *lhs, - const q7_t *rhs, - const int32_t input_offset, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t row_x_col, - const int32_t *const output_bias, - q7_t *out) -{ -#if defined(ARM_MATH_MVEI) - int32_t loop_count = (num_ch + 3) / 4; - const int32_t *bias = output_bias; - uint32_t num_ch_to_process = num_ch; - - for (int i_loop_cnt = 0, offset = 0; i_loop_cnt < loop_count; - num_ch_to_process -= 4, out += 4, offset += 4, i_loop_cnt++) - { - int32x4_t out_0 = vldrwq_s32(bias); - int32x4_t out_1 = out_0; - int32x4_t out_2 = out_0; - int32x4_t out_3 = out_0; - bias += 4; - - const int8_t *rhs_0 = rhs + offset; - const int8_t *lhs_0 = lhs + offset; - const int8_t *lhs_1 = lhs + row_x_col * num_ch + offset; - const int8_t *lhs_2 = lhs + (row_x_col * num_ch * 2) + offset; - const int8_t *lhs_3 = lhs + (row_x_col * num_ch * 3) + offset; - - for (int i_row_x_col = 0; i_row_x_col < row_x_col; i_row_x_col++) - { - const int32x4_t ker_0 = vldrbq_s32(rhs_0); - - int32x4_t ip_0 = vldrbq_s32(lhs_0); - ip_0 = vaddq_n_s32(ip_0, input_offset); - out_0 += vmulq_s32(ip_0, ker_0); - - int32x4_t ip_1 = vldrbq_s32(lhs_1); - ip_1 = vaddq_n_s32(ip_1, input_offset); - out_1 += vmulq_s32(ip_1, ker_0); - - int32x4_t ip_2 = vldrbq_s32(lhs_2); - ip_2 = vaddq_n_s32(ip_2, input_offset); - out_2 += vmulq_s32(ip_2, ker_0); - - int32x4_t ip_3 = vldrbq_s32(lhs_3); - ip_3 = vaddq_n_s32(ip_3, input_offset); - - out_3 += vmulq_s32(ip_3, ker_0); - - lhs_0 += num_ch; - lhs_1 += num_ch; - lhs_2 += num_ch; - lhs_3 += num_ch; - - rhs_0 += num_ch; - } - - const int32x4_t mult = vldrwq_s32(out_mult); - const int32x4_t shift = vldrwq_s32(out_shift); - out_mult += 4; - out_shift += 4; - - out_0 = arm_requantize_mve_32x4(out_0, mult, shift); - out_0 = vaddq_n_s32(out_0, out_offset); - out_0 = vmaxq_s32(out_0, vdupq_n_s32(activation_min)); - out_0 = vminq_s32(out_0, vdupq_n_s32(activation_max)); - mve_pred16_t p = vctp32q(num_ch_to_process); - vstrbq_p_s32(out, out_0, p); - - out_1 = arm_requantize_mve_32x4(out_1, mult, shift); - out_1 = vaddq_n_s32(out_1, out_offset); - out_1 = vmaxq_s32(out_1, vdupq_n_s32(activation_min)); - out_1 = vminq_s32(out_1, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + num_ch, out_1, p); - - out_2 = arm_requantize_mve_32x4(out_2, mult, shift); - out_2 = vaddq_n_s32(out_2, out_offset); - out_2 = vmaxq_s32(out_2, vdupq_n_s32(activation_min)); - out_2 = vminq_s32(out_2, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + 2 * num_ch, out_2, p); - - out_3 = arm_requantize_mve_32x4(out_3, mult, shift); - out_3 = vaddq_n_s32(out_3, out_offset); - out_3 = vmaxq_s32(out_3, vdupq_n_s32(activation_min)); - out_3 = vminq_s32(out_3, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + 3 * num_ch, out_3, p); - } - - const int tail_ch = num_ch & 0x3; - if (tail_ch != 0) - { - out -= (4 - tail_ch); - } - return out + (3 * num_ch); - -#else - (void)lhs; - (void)rhs; - (void)input_offset; - (void)num_ch; - (void)out_shift; - (void)out_mult; - (void)out_offset; - (void)activation_min; - (void)activation_max; - (void)row_x_col; - (void)output_bias; - (void)out; - return NULL; -#endif -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_s8.c deleted file mode 100644 index 2cfdef44..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_depthwise_conv_nt_t_s8.c +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_depthwise_conv_nt_t_s8.c - * Description: Depthwise convolution on matrices with no padding. - * - * $Date: March 17, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M processors with MVE extension. - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * Depthwise convolution of rhs matrix with 4 lhs matrices with no padding. Dimensions are the same for lhs and rhs. - * - * Refer header file for details. - * - */ - -q7_t *arm_nn_depthwise_conv_nt_t_s8(const q7_t *lhs, - const q7_t *rhs, - const int32_t input_offset, - const uint16_t num_ch, - const int32_t *out_shift, - const int32_t *out_mult, - const int32_t out_offset, - const int32_t activation_min, - const int32_t activation_max, - const uint16_t row_x_col, - const int32_t *const output_bias, - q7_t *out) -{ -#if defined(ARM_MATH_MVEI) - const int32_t *bias = output_bias; - int32_t loop_count = (num_ch + 3) / 4; - uint32_t num_ch_to_process = num_ch; - - for (int i_loop_cnt = 0, offset = 0; i_loop_cnt < loop_count; - num_ch_to_process -= 4, offset += 4, out += 4, i_loop_cnt++) - { - int32x4_t out_0 = vldrwq_s32(bias); - int32x4_t out_1 = out_0; - int32x4_t out_2 = out_0; - int32x4_t out_3 = out_0; - bias += 4; - - const int8_t *rhs_0 = rhs + offset; - const int8_t *lhs_0 = lhs + offset; - const int8_t *lhs_1 = lhs + row_x_col * num_ch + offset; - const int8_t *lhs_2 = lhs + (row_x_col * num_ch * 2) + offset; - const int8_t *lhs_3 = lhs + (row_x_col * num_ch * 3) + offset; - int32x4_t ker_sum = vdupq_n_s32(0); - - for (int i_row_x_col = 0; i_row_x_col < row_x_col; i_row_x_col++) - { - const int32x4_t ker_0 = vldrbq_s32(rhs_0); - ker_sum = vaddq_s32(ker_sum, ker_0); - - int32x4_t ip_0 = vldrbq_s32(lhs_0); - out_0 += vmulq_s32(ip_0, ker_0); - - int32x4_t ip_1 = vldrbq_s32(lhs_1); - out_1 += vmulq_s32(ip_1, ker_0); - - int32x4_t ip_2 = vldrbq_s32(lhs_2); - out_2 += vmulq_s32(ip_2, ker_0); - - int32x4_t ip_3 = vldrbq_s32(lhs_3); - out_3 += vmulq_s32(ip_3, ker_0); - - lhs_0 += num_ch; - lhs_1 += num_ch; - lhs_2 += num_ch; - lhs_3 += num_ch; - - rhs_0 += num_ch; - } - - ker_sum = vmulq_n_s32(ker_sum, input_offset); - out_0 = ker_sum + out_0; - out_1 = ker_sum + out_1; - out_2 = ker_sum + out_2; - out_3 = ker_sum + out_3; - - const int32x4_t mult = vldrwq_s32(out_mult); - const int32x4_t shift = vldrwq_s32(out_shift); - out_mult += 4; - out_shift += 4; - mve_pred16_t p = vctp32q(num_ch_to_process); - - out_0 = arm_requantize_mve_32x4(out_0, mult, shift); - out_0 = vaddq_n_s32(out_0, out_offset); - out_0 = vmaxq_s32(out_0, vdupq_n_s32(activation_min)); - out_0 = vminq_s32(out_0, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out, out_0, p); - - out_1 = arm_requantize_mve_32x4(out_1, mult, shift); - out_1 = vaddq_n_s32(out_1, out_offset); - out_1 = vmaxq_s32(out_1, vdupq_n_s32(activation_min)); - out_1 = vminq_s32(out_1, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + num_ch, out_1, p); - - out_2 = arm_requantize_mve_32x4(out_2, mult, shift); - out_2 = vaddq_n_s32(out_2, out_offset); - out_2 = vmaxq_s32(out_2, vdupq_n_s32(activation_min)); - out_2 = vminq_s32(out_2, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + 2 * num_ch, out_2, p); - - out_3 = arm_requantize_mve_32x4(out_3, mult, shift); - out_3 = vaddq_n_s32(out_3, out_offset); - out_3 = vmaxq_s32(out_3, vdupq_n_s32(activation_min)); - out_3 = vminq_s32(out_3, vdupq_n_s32(activation_max)); - vstrbq_p_s32(out + 3 * num_ch, out_3, p); - } - - const int tail_ch = num_ch & 0x3; - if (tail_ch != 0) - { - out -= (4 - tail_ch); - } - - return out + (3 * num_ch); -#else - (void)lhs; - (void)rhs; - (void)input_offset; - (void)num_ch; - (void)out_shift; - (void)out_mult; - (void)out_offset; - (void)activation_min; - (void)activation_max; - (void)row_x_col; - (void)output_bias; - (void)out; - return NULL; -#endif -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_1x_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_1x_s8.c deleted file mode 100644 index f57ee07f..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_1x_s8.c +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mul_core_1x_s8.c - * Description: General Matrix-multiplication function - * - * $Date: January 20, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * s8 matrix multiplication to process 1 row - * - * Refer header file for details. - * - */ - -arm_status arm_nn_mat_mul_core_1x_s8(int32_t row_elements, - const int8_t *row_base, - const int8_t *col_base, - int32_t *const sum_col, - int32_t *const output) -{ - int32_t acc_n0 = 0; - int32_t sum_tmp = 0; - -#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - - __asm volatile ( - " vldrb.8 q0, [%[col]], 16 \n" - " wlstp.8 lr, %[cnt], 1f \n" - "2: \n" - " vaddva.s8 %[sum], q0 \n" - " vldrb.8 q1, [%[row0]], 16 \n" - " vmladava.s8 %[out0], q0, q1 \n" - " vldrb.8 q0, [%[col]], 16 \n" - " letp lr, 2b \n" - "1: \n" - :[col] "+r"(col_base) - ,[sum] "+Te"(sum_tmp) - ,[row0] "+r"(row_base) - ,[out0] "+Te"(acc_n0) - :[cnt] "r"(row_elements) - :"q0","q1", "memory", "r14"); -#else - for (int i = 0; i < row_elements; i++) - { - sum_tmp += col_base[i]; - acc_n0 += row_base[i] * col_base[i]; - } -#endif - - *sum_col = sum_tmp; - *output = acc_n0; - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_4x_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_4x_s8.c deleted file mode 100644 index 0b240b70..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mul_core_4x_s8.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mul_core_4x_s8.c - * Description: General matrix multiplication function for MVE extension - * - * $Date: January 20, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M cores - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * s8 matrix multiplication to process 4 rows and one column - * - * Refer header file for details. - * - */ -arm_status arm_nn_mat_mul_core_4x_s8(const int32_t row_elements, - const int32_t offset, - const int8_t *row_base, - const int8_t *col_base, - int32_t *const sum_col, - int32_t *const output) -{ - int32_t acc_n0 = 0; - int32_t acc_n1 = 0; - int32_t acc_n2 = 0; - int32_t acc_n3 = 0; - - const int8_t *ip_row_0 = row_base; - const int8_t *ip_row_1 = row_base + offset; - const int8_t *ip_row_2 = row_base + (2 * offset); - const int8_t *ip_row_3 = row_base + (3 * offset); - int32_t sum_tmp = 0; - -#if defined(ARM_MATH_MVEI) && !defined(ARM_MATH_AUTOVECTORIZE) - __asm volatile( - " vldrb.8 q0, [%[col]], 16 \n" - " wlstp.8 lr, %[cnt], 1f \n" - "2: \n" - " vaddva.s8 %[sum], q0 \n" - " vldrb.8 q1, [%[row0]], 16 \n" - " vmladava.s8 %[out0], q0, q1 \n" - " vldrb.8 q2, [%[row1]], 16 \n" - " vmladava.s8 %[out1], q0, q2 \n" - " vldrb.8 q3, [%[row2]], 16 \n" - " vmladava.s8 %[out2], q0, q3 \n" - " vldrb.8 q4, [%[row3]], 16 \n" - " vmladava.s8 %[out3], q0, q4 \n" - " vldrb.8 q0, [%[col]], 16 \n" - " letp lr, 2b \n" - "1: \n" - :[col] "+r"(col_base) - ,[sum] "+Te"(sum_tmp) - ,[row0] "+r"(ip_row_0) - ,[row1] "+r"(ip_row_1) - ,[row2] "+r"(ip_row_2) - ,[row3] "+r"(ip_row_3) - ,[out0] "+Te"(acc_n0) - ,[out1] "+Te"(acc_n1) - ,[out2] "+Te"(acc_n2) - ,[out3] "+Te"(acc_n3) - : [cnt] "r"(row_elements) - : "q0", "q1", "q2", "q3", "q4", "memory", "r14"); -#else - for (int i = 0; i < row_elements; i++) - { - int32_t col = col_base[i]; - sum_tmp += col; - acc_n0 += ip_row_0[i] * col; - acc_n1 += ip_row_1[i] * col; - acc_n2 += ip_row_2[i] * col; - acc_n3 += ip_row_3[i] * col; - } -#endif - output[0] = acc_n0; - output[1] = acc_n1; - output[2] = acc_n2; - output[3] = acc_n3; - - *sum_col = sum_tmp; - - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s8.c deleted file mode 100644 index 392ab58c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s8.c +++ /dev/null @@ -1,579 +0,0 @@ -/* - * Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mat_mult_s8_nt_t_s8 - * Description: Matrix multiplication support function with the right-hand-side (rhs) matrix transposed - * - * $Date: March 17 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -// Work around for https://github.com/ARMmbed/mbed-os/issues/12568 -#define __patched_SXTB16_RORn(op1, rotate) \ -({ \ - uint32_t result; \ - __ASM ("sxtb16 %0, %1, ROR %2" : "=r" (result) : "r" (op1), "i" (rotate) ); \ - result; \ -}) -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * s8 matrix multiplication with the right-hand-side matrix transposed - * - * Refer header file for details. - * - */ -arm_status arm_nn_mat_mult_nt_t_s8(const q7_t *lhs, - const q7_t *rhs, - const q31_t *bias, - q7_t *dst, - const int32_t *dst_multipliers, - const int32_t *dst_shifts, - const int32_t lhs_rows, - const int32_t rhs_rows, - const int32_t rhs_cols, - const int32_t lhs_offset, - const int32_t dst_offset, - const int32_t activation_min, - const int32_t activation_max) -{ -#if defined(ARM_MATH_DSP) - const int32_t off0 = rhs_cols - 4; - - for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 2); rhs_rows_idx += 2) - { - const q7_t *lhs_ptr = &lhs[0]; - q7_t *dst_ptr = &dst[0]; - - q31_t lhs_offset_contribution0 = 0; - q31_t lhs_offset_contribution1 = 0; - - for (int32_t x = 0; x < rhs_cols; ++x) - { - lhs_offset_contribution0 += rhs[x]; - lhs_offset_contribution1 += rhs[x + rhs_cols]; - } - - lhs_offset_contribution0 *= lhs_offset; - lhs_offset_contribution1 *= lhs_offset; - - lhs_offset_contribution0 += bias[rhs_rows_idx]; - lhs_offset_contribution1 += bias[rhs_rows_idx + 1]; - - int32_t lhs_rows_idx = lhs_rows >> 1; - - while (lhs_rows_idx) - { - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = lhs_offset_contribution0; - q31_t res01 = lhs_offset_contribution1; - q31_t res10 = lhs_offset_contribution0; - q31_t res11 = lhs_offset_contribution1; - - int32_t rhs_cols_idx = 0; - - q31_t val0, val1, val2, val3, val4, val5; - - for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) - { - val1 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val2 = __SXTB16(val1); - val0 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val4 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val1 = __patched_SXTB16_RORn(val1, 8); - val0 = __patched_SXTB16_RORn(val0, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTB16(val4); - res00 = __SMLAD(val0, val1, res00); - val4 = __patched_SXTB16_RORn(val4, 8); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val0, val4, res01); - - // 4 x MAC res10, res11 - val0 = arm_nn_read_q7x4((const q7_t *)&lhs_ptr[off0]); - val3 = __SXTB16(val0); - val0 = __patched_SXTB16_RORn(val0, 8); - res10 = __SMLAD(val3, val2, res10); - res11 = __SMLAD(val3, val5, res11); - res10 = __SMLAD(val0, val1, res10); - val1 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res11 = __SMLAD(val0, val4, res11); - - val4 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = __SXTB16(val1); - val0 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val1 = __patched_SXTB16_RORn(val1, 8); - val0 = __patched_SXTB16_RORn(val0, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTB16(val4); - res00 = __SMLAD(val0, val1, res00); - val4 = __patched_SXTB16_RORn(val4, 8); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val0, val4, res01); - - // 4 x MAC res10, res11 - val0 = arm_nn_read_q7x4((const q7_t *)&lhs_ptr[off0]); - val3 = __SXTB16(val0); - val0 = __patched_SXTB16_RORn(val0, 8); - res10 = __SMLAD(val3, val2, res10); - res11 = __SMLAD(val3, val5, res11); - res10 = __SMLAD(val0, val1, res10); - val1 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res11 = __SMLAD(val0, val4, res11); - - val4 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = __SXTB16(val1); - val0 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val1 = __patched_SXTB16_RORn(val1, 8); - val0 = __patched_SXTB16_RORn(val0, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTB16(val4); - res00 = __SMLAD(val0, val1, res00); - val4 = __patched_SXTB16_RORn(val4, 8); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val0, val4, res01); - - // 4 x MAC res10, res11 - val0 = arm_nn_read_q7x4((const q7_t *)&lhs_ptr[off0]); - val3 = __SXTB16(val0); - val0 = __patched_SXTB16_RORn(val0, 8); - res10 = __SMLAD(val3, val2, res10); - res11 = __SMLAD(val3, val5, res11); - res10 = __SMLAD(val0, val1, res10); - val1 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res11 = __SMLAD(val0, val4, res11); - - val4 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = __SXTB16(val1); - val0 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val1 = __patched_SXTB16_RORn(val1, 8); - val0 = __patched_SXTB16_RORn(val0, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTB16(val4); - res00 = __SMLAD(val0, val1, res00); - val4 = __patched_SXTB16_RORn(val4, 8); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val0, val4, res01); - - // 4 x MAC res10, res11 - val0 = arm_nn_read_q7x4((const q7_t *)&lhs_ptr[off0]); - val3 = __SXTB16(val0); - val0 = __patched_SXTB16_RORn(val0, 8); - res10 = __SMLAD(val3, val2, res10); - res11 = __SMLAD(val3, val5, res11); - res10 = __SMLAD(val0, val1, res10); - res11 = __SMLAD(val0, val4, res11); - } - - for (; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q7_t rhs_value0 = rhs_ptr[0]; - q7_t rhs_value1 = rhs_ptr[rhs_cols]; - q7_t lhs_value = lhs_ptr[0]; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - lhs_value = lhs_ptr[rhs_cols]; - res10 += lhs_value * rhs_value0; - res11 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - res10 = arm_nn_requantize(res10, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res11 = arm_nn_requantize(res11, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - res10 += dst_offset; - res11 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - res10 = MAX(res10, activation_min); - res10 = MIN(res10, activation_max); - res11 = MAX(res11, activation_min); - res11 = MIN(res11, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr[1] = (q7_t)res01; - dst_ptr += rhs_rows; - dst_ptr[0] = (q7_t)res10; - dst_ptr[1] = (q7_t)res11; - dst_ptr += rhs_rows; - - lhs_ptr += rhs_cols; - - lhs_rows_idx--; - } - - // Left-over rows - if (lhs_rows % 2) - { - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = lhs_offset_contribution0; - q31_t res01 = lhs_offset_contribution1; - - int32_t rhs_cols_idx = 0; - - q31_t val0, val1, val2, val3, val4, val5; - for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) - { - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val5 = __SXTB16(val2); - val4 = __SXTB16(val1); - val0 = __patched_SXTB16_RORn(val0, 8); - val2 = __patched_SXTB16_RORn(val2, 8); - val1 = __patched_SXTB16_RORn(val1, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val5, val3, res00); - res00 = __SMLAD(val2, val0, res00); - res01 = __SMLAD(val5, val4, res01); - res01 = __SMLAD(val2, val1, res01); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val5 = __SXTB16(val2); - val4 = __SXTB16(val1); - val0 = __patched_SXTB16_RORn(val0, 8); - val2 = __patched_SXTB16_RORn(val2, 8); - val1 = __patched_SXTB16_RORn(val1, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val5, val3, res00); - res00 = __SMLAD(val2, val0, res00); - res01 = __SMLAD(val5, val4, res01); - res01 = __SMLAD(val2, val1, res01); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val5 = __SXTB16(val2); - val4 = __SXTB16(val1); - val0 = __patched_SXTB16_RORn(val0, 8); - val2 = __patched_SXTB16_RORn(val2, 8); - val1 = __patched_SXTB16_RORn(val1, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val5, val3, res00); - res00 = __SMLAD(val2, val0, res00); - res01 = __SMLAD(val5, val4, res01); - res01 = __SMLAD(val2, val1, res01); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = arm_nn_read_q7x4((const q7_t *)&rhs_ptr[off0]); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val3 = __SXTB16(val0); - val5 = __SXTB16(val2); - val4 = __SXTB16(val1); - val0 = __patched_SXTB16_RORn(val0, 8); - val2 = __patched_SXTB16_RORn(val2, 8); - val1 = __patched_SXTB16_RORn(val1, 8); - - // 4 x MAC res00, res01 - res00 = __SMLAD(val5, val3, res00); - res00 = __SMLAD(val2, val0, res00); - res01 = __SMLAD(val5, val4, res01); - res01 = __SMLAD(val2, val1, res01); - } - - // Left-over accumulations - for (; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q7_t rhs_value0 = rhs_ptr[0]; - q7_t rhs_value1 = rhs_ptr[rhs_cols]; - q7_t lhs_value = lhs_ptr[0]; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr[1] = (q7_t)res01; - } - - rhs += 2 * rhs_cols; - dst += 2; - } - - if (rhs_rows % 2) - { - const q7_t *lhs_ptr = &lhs[0]; - q7_t *dst_ptr = &dst[0]; - - for (int32_t lhs_rows_idx = 0; lhs_rows_idx < lhs_rows; ++lhs_rows_idx) - { - const q7_t *rhs_ptr = &rhs[0]; - q31_t res00 = bias[rhs_rows - 1]; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value = rhs_ptr[0]; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows - 1], dst_shifts[rhs_rows - 1]); - - // Add offset - res00 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr += rhs_rows; - } - } -#else - for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 2); rhs_rows_idx += 2) - { - const q7_t *lhs_ptr = &lhs[0]; - q7_t *dst_ptr = &dst[0]; - - q31_t lhs_offset_contribution0 = 0; - q31_t lhs_offset_contribution1 = 0; - - for (int32_t x = 0; x < rhs_cols; ++x) - { - lhs_offset_contribution0 += rhs[x]; - lhs_offset_contribution1 += rhs[x + rhs_cols]; - } - - lhs_offset_contribution0 *= lhs_offset; - lhs_offset_contribution1 *= lhs_offset; - - lhs_offset_contribution0 += bias[rhs_rows_idx]; - lhs_offset_contribution1 += bias[rhs_rows_idx + 1]; - - int32_t lhs_rows_idx = lhs_rows >> 1; - - while (lhs_rows_idx) - { - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = lhs_offset_contribution0; - q31_t res01 = lhs_offset_contribution1; - q31_t res10 = lhs_offset_contribution0; - q31_t res11 = lhs_offset_contribution1; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q7_t rhs_value0 = rhs_ptr[0]; - q7_t rhs_value1 = rhs_ptr[rhs_cols]; - q7_t lhs_value = lhs_ptr[0]; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - lhs_value = lhs_ptr[rhs_cols]; - res10 += lhs_value * rhs_value0; - res11 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - res10 = arm_nn_requantize(res10, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res11 = arm_nn_requantize(res11, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - res10 += dst_offset; - res11 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - res10 = MAX(res10, activation_min); - res10 = MIN(res10, activation_max); - res11 = MAX(res11, activation_min); - res11 = MIN(res11, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr[1] = (q7_t)res01; - dst_ptr += rhs_rows; - dst_ptr[0] = (q7_t)res10; - dst_ptr[1] = (q7_t)res11; - dst_ptr += rhs_rows; - - lhs_ptr += rhs_cols; - - lhs_rows_idx--; - } - - // Left-over rows - if (lhs_rows % 2) - { - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = lhs_offset_contribution0; - q31_t res01 = lhs_offset_contribution1; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q7_t rhs_value0 = rhs_ptr[0]; - q7_t rhs_value1 = rhs_ptr[rhs_cols]; - q7_t lhs_value = lhs_ptr[0]; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx], dst_shifts[rhs_rows_idx]); - res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr[1] = (q7_t)res01; - } - - rhs += 2 * rhs_cols; - dst += 2; - } - - if (rhs_rows % 2) - { - const q7_t *lhs_ptr = &lhs[0]; - q7_t *dst_ptr = &dst[0]; - - for (int32_t lhs_rows_idx = 0; lhs_rows_idx < lhs_rows; ++lhs_rows_idx) - { - const q7_t *rhs_ptr = &rhs[0]; - q31_t res00 = bias[rhs_rows - 1]; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value = rhs_ptr[0]; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows - 1], dst_shifts[rhs_rows - 1]); - - // Add offset - res00 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - - dst_ptr[0] = (q7_t)res00; - dst_ptr += rhs_rows; - } - } -#endif - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q15.c deleted file mode 100644 index d84bc18b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q15.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mult_q15.c - * Description: Q15 vector multiplication with variable output shifts - * - * $Date: 29. April 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - - -/** - * @brief Q7 vector multiplication with variable output shifts - * @param[in] *pSrcA pointer to the first input vector - * @param[in] *pSrcB pointer to the second input vector - * @param[out] *pDst pointer to the output vector - * @param[in] out_shift amount of right-shift for output - * @param[in] blockSize number of samples in each vector - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q15 range [0x8000 0x7FFF] will be saturated. - */ - -void arm_nn_mult_q15( - q15_t * pSrcA, - q15_t * pSrcB, - q15_t * pDst, - const uint16_t out_shift, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ - -#if defined (ARM_MATH_DSP) - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q31_t inA1, inA2, inB1, inB2; /* temporary input variables */ - q15_t out1, out2, out3, out4; /* temporary output variables */ - q31_t mul1, mul2, mul3, mul4; /* temporary variables */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2U; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while (blkCnt > 0U) - { - /* read two samples at a time from sourceA */ - inA1 = arm_nn_read_q15x2_ia((const q15_t **)&pSrcA); - /* read two samples at a time from sourceB */ - inB1 = arm_nn_read_q15x2_ia((const q15_t **)&pSrcB); - /* read two samples at a time from sourceA */ - inA2 = arm_nn_read_q15x2_ia((const q15_t **)&pSrcA); - /* read two samples at a time from sourceB */ - inB2 = arm_nn_read_q15x2_ia((const q15_t **)&pSrcB); - - /* multiply mul = sourceA * sourceB */ - mul1 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16)); - mul2 = (q31_t) ((q15_t) inA1 * (q15_t) inB1); - mul3 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB2 >> 16)); - mul4 = (q31_t) ((q15_t) inA2 * (q15_t) inB2); - - /* saturate result to 16 bit */ - out1 = (q15_t) __SSAT((q31_t) (mul1 + NN_ROUND(out_shift)) >> out_shift, 16); - out2 = (q15_t) __SSAT((q31_t) (mul2 + NN_ROUND(out_shift)) >> out_shift, 16); - out3 = (q15_t) __SSAT((q31_t) (mul3 + NN_ROUND(out_shift)) >> out_shift, 16); - out4 = (q15_t) __SSAT((q31_t) (mul4 + NN_ROUND(out_shift)) >> out_shift, 16); - - /* store the result */ -#ifndef ARM_MATH_BIG_ENDIAN - - *__SIMD32(pDst)++ = __PKHBT(out2, out1, 16); - *__SIMD32(pDst)++ = __PKHBT(out4, out3, 16); - -#else - - *__SIMD32(pDst)++ = __PKHBT(out2, out1, 16); - *__SIMD32(pDst)++ = __PKHBT(out4, out3, 16); - -#endif /* #ifndef ARM_MATH_BIG_ENDIAN */ - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4U; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #if defined (ARM_MATH_DSP) */ - - - while (blkCnt > 0U) - { - /* C = A * B */ - /* Multiply the inputs and store the result in the destination buffer */ - *pDst++ = (q15_t) __SSAT(((q31_t) ((q31_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 16); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q7.c deleted file mode 100644 index d99c42a3..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_mult_q7.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_mult_q7.c - * Description: Q7 vector multiplication with variable output shifts - * - * $Date: 29. April 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/** - * @brief Q7 vector multiplication with variable output shifts - * @param[in] *pSrcA pointer to the first input vector - * @param[in] *pSrcB pointer to the second input vector - * @param[out] *pDst pointer to the output vector - * @param[in] out_shift amount of right-shift for output - * @param[in] blockSize number of samples in each vector - * - * Scaling and Overflow Behavior: - * \par - * The function uses saturating arithmetic. - * Results outside of the allowable Q7 range [0x80 0x7F] will be saturated. - */ - -void arm_nn_mult_q7( - q7_t * pSrcA, - q7_t * pSrcB, - q7_t * pDst, - const uint16_t out_shift, - uint32_t blockSize) -{ - uint32_t blkCnt; /* loop counters */ - -#if defined (ARM_MATH_DSP) - -/* Run the below code for Cortex-M4 and Cortex-M3 */ - q7_t out1, out2, out3, out4; /* Temporary variables to store the product */ - - /* loop Unrolling */ - blkCnt = blockSize >> 2U; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while (blkCnt > 0U) - { - /* C = A * B */ - /* Multiply the inputs and store the results in temporary variables */ - out1 = (q7_t) __SSAT(((q15_t) ((q15_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 8); - out2 = (q7_t) __SSAT(((q15_t) ((q15_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 8); - out3 = (q7_t) __SSAT(((q15_t) ((q15_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 8); - out4 = (q7_t) __SSAT(((q15_t) ((q15_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 8); - - /* Store the results of 4 inputs in the destination buffer in single cycle by packing */ - *__SIMD32(pDst)++ = __PACKq7(out1, out2, out3, out4); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4U; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Initialize blkCnt with number of samples */ - blkCnt = blockSize; - -#endif /* #if defined (ARM_MATH_DSP) */ - - - while (blkCnt > 0U) - { - /* C = A * B */ - /* Multiply the inputs and store the result in the destination buffer */ - *pDst++ = (q7_t) __SSAT(((q15_t) ((q15_t) (*pSrcA++) * (*pSrcB++) + NN_ROUND(out_shift)) >> out_shift), 8); - - /* Decrement the blockSize loop counter */ - blkCnt--; - } -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s8.c deleted file mode 100644 index 2551b189..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nn_vec_mat_mult_t_s8.c +++ /dev/null @@ -1,462 +0,0 @@ -/* - * Copyright (C) 2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nn_vec_mat_mult_t_s8 - * Description: s8 vector by matrix (transposed) multiplication - * - * $Date: April 2, 2020 - * $Revision: V.1.5.0 - * - * Target Processor: Cortex-M - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup NNBasicMath - * @{ - */ - -/* - * s8 vector(lhs) by matrix (transposed) multiplication - * - * Refer header file for details. - * - */ -arm_status arm_nn_vec_mat_mult_t_s8(const q7_t *lhs, - const q7_t *rhs, - const q31_t *bias, - q7_t *dst, - const int32_t lhs_offset, - const int32_t rhs_offset, - const int32_t dst_offset, - const int32_t dst_multiplier, - const int32_t dst_shift, - const int32_t rhs_cols, - const int32_t rhs_rows, - const int32_t activation_min, - const int32_t activation_max) -{ -#if defined(ARM_MATH_MVEI) - - const int16x8_t rhs_offset_vec = vdupq_n_s16((int16_t)rhs_offset); - const int16x8_t lhs_offset_vec = vdupq_n_s16((int16_t)lhs_offset); - - int32_t row_loop_cnt = rhs_rows / 4; - - for (int i_row_loop_cnt = 0; i_row_loop_cnt < row_loop_cnt; i_row_loop_cnt++) - { - int32_t acc1 = bias[0]; - int32_t acc2 = bias[1]; - int32_t acc3 = bias[2]; - int32_t acc4 = bias[3]; - bias += 4; - - int32x4_t acc; - const int32_t col_loop_cnt = (rhs_cols + 7) / 8; - - const int8_t *vec = lhs; - const int8_t *rhs_0 = rhs; - const int8_t *rhs_1 = rhs + rhs_cols; - const int8_t *rhs_2 = rhs + 2 * rhs_cols; - const int8_t *rhs_3 = rhs + 3 * rhs_cols; - - uint32_t col_cnt = (uint32_t)rhs_cols; - - for (int i = 0; i < col_loop_cnt; i++) - { - mve_pred16_t p = vctp16q(col_cnt); - col_cnt -= 8; - const int16x8_t tmp_b = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(vec, p), lhs_offset_vec, p); - - const int16x8_t tmp_a0 = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(rhs_0, p), rhs_offset_vec, p); - acc1 = vmladavaq_p_s16(acc1, tmp_a0, tmp_b, p); - - const int16x8_t tmp_a1 = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(rhs_1, p), rhs_offset_vec, p); - acc2 = vmladavaq_p_s16(acc2, tmp_a1, tmp_b, p); - - const int16x8_t tmp_a2 = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(rhs_2, p), rhs_offset_vec, p); - acc3 = vmladavaq_p_s16(acc3, tmp_a2, tmp_b, p); - - const int16x8_t tmp_a3 = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(rhs_3, p), rhs_offset_vec, p); - acc4 = vmladavaq_p_s16(acc4, tmp_a3, tmp_b, p); - - vec += 8; - rhs_0 += 8; - rhs_1 += 8; - rhs_2 += 8; - rhs_3 += 8; - } - rhs += 4 * rhs_cols; - - acc[0] = acc1; - acc[1] = acc2; - acc[2] = acc3; - acc[3] = acc4; - - acc = arm_requantize_mve(acc, dst_multiplier, dst_shift); - acc = vaddq_s32(acc, vdupq_n_s32(dst_offset)); - acc = vmaxq_s32(acc, vdupq_n_s32(activation_min)); - acc = vminq_s32(acc, vdupq_n_s32(activation_max)); - - vstrbq_s32(dst, acc); - dst += 4; - } - - row_loop_cnt = rhs_rows & 3; - - for (int i_row_loop_cnt = 0; i_row_loop_cnt < row_loop_cnt; - i_row_loop_cnt++) - { - int32_t acc = *bias++; - const int32_t col_loop_cnt = (rhs_cols + 7) / 8; - const int8_t *vec = lhs; - const int8_t *kernel_cur = rhs; - - uint32_t col_cnt = (uint32_t)rhs_cols; - - for (int i = 0; i < col_loop_cnt; i++) - { - mve_pred16_t p = vctp16q(col_cnt); - col_cnt -= 8; - const int16x8_t tmp_b = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(vec, p), lhs_offset_vec, p); - - const int16x8_t tmp_a = vaddq_m_s16(vuninitializedq_s16(), - vldrbq_z_s16(kernel_cur, p), rhs_offset_vec, p); - acc = vmladavaq_p_s16(acc, tmp_a, tmp_b, p); - vec += 8; - kernel_cur += 8; - } - rhs += rhs_cols; - - acc = arm_nn_requantize(acc, dst_multiplier, dst_shift); - acc += dst_offset; - - acc = MAX(acc, activation_min); - acc = MIN(acc, activation_max); - *dst++ = (int8_t)(acc); - } - -#elif defined(ARM_MATH_DSP) - const int32_t off0 = rhs_cols - 4; - const int16_t lhs_offset_s16 = lhs_offset; - const int16_t rhs_offset_s16 = rhs_offset; - - const uint32_t lhs_offset_s16x2 = __PKHBT(lhs_offset_s16, lhs_offset_s16, 16); - const uint32_t rhs_offset_s16x2 = __PKHBT(rhs_offset_s16, rhs_offset_s16, 16); - - for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 2); rhs_rows_idx += 2) - { - const q7_t *lhs_ptr = &lhs[0]; - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = *bias++; - q31_t res01 = *bias++; - - int32_t rhs_cols_idx = 0; - - q31_t val0, val1, val2, val3, val4, val5; - for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) - { - // Read 4 x int8 values from the RHS matrix - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val2 = __SXTAB16(rhs_offset_s16x2, val0); - // Read 4 x int8 values from the LHS vector - val1 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val1); - // Read 4 x int8 values from the RHS matrix - val4 = arm_nn_read_q7x4((const q7_t *)rhs_ptr + off0); - val1 = __SXTAB16(lhs_offset_s16x2, __ROR(val1, 8)); - - // Perform the accumulations - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTAB16(rhs_offset_s16x2, val4); - res00 = __SMLAD(val1, val0, res00); - val4 = __SXTAB16(rhs_offset_s16x2, __ROR(val4, 8)); - // Read 4 x int8 values from the RHS matrix - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val1, val4, res01); - - val2 = __SXTAB16(rhs_offset_s16x2, val0); - // Read 4 x int8 values from the LHS vector - val1 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val1); - // Read 4 x int8 values from the RHS matrix - val4 = arm_nn_read_q7x4((const q7_t *)rhs_ptr + off0); - val1 = __SXTAB16(lhs_offset_s16x2, __ROR(val1, 8)); - - // Perform the accumulations - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTAB16(rhs_offset_s16x2, val4); - res00 = __SMLAD(val1, val0, res00); - val4 = __SXTAB16(rhs_offset_s16x2, __ROR(val4, 8)); - // Read 4 x int8 values from the RHS matrix - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val1, val4, res01); - - val2 = __SXTAB16(rhs_offset_s16x2, val0); - // Read 4 x int8 values from the LHS vector - val1 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val1); - // Read 4 x int8 values from the RHS matrix - val4 = arm_nn_read_q7x4((const q7_t *)rhs_ptr + off0); - val1 = __SXTAB16(lhs_offset_s16x2, __ROR(val1, 8)); - - // Perform the accumulations - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTAB16(rhs_offset_s16x2, val4); - res00 = __SMLAD(val1, val0, res00); - val4 = __SXTAB16(rhs_offset_s16x2, __ROR(val4, 8)); - // Read 4 x int8 values from the RHS matrix - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val1, val4, res01); - - val2 = __SXTAB16(rhs_offset_s16x2, val0); - // Read 4 x int8 values from the LHS vector - val1 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val1); - // Read 4 x int8 values from the RHS matrix - val4 = arm_nn_read_q7x4((const q7_t *)rhs_ptr + off0); - val1 = __SXTAB16(lhs_offset_s16x2, __ROR(val1, 8)); - - // Perform the accumulations - res00 = __SMLAD(val3, val2, res00); - val5 = __SXTAB16(rhs_offset_s16x2, val4); - res00 = __SMLAD(val1, val0, res00); - val4 = __SXTAB16(rhs_offset_s16x2, __ROR(val4, 8)); - res01 = __SMLAD(val3, val5, res01); - res01 = __SMLAD(val1, val4, res01); - } - - for (; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value0 = rhs_ptr[0] + rhs_offset; - q31_t rhs_value1 = rhs_ptr[rhs_cols] + rhs_offset; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multiplier, dst_shift); - res01 = arm_nn_requantize(res01, dst_multiplier, dst_shift); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - - *dst++ = (q7_t)res00; - *dst++ = (q7_t)res01; - - rhs += 2 * rhs_cols; - } - - if (rhs_rows % 2) - { - const q7_t *lhs_ptr = &lhs[0]; - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = *bias++; - - int32_t rhs_cols_idx = 0; - - q31_t val0, val1, val2, val3; - for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) - { - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = __SXTAB16(rhs_offset_s16x2, val0); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val2); - val2 = __SXTAB16(lhs_offset_s16x2, __ROR(val2, 8)); - - // Partial accumulations - res00 = __SMLAD(val3, val1, res00); - res00 = __SMLAD(val2, val0, res00); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = __SXTAB16(rhs_offset_s16x2, val0); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val2); - val2 = __SXTAB16(lhs_offset_s16x2, __ROR(val2, 8)); - - // Partial accumulations - res00 = __SMLAD(val3, val1, res00); - res00 = __SMLAD(val2, val0, res00); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = __SXTAB16(rhs_offset_s16x2, val0); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val2); - val2 = __SXTAB16(lhs_offset_s16x2, __ROR(val2, 8)); - - // Partial accumulations - res00 = __SMLAD(val3, val1, res00); - res00 = __SMLAD(val2, val0, res00); - - val0 = arm_nn_read_q7x4_ia((const q7_t **)&rhs_ptr); - val1 = __SXTAB16(rhs_offset_s16x2, val0); - val2 = arm_nn_read_q7x4_ia((const q7_t **)&lhs_ptr); - val0 = __SXTAB16(rhs_offset_s16x2, __ROR(val0, 8)); - val3 = __SXTAB16(lhs_offset_s16x2, val2); - val2 = __SXTAB16(lhs_offset_s16x2, __ROR(val2, 8)); - - // Partial accumulations - res00 = __SMLAD(val3, val1, res00); - res00 = __SMLAD(val2, val0, res00); - } - - for (; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value0 = rhs_ptr[0] + rhs_offset; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value0; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multiplier, dst_shift); - - // Add offset - res00 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - - *dst = (q7_t)res00; - } - -#else - - for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 2); rhs_rows_idx += 2) - { - const q7_t *lhs_ptr = &lhs[0]; - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = *bias++; - q31_t res01 = *bias++; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value0 = rhs_ptr[0] + rhs_offset; - q31_t rhs_value1 = rhs_ptr[rhs_cols] + rhs_offset; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value0; - res01 += lhs_value * rhs_value1; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multiplier, dst_shift); - res01 = arm_nn_requantize(res01, dst_multiplier, dst_shift); - - // Add offset - res00 += dst_offset; - res01 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - res01 = MAX(res01, activation_min); - res01 = MIN(res01, activation_max); - - *dst++ = (q7_t)res00; - *dst++ = (q7_t)res01; - - rhs += 2 * rhs_cols; - } - - if (rhs_rows % 2) - { - const q7_t *lhs_ptr = &lhs[0]; - const q7_t *rhs_ptr = &rhs[0]; - - q31_t res00 = *bias++; - - for (int32_t rhs_cols_idx = 0; rhs_cols_idx < rhs_cols; ++rhs_cols_idx) - { - q31_t rhs_value0 = rhs_ptr[0] + rhs_offset; - q31_t lhs_value = lhs_ptr[0] + lhs_offset; - - res00 += lhs_value * rhs_value0; - - ++rhs_ptr; - ++lhs_ptr; - } - - // Quantize down - res00 = arm_nn_requantize(res00, dst_multiplier, dst_shift); - - // Add offset - res00 += dst_offset; - - // Clamp the result - res00 = MAX(res00, activation_min); - res00 = MIN(res00, activation_max); - - *dst = (q7_t)res00; - } -#endif - - return ARM_MATH_SUCCESS; -} - -/** - * @} end of NNBasicMath group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nntables.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nntables.c deleted file mode 100644 index 57f97f68..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_nntables.c +++ /dev/null @@ -1,297 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_nntables.c - * Description: Converts the elements of the Q7 vector to Q15 vector without left-shift - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @brief tables for various activation functions - * - * This file include the declaration of common tables. - * Most of them are used for activation functions - * - * Assumption: - * Unified table: input is 3.x format, i.e, range of [-8, 8) - * sigmoid(8) = 0.9996646498695336 - * tanh(8) = 0.9999997749296758 - * The accuracy here should be good enough - * - * 2-stage HL table: - * - * The entire input range is divided into two parts: - * - * Low range table: 0x000x xxxx or 0x111x xxxx - * table entry will be the binary number excluding the first - * two digits, i.e., 0x0x xxxx or 0x1x xxxx - * - * - * - * High range table 0x0010 0000 -- 0x0111 1111 - * 0x1000 0000 -- 0x1101 1111 - * - * For positive numbers, table entry will be - * 0x0010 0000 -- 0x0111 1111 minus 0x0010 0000 - * i.e., 0x0000 0000 - 0x0101 11111 - * - * same thing for the negative numbers, table entry will be - * 0x1000 0000 -- 0x1101 1111 minux 0x0010 0000 - * i.e., 0x0110 0000 - 0x1011 1111 - */ - -const q7_t sigmoidTable_q7[256] = { - 0x40, 0x42, 0x44, 0x46, 0x48, 0x4a, 0x4c, 0x4e, - 0x50, 0x52, 0x53, 0x55, 0x57, 0x59, 0x5a, 0x5c, - 0x5e, 0x5f, 0x61, 0x62, 0x63, 0x65, 0x66, 0x67, - 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, - 0x71, 0x72, 0x72, 0x73, 0x74, 0x74, 0x75, 0x76, - 0x76, 0x77, 0x77, 0x78, 0x78, 0x79, 0x79, 0x7a, - 0x7a, 0x7a, 0x7b, 0x7b, 0x7b, 0x7c, 0x7c, 0x7c, - 0x7c, 0x7c, 0x7d, 0x7d, 0x7d, 0x7d, 0x7d, 0x7e, - 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7e, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, - 0x01, 0x01, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, - 0x02, 0x02, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, - 0x04, 0x04, 0x04, 0x04, 0x05, 0x05, 0x05, 0x06, - 0x06, 0x06, 0x07, 0x07, 0x08, 0x08, 0x09, 0x09, - 0x0a, 0x0a, 0x0b, 0x0c, 0x0c, 0x0d, 0x0e, 0x0e, - 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, - 0x17, 0x19, 0x1a, 0x1b, 0x1d, 0x1e, 0x1f, 0x21, - 0x22, 0x24, 0x26, 0x27, 0x29, 0x2b, 0x2d, 0x2e, - 0x30, 0x32, 0x34, 0x36, 0x38, 0x3a, 0x3c, 0x3e, -}; - -const q15_t sigmoidTable_q15[256] = { - 0x4000, 0x4200, 0x43ff, 0x45fc, 0x47f5, 0x49eb, 0x4bdc, 0x4dc8, - 0x4fad, 0x518a, 0x5360, 0x552c, 0x56ef, 0x58a8, 0x5a57, 0x5bfb, - 0x5d93, 0x5f20, 0x60a1, 0x6216, 0x637f, 0x64db, 0x662b, 0x676f, - 0x68a6, 0x69d2, 0x6af1, 0x6c05, 0x6d0d, 0x6e09, 0x6efb, 0x6fe2, - 0x70be, 0x7190, 0x7258, 0x7316, 0x73cc, 0x7478, 0x751b, 0x75b7, - 0x764a, 0x76d6, 0x775b, 0x77d8, 0x784f, 0x78c0, 0x792a, 0x798f, - 0x79ee, 0x7a48, 0x7a9d, 0x7aed, 0x7b39, 0x7b80, 0x7bc4, 0x7c03, - 0x7c3f, 0x7c78, 0x7cad, 0x7ce0, 0x7d0f, 0x7d3c, 0x7d66, 0x7d8d, - 0x7db3, 0x7dd6, 0x7df7, 0x7e16, 0x7e33, 0x7e4f, 0x7e69, 0x7e81, - 0x7e98, 0x7eae, 0x7ec2, 0x7ed5, 0x7ee7, 0x7ef8, 0x7f08, 0x7f17, - 0x7f25, 0x7f32, 0x7f3e, 0x7f4a, 0x7f55, 0x7f5f, 0x7f69, 0x7f72, - 0x7f7b, 0x7f83, 0x7f8a, 0x7f91, 0x7f98, 0x7f9e, 0x7fa4, 0x7faa, - 0x7faf, 0x7fb4, 0x7fb8, 0x7fbd, 0x7fc1, 0x7fc5, 0x7fc8, 0x7fcc, - 0x7fcf, 0x7fd2, 0x7fd5, 0x7fd7, 0x7fda, 0x7fdc, 0x7fde, 0x7fe0, - 0x7fe2, 0x7fe4, 0x7fe6, 0x7fe7, 0x7fe9, 0x7fea, 0x7feb, 0x7fed, - 0x7fee, 0x7fef, 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff4, - 0x000b, 0x000c, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, - 0x0012, 0x0013, 0x0015, 0x0016, 0x0017, 0x0019, 0x001a, 0x001c, - 0x001e, 0x0020, 0x0022, 0x0024, 0x0026, 0x0029, 0x002b, 0x002e, - 0x0031, 0x0034, 0x0038, 0x003b, 0x003f, 0x0043, 0x0048, 0x004c, - 0x0051, 0x0056, 0x005c, 0x0062, 0x0068, 0x006f, 0x0076, 0x007d, - 0x0085, 0x008e, 0x0097, 0x00a1, 0x00ab, 0x00b6, 0x00c2, 0x00ce, - 0x00db, 0x00e9, 0x00f8, 0x0108, 0x0119, 0x012b, 0x013e, 0x0152, - 0x0168, 0x017f, 0x0197, 0x01b1, 0x01cd, 0x01ea, 0x0209, 0x022a, - 0x024d, 0x0273, 0x029a, 0x02c4, 0x02f1, 0x0320, 0x0353, 0x0388, - 0x03c1, 0x03fd, 0x043c, 0x0480, 0x04c7, 0x0513, 0x0563, 0x05b8, - 0x0612, 0x0671, 0x06d6, 0x0740, 0x07b1, 0x0828, 0x08a5, 0x092a, - 0x09b6, 0x0a49, 0x0ae5, 0x0b88, 0x0c34, 0x0cea, 0x0da8, 0x0e70, - 0x0f42, 0x101e, 0x1105, 0x11f7, 0x12f3, 0x13fb, 0x150f, 0x162e, - 0x175a, 0x1891, 0x19d5, 0x1b25, 0x1c81, 0x1dea, 0x1f5f, 0x20e0, - 0x226d, 0x2405, 0x25a9, 0x2758, 0x2911, 0x2ad4, 0x2ca0, 0x2e76, - 0x3053, 0x3238, 0x3424, 0x3615, 0x380b, 0x3a04, 0x3c01, 0x3e00, -}; - -const q15_t sigmoidLTable_q15[128] = { - 0x4000, 0x4100, 0x4200, 0x42ff, 0x43ff, 0x44fd, 0x45fc, 0x46f9, - 0x47f5, 0x48f1, 0x49eb, 0x4ae5, 0x4bdc, 0x4cd3, 0x4dc8, 0x4ebb, - 0x4fad, 0x509c, 0x518a, 0x5276, 0x5360, 0x5447, 0x552c, 0x560f, - 0x56ef, 0x57cd, 0x58a8, 0x5981, 0x5a57, 0x5b2a, 0x5bfb, 0x5cc9, - 0x5d93, 0x5e5b, 0x5f20, 0x5fe2, 0x60a1, 0x615d, 0x6216, 0x62cc, - 0x637f, 0x642e, 0x64db, 0x6584, 0x662b, 0x66ce, 0x676f, 0x680c, - 0x68a6, 0x693d, 0x69d2, 0x6a63, 0x6af1, 0x6b7c, 0x6c05, 0x6c8a, - 0x6d0d, 0x6d8d, 0x6e09, 0x6e84, 0x6efb, 0x6f70, 0x6fe2, 0x7051, - 0x0f42, 0x0faf, 0x101e, 0x1090, 0x1105, 0x117c, 0x11f7, 0x1273, - 0x12f3, 0x1376, 0x13fb, 0x1484, 0x150f, 0x159d, 0x162e, 0x16c3, - 0x175a, 0x17f4, 0x1891, 0x1932, 0x19d5, 0x1a7c, 0x1b25, 0x1bd2, - 0x1c81, 0x1d34, 0x1dea, 0x1ea3, 0x1f5f, 0x201e, 0x20e0, 0x21a5, - 0x226d, 0x2337, 0x2405, 0x24d6, 0x25a9, 0x267f, 0x2758, 0x2833, - 0x2911, 0x29f1, 0x2ad4, 0x2bb9, 0x2ca0, 0x2d8a, 0x2e76, 0x2f64, - 0x3053, 0x3145, 0x3238, 0x332d, 0x3424, 0x351b, 0x3615, 0x370f, - 0x380b, 0x3907, 0x3a04, 0x3b03, 0x3c01, 0x3d01, 0x3e00, 0x3f00, -}; - -const q15_t sigmoidHTable_q15[192] = { - 0x70be, 0x7190, 0x7258, 0x7316, 0x73cc, 0x7478, 0x751b, 0x75b7, - 0x764a, 0x76d6, 0x775b, 0x77d8, 0x784f, 0x78c0, 0x792a, 0x798f, - 0x79ee, 0x7a48, 0x7a9d, 0x7aed, 0x7b39, 0x7b80, 0x7bc4, 0x7c03, - 0x7c3f, 0x7c78, 0x7cad, 0x7ce0, 0x7d0f, 0x7d3c, 0x7d66, 0x7d8d, - 0x7db3, 0x7dd6, 0x7df7, 0x7e16, 0x7e33, 0x7e4f, 0x7e69, 0x7e81, - 0x7e98, 0x7eae, 0x7ec2, 0x7ed5, 0x7ee7, 0x7ef8, 0x7f08, 0x7f17, - 0x7f25, 0x7f32, 0x7f3e, 0x7f4a, 0x7f55, 0x7f5f, 0x7f69, 0x7f72, - 0x7f7b, 0x7f83, 0x7f8a, 0x7f91, 0x7f98, 0x7f9e, 0x7fa4, 0x7faa, - 0x7faf, 0x7fb4, 0x7fb8, 0x7fbd, 0x7fc1, 0x7fc5, 0x7fc8, 0x7fcc, - 0x7fcf, 0x7fd2, 0x7fd5, 0x7fd7, 0x7fda, 0x7fdc, 0x7fde, 0x7fe0, - 0x7fe2, 0x7fe4, 0x7fe6, 0x7fe7, 0x7fe9, 0x7fea, 0x7feb, 0x7fed, - 0x7fee, 0x7fef, 0x7ff0, 0x7ff1, 0x7ff2, 0x7ff3, 0x7ff4, 0x7ff4, - 0x000b, 0x000c, 0x000c, 0x000d, 0x000e, 0x000f, 0x0010, 0x0011, - 0x0012, 0x0013, 0x0015, 0x0016, 0x0017, 0x0019, 0x001a, 0x001c, - 0x001e, 0x0020, 0x0022, 0x0024, 0x0026, 0x0029, 0x002b, 0x002e, - 0x0031, 0x0034, 0x0038, 0x003b, 0x003f, 0x0043, 0x0048, 0x004c, - 0x0051, 0x0056, 0x005c, 0x0062, 0x0068, 0x006f, 0x0076, 0x007d, - 0x0085, 0x008e, 0x0097, 0x00a1, 0x00ab, 0x00b6, 0x00c2, 0x00ce, - 0x00db, 0x00e9, 0x00f8, 0x0108, 0x0119, 0x012b, 0x013e, 0x0152, - 0x0168, 0x017f, 0x0197, 0x01b1, 0x01cd, 0x01ea, 0x0209, 0x022a, - 0x024d, 0x0273, 0x029a, 0x02c4, 0x02f1, 0x0320, 0x0353, 0x0388, - 0x03c1, 0x03fd, 0x043c, 0x0480, 0x04c7, 0x0513, 0x0563, 0x05b8, - 0x0612, 0x0671, 0x06d6, 0x0740, 0x07b1, 0x0828, 0x08a5, 0x092a, - 0x09b6, 0x0a49, 0x0ae5, 0x0b88, 0x0c34, 0x0cea, 0x0da8, 0x0e70, -}; - -const q7_t tanhTable_q7[256] = { - 0x00, 0x08, 0x10, 0x18, 0x1f, 0x27, 0x2e, 0x35, - 0x3b, 0x41, 0x47, 0x4c, 0x51, 0x56, 0x5a, 0x5e, - 0x61, 0x65, 0x68, 0x6a, 0x6d, 0x6f, 0x71, 0x72, - 0x74, 0x75, 0x76, 0x78, 0x78, 0x79, 0x7a, 0x7b, - 0x7b, 0x7c, 0x7c, 0x7d, 0x7d, 0x7e, 0x7e, 0x7e, - 0x7e, 0x7e, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, 0x7f, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, - 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x81, - 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x81, 0x82, - 0x82, 0x82, 0x82, 0x82, 0x83, 0x83, 0x84, 0x84, - 0x85, 0x85, 0x86, 0x87, 0x88, 0x88, 0x8a, 0x8b, - 0x8c, 0x8e, 0x8f, 0x91, 0x93, 0x96, 0x98, 0x9b, - 0x9f, 0xa2, 0xa6, 0xaa, 0xaf, 0xb4, 0xb9, 0xbf, - 0xc5, 0xcb, 0xd2, 0xd9, 0xe1, 0xe8, 0xf0, 0xf8, -}; - -const q15_t tanhTable_q15[256] = { - 0x0000, 0x07fd, 0x0feb, 0x17b9, 0x1f59, 0x26bf, 0x2ddf, 0x34ae, - 0x3b27, 0x4142, 0x46fd, 0x4c56, 0x514d, 0x55e2, 0x5a1a, 0x5df6, - 0x617c, 0x64b0, 0x6797, 0x6a37, 0x6c95, 0x6eb5, 0x709e, 0x7254, - 0x73dc, 0x753a, 0x7672, 0x7788, 0x787f, 0x795b, 0x7a1e, 0x7acb, - 0x7b65, 0x7bee, 0x7c66, 0x7cd1, 0x7d30, 0x7d84, 0x7dce, 0x7e0f, - 0x7e49, 0x7e7d, 0x7eaa, 0x7ed2, 0x7ef5, 0x7f14, 0x7f30, 0x7f48, - 0x7f5e, 0x7f71, 0x7f82, 0x7f91, 0x7f9e, 0x7fa9, 0x7fb3, 0x7fbc, - 0x7fc4, 0x7fcb, 0x7fd1, 0x7fd7, 0x7fdc, 0x7fe0, 0x7fe4, 0x7fe7, - 0x7fea, 0x7fed, 0x7fef, 0x7ff1, 0x7ff3, 0x7ff4, 0x7ff6, 0x7ff7, - 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffa, 0x7ffb, 0x7ffc, 0x7ffc, 0x7ffd, - 0x7ffd, 0x7ffd, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, - 0x8001, 0x8001, 0x8001, 0x8002, 0x8002, 0x8002, 0x8002, 0x8003, - 0x8003, 0x8003, 0x8004, 0x8004, 0x8005, 0x8006, 0x8006, 0x8007, - 0x8008, 0x8009, 0x800a, 0x800c, 0x800d, 0x800f, 0x8011, 0x8013, - 0x8016, 0x8019, 0x801c, 0x8020, 0x8024, 0x8029, 0x802f, 0x8035, - 0x803c, 0x8044, 0x804d, 0x8057, 0x8062, 0x806f, 0x807e, 0x808f, - 0x80a2, 0x80b8, 0x80d0, 0x80ec, 0x810b, 0x812e, 0x8156, 0x8183, - 0x81b7, 0x81f1, 0x8232, 0x827c, 0x82d0, 0x832f, 0x839a, 0x8412, - 0x849b, 0x8535, 0x85e2, 0x86a5, 0x8781, 0x8878, 0x898e, 0x8ac6, - 0x8c24, 0x8dac, 0x8f62, 0x914b, 0x936b, 0x95c9, 0x9869, 0x9b50, - 0x9e84, 0xa20a, 0xa5e6, 0xaa1e, 0xaeb3, 0xb3aa, 0xb903, 0xbebe, - 0xc4d9, 0xcb52, 0xd221, 0xd941, 0xe0a7, 0xe847, 0xf015, 0xf803, -}; - -const q15_t tanhLTable_q15[128] = { - 0x0000, 0x0400, 0x07fd, 0x0bf7, 0x0feb, 0x13d7, 0x17b9, 0x1b90, - 0x1f59, 0x2314, 0x26bf, 0x2a58, 0x2ddf, 0x3151, 0x34ae, 0x37f6, - 0x3b27, 0x3e40, 0x4142, 0x442c, 0x46fd, 0x49b6, 0x4c56, 0x4edd, - 0x514d, 0x53a3, 0x55e2, 0x580a, 0x5a1a, 0x5c13, 0x5df6, 0x5fc4, - 0x617c, 0x6320, 0x64b0, 0x662d, 0x6797, 0x68f0, 0x6a37, 0x6b6e, - 0x6c95, 0x6dac, 0x6eb5, 0x6fb0, 0x709e, 0x717f, 0x7254, 0x731e, - 0x73dc, 0x7490, 0x753a, 0x75da, 0x7672, 0x7701, 0x7788, 0x7807, - 0x787f, 0x78f0, 0x795b, 0x79bf, 0x7a1e, 0x7a77, 0x7acb, 0x7b1b, - 0x849b, 0x84e5, 0x8535, 0x8589, 0x85e2, 0x8641, 0x86a5, 0x8710, - 0x8781, 0x87f9, 0x8878, 0x88ff, 0x898e, 0x8a26, 0x8ac6, 0x8b70, - 0x8c24, 0x8ce2, 0x8dac, 0x8e81, 0x8f62, 0x9050, 0x914b, 0x9254, - 0x936b, 0x9492, 0x95c9, 0x9710, 0x9869, 0x99d3, 0x9b50, 0x9ce0, - 0x9e84, 0xa03c, 0xa20a, 0xa3ed, 0xa5e6, 0xa7f6, 0xaa1e, 0xac5d, - 0xaeb3, 0xb123, 0xb3aa, 0xb64a, 0xb903, 0xbbd4, 0xbebe, 0xc1c0, - 0xc4d9, 0xc80a, 0xcb52, 0xceaf, 0xd221, 0xd5a8, 0xd941, 0xdcec, - 0xe0a7, 0xe470, 0xe847, 0xec29, 0xf015, 0xf409, 0xf803, 0xfc00, -}; - -const q15_t tanhHTable_q15[192] = { - 0x7b65, 0x7bee, 0x7c66, 0x7cd1, 0x7d30, 0x7d84, 0x7dce, 0x7e0f, - 0x7e49, 0x7e7d, 0x7eaa, 0x7ed2, 0x7ef5, 0x7f14, 0x7f30, 0x7f48, - 0x7f5e, 0x7f71, 0x7f82, 0x7f91, 0x7f9e, 0x7fa9, 0x7fb3, 0x7fbc, - 0x7fc4, 0x7fcb, 0x7fd1, 0x7fd7, 0x7fdc, 0x7fe0, 0x7fe4, 0x7fe7, - 0x7fea, 0x7fed, 0x7fef, 0x7ff1, 0x7ff3, 0x7ff4, 0x7ff6, 0x7ff7, - 0x7ff8, 0x7ff9, 0x7ffa, 0x7ffa, 0x7ffb, 0x7ffc, 0x7ffc, 0x7ffd, - 0x7ffd, 0x7ffd, 0x7ffe, 0x7ffe, 0x7ffe, 0x7ffe, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, 0x7fff, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, 0x8000, - 0x8000, 0x8000, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, 0x8001, - 0x8001, 0x8001, 0x8001, 0x8002, 0x8002, 0x8002, 0x8002, 0x8003, - 0x8003, 0x8003, 0x8004, 0x8004, 0x8005, 0x8006, 0x8006, 0x8007, - 0x8008, 0x8009, 0x800a, 0x800c, 0x800d, 0x800f, 0x8011, 0x8013, - 0x8016, 0x8019, 0x801c, 0x8020, 0x8024, 0x8029, 0x802f, 0x8035, - 0x803c, 0x8044, 0x804d, 0x8057, 0x8062, 0x806f, 0x807e, 0x808f, - 0x80a2, 0x80b8, 0x80d0, 0x80ec, 0x810b, 0x812e, 0x8156, 0x8183, - 0x81b7, 0x81f1, 0x8232, 0x827c, 0x82d0, 0x832f, 0x839a, 0x8412, -}; diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_no_shift.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_no_shift.c deleted file mode 100644 index 5cdac6ce..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_no_shift.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_q7_to_q15_no_shift.c - * Description: Converts the elements of the Q7 vector to Q15 vector without left-shift - * - * $Date: May 29, 2020 - * $Revision: V.1.0.2 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup nndata_convert - * @{ - */ - -/** - * @brief Converts the elements of the Q7 vector to Q15 vector without left-shift - * @param[in] *pSrc points to the Q7 input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * - * \par Description: - * - * The equation used for the conversion process is: - * - *
- * 	pDst[n] = (q15_t) pSrc[n];   0 <= n < blockSize.
- * 
- * - */ - -void arm_q7_to_q15_no_shift(const q7_t * pSrc, q15_t * pDst, uint32_t blockSize) -{ - const q7_t *pIn = pSrc; - uint32_t blkCnt; - -#if defined(ARM_MATH_DSP) - q31_t in; - q31_t in1, in2; - q31_t out1, out2; - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. */ - while (blkCnt > 0u) - { - in = arm_nn_read_q7x4_ia(&pIn); - - /* rotatate in by 8 and extend two q7_t values to q15_t values */ - in1 = __SXTB16(__ROR((uint32_t)in, 8)); - - /* extend remaining two q7_t values to q15_t values */ - in2 = __SXTB16(in); - -#ifndef ARM_MATH_BIG_ENDIAN - out2 = (int32_t)__PKHTB(in1, in2, 16); - out1 = (int32_t)__PKHBT(in2, in1, 16); -#else - out1 = (int32_t)__PKHTB(in1, in2, 16); - out2 = (int32_t)__PKHBT(in2, in1, 16); -#endif - write_q15x2_ia(&pDst, out1); - write_q15x2_ia(&pDst, out2); - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while (blkCnt > 0u) - { - /* convert from q7 to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t)*pIn++; - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of nndata_convert group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_no_shift.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_no_shift.c deleted file mode 100644 index 8128aaa2..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_no_shift.c +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_q7_to_q15_reordered_no_shift.c - * Description: Converts the elements of the Q7 vector to reordered Q15 vector without left-shift - * - * $Date: May 29, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup nndata_convert - * @{ - */ - -/** - * @brief Converts the elements of the Q7 vector to reordered Q15 vector without left-shift - * @param[in] *pSrc points to the Q7 input vector - * @param[out] *pDst points to the Q15 output vector - * @param[in] blockSize length of the input vector - * - * @details - * - * This function does the q7 to q15 expansion with re-ordering - * - *
- *                          |   A1   |   A2   |   A3   |   A4   |
- *
- *                           0      7 8     15 16    23 24    31
- * 
- * - * is converted into: - * - *
- *  |       A1       |       A3       |   and  |       A2       |       A4       |
- *
- *   0             15 16            31          0             15 16            31
- * 
- * - * - * This looks strange but is natural considering how sign-extension is done at - * assembly level. - * - * The expansion of other other oprand will follow the same rule so that the end - * results are the same. - * - * The tail (i.e., last (N % 4) elements) will still be in original order. - * - */ - -void arm_q7_to_q15_reordered_no_shift(const q7_t * pSrc, q15_t * pDst, uint32_t blockSize) -{ - const q7_t *pIn = pSrc; /* Src pointer */ - uint32_t blkCnt; /* loop counter */ - -#ifndef ARM_MATH_CM0_FAMILY - q31_t in; - q31_t in1, in2; - - /* Run the below code for Cortex-M4 and Cortex-M3 */ - - /*loop Unrolling */ - blkCnt = blockSize >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. - ** a second loop below computes the remaining 1 to 3 samples. */ - while (blkCnt > 0u) - { - /* C = (q15_t) A << 8 */ - /* convert from q7 to q15 and then store the results in the destination buffer */ - in = arm_nn_read_q7x4_ia(&pIn); - - /* rotatate in by 8 and extend two q7_t values to q15_t values */ - in1 = __SXTB16(__ROR((uint32_t)in, 8)); - - /* extend remainig two q7_t values to q15_t values */ - in2 = __SXTB16(in); - -#ifndef ARM_MATH_BIG_ENDIAN - *__SIMD32(pDst)++ = in2; - *__SIMD32(pDst)++ = in1; -#else - *__SIMD32(pDst)++ = in1; - *__SIMD32(pDst)++ = in2; -#endif - - /* Decrement the loop counter */ - blkCnt--; - } - - /* If the blockSize is not a multiple of 4, compute any remaining output samples here. - ** No loop unrolling is used. */ - blkCnt = blockSize % 0x4u; - -#else - - /* Run the below code for Cortex-M0 */ - - /* Loop over blockSize number of values */ - blkCnt = blockSize; - -#endif /* #ifndef ARM_MATH_CM0_FAMILY */ - - while (blkCnt > 0u) - { - /* C = (q15_t) A << 8 */ - /* convert from q7 to q15 and then store the results in the destination buffer */ - *pDst++ = (q15_t) * pIn++; - - /* Decrement the loop counter */ - blkCnt--; - } - -} - -/** - * @} end of q7_to_x group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_with_offset.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_with_offset.c deleted file mode 100644 index 34e13ca1..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_reordered_with_offset.c +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_q7_to_q15_reordered_with_offset.c - * Description: Converts the elements of the Q7 vector to a reordered Q15 vector with an added offset. The re-ordering - * is a signature of sign extension intrinsic(DSP extension). - * - * $Date: May 29, 2020 - * $Revision: V.2.0.3 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup nndata_convert - * @{ - */ - -/** - * @brief Converts the elements of the Q7 vector to a reordered Q15 vector with an added offset. - * - * @note Refer header file for details. - * - */ - -void arm_q7_to_q15_reordered_with_offset(const q7_t *src, q15_t *dst, uint32_t block_size, q15_t offset) -{ - -#if defined(ARM_MATH_DSP) - uint32_t block_cnt; - /* Run the below code for cores that support SIMD instructions */ - q31_t in_q7x4; - q31_t out_q15x2_1; - q31_t out_q15x2_2; - - /*loop unrolling */ - block_cnt = block_size >> 2u; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. */ - const q31_t offset_q15x2 = (q31_t)__PKHBT(offset, offset, 16); - while (block_cnt > 0u) - { - /* convert from q7 to q15 and then store the results in the destination buffer */ - in_q7x4 = arm_nn_read_q7x4_ia(&src); - - /* Extract and sign extend each of the four q7 values to q15 */ - out_q15x2_1 = __SXTAB16(offset_q15x2, __ROR((uint32_t)in_q7x4, 8)); - out_q15x2_2 = __SXTAB16(offset_q15x2, in_q7x4); - - write_q15x2_ia(&dst, out_q15x2_2); - write_q15x2_ia(&dst, out_q15x2_1); - - block_cnt--; - } - /* Handle left over samples */ - block_cnt = block_size % 0x4u; - - while (block_cnt > 0u) - { - *dst++ = (q15_t)*src++ + offset; - - /* Decrement the loop counter */ - block_cnt--; - } -#else - (void)src; - (void)dst; - (void)block_size; - (void)offset; - /* Not available */ -#endif -} - -/** - * @} end of nndata_convert group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_with_offset.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_with_offset.c deleted file mode 100644 index 4b69f556..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/NNSupportFunctions/arm_q7_to_q15_with_offset.c +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in_q7x4 compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in_q7x4 writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_q7_to_q15_with_offset.c - * Description: Converts the elements of the Q7 vector to Q15 vector with an added offset - * - * $Date: March 3, 2020 - * $Revision: V.2.0.2 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -/** - * @ingroup groupSupport - */ - -/** - * @addtogroup nndata_convert - * @{ - */ - -void arm_q7_to_q15_with_offset(const q7_t *src, - q15_t *dst, - uint32_t block_size, - q15_t offset) -{ - int block_cnt; - -#if defined(ARM_MATH_MVEI) - - int16x8_t source; - const int16x8_t source_offset = vdupq_n_s16(offset); - block_cnt = block_size / 8; - - while (block_cnt > 0) - { - source = vldrbq_s16(src); - source = vaddq_s16(source, source_offset); - vstrhq_s16(dst, source); - dst += 8; - src += 8; - block_cnt--; - } - - block_cnt = block_size & 0x7; - -#elif defined(ARM_MATH_DSP) - /* Run the below code for cores that support SIMD instructions */ - q31_t in_q7x4; - q31_t in_q15x2_1; - q31_t in_q15x2_2; - q31_t out_q15x2_1; - q31_t out_q15x2_2; - - /*loop unrolling */ - block_cnt = block_size >> 2; - - /* First part of the processing with loop unrolling. Compute 4 outputs at a time. */ - const q31_t offset_q15x2 = __PKHBT(offset, offset, 16); - while (block_cnt > 0) - { - /* convert from q7 to q15 and then store the results in the destination buffer */ - in_q7x4 = arm_nn_read_q7x4_ia(&src); - - /* Extract and sign extend each of the four q7 values to q15 */ - in_q15x2_1 = __SXTAB16(offset_q15x2, __ROR(in_q7x4, 8)); - in_q15x2_2 = __SXTAB16(offset_q15x2, in_q7x4); - - out_q15x2_2 = __PKHTB(in_q15x2_1, in_q15x2_2, 16); - out_q15x2_1 = __PKHBT(in_q15x2_2, in_q15x2_1, 16); - - write_q15x2_ia(&dst, out_q15x2_1); - write_q15x2_ia(&dst, out_q15x2_2); - - block_cnt--; - } - /* Handle left over samples */ - block_cnt = block_size % 0x4; - -#else - /* Run the below code for Cortex-M0 */ - /* Loop over block_size number of values */ - block_cnt = block_size; -#endif - - while (block_cnt > 0) - { - *dst++ = (q15_t)*src++ + offset; - - /* Decrement the loop counter */ - block_cnt--; - } -} - -/** - * @} end of nndata_convert group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_avgpool_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_avgpool_s8.c deleted file mode 100644 index fbcfdf6c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_avgpool_s8.c +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_avgpool_s8.c - * Description: Pooling function implementations - * - * $Date: May 29,2020 - * $Revision: V.2.0.1 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - - -#if defined (ARM_MATH_DSP) && !defined (ARM_MATH_MVEI) - -static void buffer_scale_back_q15_to_q7_and_clamp(q15_t *buffer, q7_t *target, uint16_t length, - uint16_t count,const int act_min, const int act_max) -{ - int i; - int sum; - - for (i = 0; i < length; i++) - { - sum = buffer[i] > 0 ? (buffer[i] + count / 2) / count : (buffer[i] - count / 2) / count; - - sum = MAX(sum, act_min); - sum = MIN(sum, act_max); - - target[i] = (q7_t) (sum); - } -} -#endif - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Pooling - * @{ - */ - -/* - * s8 average pooling function - * - * Refer to header file for details. - * - */ - -#if defined(ARM_MATH_MVEI) - -arm_status arm_avgpool_s8(const cmsis_nn_context *ctx, - const cmsis_nn_pool_params *pool_params, - const cmsis_nn_dims *input_dims, - const q7_t *src, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims, - q7_t *dst) -{ - (void)ctx; - const int32_t dim_src_height = input_dims->h; - const int32_t dim_src_width = input_dims->w; - const int32_t dim_dst_height = output_dims->h; - const int32_t dim_dst_width = output_dims->w; - const int32_t stride_height = pool_params->stride.h; - const int32_t stride_width = pool_params->stride.w; - const int32_t dim_kernel_height = filter_dims->h; - const int32_t dim_kernel_width = filter_dims->w; - const int32_t padding_height = pool_params->padding.h; - const int32_t padding_width = pool_params->padding.w; - const int32_t act_min = pool_params->activation.min; - const int32_t act_max = pool_params->activation.max; - const int32_t ch_src = input_dims->c; - - int32_t i_x, i_y; - int32_t k_x, k_y; - - for (i_y = 0; i_y < dim_dst_height; i_y++) - { - for (i_x = 0; i_x < dim_dst_width; i_x++) - { - - int32_t k_y_start,k_y_end; - int32_t k_x_start,k_x_end; - int32_t chCnt; - const int8_t *pTmp, *pTmpInner; - int8_t *pDst; - - k_y_start = MAX(0, i_y * stride_height - padding_height); - k_y_end = MIN(i_y * stride_height - padding_height + dim_kernel_height,dim_src_height); - - k_x_start = MAX(0,i_x * stride_width - padding_width); - k_x_end = MIN(i_x * stride_width - padding_width + dim_kernel_width, dim_src_width); - - - pTmp = src; - pDst = &dst[ch_src * (i_x + i_y * dim_dst_width)]; - - chCnt = ch_src >> 4; - while(chCnt > 0) - { - int32x4_t sumV1,sumV2,sumV3,sumV4; - - int8x16_t tempV; - int16x8_t tempVLO, tempVHI; - int32x4_t tempVLOLO, tempVLOHI, tempVHILO, tempVHIHI; - int32_t count = 0; - - sumV1 = vdupq_n_s32(0); - sumV2 = vdupq_n_s32(0); - sumV3 = vdupq_n_s32(0); - sumV4 = vdupq_n_s32(0); - - for (k_y = k_y_start; k_y < k_y_end; k_y++) - { - for (k_x = k_x_start; k_x < k_x_end; k_x++) - { - pTmpInner = pTmp + (ch_src * (k_x + k_y * dim_src_width)); - tempV = vldrbq_s8 (pTmpInner); - - tempVLO = vmovlbq_s8(tempV); - tempVHI = vmovltq_s8(tempV); - - tempVLOLO = vmovlbq_s16(tempVLO); - tempVLOHI = vmovltq_s16(tempVLO); - - tempVHILO = vmovlbq_s16(tempVHI); - tempVHIHI = vmovltq_s16(tempVHI); - - sumV1 = vaddq_s32(sumV1,tempVLOLO); - sumV2 = vaddq_s32(sumV2,tempVLOHI); - sumV3 = vaddq_s32(sumV3,tempVHILO); - sumV4 = vaddq_s32(sumV4,tempVHIHI); - - count++; - } - } - - - sumV1[0] = sumV1[0] > 0 ? (sumV1[0] + count / 2) / count : (sumV1[0] - count / 2) / count; - sumV1[1] = sumV1[1] > 0 ? (sumV1[1] + count / 2) / count : (sumV1[1] - count / 2) / count; - sumV1[2] = sumV1[2] > 0 ? (sumV1[2] + count / 2) / count : (sumV1[2] - count / 2) / count; - sumV1[3] = sumV1[3] > 0 ? (sumV1[3] + count / 2) / count : (sumV1[3] - count / 2) / count; - - sumV2[0] = sumV2[0] > 0 ? (sumV2[0] + count / 2) / count : (sumV2[0] - count / 2) / count; - sumV2[1] = sumV2[1] > 0 ? (sumV2[1] + count / 2) / count : (sumV2[1] - count / 2) / count; - sumV2[2] = sumV2[2] > 0 ? (sumV2[2] + count / 2) / count : (sumV2[2] - count / 2) / count; - sumV2[3] = sumV2[3] > 0 ? (sumV2[3] + count / 2) / count : (sumV2[3] - count / 2) / count; - - sumV3[0] = sumV3[0] > 0 ? (sumV3[0] + count / 2) / count : (sumV3[0] - count / 2) / count; - sumV3[1] = sumV3[1] > 0 ? (sumV3[1] + count / 2) / count : (sumV3[1] - count / 2) / count; - sumV3[2] = sumV3[2] > 0 ? (sumV3[2] + count / 2) / count : (sumV3[2] - count / 2) / count; - sumV3[3] = sumV3[3] > 0 ? (sumV3[3] + count / 2) / count : (sumV3[3] - count / 2) / count; - - sumV4[0] = sumV4[0] > 0 ? (sumV4[0] + count / 2) / count : (sumV4[0] - count / 2) / count; - sumV4[1] = sumV4[1] > 0 ? (sumV4[1] + count / 2) / count : (sumV4[1] - count / 2) / count; - sumV4[2] = sumV4[2] > 0 ? (sumV4[2] + count / 2) / count : (sumV4[2] - count / 2) / count; - sumV4[3] = sumV4[3] > 0 ? (sumV4[3] + count / 2) / count : (sumV4[3] - count / 2) / count; - - sumV1 = vmaxq_s32(sumV1, vdupq_n_s32(act_min)); - sumV1 = vminq_s32(sumV1, vdupq_n_s32(act_max)); - - sumV2 = vmaxq_s32(sumV2, vdupq_n_s32(act_min)); - sumV2 = vminq_s32(sumV2, vdupq_n_s32(act_max)); - - sumV3 = vmaxq_s32(sumV3, vdupq_n_s32(act_min)); - sumV3 = vminq_s32(sumV3, vdupq_n_s32(act_max)); - - sumV4 = vmaxq_s32(sumV4, vdupq_n_s32(act_min)); - sumV4 = vminq_s32(sumV4, vdupq_n_s32(act_max)); - - tempVLO = vmovnbq_s32(tempVLO,sumV1); - tempVLO = vmovntq_s32(tempVLO,sumV2); - - tempVHI = vmovnbq_s32(tempVHI,sumV3); - tempVHI = vmovntq_s32(tempVHI,sumV4); - - - tempV = vmovnbq_s16(tempV,tempVLO); - tempV = vmovntq_s16(tempV,tempVHI); - - vstrbq_s8(pDst,tempV); - pDst += 16; - - chCnt --; - pTmp += 16; - } - - chCnt = ch_src & 0xF; - while(chCnt > 0) - { - int32_t sum = 0; - int32_t count = 0; - - for (k_y = k_y_start; k_y < k_y_end; k_y++) - { - for (k_x = k_x_start; k_x < k_x_end; k_x++) - { - sum += pTmp[ch_src * (k_x + k_y * dim_src_width)]; - count++; - } - } - sum = sum > 0 ? (sum + count / 2) / count : (sum - count / 2) / count; - sum = MAX(sum, act_min); - sum = MIN(sum, act_max); - - *pDst++ = sum; - - chCnt --; - pTmp++; - } - } - } - return ARM_MATH_SUCCESS; -} - -#else -arm_status arm_avgpool_s8(const cmsis_nn_context *ctx, - const cmsis_nn_pool_params *pool_params, - const cmsis_nn_dims *input_dims, - const q7_t *src, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims, - q7_t *dst) -{ - const int32_t dim_src_height = input_dims->h; - const int32_t dim_src_width = input_dims->w; - const int32_t dim_dst_height = output_dims->h; - const int32_t dim_dst_width = output_dims->w; - const int32_t stride_height = pool_params->stride.h; - const int32_t stride_width = pool_params->stride.w; - const int32_t dim_kernel_height = filter_dims->h; - const int32_t dim_kernel_width = filter_dims->w; - const int32_t padding_height = pool_params->padding.h; - const int32_t padding_width = pool_params->padding.w; - const int32_t act_min = pool_params->activation.min; - const int32_t act_max = pool_params->activation.max; - const int32_t ch_src = input_dims->c; - q15_t *bufferA = (q15_t *)ctx->buf; - -#if defined (ARM_MATH_DSP) - - /* Run the following code for Cortex-M4 and Cortex-M7 - */ - int32_t k_x, k_y, i_x, i_y; - - for (i_y = 0; i_y < dim_dst_height; i_y++) - { - for (i_x = 0; i_x < dim_dst_width; i_x++) - { - /* Condition for kernel start dimension: (base_idx_ + kernel__start) >= 0 */ - const int32_t base_idx_y = (i_y * stride_height) - padding_height; - const int32_t base_idx_x = (i_x * stride_width) - padding_width; - const int32_t kernel_y_start = MAX(0, -base_idx_y); - const int32_t kernel_x_start = MAX(0, -base_idx_x); - - /* Condition for kernel end dimension: (base_idx_ + kernel__end) < dim_src_ */ - const int32_t kernel_y_end = MIN(dim_kernel_height, dim_src_height - base_idx_y); - const int32_t kernel_x_end = MIN(dim_kernel_width, dim_src_width - base_idx_x); - - int count = 0; - - for (k_y = kernel_y_start; k_y < kernel_y_end; k_y++) - { - for (k_x = kernel_x_start; k_x < kernel_x_end; k_x++) - { - const q7_t *start = src + ch_src * (k_x + base_idx_x + (k_y + base_idx_y) * dim_src_width); - - if (count == 0) - { - arm_q7_to_q15_no_shift(start, bufferA, ch_src); - } - else - { - arm_nn_accumulate_q7_to_q15(bufferA, start, ch_src); - } - count++; - } - } - buffer_scale_back_q15_to_q7_and_clamp(bufferA, dst, ch_src, count, act_min, act_max); - dst += ch_src; - } - } -#else - - /* Reference C code adapted from CMSIS-NN arm_avepool_q7_HWC. - */ - (void)bufferA; - int16_t i_ch_in, i_x, i_y; - int16_t k_x, k_y; - - for (i_y = 0; i_y < dim_dst_height; i_y++) - { - for (i_x = 0; i_x < dim_dst_width; i_x++) - { - for (i_ch_in = 0; i_ch_in < ch_src; i_ch_in++) - { - int sum = 0; - int count = 0; - for (k_y = i_y * stride_height - padding_height; k_y < i_y * stride_height - padding_height + dim_kernel_height; k_y++) - { - for (k_x = i_x * stride_width - padding_width; k_x < i_x * stride_width - padding_width + dim_kernel_width; k_x++) - { - if (k_y >= 0 && k_x >= 0 && k_y < dim_src_height && k_x < dim_src_width) - { - sum += src[i_ch_in + ch_src * (k_x + k_y * dim_src_width)]; - count++; - } - } - } - sum = sum > 0 ? (sum + count / 2) / count : (sum - count / 2) / count; - sum = MAX(sum, act_min); - sum = MIN(sum, act_max); - - dst[i_ch_in + ch_src * (i_x + i_y * dim_dst_width)] = sum; - } - } - } - -#endif - return ARM_MATH_SUCCESS; -} - -#endif /* ARM_MATH_MVEI */ - -int32_t arm_avgpool_s8_get_buffer_size(const int dim_dst_width, - const int ch_src) -{ - (void)dim_dst_width; - -#if defined(ARM_MATH_DSP) && !defined(ARM_MATH_MVEI) - return (ch_src * sizeof(int16_t)); -#else - (void)ch_src; - return 0; -#endif -} -/** - * @} end of Pooling group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_max_pool_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_max_pool_s8.c deleted file mode 100644 index df87ad98..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_max_pool_s8.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_max_pool_s8.c - * Description: Pooling function implementations - * - * $Date: June 11, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -static void compare_and_replace_if_larger_q7(q7_t *base, - const q7_t *target, - int32_t length) -{ -#if defined(ARM_MATH_MVEI) - int32_t loop_count = (length + 15) / 16; - for (int i = 0; i < loop_count; i++) - { - mve_pred16_t p = vctp16q((uint32_t)length); - const int8x16_t op_1 = vldrbq_z_s8(base, p); - const int8x16_t op_2 = vldrbq_z_s8(target, p); - const int8x16_t max = vmaxq_m_s8(vuninitializedq_s8(), op_1, op_2, p); - vstrbq_p_s8(base, max, p); - base += 16; - target += 16; - length -= 16; - } -#else - q7_t *dst = base; - const q7_t *src = target; - union arm_nnword ref_max; - union arm_nnword comp_max; - int32_t cnt = length >> 2; - - while (cnt > 0l) - { - ref_max.word = arm_nn_read_q7x4(dst); - comp_max.word = arm_nn_read_q7x4_ia(&src); - - if (comp_max.bytes[0] > ref_max.bytes[0]) - { - ref_max.bytes[0] = comp_max.bytes[0]; - } - if (comp_max.bytes[1] > ref_max.bytes[1]) - { - ref_max.bytes[1] = comp_max.bytes[1]; - } - if (comp_max.bytes[2] > ref_max.bytes[2]) - { - ref_max.bytes[2] = comp_max.bytes[2]; - } - if (comp_max.bytes[3] > ref_max.bytes[3]) - { - ref_max.bytes[3] = comp_max.bytes[3]; - } - - write_q7x4_ia(&dst, ref_max.word); - - cnt--; - } - - cnt = length & 0x3; - while (cnt > 0l) - { - if (*src > *dst) - { - *dst = *src; - } - dst++; - src++; - cnt--; - } -#endif -} - -static void -clamp_output(q7_t *source, int32_t length, const int32_t act_min, const int32_t act_max) -{ -#if defined(ARM_MATH_MVEI) - int32_t - loop_count = (length + 15) / 16; - for (int i = 0; i < loop_count; i++) - { - mve_pred16_t p = vctp16q((uint32_t)length); - length -= 16; - const int8x16_t src = vldrbq_z_s8(source, p); - const int8x16_t predicated_min = vdupq_m_n_s8(vuninitializedq_s8(), (int8_t)act_min, p); - const int8x16_t predicated_max = vdupq_m_n_s8(vuninitializedq_s8(), (int8_t)act_max, p); - int8x16_t - res = vmaxq_m_s8(vuninitializedq_s8(), src, predicated_min, p); - res = vminq_m_s8(vuninitializedq_s8(), src, predicated_max, p); - vstrbq_p_s8(source, res, p); - source += 16; - } -#else - union arm_nnword in; - int32_t cnt = length >> 2; - - while (cnt > 0l) - { - in.word = arm_nn_read_q7x4(source); - - in.bytes[0] = MAX(in.bytes[0], act_min); - in.bytes[0] = MIN(in.bytes[0], act_max); - in.bytes[1] = MAX(in.bytes[1], act_min); - in.bytes[1] = MIN(in.bytes[1], act_max); - in.bytes[2] = MAX(in.bytes[2], act_min); - in.bytes[2] = MIN(in.bytes[2], act_max); - in.bytes[3] = MAX(in.bytes[3], act_min); - in.bytes[3] = MIN(in.bytes[3], act_max); - - write_q7x4_ia(&source, in.word); - cnt--; - } - - cnt = length & 0x3; - while (cnt > 0l) - { - int32_t comp = *source; - comp = MAX(comp, act_min); - comp = MIN(comp, act_max); - *source++ = (int8_t)comp; - cnt--; - } -#endif -} - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Pooling - * @{ - */ - -/* - * Optimized s8 max pooling function - * - * Refer to header file for details. - * - */ - -arm_status -arm_max_pool_s8(const cmsis_nn_context *ctx, - const cmsis_nn_pool_params *pool_params, - const cmsis_nn_dims *input_dims, - const q7_t *src, - const cmsis_nn_dims *filter_dims, - const cmsis_nn_dims *output_dims, - q7_t *dst) -{ - const int32_t input_y = input_dims->h; - const int32_t input_x = input_dims->w; - const int32_t output_y = output_dims->h; - const int32_t output_x = output_dims->w; - const int32_t stride_y = pool_params->stride.h; - const int32_t stride_x = pool_params->stride.w; - const int32_t kernel_y = filter_dims->h; - const int32_t kernel_x = filter_dims->w; - const int32_t pad_y = pool_params->padding.h; - const int32_t pad_x = pool_params->padding.w; - const int32_t act_min = pool_params->activation.min; - const int32_t act_max = pool_params->activation.max; - const int32_t channel_in = input_dims->c; - (void)ctx; - q7_t *dst_base = dst; - - for (int i_y = 0, base_idx_y = -pad_y; i_y < output_y; base_idx_y += stride_y, i_y++) - { - for (int i_x = 0, base_idx_x = -pad_x; i_x < output_x; base_idx_x += stride_x, i_x++) - { - /* Condition for kernel start dimension: (base_idx_ + kernel__start) >= 0 */ - const int32_t ker_y_start = MAX(0, -base_idx_y); - const int32_t ker_x_start = MAX(0, -base_idx_x); - - /* Condition for kernel end dimension: (base_idx_ + kernel__end) < dim_src_ */ - const int32_t kernel_y_end = MIN(kernel_y, input_y - base_idx_y); - const int32_t kernel_x_end = MIN(kernel_x, input_x - base_idx_x); - - int count = 0; - - for (int k_y = ker_y_start; k_y < kernel_y_end; k_y++) - { - for (int k_x = ker_x_start; k_x < kernel_x_end; k_x++) - { - const q7_t *start = src + channel_in * (k_x + base_idx_x + (k_y + base_idx_y) * input_x); - - if (count == 0) - { - memcpy(dst, start, channel_in); - count++; - } - else - { - compare_and_replace_if_larger_q7(dst, start, channel_in); - } - } - } - /* 'count' is expected to be non-zero here. */ - dst += channel_in; - } - } - - clamp_output(dst_base, output_x * output_y * channel_in, act_min, act_max); - - return ARM_MATH_SUCCESS; -} - -/** - * @} end of Pooling group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_pool_q7_HWC.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_pool_q7_HWC.c deleted file mode 100644 index 4f1e2a51..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/PoolingFunctions/arm_pool_q7_HWC.c +++ /dev/null @@ -1,454 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_pool_q7_HWC.c - * Description: Pooling function implementations - * - * $Date: 17. January 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -#if defined (ARM_MATH_DSP) - -/** - * @brief A few utility functions used by pooling functions - * - * - */ - -static void buffer_scale_back_q15_to_q7(q15_t * buffer, q7_t * target, uint16_t length, uint16_t scale) -{ - int i; - - for (i = 0; i < length; i++) - { - target[i] = (q7_t) (buffer[i] / scale); - } -} - -static void compare_and_replace_if_larger_q7(q7_t * base, // base data - const q7_t * target, // compare target - const uint16_t length // data length - ) -{ - q7_t *pIn = base; - const q7_t *pCom = target; - union arm_nnword in; - union arm_nnword com; - uint16_t cnt = length >> 2; - - while (cnt > 0u) - { - in.word = arm_nn_read_q7x4((const q7_t*)pIn); - com.word = arm_nn_read_q7x4_ia((const q7_t**)&pCom); - - // if version - if (com.bytes[0] > in.bytes[0]) - in.bytes[0] = com.bytes[0]; - if (com.bytes[1] > in.bytes[1]) - in.bytes[1] = com.bytes[1]; - if (com.bytes[2] > in.bytes[2]) - in.bytes[2] = com.bytes[2]; - if (com.bytes[3] > in.bytes[3]) - in.bytes[3] = com.bytes[3]; - - *__SIMD32(pIn)++ = in.word; - - cnt--; - } - - cnt = length & 0x3; - while (cnt > 0u) - { - if (*pCom > *pIn) - { - *pIn = *pCom; - } - pIn++; - pCom++; - cnt--; - } -} - -static void accumulate_q7_to_q15(q15_t * base, q7_t * target, const uint16_t length) -{ - q15_t *pCnt = base; - q7_t *pV = target; - q31_t v1, v2, vo1, vo2; - uint16_t cnt = length >> 2; - q31_t in; - - while (cnt > 0u) - { - q31_t value = arm_nn_read_q7x4_ia((const q7_t**)&pV); - v1 = __SXTB16(__ROR(value, 8)); - v2 = __SXTB16(value); -#ifndef ARM_MATH_BIG_ENDIAN - - vo2 = __PKHTB(v1, v2, 16); - vo1 = __PKHBT(v2, v1, 16); - -#else - - vo1 = __PKHTB(v1, v2, 16); - vo2 = __PKHBT(v2, v1, 16); - -#endif - - in = arm_nn_read_q15x2(pCnt); - *__SIMD32(pCnt)++ = __QADD16(vo1, in); - - in = arm_nn_read_q15x2(pCnt); - *__SIMD32(pCnt)++ = __QADD16(vo2, in); - - cnt--; - } - cnt = length & 0x3; - while (cnt > 0u) - { - *pCnt++ += *pV++; - cnt--; - } -} - -#endif // ARM_MATH_DSP - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Pooling - * @{ - */ - - /** - * @brief Q7 max pooling function - * @param[in, out] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA Not used - * @param[in,out] Im_out pointer to output tensor - * - * @details - * - * The pooling function is implemented as split x-pooling then - * y-pooling. - * - * This pooling function is input-destructive. Input data is undefined - * after calling this function. - * - */ - -void -arm_maxpool_q7_HWC(q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, const uint16_t dim_im_out, q7_t * bufferA, q7_t * Im_out) -{ - (void)bufferA; -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - int16_t i_x, i_y; - - /* first does the pooling along x axis */ - for (i_y = 0; i_y < dim_im_in; i_y++) - { - - for (i_x = 0; i_x < dim_im_out; i_x++) - { - /* for each output pixel */ - q7_t *target = Im_in + (i_y * dim_im_in + i_x) * ch_im_in; - q7_t *win_start; - q7_t *win_stop; - if (i_x * stride - padding < 0) - { - win_start = target; - } else - { - win_start = Im_in + (i_y * dim_im_in + i_x * stride - padding) * ch_im_in; - } - - if (i_x * stride - padding + dim_kernel >= dim_im_in) - { - win_stop = Im_in + (i_y * dim_im_in + dim_im_in) * ch_im_in; - } else - { - win_stop = Im_in + (i_y * dim_im_in + i_x * stride - padding + dim_kernel) * ch_im_in; - } - - /* first step is to copy over initial data */ - /* arm_copy_q7(win_start, target, ch_im_in); */ - memmove(target, win_start, ch_im_in); - - /* start the max operation from the second part */ - win_start += ch_im_in; - for (; win_start < win_stop; win_start += ch_im_in) - { - compare_and_replace_if_larger_q7(target, win_start, ch_im_in); - } - } - } - - /* then does the pooling along y axis */ - for (i_y = 0; i_y < dim_im_out; i_y++) - { - - /* for each output row */ - q7_t *target = Im_out + i_y * dim_im_out * ch_im_in; - q7_t *row_start; - q7_t *row_end; - /* setting the starting row */ - if (i_y * stride - padding < 0) - { - row_start = Im_in; - } else - { - row_start = Im_in + (i_y * stride - padding) * dim_im_in * ch_im_in; - } - /* setting the stopping row */ - if (i_y * stride - padding + dim_kernel >= dim_im_in) - { - row_end = Im_in + dim_im_in * dim_im_in * ch_im_in; - } else - { - row_end = Im_in + (i_y * stride - padding + dim_kernel) * dim_im_in * ch_im_in; - } - - /* copy over the first row */ - /* arm_copy_q7(row_start, target, dim_im_out * ch_im_in); */ - memmove(target, row_start, dim_im_out * ch_im_in); - - /* move over to next row */ - row_start += ch_im_in * dim_im_in; - - for (; row_start < row_end; row_start += dim_im_in * ch_im_in) - { - compare_and_replace_if_larger_q7(target, row_start, dim_im_out * ch_im_in); - } - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - int16_t i_ch_in, i_x, i_y; - int16_t k_x, k_y; - - for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++) - { - for (i_y = 0; i_y < dim_im_out; i_y++) - { - for (i_x = 0; i_x < dim_im_out; i_x++) - { - int max = -129; - for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++) - { - for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++) - { - if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in) - { - if (Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)] > max) - { - max = Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)]; - } - } - } - } - Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = max; - } - } - } - -#endif /* ARM_MATH_DSP */ - -} - - /** - * @brief Q7 average pooling function - * @param[in,out] Im_in pointer to input tensor - * @param[in] dim_im_in input tensor dimention - * @param[in] ch_im_in number of input tensor channels - * @param[in] dim_kernel filter kernel size - * @param[in] padding padding sizes - * @param[in] stride convolution stride - * @param[in] dim_im_out output tensor dimension - * @param[in,out] bufferA pointer to buffer space for input - * @param[in,out] Im_out pointer to output tensor - * - * @details - * - * Buffer size: - * - * bufferA size: 2*dim_im_out*ch_im_in - * - * The pooling function is implemented as split x-pooling then - * y-pooling. - * - * This pooling function is input-destructive. Input data is undefined - * after calling this function. - * - */ - -void -arm_avepool_q7_HWC(q7_t * Im_in, - const uint16_t dim_im_in, - const uint16_t ch_im_in, - const uint16_t dim_kernel, - const uint16_t padding, - const uint16_t stride, const uint16_t dim_im_out, q7_t * bufferA, q7_t * Im_out) -{ - -#if defined (ARM_MATH_DSP) - /* Run the following code for Cortex-M4 and Cortex-M7 */ - - q15_t *buffer = (q15_t *) bufferA; - int16_t i_x, i_y; - int16_t count = 0; - - /* first does the pooling along x axis */ - for (i_y = 0; i_y < dim_im_in; i_y++) - { - - for (i_x = 0; i_x < dim_im_out; i_x++) - { - /* for each output pixel */ - q7_t *target = Im_in + (i_y * dim_im_in + i_x) * ch_im_in; - q7_t *win_start; - q7_t *win_stop; - if (i_x * stride - padding < 0) - { - win_start = target; - } else - { - win_start = Im_in + (i_y * dim_im_in + i_x * stride - padding) * ch_im_in; - } - - if (i_x * stride - padding + dim_kernel >= dim_im_in) - { - win_stop = Im_in + (i_y * dim_im_in + dim_im_in) * ch_im_in; - } else - { - win_stop = Im_in + (i_y * dim_im_in + i_x * stride - padding + dim_kernel) * ch_im_in; - } - - /* first step is to copy over initial data */ - arm_q7_to_q15_no_shift(win_start, buffer, ch_im_in); - count = 1; - - /* start the max operation from the second part */ - win_start += ch_im_in; - for (; win_start < win_stop; win_start += ch_im_in) - { - accumulate_q7_to_q15(buffer, win_start, ch_im_in); - count++; - } - buffer_scale_back_q15_to_q7(buffer, target, ch_im_in, count); - } - } - - /* then does the pooling along y axis */ - for (i_y = 0; i_y < dim_im_out; i_y++) - { - /* for each output row */ - q7_t *target = Im_out + i_y * dim_im_out * ch_im_in; - q7_t *row_start; - q7_t *row_end; - /* setting the starting row */ - if (i_y * stride - padding < 0) - { - row_start = Im_in; - } else - { - row_start = Im_in + (i_y * stride - padding) * dim_im_in * ch_im_in; - } - /* setting the stopping row */ - if (i_y * stride - padding + dim_kernel >= dim_im_in) - { - row_end = Im_in + dim_im_in * dim_im_in * ch_im_in; - } else - { - row_end = Im_in + (i_y * stride - padding + dim_kernel) * dim_im_in * ch_im_in; - } - - /* copy over the first row */ - arm_q7_to_q15_no_shift(row_start, buffer, dim_im_out * ch_im_in); - count = 1; - - /* move over to next row */ - row_start += ch_im_in * dim_im_in; - - for (; row_start < row_end; row_start += dim_im_in * ch_im_in) - { - accumulate_q7_to_q15(buffer, row_start, dim_im_out * ch_im_in); - count++; - } - buffer_scale_back_q15_to_q7(buffer, target, dim_im_out * ch_im_in, count); - } - -#else - /* Run the following code as reference implementation for Cortex-M0 and Cortex-M3 */ - - (void)bufferA; - int16_t i_ch_in, i_x, i_y; - int16_t k_x, k_y; - - for (i_ch_in = 0; i_ch_in < ch_im_in; i_ch_in++) - { - for (i_y = 0; i_y < dim_im_out; i_y++) - { - for (i_x = 0; i_x < dim_im_out; i_x++) - { - int sum = 0; - int count = 0; - for (k_y = i_y * stride - padding; k_y < i_y * stride - padding + dim_kernel; k_y++) - { - for (k_x = i_x * stride - padding; k_x < i_x * stride - padding + dim_kernel; k_x++) - { - if (k_y >= 0 && k_x >= 0 && k_y < dim_im_in && k_x < dim_im_in) - { - sum += Im_in[i_ch_in + ch_im_in * (k_x + k_y * dim_im_in)]; - count++; - } - } - } - Im_out[i_ch_in + ch_im_in * (i_x + i_y * dim_im_out)] = sum / count; - } - } - } - -#endif /* ARM_MATH_DSP */ - -} - -/** - * @} end of Pooling group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ReshapeFunctions/arm_reshape_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ReshapeFunctions/arm_reshape_s8.c deleted file mode 100644 index f943976c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/ReshapeFunctions/arm_reshape_s8.c +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_reshape_s8.c - * Description: Reshape a s8 vector - * - * $Date: September 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Reshape - * @{ - */ - -/** - * Basic s8 reshape function. - * - * Refer header file for details. - * - */ - -void arm_reshape_s8(const int8_t *input, - int8_t *output, - const uint32_t total_size) -{ - memcpy(output, input, total_size); -} - -/** - * @} end of Reshape group - */ \ No newline at end of file diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q15.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q15.c deleted file mode 100644 index 30000431..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q15.c +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2010-2018 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_softmax_q15.c - * Description: Q15 softmax function - * - * $Date: 20. February 2018 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Softmax - * @{ - */ - - /** - * @brief Q15 softmax function - * @param[in] vec_in pointer to input vector - * @param[in] dim_vec input vector dimention - * @param[out] p_out pointer to output vector - * - * @details - * - * Here, instead of typical e based softmax, we use - * 2-based softmax, i.e.,: - * - * y_i = 2^(x_i) / sum(2^x_j) - * - * The relative output will be different here. - * But mathematically, the gradient will be the same - * with a log(2) scaling factor. - * - */ - -void arm_softmax_q15(const q15_t * vec_in, const uint16_t dim_vec, q15_t * p_out) -{ - q31_t sum; - int16_t i; - uint8_t shift; - q31_t base; - base = -1 * 0x100000; - for (i = 0; i < dim_vec; i++) - { - if (vec_in[i] > base) - { - base = vec_in[i]; - } - } - - /* we ignore really small values - * anyway, they will be 0 after shrinking - * to q15_t - */ - base = base - 16; - - sum = 0; - - for (i = 0; i < dim_vec; i++) - { - if (vec_in[i] > base) - { - shift = (uint8_t)__USAT(vec_in[i] - base, 5); - sum += 0x1 << shift; - } - } - - /* This is effectively (0x1 << 32) / sum */ - int64_t div_base = 0x100000000LL; - int output_base = (int32_t)(div_base / sum); - - /* Final confidence will be output_base >> ( 17 - (vec_in[i] - base) ) - * so 32768 (0x1<<15) -> 100% confidence when sum = 0x1 << 16, output_base = 0x1 << 16 - * and vec_in[i]-base = 16 - */ - for (i = 0; i < dim_vec; i++) - { - if (vec_in[i] > base) - { - /* Here minimum value of 17+base-vec[i] will be 1 */ - shift = (uint8_t)__USAT(17+base-vec_in[i], 5); - p_out[i] = (q15_t) __SSAT((output_base >> shift), 16); - } else - { - p_out[i] = 0; - } - } - -} - -/** - * @} end of Softmax group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q7.c deleted file mode 100644 index c2032271..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_q7.c +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_softmax_q7.c - * Description: Q7 softmax function - * - * $Date: June 8, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Softmax - * @{ - */ - - /** - * @brief Q7 softmax function - * @param[in] vec_in pointer to input vector - * @param[in] dim_vec input vector dimention - * @param[out] p_out pointer to output vector - * - * @details - * - * Here, instead of typical natural logarithm e based softmax, we use - * 2-based softmax here, i.e.,: - * - * y_i = 2^(x_i) / sum(2^x_j) - * - * The relative output will be different here. - * But mathematically, the gradient will be the same - * with a log(2) scaling factor. - * - */ - -void arm_softmax_q7(const q7_t * vec_in, const uint16_t dim_vec, q7_t * p_out ) -{ - q31_t sum; - int16_t i; - uint8_t shift; - q15_t base; - base = -128; - - /* We first search for the maximum */ - for (i = 0; i < dim_vec; i++) - { - if (vec_in[i] > base) - { - base = vec_in[i]; - } - } - - /* - * So the base is set to max-8, meaning - * that we ignore really small values. - * anyway, they will be 0 after shrinking to q7_t. - */ - base = base - (1 << 3); - - sum = 0; - - for (i = 0; i < dim_vec; i++) - { - shift = (uint8_t)__USAT(vec_in[i] - base, 3); - sum += 0x1 << shift; - } - - /* This is effectively (0x1 << 20) / sum */ - int output_base = (1 << 20) / sum; - - for (i = 0; i < dim_vec; i++) - { - - /* Here minimum value of 13+base-vec_in[i] will be 5 */ - shift = (uint8_t)__USAT(13 + base - vec_in[i], 5); - p_out[i] = (q7_t)__SSAT((output_base >> shift), 8); - } -} - -/** - * @} end of Softmax group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_s8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_s8.c deleted file mode 100644 index 8639f706..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_s8.c +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_softmax_s8.c - * Description: S8 softmax function - * - * $Date: April 6, 2020 - * $Revision: V.2.0.0 - * - * Target Processor: Cortex-M cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnsupportfunctions.h" - -#define ACCUM_BITS 12 - -#ifdef ARM_MATH_MVEI -static int32x4_t arm_exp_on_negative_values_mve_32x4(int32x4_t val) -{ -#define SHIFT_START (24) - int32_t shift = SHIFT_START; - int32x4_t mask; - - const int32x4_t val_mod_minus_quarter = vandq_s32(val, vdupq_n_s32((1 << SHIFT_START) - 1)) - vdupq_n_s32(1 << SHIFT_START); - const int32x4_t remainder = vsubq_s32(val_mod_minus_quarter, val); - const int32x4_t x = vaddq_n_s32(val_mod_minus_quarter << 5, 1 << 28); - const int32x4_t x2 = MUL_SAT_MVE(x, x); - const int32x4_t op_1 = DIV_POW2_MVE(MUL_SAT_MVE(x2, x2), 2) + MUL_SAT_MVE(x2, x); - const int32x4_t op_2 = x + DIV_POW2_MVE(MUL_SAT_MVE(op_1, vdupq_n_s32(715827883)) + x2, 1); - int32x4_t result = vdupq_n_s32(1895147668) + MUL_SAT_MVE(vdupq_n_s32(1895147668), op_2); - -#define SELECT_IF_NON_ZERO(x) \ - { \ - mve_pred16_t p = vcmpneq_n_s32(remainder & vdupq_n_s32(1 << shift++), 0); \ - mask = vmvnq_m_s32(vdupq_n_s32(0), vdupq_n_s32(0), p); \ - result = SELECT_USING_MASK(mask, MUL_SAT_MVE(result, vdupq_n_s32(x)), result); \ - } - - SELECT_IF_NON_ZERO(1672461947) - SELECT_IF_NON_ZERO(1302514674) - SELECT_IF_NON_ZERO(790015084) - SELECT_IF_NON_ZERO(290630308) - SELECT_IF_NON_ZERO(39332535) - SELECT_IF_NON_ZERO(720401) - SELECT_IF_NON_ZERO(242) - -#undef SELECT_IF_NON_ZERO - - mve_pred16_t p = vcmpeqq_n_s32(val, 0); - mask = vmvnq_m_s32(vdupq_n_s32(0), vdupq_n_s32(0), p); - - result = SELECT_USING_MASK(mask, vdupq_n_s32(Q31_MAX), result); - return result; -} -#endif - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Softmax - * @{ - */ - -void arm_softmax_s8(const int8_t *input, - const int32_t num_rows, - const int32_t row_size, - const int32_t mult, - const int32_t shift, - const int32_t diff_min, - int8_t *output) -{ -#ifdef ARM_MATH_MVEI - -#define ACT_MIN ((int8_t)Q7_MIN) -#define ACT_MAX ((int8_t)Q7_MAX) - - const int32_t mask = (1 << shift); - - for (int i_num_rows = 0; i_num_rows < num_rows; ++i_num_rows) - { - int8_t max = ACT_MIN; - - int32_t vec_count = (row_size + 15) / 16; - uint32_t r_count = (uint32_t)row_size; - for (int i = 0; i < vec_count; i++) - { - mve_pred16_t p = vctp8q(r_count); - const int8x16_t ip = vldrbq_z_s8(&input[i * 16], p); - max = vmaxvq_p_s8(max, ip, p); - r_count -= 16; - } - - vec_count = row_size / 4; - int32_t idx = 0; - int32_t sum = 0; - - while (vec_count) - { - int32x4_t ip = vldrbq_s32(&input[idx * 4]); - ip = vsubq_n_s32(ip, max); - mve_pred16_t p = vcmpgeq_n_s32(ip, diff_min); - if (p != 0) - { - ip = vmulq_n_s32(ip, mask); - - int32x4_t res = MUL_SAT_MVE(ip, vdupq_n_s32(mult)); - - res = arm_exp_on_negative_values_mve_32x4(res); - res = DIV_POW2_MVE(res, ACCUM_BITS); - res = vpselq_s32(res, vdupq_n_s32(0), p); - sum += vaddvq_s32(res); - } - - vec_count--; - idx++; - } - - const int32_t tail_idx = row_size & ~3; - for (int i = 0; i < (row_size & 3); i++) - { - const int32_t diff = input[tail_idx + i] - max; - if (diff >= diff_min) - { - sum += DIV_POW2(EXP_ON_NEG(MUL_SAT(diff * mask, mult)), ACCUM_BITS); - } - } - - const int32_t headroom = __CLZ((uint32_t)sum); - const int32_t bits_over_unit = ACCUM_BITS - headroom + 23; - const int32_t shifted_scale = ONE_OVER1((sum << headroom) - (1 << 31)); - - vec_count = row_size / 4; - idx = 0; - - while (vec_count) - { - int32x4_t ip = vldrbq_s32(&input[idx]); - ip = vsubq_n_s32(ip, max); - - mve_pred16_t p = vcmpgeq_n_s32(ip, diff_min); - - int32x4_t tmp_res; - - if (p != 0) - { - ip = vmulq_n_s32(ip, mask); - - tmp_res = MUL_SAT_MVE(ip, vdupq_n_s32(mult)); - tmp_res = arm_exp_on_negative_values_mve_32x4(tmp_res); - tmp_res = MUL_SAT_MVE(vdupq_n_s32(shifted_scale), tmp_res); - tmp_res = DIV_POW2_MVE(tmp_res, bits_over_unit); - tmp_res += vdupq_n_s32(ACT_MIN); - - tmp_res = vmaxq_s32(tmp_res, vdupq_n_s32(ACT_MIN)); - tmp_res = vminq_s32(tmp_res, vdupq_n_s32(ACT_MAX)); - tmp_res = vpselq_s32(tmp_res, vdupq_n_s32(ACT_MIN), p); - } - else - { - tmp_res = vdupq_n_s32(ACT_MIN); - } - vstrbq_s32(&output[idx], tmp_res); - vec_count--; - idx += 4; - } - - for (int i = 0; i < (row_size & 3); i++) - { - int32_t diff = input[tail_idx + i] - max; - if (diff >= diff_min) - { - const int32_t res = DIV_POW2(MUL_SAT(shifted_scale, EXP_ON_NEG(MUL_SAT(diff * mask, mult))), bits_over_unit) - 128; - output[tail_idx + i] = (int8_t)CLAMP(res, (int32_t)ACT_MAX, (int32_t)ACT_MIN); - } - else - { - output[tail_idx + i] = ACT_MIN; - } - } - - input += row_size; - output += row_size; - } -#else - const int32_t mask = (1 << shift); - - int32_t col = 0; - int32_t row_idx; - - for (row_idx = 0; row_idx < num_rows; ++row_idx) - { - // Find the maximum value in order to ensure numerical stability - int8_t max = *input; - - for (col = 1; col < row_size; ++col) - { - max = MAX(max, input[col]); - } - - int32_t diff = 0; - int32_t sum = 0; - - for (col = 0; col < row_size; ++col) - { - diff = input[col] - max; - if (diff >= diff_min) - { - sum += DIV_POW2(EXP_ON_NEG(MUL_SAT(diff * mask, mult)), ACCUM_BITS); - } - } - - const int32_t headroom = __CLZ(sum); - const int32_t bits_over_unit = ACCUM_BITS - headroom + 23; - const int32_t shifted_scale = ONE_OVER1((sum << headroom) - (1 << 31)); - - for (col = 0; col < row_size; ++col) - { - diff = input[col] - max; - if (diff >= diff_min) - { - const int32_t res = DIV_POW2(MUL_SAT(shifted_scale, EXP_ON_NEG(MUL_SAT(diff * mask, mult))), bits_over_unit) - 128; - output[col] = (int8_t)CLAMP(res, (int32_t)127, (int32_t)-128); - } - else - { - output[col] = -128; - } - } - input += row_size; - output += row_size; - } - -#endif -} -/** - * @} end of Softmax group - */ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_u8.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_u8.c deleted file mode 100644 index 2820af64..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_u8.c +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2010-2020 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_softmax_u8.c - * Description: U8 softmax function - * - * $Date: May 29, 2020 - * $Revision: V.1.0.1 - * - * Target Processor: Cortex-M CPUs - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -#define ACCUM_BITS 12 - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Softmax - * @{ - */ -void arm_softmax_u8(const uint8_t *input, - const int32_t num_rows, - const int32_t row_size, - const int32_t mult, - const int32_t shift, - const int32_t diff_min, - uint8_t *output) -{ - const int32_t mask = (1 << shift); - - int32_t col = 0; - int32_t row_idx; - - for(row_idx = 0; row_idx < num_rows; ++row_idx) - { - // Find the maximum value in order to ensure numerical stability - uint8_t max = *input; - - for (col = 1; col < row_size; ++col) - { - max = MAX(max, input[col]); - } - - int32_t diff = 0; - int32_t sum = 0; - - for (col = 0; col < row_size; ++col) - { - diff = input[col] - max; - if(diff >= diff_min) - { - sum += DIV_POW2(EXP_ON_NEG(MUL_SAT(diff * mask, mult)), ACCUM_BITS); - } - } - - const int32_t headroom = __CLZ((uint32_t)sum); - const int32_t bits_over_unit = ACCUM_BITS - headroom + 23; - const int32_t shifted_scale = ONE_OVER1((sum << headroom) - (1 << 31)); - - for (col = 0; col < row_size; ++col) - { - diff = input[col] - max; - if (diff >= diff_min) - { - const int32_t res = DIV_POW2(MUL_SAT(shifted_scale, EXP_ON_NEG(MUL_SAT(diff * mask, mult))), bits_over_unit); - output[col] = (uint8_t) CLAMP(res, (int32_t)255, (int32_t)0); - } - else - { - output[col] = 0; - } - } - input += row_size; - output += row_size; - } -} -/** - * @} end of Softmax group - */ \ No newline at end of file diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_with_batch_q7.c b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_with_batch_q7.c deleted file mode 100644 index e4a634d6..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/micro/tools/make/downloads/cmsis/CMSIS/NN/Source/SoftmaxFunctions/arm_softmax_with_batch_q7.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2010-2019 Arm Limited or its affiliates. All rights reserved. - * - * SPDX-License-Identifier: Apache-2.0 - * - * Licensed under the Apache License, Version 2.0 (the License); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an AS IS BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/* ---------------------------------------------------------------------- - * Project: CMSIS NN Library - * Title: arm_softmax_with_batch_q7.c - * Description: Q7 softmax function - * - * $Date: 05. August 2019 - * $Revision: V.1.0.0 - * - * Target Processor: Cortex-M and Cortex-A cores - * - * -------------------------------------------------------------------- */ - -#include "cmsis/CMSIS/DSP/Include/arm_math.h" -#include "cmsis/CMSIS/NN/Include/arm_nnfunctions.h" - -/** - * @ingroup groupNN - */ - -/** - * @addtogroup Softmax - * @{ - */ - - /** - * @brief Q7 softmax function with batch parameter - * @param[in] vec_in pointer to input vector - * @param[in] nb_batches number of batches - * @param[in] dim_vec input vector dimention - * @param[out] p_out pointer to output vector - * - * @details - * - * Here, instead of typical natural logarithm e based softmax, we use - * 2-based softmax here, i.e.,: - * - * y_i = 2^(x_i) / sum(2^x_j) - * - * The relative output will be different here. - * But mathematically, the gradient will be the same - * with a log(2) scaling factor. - * - */ - -void arm_softmax_with_batch_q7(const q7_t * vec_in, const uint16_t nb_batches,const uint16_t dim_vec, q7_t * p_out ) -{ - for(int i=0; i(e); - return EnumNamesTensorType()[index]; -} - -enum QuantizationDetails { - QuantizationDetails_NONE = 0, - QuantizationDetails_CustomQuantization = 1, - QuantizationDetails_MIN = QuantizationDetails_NONE, - QuantizationDetails_MAX = QuantizationDetails_CustomQuantization -}; - -inline const QuantizationDetails (&EnumValuesQuantizationDetails())[2] { - static const QuantizationDetails values[] = { - QuantizationDetails_NONE, - QuantizationDetails_CustomQuantization - }; - return values; -} - -inline const char * const *EnumNamesQuantizationDetails() { - static const char * const names[3] = { - "NONE", - "CustomQuantization", - nullptr - }; - return names; -} - -inline const char *EnumNameQuantizationDetails(QuantizationDetails e) { - if (flatbuffers::IsOutRange(e, QuantizationDetails_NONE, QuantizationDetails_CustomQuantization)) return ""; - const size_t index = static_cast(e); - return EnumNamesQuantizationDetails()[index]; -} - -template struct QuantizationDetailsTraits { - static const QuantizationDetails enum_value = QuantizationDetails_NONE; -}; - -template<> struct QuantizationDetailsTraits { - static const QuantizationDetails enum_value = QuantizationDetails_CustomQuantization; -}; - -struct QuantizationDetailsUnion { - QuantizationDetails type; - void *value; - - QuantizationDetailsUnion() : type(QuantizationDetails_NONE), value(nullptr) {} - QuantizationDetailsUnion(QuantizationDetailsUnion&& u) FLATBUFFERS_NOEXCEPT : - type(QuantizationDetails_NONE), value(nullptr) - { std::swap(type, u.type); std::swap(value, u.value); } - QuantizationDetailsUnion(const QuantizationDetailsUnion &) FLATBUFFERS_NOEXCEPT; - QuantizationDetailsUnion &operator=(const QuantizationDetailsUnion &u) FLATBUFFERS_NOEXCEPT - { QuantizationDetailsUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; } - QuantizationDetailsUnion &operator=(QuantizationDetailsUnion &&u) FLATBUFFERS_NOEXCEPT - { std::swap(type, u.type); std::swap(value, u.value); return *this; } - ~QuantizationDetailsUnion() { Reset(); } - - void Reset(); - -#ifndef FLATBUFFERS_CPP98_STL - template - void Set(T&& val) { - using RT = typename std::remove_reference::type; - Reset(); - type = QuantizationDetailsTraits::enum_value; - if (type != QuantizationDetails_NONE) { - value = new RT(std::forward(val)); - } - } -#endif // FLATBUFFERS_CPP98_STL - - static void *UnPack(const void *obj, QuantizationDetails type, const flatbuffers::resolver_function_t *resolver); - flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; - - tflite::CustomQuantizationT *AsCustomQuantization() { - return type == QuantizationDetails_CustomQuantization ? - reinterpret_cast(value) : nullptr; - } - const tflite::CustomQuantizationT *AsCustomQuantization() const { - return type == QuantizationDetails_CustomQuantization ? - reinterpret_cast(value) : nullptr; - } -}; - -bool VerifyQuantizationDetails(flatbuffers::Verifier &verifier, const void *obj, QuantizationDetails type); -bool VerifyQuantizationDetailsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); - -enum DimensionType { - DimensionType_DENSE = 0, - DimensionType_SPARSE_CSR = 1, - DimensionType_MIN = DimensionType_DENSE, - DimensionType_MAX = DimensionType_SPARSE_CSR -}; - -inline const DimensionType (&EnumValuesDimensionType())[2] { - static const DimensionType values[] = { - DimensionType_DENSE, - DimensionType_SPARSE_CSR - }; - return values; -} - -inline const char * const *EnumNamesDimensionType() { - static const char * const names[3] = { - "DENSE", - "SPARSE_CSR", - nullptr - }; - return names; -} - -inline const char *EnumNameDimensionType(DimensionType e) { - if (flatbuffers::IsOutRange(e, DimensionType_DENSE, DimensionType_SPARSE_CSR)) return ""; - const size_t index = static_cast(e); - return EnumNamesDimensionType()[index]; -} - -enum SparseIndexVector { - SparseIndexVector_NONE = 0, - SparseIndexVector_Int32Vector = 1, - SparseIndexVector_Uint16Vector = 2, - SparseIndexVector_Uint8Vector = 3, - SparseIndexVector_MIN = SparseIndexVector_NONE, - SparseIndexVector_MAX = SparseIndexVector_Uint8Vector -}; - -inline const SparseIndexVector (&EnumValuesSparseIndexVector())[4] { - static const SparseIndexVector values[] = { - SparseIndexVector_NONE, - SparseIndexVector_Int32Vector, - SparseIndexVector_Uint16Vector, - SparseIndexVector_Uint8Vector - }; - return values; -} - -inline const char * const *EnumNamesSparseIndexVector() { - static const char * const names[5] = { - "NONE", - "Int32Vector", - "Uint16Vector", - "Uint8Vector", - nullptr - }; - return names; -} - -inline const char *EnumNameSparseIndexVector(SparseIndexVector e) { - if (flatbuffers::IsOutRange(e, SparseIndexVector_NONE, SparseIndexVector_Uint8Vector)) return ""; - const size_t index = static_cast(e); - return EnumNamesSparseIndexVector()[index]; -} - -template struct SparseIndexVectorTraits { - static const SparseIndexVector enum_value = SparseIndexVector_NONE; -}; - -template<> struct SparseIndexVectorTraits { - static const SparseIndexVector enum_value = SparseIndexVector_Int32Vector; -}; - -template<> struct SparseIndexVectorTraits { - static const SparseIndexVector enum_value = SparseIndexVector_Uint16Vector; -}; - -template<> struct SparseIndexVectorTraits { - static const SparseIndexVector enum_value = SparseIndexVector_Uint8Vector; -}; - -struct SparseIndexVectorUnion { - SparseIndexVector type; - void *value; - - SparseIndexVectorUnion() : type(SparseIndexVector_NONE), value(nullptr) {} - SparseIndexVectorUnion(SparseIndexVectorUnion&& u) FLATBUFFERS_NOEXCEPT : - type(SparseIndexVector_NONE), value(nullptr) - { std::swap(type, u.type); std::swap(value, u.value); } - SparseIndexVectorUnion(const SparseIndexVectorUnion &) FLATBUFFERS_NOEXCEPT; - SparseIndexVectorUnion &operator=(const SparseIndexVectorUnion &u) FLATBUFFERS_NOEXCEPT - { SparseIndexVectorUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; } - SparseIndexVectorUnion &operator=(SparseIndexVectorUnion &&u) FLATBUFFERS_NOEXCEPT - { std::swap(type, u.type); std::swap(value, u.value); return *this; } - ~SparseIndexVectorUnion() { Reset(); } - - void Reset(); - -#ifndef FLATBUFFERS_CPP98_STL - template - void Set(T&& val) { - using RT = typename std::remove_reference::type; - Reset(); - type = SparseIndexVectorTraits::enum_value; - if (type != SparseIndexVector_NONE) { - value = new RT(std::forward(val)); - } - } -#endif // FLATBUFFERS_CPP98_STL - - static void *UnPack(const void *obj, SparseIndexVector type, const flatbuffers::resolver_function_t *resolver); - flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; - - tflite::Int32VectorT *AsInt32Vector() { - return type == SparseIndexVector_Int32Vector ? - reinterpret_cast(value) : nullptr; - } - const tflite::Int32VectorT *AsInt32Vector() const { - return type == SparseIndexVector_Int32Vector ? - reinterpret_cast(value) : nullptr; - } - tflite::Uint16VectorT *AsUint16Vector() { - return type == SparseIndexVector_Uint16Vector ? - reinterpret_cast(value) : nullptr; - } - const tflite::Uint16VectorT *AsUint16Vector() const { - return type == SparseIndexVector_Uint16Vector ? - reinterpret_cast(value) : nullptr; - } - tflite::Uint8VectorT *AsUint8Vector() { - return type == SparseIndexVector_Uint8Vector ? - reinterpret_cast(value) : nullptr; - } - const tflite::Uint8VectorT *AsUint8Vector() const { - return type == SparseIndexVector_Uint8Vector ? - reinterpret_cast(value) : nullptr; - } -}; - -bool VerifySparseIndexVector(flatbuffers::Verifier &verifier, const void *obj, SparseIndexVector type); -bool VerifySparseIndexVectorVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); - -enum BuiltinOperator { - BuiltinOperator_ADD = 0, - BuiltinOperator_AVERAGE_POOL_2D = 1, - BuiltinOperator_CONCATENATION = 2, - BuiltinOperator_CONV_2D = 3, - BuiltinOperator_DEPTHWISE_CONV_2D = 4, - BuiltinOperator_DEPTH_TO_SPACE = 5, - BuiltinOperator_DEQUANTIZE = 6, - BuiltinOperator_EMBEDDING_LOOKUP = 7, - BuiltinOperator_FLOOR = 8, - BuiltinOperator_FULLY_CONNECTED = 9, - BuiltinOperator_HASHTABLE_LOOKUP = 10, - BuiltinOperator_L2_NORMALIZATION = 11, - BuiltinOperator_L2_POOL_2D = 12, - BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION = 13, - BuiltinOperator_LOGISTIC = 14, - BuiltinOperator_LSH_PROJECTION = 15, - BuiltinOperator_LSTM = 16, - BuiltinOperator_MAX_POOL_2D = 17, - BuiltinOperator_MUL = 18, - BuiltinOperator_RELU = 19, - BuiltinOperator_RELU_N1_TO_1 = 20, - BuiltinOperator_RELU6 = 21, - BuiltinOperator_RESHAPE = 22, - BuiltinOperator_RESIZE_BILINEAR = 23, - BuiltinOperator_RNN = 24, - BuiltinOperator_SOFTMAX = 25, - BuiltinOperator_SPACE_TO_DEPTH = 26, - BuiltinOperator_SVDF = 27, - BuiltinOperator_TANH = 28, - BuiltinOperator_CONCAT_EMBEDDINGS = 29, - BuiltinOperator_SKIP_GRAM = 30, - BuiltinOperator_CALL = 31, - BuiltinOperator_CUSTOM = 32, - BuiltinOperator_EMBEDDING_LOOKUP_SPARSE = 33, - BuiltinOperator_PAD = 34, - BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN = 35, - BuiltinOperator_GATHER = 36, - BuiltinOperator_BATCH_TO_SPACE_ND = 37, - BuiltinOperator_SPACE_TO_BATCH_ND = 38, - BuiltinOperator_TRANSPOSE = 39, - BuiltinOperator_MEAN = 40, - BuiltinOperator_SUB = 41, - BuiltinOperator_DIV = 42, - BuiltinOperator_SQUEEZE = 43, - BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM = 44, - BuiltinOperator_STRIDED_SLICE = 45, - BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN = 46, - BuiltinOperator_EXP = 47, - BuiltinOperator_TOPK_V2 = 48, - BuiltinOperator_SPLIT = 49, - BuiltinOperator_LOG_SOFTMAX = 50, - BuiltinOperator_DELEGATE = 51, - BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM = 52, - BuiltinOperator_CAST = 53, - BuiltinOperator_PRELU = 54, - BuiltinOperator_MAXIMUM = 55, - BuiltinOperator_ARG_MAX = 56, - BuiltinOperator_MINIMUM = 57, - BuiltinOperator_LESS = 58, - BuiltinOperator_NEG = 59, - BuiltinOperator_PADV2 = 60, - BuiltinOperator_GREATER = 61, - BuiltinOperator_GREATER_EQUAL = 62, - BuiltinOperator_LESS_EQUAL = 63, - BuiltinOperator_SELECT = 64, - BuiltinOperator_SLICE = 65, - BuiltinOperator_SIN = 66, - BuiltinOperator_TRANSPOSE_CONV = 67, - BuiltinOperator_SPARSE_TO_DENSE = 68, - BuiltinOperator_TILE = 69, - BuiltinOperator_EXPAND_DIMS = 70, - BuiltinOperator_EQUAL = 71, - BuiltinOperator_NOT_EQUAL = 72, - BuiltinOperator_LOG = 73, - BuiltinOperator_SUM = 74, - BuiltinOperator_SQRT = 75, - BuiltinOperator_RSQRT = 76, - BuiltinOperator_SHAPE = 77, - BuiltinOperator_POW = 78, - BuiltinOperator_ARG_MIN = 79, - BuiltinOperator_FAKE_QUANT = 80, - BuiltinOperator_REDUCE_PROD = 81, - BuiltinOperator_REDUCE_MAX = 82, - BuiltinOperator_PACK = 83, - BuiltinOperator_LOGICAL_OR = 84, - BuiltinOperator_ONE_HOT = 85, - BuiltinOperator_LOGICAL_AND = 86, - BuiltinOperator_LOGICAL_NOT = 87, - BuiltinOperator_UNPACK = 88, - BuiltinOperator_REDUCE_MIN = 89, - BuiltinOperator_FLOOR_DIV = 90, - BuiltinOperator_REDUCE_ANY = 91, - BuiltinOperator_SQUARE = 92, - BuiltinOperator_ZEROS_LIKE = 93, - BuiltinOperator_FILL = 94, - BuiltinOperator_FLOOR_MOD = 95, - BuiltinOperator_RANGE = 96, - BuiltinOperator_RESIZE_NEAREST_NEIGHBOR = 97, - BuiltinOperator_LEAKY_RELU = 98, - BuiltinOperator_SQUARED_DIFFERENCE = 99, - BuiltinOperator_MIRROR_PAD = 100, - BuiltinOperator_ABS = 101, - BuiltinOperator_SPLIT_V = 102, - BuiltinOperator_UNIQUE = 103, - BuiltinOperator_CEIL = 104, - BuiltinOperator_REVERSE_V2 = 105, - BuiltinOperator_ADD_N = 106, - BuiltinOperator_GATHER_ND = 107, - BuiltinOperator_COS = 108, - BuiltinOperator_WHERE = 109, - BuiltinOperator_RANK = 110, - BuiltinOperator_ELU = 111, - BuiltinOperator_REVERSE_SEQUENCE = 112, - BuiltinOperator_MATRIX_DIAG = 113, - BuiltinOperator_QUANTIZE = 114, - BuiltinOperator_MATRIX_SET_DIAG = 115, - BuiltinOperator_ROUND = 116, - BuiltinOperator_HARD_SWISH = 117, - BuiltinOperator_IF = 118, - BuiltinOperator_WHILE = 119, - BuiltinOperator_NON_MAX_SUPPRESSION_V4 = 120, - BuiltinOperator_NON_MAX_SUPPRESSION_V5 = 121, - BuiltinOperator_SCATTER_ND = 122, - BuiltinOperator_SELECT_V2 = 123, - BuiltinOperator_DENSIFY = 124, - BuiltinOperator_SEGMENT_SUM = 125, - BuiltinOperator_BATCH_MATMUL = 126, - BuiltinOperator_MIN = BuiltinOperator_ADD, - BuiltinOperator_MAX = BuiltinOperator_BATCH_MATMUL -}; - -inline const BuiltinOperator (&EnumValuesBuiltinOperator())[127] { - static const BuiltinOperator values[] = { - BuiltinOperator_ADD, - BuiltinOperator_AVERAGE_POOL_2D, - BuiltinOperator_CONCATENATION, - BuiltinOperator_CONV_2D, - BuiltinOperator_DEPTHWISE_CONV_2D, - BuiltinOperator_DEPTH_TO_SPACE, - BuiltinOperator_DEQUANTIZE, - BuiltinOperator_EMBEDDING_LOOKUP, - BuiltinOperator_FLOOR, - BuiltinOperator_FULLY_CONNECTED, - BuiltinOperator_HASHTABLE_LOOKUP, - BuiltinOperator_L2_NORMALIZATION, - BuiltinOperator_L2_POOL_2D, - BuiltinOperator_LOCAL_RESPONSE_NORMALIZATION, - BuiltinOperator_LOGISTIC, - BuiltinOperator_LSH_PROJECTION, - BuiltinOperator_LSTM, - BuiltinOperator_MAX_POOL_2D, - BuiltinOperator_MUL, - BuiltinOperator_RELU, - BuiltinOperator_RELU_N1_TO_1, - BuiltinOperator_RELU6, - BuiltinOperator_RESHAPE, - BuiltinOperator_RESIZE_BILINEAR, - BuiltinOperator_RNN, - BuiltinOperator_SOFTMAX, - BuiltinOperator_SPACE_TO_DEPTH, - BuiltinOperator_SVDF, - BuiltinOperator_TANH, - BuiltinOperator_CONCAT_EMBEDDINGS, - BuiltinOperator_SKIP_GRAM, - BuiltinOperator_CALL, - BuiltinOperator_CUSTOM, - BuiltinOperator_EMBEDDING_LOOKUP_SPARSE, - BuiltinOperator_PAD, - BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_RNN, - BuiltinOperator_GATHER, - BuiltinOperator_BATCH_TO_SPACE_ND, - BuiltinOperator_SPACE_TO_BATCH_ND, - BuiltinOperator_TRANSPOSE, - BuiltinOperator_MEAN, - BuiltinOperator_SUB, - BuiltinOperator_DIV, - BuiltinOperator_SQUEEZE, - BuiltinOperator_UNIDIRECTIONAL_SEQUENCE_LSTM, - BuiltinOperator_STRIDED_SLICE, - BuiltinOperator_BIDIRECTIONAL_SEQUENCE_RNN, - BuiltinOperator_EXP, - BuiltinOperator_TOPK_V2, - BuiltinOperator_SPLIT, - BuiltinOperator_LOG_SOFTMAX, - BuiltinOperator_DELEGATE, - BuiltinOperator_BIDIRECTIONAL_SEQUENCE_LSTM, - BuiltinOperator_CAST, - BuiltinOperator_PRELU, - BuiltinOperator_MAXIMUM, - BuiltinOperator_ARG_MAX, - BuiltinOperator_MINIMUM, - BuiltinOperator_LESS, - BuiltinOperator_NEG, - BuiltinOperator_PADV2, - BuiltinOperator_GREATER, - BuiltinOperator_GREATER_EQUAL, - BuiltinOperator_LESS_EQUAL, - BuiltinOperator_SELECT, - BuiltinOperator_SLICE, - BuiltinOperator_SIN, - BuiltinOperator_TRANSPOSE_CONV, - BuiltinOperator_SPARSE_TO_DENSE, - BuiltinOperator_TILE, - BuiltinOperator_EXPAND_DIMS, - BuiltinOperator_EQUAL, - BuiltinOperator_NOT_EQUAL, - BuiltinOperator_LOG, - BuiltinOperator_SUM, - BuiltinOperator_SQRT, - BuiltinOperator_RSQRT, - BuiltinOperator_SHAPE, - BuiltinOperator_POW, - BuiltinOperator_ARG_MIN, - BuiltinOperator_FAKE_QUANT, - BuiltinOperator_REDUCE_PROD, - BuiltinOperator_REDUCE_MAX, - BuiltinOperator_PACK, - BuiltinOperator_LOGICAL_OR, - BuiltinOperator_ONE_HOT, - BuiltinOperator_LOGICAL_AND, - BuiltinOperator_LOGICAL_NOT, - BuiltinOperator_UNPACK, - BuiltinOperator_REDUCE_MIN, - BuiltinOperator_FLOOR_DIV, - BuiltinOperator_REDUCE_ANY, - BuiltinOperator_SQUARE, - BuiltinOperator_ZEROS_LIKE, - BuiltinOperator_FILL, - BuiltinOperator_FLOOR_MOD, - BuiltinOperator_RANGE, - BuiltinOperator_RESIZE_NEAREST_NEIGHBOR, - BuiltinOperator_LEAKY_RELU, - BuiltinOperator_SQUARED_DIFFERENCE, - BuiltinOperator_MIRROR_PAD, - BuiltinOperator_ABS, - BuiltinOperator_SPLIT_V, - BuiltinOperator_UNIQUE, - BuiltinOperator_CEIL, - BuiltinOperator_REVERSE_V2, - BuiltinOperator_ADD_N, - BuiltinOperator_GATHER_ND, - BuiltinOperator_COS, - BuiltinOperator_WHERE, - BuiltinOperator_RANK, - BuiltinOperator_ELU, - BuiltinOperator_REVERSE_SEQUENCE, - BuiltinOperator_MATRIX_DIAG, - BuiltinOperator_QUANTIZE, - BuiltinOperator_MATRIX_SET_DIAG, - BuiltinOperator_ROUND, - BuiltinOperator_HARD_SWISH, - BuiltinOperator_IF, - BuiltinOperator_WHILE, - BuiltinOperator_NON_MAX_SUPPRESSION_V4, - BuiltinOperator_NON_MAX_SUPPRESSION_V5, - BuiltinOperator_SCATTER_ND, - BuiltinOperator_SELECT_V2, - BuiltinOperator_DENSIFY, - BuiltinOperator_SEGMENT_SUM, - BuiltinOperator_BATCH_MATMUL - }; - return values; -} - -inline const char * const *EnumNamesBuiltinOperator() { - static const char * const names[128] = { - "ADD", - "AVERAGE_POOL_2D", - "CONCATENATION", - "CONV_2D", - "DEPTHWISE_CONV_2D", - "DEPTH_TO_SPACE", - "DEQUANTIZE", - "EMBEDDING_LOOKUP", - "FLOOR", - "FULLY_CONNECTED", - "HASHTABLE_LOOKUP", - "L2_NORMALIZATION", - "L2_POOL_2D", - "LOCAL_RESPONSE_NORMALIZATION", - "LOGISTIC", - "LSH_PROJECTION", - "LSTM", - "MAX_POOL_2D", - "MUL", - "RELU", - "RELU_N1_TO_1", - "RELU6", - "RESHAPE", - "RESIZE_BILINEAR", - "RNN", - "SOFTMAX", - "SPACE_TO_DEPTH", - "SVDF", - "TANH", - "CONCAT_EMBEDDINGS", - "SKIP_GRAM", - "CALL", - "CUSTOM", - "EMBEDDING_LOOKUP_SPARSE", - "PAD", - "UNIDIRECTIONAL_SEQUENCE_RNN", - "GATHER", - "BATCH_TO_SPACE_ND", - "SPACE_TO_BATCH_ND", - "TRANSPOSE", - "MEAN", - "SUB", - "DIV", - "SQUEEZE", - "UNIDIRECTIONAL_SEQUENCE_LSTM", - "STRIDED_SLICE", - "BIDIRECTIONAL_SEQUENCE_RNN", - "EXP", - "TOPK_V2", - "SPLIT", - "LOG_SOFTMAX", - "DELEGATE", - "BIDIRECTIONAL_SEQUENCE_LSTM", - "CAST", - "PRELU", - "MAXIMUM", - "ARG_MAX", - "MINIMUM", - "LESS", - "NEG", - "PADV2", - "GREATER", - "GREATER_EQUAL", - "LESS_EQUAL", - "SELECT", - "SLICE", - "SIN", - "TRANSPOSE_CONV", - "SPARSE_TO_DENSE", - "TILE", - "EXPAND_DIMS", - "EQUAL", - "NOT_EQUAL", - "LOG", - "SUM", - "SQRT", - "RSQRT", - "SHAPE", - "POW", - "ARG_MIN", - "FAKE_QUANT", - "REDUCE_PROD", - "REDUCE_MAX", - "PACK", - "LOGICAL_OR", - "ONE_HOT", - "LOGICAL_AND", - "LOGICAL_NOT", - "UNPACK", - "REDUCE_MIN", - "FLOOR_DIV", - "REDUCE_ANY", - "SQUARE", - "ZEROS_LIKE", - "FILL", - "FLOOR_MOD", - "RANGE", - "RESIZE_NEAREST_NEIGHBOR", - "LEAKY_RELU", - "SQUARED_DIFFERENCE", - "MIRROR_PAD", - "ABS", - "SPLIT_V", - "UNIQUE", - "CEIL", - "REVERSE_V2", - "ADD_N", - "GATHER_ND", - "COS", - "WHERE", - "RANK", - "ELU", - "REVERSE_SEQUENCE", - "MATRIX_DIAG", - "QUANTIZE", - "MATRIX_SET_DIAG", - "ROUND", - "HARD_SWISH", - "IF", - "WHILE", - "NON_MAX_SUPPRESSION_V4", - "NON_MAX_SUPPRESSION_V5", - "SCATTER_ND", - "SELECT_V2", - "DENSIFY", - "SEGMENT_SUM", - "BATCH_MATMUL", - nullptr - }; - return names; -} - -inline const char *EnumNameBuiltinOperator(BuiltinOperator e) { - if (flatbuffers::IsOutRange(e, BuiltinOperator_ADD, BuiltinOperator_BATCH_MATMUL)) return ""; - const size_t index = static_cast(e); - return EnumNamesBuiltinOperator()[index]; -} - -enum BuiltinOptions { - BuiltinOptions_NONE = 0, - BuiltinOptions_Conv2DOptions = 1, - BuiltinOptions_DepthwiseConv2DOptions = 2, - BuiltinOptions_ConcatEmbeddingsOptions = 3, - BuiltinOptions_LSHProjectionOptions = 4, - BuiltinOptions_Pool2DOptions = 5, - BuiltinOptions_SVDFOptions = 6, - BuiltinOptions_RNNOptions = 7, - BuiltinOptions_FullyConnectedOptions = 8, - BuiltinOptions_SoftmaxOptions = 9, - BuiltinOptions_ConcatenationOptions = 10, - BuiltinOptions_AddOptions = 11, - BuiltinOptions_L2NormOptions = 12, - BuiltinOptions_LocalResponseNormalizationOptions = 13, - BuiltinOptions_LSTMOptions = 14, - BuiltinOptions_ResizeBilinearOptions = 15, - BuiltinOptions_CallOptions = 16, - BuiltinOptions_ReshapeOptions = 17, - BuiltinOptions_SkipGramOptions = 18, - BuiltinOptions_SpaceToDepthOptions = 19, - BuiltinOptions_EmbeddingLookupSparseOptions = 20, - BuiltinOptions_MulOptions = 21, - BuiltinOptions_PadOptions = 22, - BuiltinOptions_GatherOptions = 23, - BuiltinOptions_BatchToSpaceNDOptions = 24, - BuiltinOptions_SpaceToBatchNDOptions = 25, - BuiltinOptions_TransposeOptions = 26, - BuiltinOptions_ReducerOptions = 27, - BuiltinOptions_SubOptions = 28, - BuiltinOptions_DivOptions = 29, - BuiltinOptions_SqueezeOptions = 30, - BuiltinOptions_SequenceRNNOptions = 31, - BuiltinOptions_StridedSliceOptions = 32, - BuiltinOptions_ExpOptions = 33, - BuiltinOptions_TopKV2Options = 34, - BuiltinOptions_SplitOptions = 35, - BuiltinOptions_LogSoftmaxOptions = 36, - BuiltinOptions_CastOptions = 37, - BuiltinOptions_DequantizeOptions = 38, - BuiltinOptions_MaximumMinimumOptions = 39, - BuiltinOptions_ArgMaxOptions = 40, - BuiltinOptions_LessOptions = 41, - BuiltinOptions_NegOptions = 42, - BuiltinOptions_PadV2Options = 43, - BuiltinOptions_GreaterOptions = 44, - BuiltinOptions_GreaterEqualOptions = 45, - BuiltinOptions_LessEqualOptions = 46, - BuiltinOptions_SelectOptions = 47, - BuiltinOptions_SliceOptions = 48, - BuiltinOptions_TransposeConvOptions = 49, - BuiltinOptions_SparseToDenseOptions = 50, - BuiltinOptions_TileOptions = 51, - BuiltinOptions_ExpandDimsOptions = 52, - BuiltinOptions_EqualOptions = 53, - BuiltinOptions_NotEqualOptions = 54, - BuiltinOptions_ShapeOptions = 55, - BuiltinOptions_PowOptions = 56, - BuiltinOptions_ArgMinOptions = 57, - BuiltinOptions_FakeQuantOptions = 58, - BuiltinOptions_PackOptions = 59, - BuiltinOptions_LogicalOrOptions = 60, - BuiltinOptions_OneHotOptions = 61, - BuiltinOptions_LogicalAndOptions = 62, - BuiltinOptions_LogicalNotOptions = 63, - BuiltinOptions_UnpackOptions = 64, - BuiltinOptions_FloorDivOptions = 65, - BuiltinOptions_SquareOptions = 66, - BuiltinOptions_ZerosLikeOptions = 67, - BuiltinOptions_FillOptions = 68, - BuiltinOptions_BidirectionalSequenceLSTMOptions = 69, - BuiltinOptions_BidirectionalSequenceRNNOptions = 70, - BuiltinOptions_UnidirectionalSequenceLSTMOptions = 71, - BuiltinOptions_FloorModOptions = 72, - BuiltinOptions_RangeOptions = 73, - BuiltinOptions_ResizeNearestNeighborOptions = 74, - BuiltinOptions_LeakyReluOptions = 75, - BuiltinOptions_SquaredDifferenceOptions = 76, - BuiltinOptions_MirrorPadOptions = 77, - BuiltinOptions_AbsOptions = 78, - BuiltinOptions_SplitVOptions = 79, - BuiltinOptions_UniqueOptions = 80, - BuiltinOptions_ReverseV2Options = 81, - BuiltinOptions_AddNOptions = 82, - BuiltinOptions_GatherNdOptions = 83, - BuiltinOptions_CosOptions = 84, - BuiltinOptions_WhereOptions = 85, - BuiltinOptions_RankOptions = 86, - BuiltinOptions_ReverseSequenceOptions = 87, - BuiltinOptions_MatrixDiagOptions = 88, - BuiltinOptions_QuantizeOptions = 89, - BuiltinOptions_MatrixSetDiagOptions = 90, - BuiltinOptions_HardSwishOptions = 91, - BuiltinOptions_IfOptions = 92, - BuiltinOptions_WhileOptions = 93, - BuiltinOptions_DepthToSpaceOptions = 94, - BuiltinOptions_NonMaxSuppressionV4Options = 95, - BuiltinOptions_NonMaxSuppressionV5Options = 96, - BuiltinOptions_ScatterNdOptions = 97, - BuiltinOptions_SelectV2Options = 98, - BuiltinOptions_DensifyOptions = 99, - BuiltinOptions_SegmentSumOptions = 100, - BuiltinOptions_BatchMatMulOptions = 101, - BuiltinOptions_MIN = BuiltinOptions_NONE, - BuiltinOptions_MAX = BuiltinOptions_BatchMatMulOptions -}; - -inline const BuiltinOptions (&EnumValuesBuiltinOptions())[102] { - static const BuiltinOptions values[] = { - BuiltinOptions_NONE, - BuiltinOptions_Conv2DOptions, - BuiltinOptions_DepthwiseConv2DOptions, - BuiltinOptions_ConcatEmbeddingsOptions, - BuiltinOptions_LSHProjectionOptions, - BuiltinOptions_Pool2DOptions, - BuiltinOptions_SVDFOptions, - BuiltinOptions_RNNOptions, - BuiltinOptions_FullyConnectedOptions, - BuiltinOptions_SoftmaxOptions, - BuiltinOptions_ConcatenationOptions, - BuiltinOptions_AddOptions, - BuiltinOptions_L2NormOptions, - BuiltinOptions_LocalResponseNormalizationOptions, - BuiltinOptions_LSTMOptions, - BuiltinOptions_ResizeBilinearOptions, - BuiltinOptions_CallOptions, - BuiltinOptions_ReshapeOptions, - BuiltinOptions_SkipGramOptions, - BuiltinOptions_SpaceToDepthOptions, - BuiltinOptions_EmbeddingLookupSparseOptions, - BuiltinOptions_MulOptions, - BuiltinOptions_PadOptions, - BuiltinOptions_GatherOptions, - BuiltinOptions_BatchToSpaceNDOptions, - BuiltinOptions_SpaceToBatchNDOptions, - BuiltinOptions_TransposeOptions, - BuiltinOptions_ReducerOptions, - BuiltinOptions_SubOptions, - BuiltinOptions_DivOptions, - BuiltinOptions_SqueezeOptions, - BuiltinOptions_SequenceRNNOptions, - BuiltinOptions_StridedSliceOptions, - BuiltinOptions_ExpOptions, - BuiltinOptions_TopKV2Options, - BuiltinOptions_SplitOptions, - BuiltinOptions_LogSoftmaxOptions, - BuiltinOptions_CastOptions, - BuiltinOptions_DequantizeOptions, - BuiltinOptions_MaximumMinimumOptions, - BuiltinOptions_ArgMaxOptions, - BuiltinOptions_LessOptions, - BuiltinOptions_NegOptions, - BuiltinOptions_PadV2Options, - BuiltinOptions_GreaterOptions, - BuiltinOptions_GreaterEqualOptions, - BuiltinOptions_LessEqualOptions, - BuiltinOptions_SelectOptions, - BuiltinOptions_SliceOptions, - BuiltinOptions_TransposeConvOptions, - BuiltinOptions_SparseToDenseOptions, - BuiltinOptions_TileOptions, - BuiltinOptions_ExpandDimsOptions, - BuiltinOptions_EqualOptions, - BuiltinOptions_NotEqualOptions, - BuiltinOptions_ShapeOptions, - BuiltinOptions_PowOptions, - BuiltinOptions_ArgMinOptions, - BuiltinOptions_FakeQuantOptions, - BuiltinOptions_PackOptions, - BuiltinOptions_LogicalOrOptions, - BuiltinOptions_OneHotOptions, - BuiltinOptions_LogicalAndOptions, - BuiltinOptions_LogicalNotOptions, - BuiltinOptions_UnpackOptions, - BuiltinOptions_FloorDivOptions, - BuiltinOptions_SquareOptions, - BuiltinOptions_ZerosLikeOptions, - BuiltinOptions_FillOptions, - BuiltinOptions_BidirectionalSequenceLSTMOptions, - BuiltinOptions_BidirectionalSequenceRNNOptions, - BuiltinOptions_UnidirectionalSequenceLSTMOptions, - BuiltinOptions_FloorModOptions, - BuiltinOptions_RangeOptions, - BuiltinOptions_ResizeNearestNeighborOptions, - BuiltinOptions_LeakyReluOptions, - BuiltinOptions_SquaredDifferenceOptions, - BuiltinOptions_MirrorPadOptions, - BuiltinOptions_AbsOptions, - BuiltinOptions_SplitVOptions, - BuiltinOptions_UniqueOptions, - BuiltinOptions_ReverseV2Options, - BuiltinOptions_AddNOptions, - BuiltinOptions_GatherNdOptions, - BuiltinOptions_CosOptions, - BuiltinOptions_WhereOptions, - BuiltinOptions_RankOptions, - BuiltinOptions_ReverseSequenceOptions, - BuiltinOptions_MatrixDiagOptions, - BuiltinOptions_QuantizeOptions, - BuiltinOptions_MatrixSetDiagOptions, - BuiltinOptions_HardSwishOptions, - BuiltinOptions_IfOptions, - BuiltinOptions_WhileOptions, - BuiltinOptions_DepthToSpaceOptions, - BuiltinOptions_NonMaxSuppressionV4Options, - BuiltinOptions_NonMaxSuppressionV5Options, - BuiltinOptions_ScatterNdOptions, - BuiltinOptions_SelectV2Options, - BuiltinOptions_DensifyOptions, - BuiltinOptions_SegmentSumOptions, - BuiltinOptions_BatchMatMulOptions - }; - return values; -} - -inline const char * const *EnumNamesBuiltinOptions() { - static const char * const names[103] = { - "NONE", - "Conv2DOptions", - "DepthwiseConv2DOptions", - "ConcatEmbeddingsOptions", - "LSHProjectionOptions", - "Pool2DOptions", - "SVDFOptions", - "RNNOptions", - "FullyConnectedOptions", - "SoftmaxOptions", - "ConcatenationOptions", - "AddOptions", - "L2NormOptions", - "LocalResponseNormalizationOptions", - "LSTMOptions", - "ResizeBilinearOptions", - "CallOptions", - "ReshapeOptions", - "SkipGramOptions", - "SpaceToDepthOptions", - "EmbeddingLookupSparseOptions", - "MulOptions", - "PadOptions", - "GatherOptions", - "BatchToSpaceNDOptions", - "SpaceToBatchNDOptions", - "TransposeOptions", - "ReducerOptions", - "SubOptions", - "DivOptions", - "SqueezeOptions", - "SequenceRNNOptions", - "StridedSliceOptions", - "ExpOptions", - "TopKV2Options", - "SplitOptions", - "LogSoftmaxOptions", - "CastOptions", - "DequantizeOptions", - "MaximumMinimumOptions", - "ArgMaxOptions", - "LessOptions", - "NegOptions", - "PadV2Options", - "GreaterOptions", - "GreaterEqualOptions", - "LessEqualOptions", - "SelectOptions", - "SliceOptions", - "TransposeConvOptions", - "SparseToDenseOptions", - "TileOptions", - "ExpandDimsOptions", - "EqualOptions", - "NotEqualOptions", - "ShapeOptions", - "PowOptions", - "ArgMinOptions", - "FakeQuantOptions", - "PackOptions", - "LogicalOrOptions", - "OneHotOptions", - "LogicalAndOptions", - "LogicalNotOptions", - "UnpackOptions", - "FloorDivOptions", - "SquareOptions", - "ZerosLikeOptions", - "FillOptions", - "BidirectionalSequenceLSTMOptions", - "BidirectionalSequenceRNNOptions", - "UnidirectionalSequenceLSTMOptions", - "FloorModOptions", - "RangeOptions", - "ResizeNearestNeighborOptions", - "LeakyReluOptions", - "SquaredDifferenceOptions", - "MirrorPadOptions", - "AbsOptions", - "SplitVOptions", - "UniqueOptions", - "ReverseV2Options", - "AddNOptions", - "GatherNdOptions", - "CosOptions", - "WhereOptions", - "RankOptions", - "ReverseSequenceOptions", - "MatrixDiagOptions", - "QuantizeOptions", - "MatrixSetDiagOptions", - "HardSwishOptions", - "IfOptions", - "WhileOptions", - "DepthToSpaceOptions", - "NonMaxSuppressionV4Options", - "NonMaxSuppressionV5Options", - "ScatterNdOptions", - "SelectV2Options", - "DensifyOptions", - "SegmentSumOptions", - "BatchMatMulOptions", - nullptr - }; - return names; -} - -inline const char *EnumNameBuiltinOptions(BuiltinOptions e) { - if (flatbuffers::IsOutRange(e, BuiltinOptions_NONE, BuiltinOptions_BatchMatMulOptions)) return ""; - const size_t index = static_cast(e); - return EnumNamesBuiltinOptions()[index]; -} - -template struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_NONE; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_Conv2DOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_DepthwiseConv2DOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ConcatEmbeddingsOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LSHProjectionOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_Pool2DOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SVDFOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_RNNOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_FullyConnectedOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SoftmaxOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ConcatenationOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_AddOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_L2NormOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LocalResponseNormalizationOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LSTMOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ResizeBilinearOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_CallOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ReshapeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SkipGramOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SpaceToDepthOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_EmbeddingLookupSparseOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_MulOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_PadOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_GatherOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_BatchToSpaceNDOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SpaceToBatchNDOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_TransposeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ReducerOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SubOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_DivOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SqueezeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SequenceRNNOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_StridedSliceOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ExpOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_TopKV2Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SplitOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LogSoftmaxOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_CastOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_DequantizeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_MaximumMinimumOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ArgMaxOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LessOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_NegOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_PadV2Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_GreaterOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_GreaterEqualOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LessEqualOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SelectOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SliceOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_TransposeConvOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SparseToDenseOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_TileOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ExpandDimsOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_EqualOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_NotEqualOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ShapeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_PowOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ArgMinOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_FakeQuantOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_PackOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LogicalOrOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_OneHotOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LogicalAndOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LogicalNotOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_UnpackOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_FloorDivOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SquareOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ZerosLikeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_FillOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_BidirectionalSequenceLSTMOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_BidirectionalSequenceRNNOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_UnidirectionalSequenceLSTMOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_FloorModOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_RangeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ResizeNearestNeighborOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_LeakyReluOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SquaredDifferenceOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_MirrorPadOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_AbsOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SplitVOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_UniqueOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ReverseV2Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_AddNOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_GatherNdOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_CosOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_WhereOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_RankOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ReverseSequenceOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_MatrixDiagOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_QuantizeOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_MatrixSetDiagOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_HardSwishOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_IfOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_WhileOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_DepthToSpaceOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_NonMaxSuppressionV4Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_NonMaxSuppressionV5Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_ScatterNdOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SelectV2Options; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_DensifyOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_SegmentSumOptions; -}; - -template<> struct BuiltinOptionsTraits { - static const BuiltinOptions enum_value = BuiltinOptions_BatchMatMulOptions; -}; - -struct BuiltinOptionsUnion { - BuiltinOptions type; - void *value; - - BuiltinOptionsUnion() : type(BuiltinOptions_NONE), value(nullptr) {} - BuiltinOptionsUnion(BuiltinOptionsUnion&& u) FLATBUFFERS_NOEXCEPT : - type(BuiltinOptions_NONE), value(nullptr) - { std::swap(type, u.type); std::swap(value, u.value); } - BuiltinOptionsUnion(const BuiltinOptionsUnion &) FLATBUFFERS_NOEXCEPT; - BuiltinOptionsUnion &operator=(const BuiltinOptionsUnion &u) FLATBUFFERS_NOEXCEPT - { BuiltinOptionsUnion t(u); std::swap(type, t.type); std::swap(value, t.value); return *this; } - BuiltinOptionsUnion &operator=(BuiltinOptionsUnion &&u) FLATBUFFERS_NOEXCEPT - { std::swap(type, u.type); std::swap(value, u.value); return *this; } - ~BuiltinOptionsUnion() { Reset(); } - - void Reset(); - -#ifndef FLATBUFFERS_CPP98_STL - template - void Set(T&& val) { - using RT = typename std::remove_reference::type; - Reset(); - type = BuiltinOptionsTraits::enum_value; - if (type != BuiltinOptions_NONE) { - value = new RT(std::forward(val)); - } - } -#endif // FLATBUFFERS_CPP98_STL - - static void *UnPack(const void *obj, BuiltinOptions type, const flatbuffers::resolver_function_t *resolver); - flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher = nullptr) const; - - tflite::Conv2DOptionsT *AsConv2DOptions() { - return type == BuiltinOptions_Conv2DOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::Conv2DOptionsT *AsConv2DOptions() const { - return type == BuiltinOptions_Conv2DOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::DepthwiseConv2DOptionsT *AsDepthwiseConv2DOptions() { - return type == BuiltinOptions_DepthwiseConv2DOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::DepthwiseConv2DOptionsT *AsDepthwiseConv2DOptions() const { - return type == BuiltinOptions_DepthwiseConv2DOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ConcatEmbeddingsOptionsT *AsConcatEmbeddingsOptions() { - return type == BuiltinOptions_ConcatEmbeddingsOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ConcatEmbeddingsOptionsT *AsConcatEmbeddingsOptions() const { - return type == BuiltinOptions_ConcatEmbeddingsOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LSHProjectionOptionsT *AsLSHProjectionOptions() { - return type == BuiltinOptions_LSHProjectionOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LSHProjectionOptionsT *AsLSHProjectionOptions() const { - return type == BuiltinOptions_LSHProjectionOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::Pool2DOptionsT *AsPool2DOptions() { - return type == BuiltinOptions_Pool2DOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::Pool2DOptionsT *AsPool2DOptions() const { - return type == BuiltinOptions_Pool2DOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SVDFOptionsT *AsSVDFOptions() { - return type == BuiltinOptions_SVDFOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SVDFOptionsT *AsSVDFOptions() const { - return type == BuiltinOptions_SVDFOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::RNNOptionsT *AsRNNOptions() { - return type == BuiltinOptions_RNNOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::RNNOptionsT *AsRNNOptions() const { - return type == BuiltinOptions_RNNOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::FullyConnectedOptionsT *AsFullyConnectedOptions() { - return type == BuiltinOptions_FullyConnectedOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::FullyConnectedOptionsT *AsFullyConnectedOptions() const { - return type == BuiltinOptions_FullyConnectedOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SoftmaxOptionsT *AsSoftmaxOptions() { - return type == BuiltinOptions_SoftmaxOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SoftmaxOptionsT *AsSoftmaxOptions() const { - return type == BuiltinOptions_SoftmaxOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ConcatenationOptionsT *AsConcatenationOptions() { - return type == BuiltinOptions_ConcatenationOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ConcatenationOptionsT *AsConcatenationOptions() const { - return type == BuiltinOptions_ConcatenationOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::AddOptionsT *AsAddOptions() { - return type == BuiltinOptions_AddOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::AddOptionsT *AsAddOptions() const { - return type == BuiltinOptions_AddOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::L2NormOptionsT *AsL2NormOptions() { - return type == BuiltinOptions_L2NormOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::L2NormOptionsT *AsL2NormOptions() const { - return type == BuiltinOptions_L2NormOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LocalResponseNormalizationOptionsT *AsLocalResponseNormalizationOptions() { - return type == BuiltinOptions_LocalResponseNormalizationOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LocalResponseNormalizationOptionsT *AsLocalResponseNormalizationOptions() const { - return type == BuiltinOptions_LocalResponseNormalizationOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LSTMOptionsT *AsLSTMOptions() { - return type == BuiltinOptions_LSTMOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LSTMOptionsT *AsLSTMOptions() const { - return type == BuiltinOptions_LSTMOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ResizeBilinearOptionsT *AsResizeBilinearOptions() { - return type == BuiltinOptions_ResizeBilinearOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ResizeBilinearOptionsT *AsResizeBilinearOptions() const { - return type == BuiltinOptions_ResizeBilinearOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::CallOptionsT *AsCallOptions() { - return type == BuiltinOptions_CallOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::CallOptionsT *AsCallOptions() const { - return type == BuiltinOptions_CallOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ReshapeOptionsT *AsReshapeOptions() { - return type == BuiltinOptions_ReshapeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ReshapeOptionsT *AsReshapeOptions() const { - return type == BuiltinOptions_ReshapeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SkipGramOptionsT *AsSkipGramOptions() { - return type == BuiltinOptions_SkipGramOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SkipGramOptionsT *AsSkipGramOptions() const { - return type == BuiltinOptions_SkipGramOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SpaceToDepthOptionsT *AsSpaceToDepthOptions() { - return type == BuiltinOptions_SpaceToDepthOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SpaceToDepthOptionsT *AsSpaceToDepthOptions() const { - return type == BuiltinOptions_SpaceToDepthOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::EmbeddingLookupSparseOptionsT *AsEmbeddingLookupSparseOptions() { - return type == BuiltinOptions_EmbeddingLookupSparseOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::EmbeddingLookupSparseOptionsT *AsEmbeddingLookupSparseOptions() const { - return type == BuiltinOptions_EmbeddingLookupSparseOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::MulOptionsT *AsMulOptions() { - return type == BuiltinOptions_MulOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::MulOptionsT *AsMulOptions() const { - return type == BuiltinOptions_MulOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::PadOptionsT *AsPadOptions() { - return type == BuiltinOptions_PadOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::PadOptionsT *AsPadOptions() const { - return type == BuiltinOptions_PadOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::GatherOptionsT *AsGatherOptions() { - return type == BuiltinOptions_GatherOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::GatherOptionsT *AsGatherOptions() const { - return type == BuiltinOptions_GatherOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::BatchToSpaceNDOptionsT *AsBatchToSpaceNDOptions() { - return type == BuiltinOptions_BatchToSpaceNDOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::BatchToSpaceNDOptionsT *AsBatchToSpaceNDOptions() const { - return type == BuiltinOptions_BatchToSpaceNDOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SpaceToBatchNDOptionsT *AsSpaceToBatchNDOptions() { - return type == BuiltinOptions_SpaceToBatchNDOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SpaceToBatchNDOptionsT *AsSpaceToBatchNDOptions() const { - return type == BuiltinOptions_SpaceToBatchNDOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::TransposeOptionsT *AsTransposeOptions() { - return type == BuiltinOptions_TransposeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::TransposeOptionsT *AsTransposeOptions() const { - return type == BuiltinOptions_TransposeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ReducerOptionsT *AsReducerOptions() { - return type == BuiltinOptions_ReducerOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ReducerOptionsT *AsReducerOptions() const { - return type == BuiltinOptions_ReducerOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SubOptionsT *AsSubOptions() { - return type == BuiltinOptions_SubOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SubOptionsT *AsSubOptions() const { - return type == BuiltinOptions_SubOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::DivOptionsT *AsDivOptions() { - return type == BuiltinOptions_DivOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::DivOptionsT *AsDivOptions() const { - return type == BuiltinOptions_DivOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SqueezeOptionsT *AsSqueezeOptions() { - return type == BuiltinOptions_SqueezeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SqueezeOptionsT *AsSqueezeOptions() const { - return type == BuiltinOptions_SqueezeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SequenceRNNOptionsT *AsSequenceRNNOptions() { - return type == BuiltinOptions_SequenceRNNOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SequenceRNNOptionsT *AsSequenceRNNOptions() const { - return type == BuiltinOptions_SequenceRNNOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::StridedSliceOptionsT *AsStridedSliceOptions() { - return type == BuiltinOptions_StridedSliceOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::StridedSliceOptionsT *AsStridedSliceOptions() const { - return type == BuiltinOptions_StridedSliceOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ExpOptionsT *AsExpOptions() { - return type == BuiltinOptions_ExpOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ExpOptionsT *AsExpOptions() const { - return type == BuiltinOptions_ExpOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::TopKV2OptionsT *AsTopKV2Options() { - return type == BuiltinOptions_TopKV2Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::TopKV2OptionsT *AsTopKV2Options() const { - return type == BuiltinOptions_TopKV2Options ? - reinterpret_cast(value) : nullptr; - } - tflite::SplitOptionsT *AsSplitOptions() { - return type == BuiltinOptions_SplitOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SplitOptionsT *AsSplitOptions() const { - return type == BuiltinOptions_SplitOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LogSoftmaxOptionsT *AsLogSoftmaxOptions() { - return type == BuiltinOptions_LogSoftmaxOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LogSoftmaxOptionsT *AsLogSoftmaxOptions() const { - return type == BuiltinOptions_LogSoftmaxOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::CastOptionsT *AsCastOptions() { - return type == BuiltinOptions_CastOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::CastOptionsT *AsCastOptions() const { - return type == BuiltinOptions_CastOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::DequantizeOptionsT *AsDequantizeOptions() { - return type == BuiltinOptions_DequantizeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::DequantizeOptionsT *AsDequantizeOptions() const { - return type == BuiltinOptions_DequantizeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::MaximumMinimumOptionsT *AsMaximumMinimumOptions() { - return type == BuiltinOptions_MaximumMinimumOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::MaximumMinimumOptionsT *AsMaximumMinimumOptions() const { - return type == BuiltinOptions_MaximumMinimumOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ArgMaxOptionsT *AsArgMaxOptions() { - return type == BuiltinOptions_ArgMaxOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ArgMaxOptionsT *AsArgMaxOptions() const { - return type == BuiltinOptions_ArgMaxOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LessOptionsT *AsLessOptions() { - return type == BuiltinOptions_LessOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LessOptionsT *AsLessOptions() const { - return type == BuiltinOptions_LessOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::NegOptionsT *AsNegOptions() { - return type == BuiltinOptions_NegOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::NegOptionsT *AsNegOptions() const { - return type == BuiltinOptions_NegOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::PadV2OptionsT *AsPadV2Options() { - return type == BuiltinOptions_PadV2Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::PadV2OptionsT *AsPadV2Options() const { - return type == BuiltinOptions_PadV2Options ? - reinterpret_cast(value) : nullptr; - } - tflite::GreaterOptionsT *AsGreaterOptions() { - return type == BuiltinOptions_GreaterOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::GreaterOptionsT *AsGreaterOptions() const { - return type == BuiltinOptions_GreaterOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::GreaterEqualOptionsT *AsGreaterEqualOptions() { - return type == BuiltinOptions_GreaterEqualOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::GreaterEqualOptionsT *AsGreaterEqualOptions() const { - return type == BuiltinOptions_GreaterEqualOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LessEqualOptionsT *AsLessEqualOptions() { - return type == BuiltinOptions_LessEqualOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LessEqualOptionsT *AsLessEqualOptions() const { - return type == BuiltinOptions_LessEqualOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SelectOptionsT *AsSelectOptions() { - return type == BuiltinOptions_SelectOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SelectOptionsT *AsSelectOptions() const { - return type == BuiltinOptions_SelectOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SliceOptionsT *AsSliceOptions() { - return type == BuiltinOptions_SliceOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SliceOptionsT *AsSliceOptions() const { - return type == BuiltinOptions_SliceOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::TransposeConvOptionsT *AsTransposeConvOptions() { - return type == BuiltinOptions_TransposeConvOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::TransposeConvOptionsT *AsTransposeConvOptions() const { - return type == BuiltinOptions_TransposeConvOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SparseToDenseOptionsT *AsSparseToDenseOptions() { - return type == BuiltinOptions_SparseToDenseOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SparseToDenseOptionsT *AsSparseToDenseOptions() const { - return type == BuiltinOptions_SparseToDenseOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::TileOptionsT *AsTileOptions() { - return type == BuiltinOptions_TileOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::TileOptionsT *AsTileOptions() const { - return type == BuiltinOptions_TileOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ExpandDimsOptionsT *AsExpandDimsOptions() { - return type == BuiltinOptions_ExpandDimsOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ExpandDimsOptionsT *AsExpandDimsOptions() const { - return type == BuiltinOptions_ExpandDimsOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::EqualOptionsT *AsEqualOptions() { - return type == BuiltinOptions_EqualOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::EqualOptionsT *AsEqualOptions() const { - return type == BuiltinOptions_EqualOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::NotEqualOptionsT *AsNotEqualOptions() { - return type == BuiltinOptions_NotEqualOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::NotEqualOptionsT *AsNotEqualOptions() const { - return type == BuiltinOptions_NotEqualOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ShapeOptionsT *AsShapeOptions() { - return type == BuiltinOptions_ShapeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ShapeOptionsT *AsShapeOptions() const { - return type == BuiltinOptions_ShapeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::PowOptionsT *AsPowOptions() { - return type == BuiltinOptions_PowOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::PowOptionsT *AsPowOptions() const { - return type == BuiltinOptions_PowOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ArgMinOptionsT *AsArgMinOptions() { - return type == BuiltinOptions_ArgMinOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ArgMinOptionsT *AsArgMinOptions() const { - return type == BuiltinOptions_ArgMinOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::FakeQuantOptionsT *AsFakeQuantOptions() { - return type == BuiltinOptions_FakeQuantOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::FakeQuantOptionsT *AsFakeQuantOptions() const { - return type == BuiltinOptions_FakeQuantOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::PackOptionsT *AsPackOptions() { - return type == BuiltinOptions_PackOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::PackOptionsT *AsPackOptions() const { - return type == BuiltinOptions_PackOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LogicalOrOptionsT *AsLogicalOrOptions() { - return type == BuiltinOptions_LogicalOrOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LogicalOrOptionsT *AsLogicalOrOptions() const { - return type == BuiltinOptions_LogicalOrOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::OneHotOptionsT *AsOneHotOptions() { - return type == BuiltinOptions_OneHotOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::OneHotOptionsT *AsOneHotOptions() const { - return type == BuiltinOptions_OneHotOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LogicalAndOptionsT *AsLogicalAndOptions() { - return type == BuiltinOptions_LogicalAndOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LogicalAndOptionsT *AsLogicalAndOptions() const { - return type == BuiltinOptions_LogicalAndOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LogicalNotOptionsT *AsLogicalNotOptions() { - return type == BuiltinOptions_LogicalNotOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LogicalNotOptionsT *AsLogicalNotOptions() const { - return type == BuiltinOptions_LogicalNotOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::UnpackOptionsT *AsUnpackOptions() { - return type == BuiltinOptions_UnpackOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::UnpackOptionsT *AsUnpackOptions() const { - return type == BuiltinOptions_UnpackOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::FloorDivOptionsT *AsFloorDivOptions() { - return type == BuiltinOptions_FloorDivOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::FloorDivOptionsT *AsFloorDivOptions() const { - return type == BuiltinOptions_FloorDivOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SquareOptionsT *AsSquareOptions() { - return type == BuiltinOptions_SquareOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SquareOptionsT *AsSquareOptions() const { - return type == BuiltinOptions_SquareOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ZerosLikeOptionsT *AsZerosLikeOptions() { - return type == BuiltinOptions_ZerosLikeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ZerosLikeOptionsT *AsZerosLikeOptions() const { - return type == BuiltinOptions_ZerosLikeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::FillOptionsT *AsFillOptions() { - return type == BuiltinOptions_FillOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::FillOptionsT *AsFillOptions() const { - return type == BuiltinOptions_FillOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::BidirectionalSequenceLSTMOptionsT *AsBidirectionalSequenceLSTMOptions() { - return type == BuiltinOptions_BidirectionalSequenceLSTMOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::BidirectionalSequenceLSTMOptionsT *AsBidirectionalSequenceLSTMOptions() const { - return type == BuiltinOptions_BidirectionalSequenceLSTMOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::BidirectionalSequenceRNNOptionsT *AsBidirectionalSequenceRNNOptions() { - return type == BuiltinOptions_BidirectionalSequenceRNNOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::BidirectionalSequenceRNNOptionsT *AsBidirectionalSequenceRNNOptions() const { - return type == BuiltinOptions_BidirectionalSequenceRNNOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::UnidirectionalSequenceLSTMOptionsT *AsUnidirectionalSequenceLSTMOptions() { - return type == BuiltinOptions_UnidirectionalSequenceLSTMOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::UnidirectionalSequenceLSTMOptionsT *AsUnidirectionalSequenceLSTMOptions() const { - return type == BuiltinOptions_UnidirectionalSequenceLSTMOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::FloorModOptionsT *AsFloorModOptions() { - return type == BuiltinOptions_FloorModOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::FloorModOptionsT *AsFloorModOptions() const { - return type == BuiltinOptions_FloorModOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::RangeOptionsT *AsRangeOptions() { - return type == BuiltinOptions_RangeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::RangeOptionsT *AsRangeOptions() const { - return type == BuiltinOptions_RangeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ResizeNearestNeighborOptionsT *AsResizeNearestNeighborOptions() { - return type == BuiltinOptions_ResizeNearestNeighborOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ResizeNearestNeighborOptionsT *AsResizeNearestNeighborOptions() const { - return type == BuiltinOptions_ResizeNearestNeighborOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::LeakyReluOptionsT *AsLeakyReluOptions() { - return type == BuiltinOptions_LeakyReluOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::LeakyReluOptionsT *AsLeakyReluOptions() const { - return type == BuiltinOptions_LeakyReluOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SquaredDifferenceOptionsT *AsSquaredDifferenceOptions() { - return type == BuiltinOptions_SquaredDifferenceOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SquaredDifferenceOptionsT *AsSquaredDifferenceOptions() const { - return type == BuiltinOptions_SquaredDifferenceOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::MirrorPadOptionsT *AsMirrorPadOptions() { - return type == BuiltinOptions_MirrorPadOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::MirrorPadOptionsT *AsMirrorPadOptions() const { - return type == BuiltinOptions_MirrorPadOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::AbsOptionsT *AsAbsOptions() { - return type == BuiltinOptions_AbsOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::AbsOptionsT *AsAbsOptions() const { - return type == BuiltinOptions_AbsOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SplitVOptionsT *AsSplitVOptions() { - return type == BuiltinOptions_SplitVOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SplitVOptionsT *AsSplitVOptions() const { - return type == BuiltinOptions_SplitVOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::UniqueOptionsT *AsUniqueOptions() { - return type == BuiltinOptions_UniqueOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::UniqueOptionsT *AsUniqueOptions() const { - return type == BuiltinOptions_UniqueOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ReverseV2OptionsT *AsReverseV2Options() { - return type == BuiltinOptions_ReverseV2Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::ReverseV2OptionsT *AsReverseV2Options() const { - return type == BuiltinOptions_ReverseV2Options ? - reinterpret_cast(value) : nullptr; - } - tflite::AddNOptionsT *AsAddNOptions() { - return type == BuiltinOptions_AddNOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::AddNOptionsT *AsAddNOptions() const { - return type == BuiltinOptions_AddNOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::GatherNdOptionsT *AsGatherNdOptions() { - return type == BuiltinOptions_GatherNdOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::GatherNdOptionsT *AsGatherNdOptions() const { - return type == BuiltinOptions_GatherNdOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::CosOptionsT *AsCosOptions() { - return type == BuiltinOptions_CosOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::CosOptionsT *AsCosOptions() const { - return type == BuiltinOptions_CosOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::WhereOptionsT *AsWhereOptions() { - return type == BuiltinOptions_WhereOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::WhereOptionsT *AsWhereOptions() const { - return type == BuiltinOptions_WhereOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::RankOptionsT *AsRankOptions() { - return type == BuiltinOptions_RankOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::RankOptionsT *AsRankOptions() const { - return type == BuiltinOptions_RankOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::ReverseSequenceOptionsT *AsReverseSequenceOptions() { - return type == BuiltinOptions_ReverseSequenceOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ReverseSequenceOptionsT *AsReverseSequenceOptions() const { - return type == BuiltinOptions_ReverseSequenceOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::MatrixDiagOptionsT *AsMatrixDiagOptions() { - return type == BuiltinOptions_MatrixDiagOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::MatrixDiagOptionsT *AsMatrixDiagOptions() const { - return type == BuiltinOptions_MatrixDiagOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::QuantizeOptionsT *AsQuantizeOptions() { - return type == BuiltinOptions_QuantizeOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::QuantizeOptionsT *AsQuantizeOptions() const { - return type == BuiltinOptions_QuantizeOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::MatrixSetDiagOptionsT *AsMatrixSetDiagOptions() { - return type == BuiltinOptions_MatrixSetDiagOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::MatrixSetDiagOptionsT *AsMatrixSetDiagOptions() const { - return type == BuiltinOptions_MatrixSetDiagOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::HardSwishOptionsT *AsHardSwishOptions() { - return type == BuiltinOptions_HardSwishOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::HardSwishOptionsT *AsHardSwishOptions() const { - return type == BuiltinOptions_HardSwishOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::IfOptionsT *AsIfOptions() { - return type == BuiltinOptions_IfOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::IfOptionsT *AsIfOptions() const { - return type == BuiltinOptions_IfOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::WhileOptionsT *AsWhileOptions() { - return type == BuiltinOptions_WhileOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::WhileOptionsT *AsWhileOptions() const { - return type == BuiltinOptions_WhileOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::DepthToSpaceOptionsT *AsDepthToSpaceOptions() { - return type == BuiltinOptions_DepthToSpaceOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::DepthToSpaceOptionsT *AsDepthToSpaceOptions() const { - return type == BuiltinOptions_DepthToSpaceOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::NonMaxSuppressionV4OptionsT *AsNonMaxSuppressionV4Options() { - return type == BuiltinOptions_NonMaxSuppressionV4Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::NonMaxSuppressionV4OptionsT *AsNonMaxSuppressionV4Options() const { - return type == BuiltinOptions_NonMaxSuppressionV4Options ? - reinterpret_cast(value) : nullptr; - } - tflite::NonMaxSuppressionV5OptionsT *AsNonMaxSuppressionV5Options() { - return type == BuiltinOptions_NonMaxSuppressionV5Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::NonMaxSuppressionV5OptionsT *AsNonMaxSuppressionV5Options() const { - return type == BuiltinOptions_NonMaxSuppressionV5Options ? - reinterpret_cast(value) : nullptr; - } - tflite::ScatterNdOptionsT *AsScatterNdOptions() { - return type == BuiltinOptions_ScatterNdOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::ScatterNdOptionsT *AsScatterNdOptions() const { - return type == BuiltinOptions_ScatterNdOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SelectV2OptionsT *AsSelectV2Options() { - return type == BuiltinOptions_SelectV2Options ? - reinterpret_cast(value) : nullptr; - } - const tflite::SelectV2OptionsT *AsSelectV2Options() const { - return type == BuiltinOptions_SelectV2Options ? - reinterpret_cast(value) : nullptr; - } - tflite::DensifyOptionsT *AsDensifyOptions() { - return type == BuiltinOptions_DensifyOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::DensifyOptionsT *AsDensifyOptions() const { - return type == BuiltinOptions_DensifyOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::SegmentSumOptionsT *AsSegmentSumOptions() { - return type == BuiltinOptions_SegmentSumOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::SegmentSumOptionsT *AsSegmentSumOptions() const { - return type == BuiltinOptions_SegmentSumOptions ? - reinterpret_cast(value) : nullptr; - } - tflite::BatchMatMulOptionsT *AsBatchMatMulOptions() { - return type == BuiltinOptions_BatchMatMulOptions ? - reinterpret_cast(value) : nullptr; - } - const tflite::BatchMatMulOptionsT *AsBatchMatMulOptions() const { - return type == BuiltinOptions_BatchMatMulOptions ? - reinterpret_cast(value) : nullptr; - } -}; - -bool VerifyBuiltinOptions(flatbuffers::Verifier &verifier, const void *obj, BuiltinOptions type); -bool VerifyBuiltinOptionsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types); - -enum Padding { - Padding_SAME = 0, - Padding_VALID = 1, - Padding_MIN = Padding_SAME, - Padding_MAX = Padding_VALID -}; - -inline const Padding (&EnumValuesPadding())[2] { - static const Padding values[] = { - Padding_SAME, - Padding_VALID - }; - return values; -} - -inline const char * const *EnumNamesPadding() { - static const char * const names[3] = { - "SAME", - "VALID", - nullptr - }; - return names; -} - -inline const char *EnumNamePadding(Padding e) { - if (flatbuffers::IsOutRange(e, Padding_SAME, Padding_VALID)) return ""; - const size_t index = static_cast(e); - return EnumNamesPadding()[index]; -} - -enum ActivationFunctionType { - ActivationFunctionType_NONE = 0, - ActivationFunctionType_RELU = 1, - ActivationFunctionType_RELU_N1_TO_1 = 2, - ActivationFunctionType_RELU6 = 3, - ActivationFunctionType_TANH = 4, - ActivationFunctionType_SIGN_BIT = 5, - ActivationFunctionType_MIN = ActivationFunctionType_NONE, - ActivationFunctionType_MAX = ActivationFunctionType_SIGN_BIT -}; - -inline const ActivationFunctionType (&EnumValuesActivationFunctionType())[6] { - static const ActivationFunctionType values[] = { - ActivationFunctionType_NONE, - ActivationFunctionType_RELU, - ActivationFunctionType_RELU_N1_TO_1, - ActivationFunctionType_RELU6, - ActivationFunctionType_TANH, - ActivationFunctionType_SIGN_BIT - }; - return values; -} - -inline const char * const *EnumNamesActivationFunctionType() { - static const char * const names[7] = { - "NONE", - "RELU", - "RELU_N1_TO_1", - "RELU6", - "TANH", - "SIGN_BIT", - nullptr - }; - return names; -} - -inline const char *EnumNameActivationFunctionType(ActivationFunctionType e) { - if (flatbuffers::IsOutRange(e, ActivationFunctionType_NONE, ActivationFunctionType_SIGN_BIT)) return ""; - const size_t index = static_cast(e); - return EnumNamesActivationFunctionType()[index]; -} - -enum LSHProjectionType { - LSHProjectionType_UNKNOWN = 0, - LSHProjectionType_SPARSE = 1, - LSHProjectionType_DENSE = 2, - LSHProjectionType_MIN = LSHProjectionType_UNKNOWN, - LSHProjectionType_MAX = LSHProjectionType_DENSE -}; - -inline const LSHProjectionType (&EnumValuesLSHProjectionType())[3] { - static const LSHProjectionType values[] = { - LSHProjectionType_UNKNOWN, - LSHProjectionType_SPARSE, - LSHProjectionType_DENSE - }; - return values; -} - -inline const char * const *EnumNamesLSHProjectionType() { - static const char * const names[4] = { - "UNKNOWN", - "SPARSE", - "DENSE", - nullptr - }; - return names; -} - -inline const char *EnumNameLSHProjectionType(LSHProjectionType e) { - if (flatbuffers::IsOutRange(e, LSHProjectionType_UNKNOWN, LSHProjectionType_DENSE)) return ""; - const size_t index = static_cast(e); - return EnumNamesLSHProjectionType()[index]; -} - -enum FullyConnectedOptionsWeightsFormat { - FullyConnectedOptionsWeightsFormat_DEFAULT = 0, - FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 = 1, - FullyConnectedOptionsWeightsFormat_MIN = FullyConnectedOptionsWeightsFormat_DEFAULT, - FullyConnectedOptionsWeightsFormat_MAX = FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 -}; - -inline const FullyConnectedOptionsWeightsFormat (&EnumValuesFullyConnectedOptionsWeightsFormat())[2] { - static const FullyConnectedOptionsWeightsFormat values[] = { - FullyConnectedOptionsWeightsFormat_DEFAULT, - FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8 - }; - return values; -} - -inline const char * const *EnumNamesFullyConnectedOptionsWeightsFormat() { - static const char * const names[3] = { - "DEFAULT", - "SHUFFLED4x16INT8", - nullptr - }; - return names; -} - -inline const char *EnumNameFullyConnectedOptionsWeightsFormat(FullyConnectedOptionsWeightsFormat e) { - if (flatbuffers::IsOutRange(e, FullyConnectedOptionsWeightsFormat_DEFAULT, FullyConnectedOptionsWeightsFormat_SHUFFLED4x16INT8)) return ""; - const size_t index = static_cast(e); - return EnumNamesFullyConnectedOptionsWeightsFormat()[index]; -} - -enum LSTMKernelType { - LSTMKernelType_FULL = 0, - LSTMKernelType_BASIC = 1, - LSTMKernelType_MIN = LSTMKernelType_FULL, - LSTMKernelType_MAX = LSTMKernelType_BASIC -}; - -inline const LSTMKernelType (&EnumValuesLSTMKernelType())[2] { - static const LSTMKernelType values[] = { - LSTMKernelType_FULL, - LSTMKernelType_BASIC - }; - return values; -} - -inline const char * const *EnumNamesLSTMKernelType() { - static const char * const names[3] = { - "FULL", - "BASIC", - nullptr - }; - return names; -} - -inline const char *EnumNameLSTMKernelType(LSTMKernelType e) { - if (flatbuffers::IsOutRange(e, LSTMKernelType_FULL, LSTMKernelType_BASIC)) return ""; - const size_t index = static_cast(e); - return EnumNamesLSTMKernelType()[index]; -} - -enum CombinerType { - CombinerType_SUM = 0, - CombinerType_MEAN = 1, - CombinerType_SQRTN = 2, - CombinerType_MIN = CombinerType_SUM, - CombinerType_MAX = CombinerType_SQRTN -}; - -inline const CombinerType (&EnumValuesCombinerType())[3] { - static const CombinerType values[] = { - CombinerType_SUM, - CombinerType_MEAN, - CombinerType_SQRTN - }; - return values; -} - -inline const char * const *EnumNamesCombinerType() { - static const char * const names[4] = { - "SUM", - "MEAN", - "SQRTN", - nullptr - }; - return names; -} - -inline const char *EnumNameCombinerType(CombinerType e) { - if (flatbuffers::IsOutRange(e, CombinerType_SUM, CombinerType_SQRTN)) return ""; - const size_t index = static_cast(e); - return EnumNamesCombinerType()[index]; -} - -enum MirrorPadMode { - MirrorPadMode_REFLECT = 0, - MirrorPadMode_SYMMETRIC = 1, - MirrorPadMode_MIN = MirrorPadMode_REFLECT, - MirrorPadMode_MAX = MirrorPadMode_SYMMETRIC -}; - -inline const MirrorPadMode (&EnumValuesMirrorPadMode())[2] { - static const MirrorPadMode values[] = { - MirrorPadMode_REFLECT, - MirrorPadMode_SYMMETRIC - }; - return values; -} - -inline const char * const *EnumNamesMirrorPadMode() { - static const char * const names[3] = { - "REFLECT", - "SYMMETRIC", - nullptr - }; - return names; -} - -inline const char *EnumNameMirrorPadMode(MirrorPadMode e) { - if (flatbuffers::IsOutRange(e, MirrorPadMode_REFLECT, MirrorPadMode_SYMMETRIC)) return ""; - const size_t index = static_cast(e); - return EnumNamesMirrorPadMode()[index]; -} - -enum CustomOptionsFormat { - CustomOptionsFormat_FLEXBUFFERS = 0, - CustomOptionsFormat_MIN = CustomOptionsFormat_FLEXBUFFERS, - CustomOptionsFormat_MAX = CustomOptionsFormat_FLEXBUFFERS -}; - -inline const CustomOptionsFormat (&EnumValuesCustomOptionsFormat())[1] { - static const CustomOptionsFormat values[] = { - CustomOptionsFormat_FLEXBUFFERS - }; - return values; -} - -inline const char * const *EnumNamesCustomOptionsFormat() { - static const char * const names[2] = { - "FLEXBUFFERS", - nullptr - }; - return names; -} - -inline const char *EnumNameCustomOptionsFormat(CustomOptionsFormat e) { - if (flatbuffers::IsOutRange(e, CustomOptionsFormat_FLEXBUFFERS, CustomOptionsFormat_FLEXBUFFERS)) return ""; - const size_t index = static_cast(e); - return EnumNamesCustomOptionsFormat()[index]; -} - -struct CustomQuantizationT : public flatbuffers::NativeTable { - typedef CustomQuantization TableType; - std::vector custom; - CustomQuantizationT() { - } -}; - -struct CustomQuantization FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef CustomQuantizationT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_CUSTOM = 4 - }; - const flatbuffers::Vector *custom() const { - return GetPointer *>(VT_CUSTOM); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_CUSTOM) && - verifier.VerifyVector(custom()) && - verifier.EndTable(); - } - CustomQuantizationT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(CustomQuantizationT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct CustomQuantizationBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_custom(flatbuffers::Offset> custom) { - fbb_.AddOffset(CustomQuantization::VT_CUSTOM, custom); - } - explicit CustomQuantizationBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - CustomQuantizationBuilder &operator=(const CustomQuantizationBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateCustomQuantization( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> custom = 0) { - CustomQuantizationBuilder builder_(_fbb); - builder_.add_custom(custom); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateCustomQuantizationDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *custom = nullptr) { - if (custom) { _fbb.ForceVectorAlignment(custom->size(), sizeof(uint8_t), 16); } - auto custom__ = custom ? _fbb.CreateVector(*custom) : 0; - return tflite::CreateCustomQuantization( - _fbb, - custom__); -} - -flatbuffers::Offset CreateCustomQuantization(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct QuantizationParametersT : public flatbuffers::NativeTable { - typedef QuantizationParameters TableType; - std::vector min; - std::vector max; - std::vector scale; - std::vector zero_point; - tflite::QuantizationDetailsUnion details; - int32_t quantized_dimension; - QuantizationParametersT() - : quantized_dimension(0) { - } -}; - -struct QuantizationParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef QuantizationParametersT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_MIN = 4, - VT_MAX = 6, - VT_SCALE = 8, - VT_ZERO_POINT = 10, - VT_DETAILS_TYPE = 12, - VT_DETAILS = 14, - VT_QUANTIZED_DIMENSION = 16 - }; - const flatbuffers::Vector *min() const { - return GetPointer *>(VT_MIN); - } - const flatbuffers::Vector *max() const { - return GetPointer *>(VT_MAX); - } - const flatbuffers::Vector *scale() const { - return GetPointer *>(VT_SCALE); - } - const flatbuffers::Vector *zero_point() const { - return GetPointer *>(VT_ZERO_POINT); - } - tflite::QuantizationDetails details_type() const { - return static_cast(GetField(VT_DETAILS_TYPE, 0)); - } - const void *details() const { - return GetPointer(VT_DETAILS); - } - template const T *details_as() const; - const tflite::CustomQuantization *details_as_CustomQuantization() const { - return details_type() == tflite::QuantizationDetails_CustomQuantization ? static_cast(details()) : nullptr; - } - int32_t quantized_dimension() const { - return GetField(VT_QUANTIZED_DIMENSION, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_MIN) && - verifier.VerifyVector(min()) && - VerifyOffset(verifier, VT_MAX) && - verifier.VerifyVector(max()) && - VerifyOffset(verifier, VT_SCALE) && - verifier.VerifyVector(scale()) && - VerifyOffset(verifier, VT_ZERO_POINT) && - verifier.VerifyVector(zero_point()) && - VerifyField(verifier, VT_DETAILS_TYPE) && - VerifyOffset(verifier, VT_DETAILS) && - VerifyQuantizationDetails(verifier, details(), details_type()) && - VerifyField(verifier, VT_QUANTIZED_DIMENSION) && - verifier.EndTable(); - } - QuantizationParametersT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(QuantizationParametersT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -template<> inline const tflite::CustomQuantization *QuantizationParameters::details_as() const { - return details_as_CustomQuantization(); -} - -struct QuantizationParametersBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_min(flatbuffers::Offset> min) { - fbb_.AddOffset(QuantizationParameters::VT_MIN, min); - } - void add_max(flatbuffers::Offset> max) { - fbb_.AddOffset(QuantizationParameters::VT_MAX, max); - } - void add_scale(flatbuffers::Offset> scale) { - fbb_.AddOffset(QuantizationParameters::VT_SCALE, scale); - } - void add_zero_point(flatbuffers::Offset> zero_point) { - fbb_.AddOffset(QuantizationParameters::VT_ZERO_POINT, zero_point); - } - void add_details_type(tflite::QuantizationDetails details_type) { - fbb_.AddElement(QuantizationParameters::VT_DETAILS_TYPE, static_cast(details_type), 0); - } - void add_details(flatbuffers::Offset details) { - fbb_.AddOffset(QuantizationParameters::VT_DETAILS, details); - } - void add_quantized_dimension(int32_t quantized_dimension) { - fbb_.AddElement(QuantizationParameters::VT_QUANTIZED_DIMENSION, quantized_dimension, 0); - } - explicit QuantizationParametersBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - QuantizationParametersBuilder &operator=(const QuantizationParametersBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateQuantizationParameters( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> min = 0, - flatbuffers::Offset> max = 0, - flatbuffers::Offset> scale = 0, - flatbuffers::Offset> zero_point = 0, - tflite::QuantizationDetails details_type = tflite::QuantizationDetails_NONE, - flatbuffers::Offset details = 0, - int32_t quantized_dimension = 0) { - QuantizationParametersBuilder builder_(_fbb); - builder_.add_quantized_dimension(quantized_dimension); - builder_.add_details(details); - builder_.add_zero_point(zero_point); - builder_.add_scale(scale); - builder_.add_max(max); - builder_.add_min(min); - builder_.add_details_type(details_type); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateQuantizationParametersDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *min = nullptr, - const std::vector *max = nullptr, - const std::vector *scale = nullptr, - const std::vector *zero_point = nullptr, - tflite::QuantizationDetails details_type = tflite::QuantizationDetails_NONE, - flatbuffers::Offset details = 0, - int32_t quantized_dimension = 0) { - auto min__ = min ? _fbb.CreateVector(*min) : 0; - auto max__ = max ? _fbb.CreateVector(*max) : 0; - auto scale__ = scale ? _fbb.CreateVector(*scale) : 0; - auto zero_point__ = zero_point ? _fbb.CreateVector(*zero_point) : 0; - return tflite::CreateQuantizationParameters( - _fbb, - min__, - max__, - scale__, - zero_point__, - details_type, - details, - quantized_dimension); -} - -flatbuffers::Offset CreateQuantizationParameters(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct Int32VectorT : public flatbuffers::NativeTable { - typedef Int32Vector TableType; - std::vector values; - Int32VectorT() { - } -}; - -struct Int32Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef Int32VectorT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VALUES = 4 - }; - const flatbuffers::Vector *values() const { - return GetPointer *>(VT_VALUES); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_VALUES) && - verifier.VerifyVector(values()) && - verifier.EndTable(); - } - Int32VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(Int32VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct Int32VectorBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_values(flatbuffers::Offset> values) { - fbb_.AddOffset(Int32Vector::VT_VALUES, values); - } - explicit Int32VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - Int32VectorBuilder &operator=(const Int32VectorBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateInt32Vector( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> values = 0) { - Int32VectorBuilder builder_(_fbb); - builder_.add_values(values); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateInt32VectorDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *values = nullptr) { - auto values__ = values ? _fbb.CreateVector(*values) : 0; - return tflite::CreateInt32Vector( - _fbb, - values__); -} - -flatbuffers::Offset CreateInt32Vector(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct Uint16VectorT : public flatbuffers::NativeTable { - typedef Uint16Vector TableType; - std::vector values; - Uint16VectorT() { - } -}; - -struct Uint16Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef Uint16VectorT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VALUES = 4 - }; - const flatbuffers::Vector *values() const { - return GetPointer *>(VT_VALUES); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_VALUES) && - verifier.VerifyVector(values()) && - verifier.EndTable(); - } - Uint16VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(Uint16VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct Uint16VectorBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_values(flatbuffers::Offset> values) { - fbb_.AddOffset(Uint16Vector::VT_VALUES, values); - } - explicit Uint16VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - Uint16VectorBuilder &operator=(const Uint16VectorBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateUint16Vector( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> values = 0) { - Uint16VectorBuilder builder_(_fbb); - builder_.add_values(values); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateUint16VectorDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *values = nullptr) { - if (values) { _fbb.ForceVectorAlignment(values->size(), sizeof(uint16_t), 4); } - auto values__ = values ? _fbb.CreateVector(*values) : 0; - return tflite::CreateUint16Vector( - _fbb, - values__); -} - -flatbuffers::Offset CreateUint16Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct Uint8VectorT : public flatbuffers::NativeTable { - typedef Uint8Vector TableType; - std::vector values; - Uint8VectorT() { - } -}; - -struct Uint8Vector FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef Uint8VectorT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VALUES = 4 - }; - const flatbuffers::Vector *values() const { - return GetPointer *>(VT_VALUES); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_VALUES) && - verifier.VerifyVector(values()) && - verifier.EndTable(); - } - Uint8VectorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(Uint8VectorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct Uint8VectorBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_values(flatbuffers::Offset> values) { - fbb_.AddOffset(Uint8Vector::VT_VALUES, values); - } - explicit Uint8VectorBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - Uint8VectorBuilder &operator=(const Uint8VectorBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateUint8Vector( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> values = 0) { - Uint8VectorBuilder builder_(_fbb); - builder_.add_values(values); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateUint8VectorDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *values = nullptr) { - if (values) { _fbb.ForceVectorAlignment(values->size(), sizeof(uint8_t), 4); } - auto values__ = values ? _fbb.CreateVector(*values) : 0; - return tflite::CreateUint8Vector( - _fbb, - values__); -} - -flatbuffers::Offset CreateUint8Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DimensionMetadataT : public flatbuffers::NativeTable { - typedef DimensionMetadata TableType; - tflite::DimensionType format; - int32_t dense_size; - tflite::SparseIndexVectorUnion array_segments; - tflite::SparseIndexVectorUnion array_indices; - DimensionMetadataT() - : format(tflite::DimensionType_DENSE), - dense_size(0) { - } -}; - -struct DimensionMetadata FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DimensionMetadataT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FORMAT = 4, - VT_DENSE_SIZE = 6, - VT_ARRAY_SEGMENTS_TYPE = 8, - VT_ARRAY_SEGMENTS = 10, - VT_ARRAY_INDICES_TYPE = 12, - VT_ARRAY_INDICES = 14 - }; - tflite::DimensionType format() const { - return static_cast(GetField(VT_FORMAT, 0)); - } - int32_t dense_size() const { - return GetField(VT_DENSE_SIZE, 0); - } - tflite::SparseIndexVector array_segments_type() const { - return static_cast(GetField(VT_ARRAY_SEGMENTS_TYPE, 0)); - } - const void *array_segments() const { - return GetPointer(VT_ARRAY_SEGMENTS); - } - template const T *array_segments_as() const; - const tflite::Int32Vector *array_segments_as_Int32Vector() const { - return array_segments_type() == tflite::SparseIndexVector_Int32Vector ? static_cast(array_segments()) : nullptr; - } - const tflite::Uint16Vector *array_segments_as_Uint16Vector() const { - return array_segments_type() == tflite::SparseIndexVector_Uint16Vector ? static_cast(array_segments()) : nullptr; - } - const tflite::Uint8Vector *array_segments_as_Uint8Vector() const { - return array_segments_type() == tflite::SparseIndexVector_Uint8Vector ? static_cast(array_segments()) : nullptr; - } - tflite::SparseIndexVector array_indices_type() const { - return static_cast(GetField(VT_ARRAY_INDICES_TYPE, 0)); - } - const void *array_indices() const { - return GetPointer(VT_ARRAY_INDICES); - } - template const T *array_indices_as() const; - const tflite::Int32Vector *array_indices_as_Int32Vector() const { - return array_indices_type() == tflite::SparseIndexVector_Int32Vector ? static_cast(array_indices()) : nullptr; - } - const tflite::Uint16Vector *array_indices_as_Uint16Vector() const { - return array_indices_type() == tflite::SparseIndexVector_Uint16Vector ? static_cast(array_indices()) : nullptr; - } - const tflite::Uint8Vector *array_indices_as_Uint8Vector() const { - return array_indices_type() == tflite::SparseIndexVector_Uint8Vector ? static_cast(array_indices()) : nullptr; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FORMAT) && - VerifyField(verifier, VT_DENSE_SIZE) && - VerifyField(verifier, VT_ARRAY_SEGMENTS_TYPE) && - VerifyOffset(verifier, VT_ARRAY_SEGMENTS) && - VerifySparseIndexVector(verifier, array_segments(), array_segments_type()) && - VerifyField(verifier, VT_ARRAY_INDICES_TYPE) && - VerifyOffset(verifier, VT_ARRAY_INDICES) && - VerifySparseIndexVector(verifier, array_indices(), array_indices_type()) && - verifier.EndTable(); - } - DimensionMetadataT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DimensionMetadataT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -template<> inline const tflite::Int32Vector *DimensionMetadata::array_segments_as() const { - return array_segments_as_Int32Vector(); -} - -template<> inline const tflite::Uint16Vector *DimensionMetadata::array_segments_as() const { - return array_segments_as_Uint16Vector(); -} - -template<> inline const tflite::Uint8Vector *DimensionMetadata::array_segments_as() const { - return array_segments_as_Uint8Vector(); -} - -template<> inline const tflite::Int32Vector *DimensionMetadata::array_indices_as() const { - return array_indices_as_Int32Vector(); -} - -template<> inline const tflite::Uint16Vector *DimensionMetadata::array_indices_as() const { - return array_indices_as_Uint16Vector(); -} - -template<> inline const tflite::Uint8Vector *DimensionMetadata::array_indices_as() const { - return array_indices_as_Uint8Vector(); -} - -struct DimensionMetadataBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_format(tflite::DimensionType format) { - fbb_.AddElement(DimensionMetadata::VT_FORMAT, static_cast(format), 0); - } - void add_dense_size(int32_t dense_size) { - fbb_.AddElement(DimensionMetadata::VT_DENSE_SIZE, dense_size, 0); - } - void add_array_segments_type(tflite::SparseIndexVector array_segments_type) { - fbb_.AddElement(DimensionMetadata::VT_ARRAY_SEGMENTS_TYPE, static_cast(array_segments_type), 0); - } - void add_array_segments(flatbuffers::Offset array_segments) { - fbb_.AddOffset(DimensionMetadata::VT_ARRAY_SEGMENTS, array_segments); - } - void add_array_indices_type(tflite::SparseIndexVector array_indices_type) { - fbb_.AddElement(DimensionMetadata::VT_ARRAY_INDICES_TYPE, static_cast(array_indices_type), 0); - } - void add_array_indices(flatbuffers::Offset array_indices) { - fbb_.AddOffset(DimensionMetadata::VT_ARRAY_INDICES, array_indices); - } - explicit DimensionMetadataBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DimensionMetadataBuilder &operator=(const DimensionMetadataBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDimensionMetadata( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::DimensionType format = tflite::DimensionType_DENSE, - int32_t dense_size = 0, - tflite::SparseIndexVector array_segments_type = tflite::SparseIndexVector_NONE, - flatbuffers::Offset array_segments = 0, - tflite::SparseIndexVector array_indices_type = tflite::SparseIndexVector_NONE, - flatbuffers::Offset array_indices = 0) { - DimensionMetadataBuilder builder_(_fbb); - builder_.add_array_indices(array_indices); - builder_.add_array_segments(array_segments); - builder_.add_dense_size(dense_size); - builder_.add_array_indices_type(array_indices_type); - builder_.add_array_segments_type(array_segments_type); - builder_.add_format(format); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDimensionMetadata(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SparsityParametersT : public flatbuffers::NativeTable { - typedef SparsityParameters TableType; - std::vector traversal_order; - std::vector block_map; - std::vector> dim_metadata; - SparsityParametersT() { - } -}; - -struct SparsityParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SparsityParametersT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TRAVERSAL_ORDER = 4, - VT_BLOCK_MAP = 6, - VT_DIM_METADATA = 8 - }; - const flatbuffers::Vector *traversal_order() const { - return GetPointer *>(VT_TRAVERSAL_ORDER); - } - const flatbuffers::Vector *block_map() const { - return GetPointer *>(VT_BLOCK_MAP); - } - const flatbuffers::Vector> *dim_metadata() const { - return GetPointer> *>(VT_DIM_METADATA); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_TRAVERSAL_ORDER) && - verifier.VerifyVector(traversal_order()) && - VerifyOffset(verifier, VT_BLOCK_MAP) && - verifier.VerifyVector(block_map()) && - VerifyOffset(verifier, VT_DIM_METADATA) && - verifier.VerifyVector(dim_metadata()) && - verifier.VerifyVectorOfTables(dim_metadata()) && - verifier.EndTable(); - } - SparsityParametersT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SparsityParametersT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SparsityParametersBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_traversal_order(flatbuffers::Offset> traversal_order) { - fbb_.AddOffset(SparsityParameters::VT_TRAVERSAL_ORDER, traversal_order); - } - void add_block_map(flatbuffers::Offset> block_map) { - fbb_.AddOffset(SparsityParameters::VT_BLOCK_MAP, block_map); - } - void add_dim_metadata(flatbuffers::Offset>> dim_metadata) { - fbb_.AddOffset(SparsityParameters::VT_DIM_METADATA, dim_metadata); - } - explicit SparsityParametersBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SparsityParametersBuilder &operator=(const SparsityParametersBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSparsityParameters( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> traversal_order = 0, - flatbuffers::Offset> block_map = 0, - flatbuffers::Offset>> dim_metadata = 0) { - SparsityParametersBuilder builder_(_fbb); - builder_.add_dim_metadata(dim_metadata); - builder_.add_block_map(block_map); - builder_.add_traversal_order(traversal_order); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateSparsityParametersDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *traversal_order = nullptr, - const std::vector *block_map = nullptr, - const std::vector> *dim_metadata = nullptr) { - auto traversal_order__ = traversal_order ? _fbb.CreateVector(*traversal_order) : 0; - auto block_map__ = block_map ? _fbb.CreateVector(*block_map) : 0; - auto dim_metadata__ = dim_metadata ? _fbb.CreateVector>(*dim_metadata) : 0; - return tflite::CreateSparsityParameters( - _fbb, - traversal_order__, - block_map__, - dim_metadata__); -} - -flatbuffers::Offset CreateSparsityParameters(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct TensorT : public flatbuffers::NativeTable { - typedef Tensor TableType; - std::vector shape; - tflite::TensorType type; - uint32_t buffer; - std::string name; - std::unique_ptr quantization; - bool is_variable; - std::unique_ptr sparsity; - std::vector shape_signature; - TensorT() - : type(tflite::TensorType_FLOAT32), - buffer(0), - is_variable(false) { - } -}; - -struct Tensor FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef TensorT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SHAPE = 4, - VT_TYPE = 6, - VT_BUFFER = 8, - VT_NAME = 10, - VT_QUANTIZATION = 12, - VT_IS_VARIABLE = 14, - VT_SPARSITY = 16, - VT_SHAPE_SIGNATURE = 18 - }; - const flatbuffers::Vector *shape() const { - return GetPointer *>(VT_SHAPE); - } - tflite::TensorType type() const { - return static_cast(GetField(VT_TYPE, 0)); - } - uint32_t buffer() const { - return GetField(VT_BUFFER, 0); - } - const flatbuffers::String *name() const { - return GetPointer(VT_NAME); - } - const tflite::QuantizationParameters *quantization() const { - return GetPointer(VT_QUANTIZATION); - } - bool is_variable() const { - return GetField(VT_IS_VARIABLE, 0) != 0; - } - const tflite::SparsityParameters *sparsity() const { - return GetPointer(VT_SPARSITY); - } - const flatbuffers::Vector *shape_signature() const { - return GetPointer *>(VT_SHAPE_SIGNATURE); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_SHAPE) && - verifier.VerifyVector(shape()) && - VerifyField(verifier, VT_TYPE) && - VerifyField(verifier, VT_BUFFER) && - VerifyOffset(verifier, VT_NAME) && - verifier.VerifyString(name()) && - VerifyOffset(verifier, VT_QUANTIZATION) && - verifier.VerifyTable(quantization()) && - VerifyField(verifier, VT_IS_VARIABLE) && - VerifyOffset(verifier, VT_SPARSITY) && - verifier.VerifyTable(sparsity()) && - VerifyOffset(verifier, VT_SHAPE_SIGNATURE) && - verifier.VerifyVector(shape_signature()) && - verifier.EndTable(); - } - TensorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(TensorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct TensorBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_shape(flatbuffers::Offset> shape) { - fbb_.AddOffset(Tensor::VT_SHAPE, shape); - } - void add_type(tflite::TensorType type) { - fbb_.AddElement(Tensor::VT_TYPE, static_cast(type), 0); - } - void add_buffer(uint32_t buffer) { - fbb_.AddElement(Tensor::VT_BUFFER, buffer, 0); - } - void add_name(flatbuffers::Offset name) { - fbb_.AddOffset(Tensor::VT_NAME, name); - } - void add_quantization(flatbuffers::Offset quantization) { - fbb_.AddOffset(Tensor::VT_QUANTIZATION, quantization); - } - void add_is_variable(bool is_variable) { - fbb_.AddElement(Tensor::VT_IS_VARIABLE, static_cast(is_variable), 0); - } - void add_sparsity(flatbuffers::Offset sparsity) { - fbb_.AddOffset(Tensor::VT_SPARSITY, sparsity); - } - void add_shape_signature(flatbuffers::Offset> shape_signature) { - fbb_.AddOffset(Tensor::VT_SHAPE_SIGNATURE, shape_signature); - } - explicit TensorBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - TensorBuilder &operator=(const TensorBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateTensor( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> shape = 0, - tflite::TensorType type = tflite::TensorType_FLOAT32, - uint32_t buffer = 0, - flatbuffers::Offset name = 0, - flatbuffers::Offset quantization = 0, - bool is_variable = false, - flatbuffers::Offset sparsity = 0, - flatbuffers::Offset> shape_signature = 0) { - TensorBuilder builder_(_fbb); - builder_.add_shape_signature(shape_signature); - builder_.add_sparsity(sparsity); - builder_.add_quantization(quantization); - builder_.add_name(name); - builder_.add_buffer(buffer); - builder_.add_shape(shape); - builder_.add_is_variable(is_variable); - builder_.add_type(type); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateTensorDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *shape = nullptr, - tflite::TensorType type = tflite::TensorType_FLOAT32, - uint32_t buffer = 0, - const char *name = nullptr, - flatbuffers::Offset quantization = 0, - bool is_variable = false, - flatbuffers::Offset sparsity = 0, - const std::vector *shape_signature = nullptr) { - auto shape__ = shape ? _fbb.CreateVector(*shape) : 0; - auto name__ = name ? _fbb.CreateString(name) : 0; - auto shape_signature__ = shape_signature ? _fbb.CreateVector(*shape_signature) : 0; - return tflite::CreateTensor( - _fbb, - shape__, - type, - buffer, - name__, - quantization, - is_variable, - sparsity, - shape_signature__); -} - -flatbuffers::Offset CreateTensor(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct Conv2DOptionsT : public flatbuffers::NativeTable { - typedef Conv2DOptions TableType; - tflite::Padding padding; - int32_t stride_w; - int32_t stride_h; - tflite::ActivationFunctionType fused_activation_function; - int32_t dilation_w_factor; - int32_t dilation_h_factor; - Conv2DOptionsT() - : padding(tflite::Padding_SAME), - stride_w(0), - stride_h(0), - fused_activation_function(tflite::ActivationFunctionType_NONE), - dilation_w_factor(1), - dilation_h_factor(1) { - } -}; - -struct Conv2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef Conv2DOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PADDING = 4, - VT_STRIDE_W = 6, - VT_STRIDE_H = 8, - VT_FUSED_ACTIVATION_FUNCTION = 10, - VT_DILATION_W_FACTOR = 12, - VT_DILATION_H_FACTOR = 14 - }; - tflite::Padding padding() const { - return static_cast(GetField(VT_PADDING, 0)); - } - int32_t stride_w() const { - return GetField(VT_STRIDE_W, 0); - } - int32_t stride_h() const { - return GetField(VT_STRIDE_H, 0); - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - int32_t dilation_w_factor() const { - return GetField(VT_DILATION_W_FACTOR, 1); - } - int32_t dilation_h_factor() const { - return GetField(VT_DILATION_H_FACTOR, 1); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PADDING) && - VerifyField(verifier, VT_STRIDE_W) && - VerifyField(verifier, VT_STRIDE_H) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_DILATION_W_FACTOR) && - VerifyField(verifier, VT_DILATION_H_FACTOR) && - verifier.EndTable(); - } - Conv2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(Conv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct Conv2DOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_padding(tflite::Padding padding) { - fbb_.AddElement(Conv2DOptions::VT_PADDING, static_cast(padding), 0); - } - void add_stride_w(int32_t stride_w) { - fbb_.AddElement(Conv2DOptions::VT_STRIDE_W, stride_w, 0); - } - void add_stride_h(int32_t stride_h) { - fbb_.AddElement(Conv2DOptions::VT_STRIDE_H, stride_h, 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(Conv2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_dilation_w_factor(int32_t dilation_w_factor) { - fbb_.AddElement(Conv2DOptions::VT_DILATION_W_FACTOR, dilation_w_factor, 1); - } - void add_dilation_h_factor(int32_t dilation_h_factor) { - fbb_.AddElement(Conv2DOptions::VT_DILATION_H_FACTOR, dilation_h_factor, 1); - } - explicit Conv2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - Conv2DOptionsBuilder &operator=(const Conv2DOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateConv2DOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::Padding padding = tflite::Padding_SAME, - int32_t stride_w = 0, - int32_t stride_h = 0, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - int32_t dilation_w_factor = 1, - int32_t dilation_h_factor = 1) { - Conv2DOptionsBuilder builder_(_fbb); - builder_.add_dilation_h_factor(dilation_h_factor); - builder_.add_dilation_w_factor(dilation_w_factor); - builder_.add_stride_h(stride_h); - builder_.add_stride_w(stride_w); - builder_.add_fused_activation_function(fused_activation_function); - builder_.add_padding(padding); - return builder_.Finish(); -} - -flatbuffers::Offset CreateConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct Pool2DOptionsT : public flatbuffers::NativeTable { - typedef Pool2DOptions TableType; - tflite::Padding padding; - int32_t stride_w; - int32_t stride_h; - int32_t filter_width; - int32_t filter_height; - tflite::ActivationFunctionType fused_activation_function; - Pool2DOptionsT() - : padding(tflite::Padding_SAME), - stride_w(0), - stride_h(0), - filter_width(0), - filter_height(0), - fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct Pool2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef Pool2DOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PADDING = 4, - VT_STRIDE_W = 6, - VT_STRIDE_H = 8, - VT_FILTER_WIDTH = 10, - VT_FILTER_HEIGHT = 12, - VT_FUSED_ACTIVATION_FUNCTION = 14 - }; - tflite::Padding padding() const { - return static_cast(GetField(VT_PADDING, 0)); - } - int32_t stride_w() const { - return GetField(VT_STRIDE_W, 0); - } - int32_t stride_h() const { - return GetField(VT_STRIDE_H, 0); - } - int32_t filter_width() const { - return GetField(VT_FILTER_WIDTH, 0); - } - int32_t filter_height() const { - return GetField(VT_FILTER_HEIGHT, 0); - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PADDING) && - VerifyField(verifier, VT_STRIDE_W) && - VerifyField(verifier, VT_STRIDE_H) && - VerifyField(verifier, VT_FILTER_WIDTH) && - VerifyField(verifier, VT_FILTER_HEIGHT) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - Pool2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(Pool2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct Pool2DOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_padding(tflite::Padding padding) { - fbb_.AddElement(Pool2DOptions::VT_PADDING, static_cast(padding), 0); - } - void add_stride_w(int32_t stride_w) { - fbb_.AddElement(Pool2DOptions::VT_STRIDE_W, stride_w, 0); - } - void add_stride_h(int32_t stride_h) { - fbb_.AddElement(Pool2DOptions::VT_STRIDE_H, stride_h, 0); - } - void add_filter_width(int32_t filter_width) { - fbb_.AddElement(Pool2DOptions::VT_FILTER_WIDTH, filter_width, 0); - } - void add_filter_height(int32_t filter_height) { - fbb_.AddElement(Pool2DOptions::VT_FILTER_HEIGHT, filter_height, 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(Pool2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit Pool2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - Pool2DOptionsBuilder &operator=(const Pool2DOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreatePool2DOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::Padding padding = tflite::Padding_SAME, - int32_t stride_w = 0, - int32_t stride_h = 0, - int32_t filter_width = 0, - int32_t filter_height = 0, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - Pool2DOptionsBuilder builder_(_fbb); - builder_.add_filter_height(filter_height); - builder_.add_filter_width(filter_width); - builder_.add_stride_h(stride_h); - builder_.add_stride_w(stride_w); - builder_.add_fused_activation_function(fused_activation_function); - builder_.add_padding(padding); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePool2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DepthwiseConv2DOptionsT : public flatbuffers::NativeTable { - typedef DepthwiseConv2DOptions TableType; - tflite::Padding padding; - int32_t stride_w; - int32_t stride_h; - int32_t depth_multiplier; - tflite::ActivationFunctionType fused_activation_function; - int32_t dilation_w_factor; - int32_t dilation_h_factor; - DepthwiseConv2DOptionsT() - : padding(tflite::Padding_SAME), - stride_w(0), - stride_h(0), - depth_multiplier(0), - fused_activation_function(tflite::ActivationFunctionType_NONE), - dilation_w_factor(1), - dilation_h_factor(1) { - } -}; - -struct DepthwiseConv2DOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DepthwiseConv2DOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PADDING = 4, - VT_STRIDE_W = 6, - VT_STRIDE_H = 8, - VT_DEPTH_MULTIPLIER = 10, - VT_FUSED_ACTIVATION_FUNCTION = 12, - VT_DILATION_W_FACTOR = 14, - VT_DILATION_H_FACTOR = 16 - }; - tflite::Padding padding() const { - return static_cast(GetField(VT_PADDING, 0)); - } - int32_t stride_w() const { - return GetField(VT_STRIDE_W, 0); - } - int32_t stride_h() const { - return GetField(VT_STRIDE_H, 0); - } - int32_t depth_multiplier() const { - return GetField(VT_DEPTH_MULTIPLIER, 0); - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - int32_t dilation_w_factor() const { - return GetField(VT_DILATION_W_FACTOR, 1); - } - int32_t dilation_h_factor() const { - return GetField(VT_DILATION_H_FACTOR, 1); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PADDING) && - VerifyField(verifier, VT_STRIDE_W) && - VerifyField(verifier, VT_STRIDE_H) && - VerifyField(verifier, VT_DEPTH_MULTIPLIER) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_DILATION_W_FACTOR) && - VerifyField(verifier, VT_DILATION_H_FACTOR) && - verifier.EndTable(); - } - DepthwiseConv2DOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DepthwiseConv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DepthwiseConv2DOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_padding(tflite::Padding padding) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_PADDING, static_cast(padding), 0); - } - void add_stride_w(int32_t stride_w) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_STRIDE_W, stride_w, 0); - } - void add_stride_h(int32_t stride_h) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_STRIDE_H, stride_h, 0); - } - void add_depth_multiplier(int32_t depth_multiplier) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_DEPTH_MULTIPLIER, depth_multiplier, 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_dilation_w_factor(int32_t dilation_w_factor) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_DILATION_W_FACTOR, dilation_w_factor, 1); - } - void add_dilation_h_factor(int32_t dilation_h_factor) { - fbb_.AddElement(DepthwiseConv2DOptions::VT_DILATION_H_FACTOR, dilation_h_factor, 1); - } - explicit DepthwiseConv2DOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DepthwiseConv2DOptionsBuilder &operator=(const DepthwiseConv2DOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDepthwiseConv2DOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::Padding padding = tflite::Padding_SAME, - int32_t stride_w = 0, - int32_t stride_h = 0, - int32_t depth_multiplier = 0, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - int32_t dilation_w_factor = 1, - int32_t dilation_h_factor = 1) { - DepthwiseConv2DOptionsBuilder builder_(_fbb); - builder_.add_dilation_h_factor(dilation_h_factor); - builder_.add_dilation_w_factor(dilation_w_factor); - builder_.add_depth_multiplier(depth_multiplier); - builder_.add_stride_h(stride_h); - builder_.add_stride_w(stride_w); - builder_.add_fused_activation_function(fused_activation_function); - builder_.add_padding(padding); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDepthwiseConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ConcatEmbeddingsOptionsT : public flatbuffers::NativeTable { - typedef ConcatEmbeddingsOptions TableType; - int32_t num_channels; - std::vector num_columns_per_channel; - std::vector embedding_dim_per_channel; - ConcatEmbeddingsOptionsT() - : num_channels(0) { - } -}; - -struct ConcatEmbeddingsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ConcatEmbeddingsOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NUM_CHANNELS = 4, - VT_NUM_COLUMNS_PER_CHANNEL = 6, - VT_EMBEDDING_DIM_PER_CHANNEL = 8 - }; - int32_t num_channels() const { - return GetField(VT_NUM_CHANNELS, 0); - } - const flatbuffers::Vector *num_columns_per_channel() const { - return GetPointer *>(VT_NUM_COLUMNS_PER_CHANNEL); - } - const flatbuffers::Vector *embedding_dim_per_channel() const { - return GetPointer *>(VT_EMBEDDING_DIM_PER_CHANNEL); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_NUM_CHANNELS) && - VerifyOffset(verifier, VT_NUM_COLUMNS_PER_CHANNEL) && - verifier.VerifyVector(num_columns_per_channel()) && - VerifyOffset(verifier, VT_EMBEDDING_DIM_PER_CHANNEL) && - verifier.VerifyVector(embedding_dim_per_channel()) && - verifier.EndTable(); - } - ConcatEmbeddingsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ConcatEmbeddingsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ConcatEmbeddingsOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_num_channels(int32_t num_channels) { - fbb_.AddElement(ConcatEmbeddingsOptions::VT_NUM_CHANNELS, num_channels, 0); - } - void add_num_columns_per_channel(flatbuffers::Offset> num_columns_per_channel) { - fbb_.AddOffset(ConcatEmbeddingsOptions::VT_NUM_COLUMNS_PER_CHANNEL, num_columns_per_channel); - } - void add_embedding_dim_per_channel(flatbuffers::Offset> embedding_dim_per_channel) { - fbb_.AddOffset(ConcatEmbeddingsOptions::VT_EMBEDDING_DIM_PER_CHANNEL, embedding_dim_per_channel); - } - explicit ConcatEmbeddingsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ConcatEmbeddingsOptionsBuilder &operator=(const ConcatEmbeddingsOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateConcatEmbeddingsOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t num_channels = 0, - flatbuffers::Offset> num_columns_per_channel = 0, - flatbuffers::Offset> embedding_dim_per_channel = 0) { - ConcatEmbeddingsOptionsBuilder builder_(_fbb); - builder_.add_embedding_dim_per_channel(embedding_dim_per_channel); - builder_.add_num_columns_per_channel(num_columns_per_channel); - builder_.add_num_channels(num_channels); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateConcatEmbeddingsOptionsDirect( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t num_channels = 0, - const std::vector *num_columns_per_channel = nullptr, - const std::vector *embedding_dim_per_channel = nullptr) { - auto num_columns_per_channel__ = num_columns_per_channel ? _fbb.CreateVector(*num_columns_per_channel) : 0; - auto embedding_dim_per_channel__ = embedding_dim_per_channel ? _fbb.CreateVector(*embedding_dim_per_channel) : 0; - return tflite::CreateConcatEmbeddingsOptions( - _fbb, - num_channels, - num_columns_per_channel__, - embedding_dim_per_channel__); -} - -flatbuffers::Offset CreateConcatEmbeddingsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LSHProjectionOptionsT : public flatbuffers::NativeTable { - typedef LSHProjectionOptions TableType; - tflite::LSHProjectionType type; - LSHProjectionOptionsT() - : type(tflite::LSHProjectionType_UNKNOWN) { - } -}; - -struct LSHProjectionOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LSHProjectionOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TYPE = 4 - }; - tflite::LSHProjectionType type() const { - return static_cast(GetField(VT_TYPE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TYPE) && - verifier.EndTable(); - } - LSHProjectionOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LSHProjectionOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LSHProjectionOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_type(tflite::LSHProjectionType type) { - fbb_.AddElement(LSHProjectionOptions::VT_TYPE, static_cast(type), 0); - } - explicit LSHProjectionOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LSHProjectionOptionsBuilder &operator=(const LSHProjectionOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLSHProjectionOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::LSHProjectionType type = tflite::LSHProjectionType_UNKNOWN) { - LSHProjectionOptionsBuilder builder_(_fbb); - builder_.add_type(type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLSHProjectionOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SVDFOptionsT : public flatbuffers::NativeTable { - typedef SVDFOptions TableType; - int32_t rank; - tflite::ActivationFunctionType fused_activation_function; - bool asymmetric_quantize_inputs; - SVDFOptionsT() - : rank(0), - fused_activation_function(tflite::ActivationFunctionType_NONE), - asymmetric_quantize_inputs(false) { - } -}; - -struct SVDFOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SVDFOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_RANK = 4, - VT_FUSED_ACTIVATION_FUNCTION = 6, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 8 - }; - int32_t rank() const { - return GetField(VT_RANK, 0); - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_RANK) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - SVDFOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SVDFOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SVDFOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_rank(int32_t rank) { - fbb_.AddElement(SVDFOptions::VT_RANK, rank, 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(SVDFOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(SVDFOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit SVDFOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SVDFOptionsBuilder &operator=(const SVDFOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSVDFOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t rank = 0, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - bool asymmetric_quantize_inputs = false) { - SVDFOptionsBuilder builder_(_fbb); - builder_.add_rank(rank); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSVDFOptions(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct RNNOptionsT : public flatbuffers::NativeTable { - typedef RNNOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - bool asymmetric_quantize_inputs; - RNNOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE), - asymmetric_quantize_inputs(false) { - } -}; - -struct RNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef RNNOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 6 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - RNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(RNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct RNNOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(RNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(RNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit RNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - RNNOptionsBuilder &operator=(const RNNOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateRNNOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - bool asymmetric_quantize_inputs = false) { - RNNOptionsBuilder builder_(_fbb); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SequenceRNNOptionsT : public flatbuffers::NativeTable { - typedef SequenceRNNOptions TableType; - bool time_major; - tflite::ActivationFunctionType fused_activation_function; - bool asymmetric_quantize_inputs; - SequenceRNNOptionsT() - : time_major(false), - fused_activation_function(tflite::ActivationFunctionType_NONE), - asymmetric_quantize_inputs(false) { - } -}; - -struct SequenceRNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SequenceRNNOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TIME_MAJOR = 4, - VT_FUSED_ACTIVATION_FUNCTION = 6, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 8 - }; - bool time_major() const { - return GetField(VT_TIME_MAJOR, 0) != 0; - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TIME_MAJOR) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - SequenceRNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SequenceRNNOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_time_major(bool time_major) { - fbb_.AddElement(SequenceRNNOptions::VT_TIME_MAJOR, static_cast(time_major), 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(SequenceRNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(SequenceRNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit SequenceRNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SequenceRNNOptionsBuilder &operator=(const SequenceRNNOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSequenceRNNOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool time_major = false, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - bool asymmetric_quantize_inputs = false) { - SequenceRNNOptionsBuilder builder_(_fbb); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_fused_activation_function(fused_activation_function); - builder_.add_time_major(time_major); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct BidirectionalSequenceRNNOptionsT : public flatbuffers::NativeTable { - typedef BidirectionalSequenceRNNOptions TableType; - bool time_major; - tflite::ActivationFunctionType fused_activation_function; - bool merge_outputs; - bool asymmetric_quantize_inputs; - BidirectionalSequenceRNNOptionsT() - : time_major(false), - fused_activation_function(tflite::ActivationFunctionType_NONE), - merge_outputs(false), - asymmetric_quantize_inputs(false) { - } -}; - -struct BidirectionalSequenceRNNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef BidirectionalSequenceRNNOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TIME_MAJOR = 4, - VT_FUSED_ACTIVATION_FUNCTION = 6, - VT_MERGE_OUTPUTS = 8, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 10 - }; - bool time_major() const { - return GetField(VT_TIME_MAJOR, 0) != 0; - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool merge_outputs() const { - return GetField(VT_MERGE_OUTPUTS, 0) != 0; - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_TIME_MAJOR) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_MERGE_OUTPUTS) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - BidirectionalSequenceRNNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct BidirectionalSequenceRNNOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_time_major(bool time_major) { - fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_TIME_MAJOR, static_cast(time_major), 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_merge_outputs(bool merge_outputs) { - fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_MERGE_OUTPUTS, static_cast(merge_outputs), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(BidirectionalSequenceRNNOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit BidirectionalSequenceRNNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - BidirectionalSequenceRNNOptionsBuilder &operator=(const BidirectionalSequenceRNNOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateBidirectionalSequenceRNNOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool time_major = false, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - bool merge_outputs = false, - bool asymmetric_quantize_inputs = false) { - BidirectionalSequenceRNNOptionsBuilder builder_(_fbb); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_merge_outputs(merge_outputs); - builder_.add_fused_activation_function(fused_activation_function); - builder_.add_time_major(time_major); - return builder_.Finish(); -} - -flatbuffers::Offset CreateBidirectionalSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct FullyConnectedOptionsT : public flatbuffers::NativeTable { - typedef FullyConnectedOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - tflite::FullyConnectedOptionsWeightsFormat weights_format; - bool keep_num_dims; - bool asymmetric_quantize_inputs; - FullyConnectedOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE), - weights_format(tflite::FullyConnectedOptionsWeightsFormat_DEFAULT), - keep_num_dims(false), - asymmetric_quantize_inputs(false) { - } -}; - -struct FullyConnectedOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef FullyConnectedOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_WEIGHTS_FORMAT = 6, - VT_KEEP_NUM_DIMS = 8, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 10 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - tflite::FullyConnectedOptionsWeightsFormat weights_format() const { - return static_cast(GetField(VT_WEIGHTS_FORMAT, 0)); - } - bool keep_num_dims() const { - return GetField(VT_KEEP_NUM_DIMS, 0) != 0; - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_WEIGHTS_FORMAT) && - VerifyField(verifier, VT_KEEP_NUM_DIMS) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - FullyConnectedOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(FullyConnectedOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct FullyConnectedOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(FullyConnectedOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_weights_format(tflite::FullyConnectedOptionsWeightsFormat weights_format) { - fbb_.AddElement(FullyConnectedOptions::VT_WEIGHTS_FORMAT, static_cast(weights_format), 0); - } - void add_keep_num_dims(bool keep_num_dims) { - fbb_.AddElement(FullyConnectedOptions::VT_KEEP_NUM_DIMS, static_cast(keep_num_dims), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(FullyConnectedOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit FullyConnectedOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - FullyConnectedOptionsBuilder &operator=(const FullyConnectedOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateFullyConnectedOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - tflite::FullyConnectedOptionsWeightsFormat weights_format = tflite::FullyConnectedOptionsWeightsFormat_DEFAULT, - bool keep_num_dims = false, - bool asymmetric_quantize_inputs = false) { - FullyConnectedOptionsBuilder builder_(_fbb); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_keep_num_dims(keep_num_dims); - builder_.add_weights_format(weights_format); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateFullyConnectedOptions(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SoftmaxOptionsT : public flatbuffers::NativeTable { - typedef SoftmaxOptions TableType; - float beta; - SoftmaxOptionsT() - : beta(0.0f) { - } -}; - -struct SoftmaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SoftmaxOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BETA = 4 - }; - float beta() const { - return GetField(VT_BETA, 0.0f); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BETA) && - verifier.EndTable(); - } - SoftmaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SoftmaxOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_beta(float beta) { - fbb_.AddElement(SoftmaxOptions::VT_BETA, beta, 0.0f); - } - explicit SoftmaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SoftmaxOptionsBuilder &operator=(const SoftmaxOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSoftmaxOptions( - flatbuffers::FlatBufferBuilder &_fbb, - float beta = 0.0f) { - SoftmaxOptionsBuilder builder_(_fbb); - builder_.add_beta(beta); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ConcatenationOptionsT : public flatbuffers::NativeTable { - typedef ConcatenationOptions TableType; - int32_t axis; - tflite::ActivationFunctionType fused_activation_function; - ConcatenationOptionsT() - : axis(0), - fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct ConcatenationOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ConcatenationOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_AXIS = 4, - VT_FUSED_ACTIVATION_FUNCTION = 6 - }; - int32_t axis() const { - return GetField(VT_AXIS, 0); - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_AXIS) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - ConcatenationOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ConcatenationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ConcatenationOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_axis(int32_t axis) { - fbb_.AddElement(ConcatenationOptions::VT_AXIS, axis, 0); - } - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(ConcatenationOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit ConcatenationOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ConcatenationOptionsBuilder &operator=(const ConcatenationOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateConcatenationOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t axis = 0, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - ConcatenationOptionsBuilder builder_(_fbb); - builder_.add_axis(axis); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateConcatenationOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct AddOptionsT : public flatbuffers::NativeTable { - typedef AddOptions TableType; - bool pot_scale_int16; - tflite::ActivationFunctionType fused_activation_function; - AddOptionsT() - : pot_scale_int16(true), - fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct AddOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef AddOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_POT_SCALE_INT16 = 6 - }; - bool pot_scale_int16() const { - return GetField(VT_POT_SCALE_INT16, 0) != 0; - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_POT_SCALE_INT16) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - AddOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(AddOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct AddOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(AddOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit AddOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - AddOptionsBuilder &operator=(const AddOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateAddOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - AddOptionsBuilder builder_(_fbb); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateAddOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MulOptionsT : public flatbuffers::NativeTable { - typedef MulOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - MulOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct MulOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MulOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - MulOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MulOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(MulOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit MulOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MulOptionsBuilder &operator=(const MulOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMulOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - MulOptionsBuilder builder_(_fbb); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct L2NormOptionsT : public flatbuffers::NativeTable { - typedef L2NormOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - L2NormOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct L2NormOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef L2NormOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - L2NormOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(L2NormOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct L2NormOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(L2NormOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit L2NormOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - L2NormOptionsBuilder &operator=(const L2NormOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateL2NormOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - L2NormOptionsBuilder builder_(_fbb); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateL2NormOptions(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LocalResponseNormalizationOptionsT : public flatbuffers::NativeTable { - typedef LocalResponseNormalizationOptions TableType; - int32_t radius; - float bias; - float alpha; - float beta; - LocalResponseNormalizationOptionsT() - : radius(0), - bias(0.0f), - alpha(0.0f), - beta(0.0f) { - } -}; - -struct LocalResponseNormalizationOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LocalResponseNormalizationOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_RADIUS = 4, - VT_BIAS = 6, - VT_ALPHA = 8, - VT_BETA = 10 - }; - int32_t radius() const { - return GetField(VT_RADIUS, 0); - } - float bias() const { - return GetField(VT_BIAS, 0.0f); - } - float alpha() const { - return GetField(VT_ALPHA, 0.0f); - } - float beta() const { - return GetField(VT_BETA, 0.0f); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_RADIUS) && - VerifyField(verifier, VT_BIAS) && - VerifyField(verifier, VT_ALPHA) && - VerifyField(verifier, VT_BETA) && - verifier.EndTable(); - } - LocalResponseNormalizationOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LocalResponseNormalizationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LocalResponseNormalizationOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_radius(int32_t radius) { - fbb_.AddElement(LocalResponseNormalizationOptions::VT_RADIUS, radius, 0); - } - void add_bias(float bias) { - fbb_.AddElement(LocalResponseNormalizationOptions::VT_BIAS, bias, 0.0f); - } - void add_alpha(float alpha) { - fbb_.AddElement(LocalResponseNormalizationOptions::VT_ALPHA, alpha, 0.0f); - } - void add_beta(float beta) { - fbb_.AddElement(LocalResponseNormalizationOptions::VT_BETA, beta, 0.0f); - } - explicit LocalResponseNormalizationOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LocalResponseNormalizationOptionsBuilder &operator=(const LocalResponseNormalizationOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLocalResponseNormalizationOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t radius = 0, - float bias = 0.0f, - float alpha = 0.0f, - float beta = 0.0f) { - LocalResponseNormalizationOptionsBuilder builder_(_fbb); - builder_.add_beta(beta); - builder_.add_alpha(alpha); - builder_.add_bias(bias); - builder_.add_radius(radius); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LSTMOptionsT : public flatbuffers::NativeTable { - typedef LSTMOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - float cell_clip; - float proj_clip; - tflite::LSTMKernelType kernel_type; - bool asymmetric_quantize_inputs; - LSTMOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE), - cell_clip(0.0f), - proj_clip(0.0f), - kernel_type(tflite::LSTMKernelType_FULL), - asymmetric_quantize_inputs(false) { - } -}; - -struct LSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LSTMOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_CELL_CLIP = 6, - VT_PROJ_CLIP = 8, - VT_KERNEL_TYPE = 10, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 12 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - float cell_clip() const { - return GetField(VT_CELL_CLIP, 0.0f); - } - float proj_clip() const { - return GetField(VT_PROJ_CLIP, 0.0f); - } - tflite::LSTMKernelType kernel_type() const { - return static_cast(GetField(VT_KERNEL_TYPE, 0)); - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_CELL_CLIP) && - VerifyField(verifier, VT_PROJ_CLIP) && - VerifyField(verifier, VT_KERNEL_TYPE) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - LSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LSTMOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(LSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_cell_clip(float cell_clip) { - fbb_.AddElement(LSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); - } - void add_proj_clip(float proj_clip) { - fbb_.AddElement(LSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); - } - void add_kernel_type(tflite::LSTMKernelType kernel_type) { - fbb_.AddElement(LSTMOptions::VT_KERNEL_TYPE, static_cast(kernel_type), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(LSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit LSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LSTMOptionsBuilder &operator=(const LSTMOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLSTMOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - float cell_clip = 0.0f, - float proj_clip = 0.0f, - tflite::LSTMKernelType kernel_type = tflite::LSTMKernelType_FULL, - bool asymmetric_quantize_inputs = false) { - LSTMOptionsBuilder builder_(_fbb); - builder_.add_proj_clip(proj_clip); - builder_.add_cell_clip(cell_clip); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_kernel_type(kernel_type); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct UnidirectionalSequenceLSTMOptionsT : public flatbuffers::NativeTable { - typedef UnidirectionalSequenceLSTMOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - float cell_clip; - float proj_clip; - bool time_major; - bool asymmetric_quantize_inputs; - UnidirectionalSequenceLSTMOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE), - cell_clip(0.0f), - proj_clip(0.0f), - time_major(false), - asymmetric_quantize_inputs(false) { - } -}; - -struct UnidirectionalSequenceLSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef UnidirectionalSequenceLSTMOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_CELL_CLIP = 6, - VT_PROJ_CLIP = 8, - VT_TIME_MAJOR = 10, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 12 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - float cell_clip() const { - return GetField(VT_CELL_CLIP, 0.0f); - } - float proj_clip() const { - return GetField(VT_PROJ_CLIP, 0.0f); - } - bool time_major() const { - return GetField(VT_TIME_MAJOR, 0) != 0; - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_CELL_CLIP) && - VerifyField(verifier, VT_PROJ_CLIP) && - VerifyField(verifier, VT_TIME_MAJOR) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - UnidirectionalSequenceLSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct UnidirectionalSequenceLSTMOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_cell_clip(float cell_clip) { - fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); - } - void add_proj_clip(float proj_clip) { - fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); - } - void add_time_major(bool time_major) { - fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_TIME_MAJOR, static_cast(time_major), 0); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(UnidirectionalSequenceLSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit UnidirectionalSequenceLSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - UnidirectionalSequenceLSTMOptionsBuilder &operator=(const UnidirectionalSequenceLSTMOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - float cell_clip = 0.0f, - float proj_clip = 0.0f, - bool time_major = false, - bool asymmetric_quantize_inputs = false) { - UnidirectionalSequenceLSTMOptionsBuilder builder_(_fbb); - builder_.add_proj_clip(proj_clip); - builder_.add_cell_clip(cell_clip); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_time_major(time_major); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct BidirectionalSequenceLSTMOptionsT : public flatbuffers::NativeTable { - typedef BidirectionalSequenceLSTMOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - float cell_clip; - float proj_clip; - bool merge_outputs; - bool time_major; - bool asymmetric_quantize_inputs; - BidirectionalSequenceLSTMOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE), - cell_clip(0.0f), - proj_clip(0.0f), - merge_outputs(false), - time_major(true), - asymmetric_quantize_inputs(false) { - } -}; - -struct BidirectionalSequenceLSTMOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef BidirectionalSequenceLSTMOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_CELL_CLIP = 6, - VT_PROJ_CLIP = 8, - VT_MERGE_OUTPUTS = 10, - VT_TIME_MAJOR = 12, - VT_ASYMMETRIC_QUANTIZE_INPUTS = 14 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - float cell_clip() const { - return GetField(VT_CELL_CLIP, 0.0f); - } - float proj_clip() const { - return GetField(VT_PROJ_CLIP, 0.0f); - } - bool merge_outputs() const { - return GetField(VT_MERGE_OUTPUTS, 0) != 0; - } - bool time_major() const { - return GetField(VT_TIME_MAJOR, 1) != 0; - } - bool asymmetric_quantize_inputs() const { - return GetField(VT_ASYMMETRIC_QUANTIZE_INPUTS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - VerifyField(verifier, VT_CELL_CLIP) && - VerifyField(verifier, VT_PROJ_CLIP) && - VerifyField(verifier, VT_MERGE_OUTPUTS) && - VerifyField(verifier, VT_TIME_MAJOR) && - VerifyField(verifier, VT_ASYMMETRIC_QUANTIZE_INPUTS) && - verifier.EndTable(); - } - BidirectionalSequenceLSTMOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct BidirectionalSequenceLSTMOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - void add_cell_clip(float cell_clip) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_CELL_CLIP, cell_clip, 0.0f); - } - void add_proj_clip(float proj_clip) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_PROJ_CLIP, proj_clip, 0.0f); - } - void add_merge_outputs(bool merge_outputs) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_MERGE_OUTPUTS, static_cast(merge_outputs), 0); - } - void add_time_major(bool time_major) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_TIME_MAJOR, static_cast(time_major), 1); - } - void add_asymmetric_quantize_inputs(bool asymmetric_quantize_inputs) { - fbb_.AddElement(BidirectionalSequenceLSTMOptions::VT_ASYMMETRIC_QUANTIZE_INPUTS, static_cast(asymmetric_quantize_inputs), 0); - } - explicit BidirectionalSequenceLSTMOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - BidirectionalSequenceLSTMOptionsBuilder &operator=(const BidirectionalSequenceLSTMOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE, - float cell_clip = 0.0f, - float proj_clip = 0.0f, - bool merge_outputs = false, - bool time_major = true, - bool asymmetric_quantize_inputs = false) { - BidirectionalSequenceLSTMOptionsBuilder builder_(_fbb); - builder_.add_proj_clip(proj_clip); - builder_.add_cell_clip(cell_clip); - builder_.add_asymmetric_quantize_inputs(asymmetric_quantize_inputs); - builder_.add_time_major(time_major); - builder_.add_merge_outputs(merge_outputs); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ResizeBilinearOptionsT : public flatbuffers::NativeTable { - typedef ResizeBilinearOptions TableType; - bool align_corners; - bool half_pixel_centers; - ResizeBilinearOptionsT() - : align_corners(false), - half_pixel_centers(false) { - } -}; - -struct ResizeBilinearOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ResizeBilinearOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ALIGN_CORNERS = 8, - VT_HALF_PIXEL_CENTERS = 10 - }; - bool align_corners() const { - return GetField(VT_ALIGN_CORNERS, 0) != 0; - } - bool half_pixel_centers() const { - return GetField(VT_HALF_PIXEL_CENTERS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ALIGN_CORNERS) && - VerifyField(verifier, VT_HALF_PIXEL_CENTERS) && - verifier.EndTable(); - } - ResizeBilinearOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ResizeBilinearOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ResizeBilinearOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_align_corners(bool align_corners) { - fbb_.AddElement(ResizeBilinearOptions::VT_ALIGN_CORNERS, static_cast(align_corners), 0); - } - void add_half_pixel_centers(bool half_pixel_centers) { - fbb_.AddElement(ResizeBilinearOptions::VT_HALF_PIXEL_CENTERS, static_cast(half_pixel_centers), 0); - } - explicit ResizeBilinearOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ResizeBilinearOptionsBuilder &operator=(const ResizeBilinearOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateResizeBilinearOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool align_corners = false, - bool half_pixel_centers = false) { - ResizeBilinearOptionsBuilder builder_(_fbb); - builder_.add_half_pixel_centers(half_pixel_centers); - builder_.add_align_corners(align_corners); - return builder_.Finish(); -} - -flatbuffers::Offset CreateResizeBilinearOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ResizeNearestNeighborOptionsT : public flatbuffers::NativeTable { - typedef ResizeNearestNeighborOptions TableType; - bool align_corners; - bool half_pixel_centers; - ResizeNearestNeighborOptionsT() - : align_corners(false), - half_pixel_centers(false) { - } -}; - -struct ResizeNearestNeighborOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ResizeNearestNeighborOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ALIGN_CORNERS = 4, - VT_HALF_PIXEL_CENTERS = 6 - }; - bool align_corners() const { - return GetField(VT_ALIGN_CORNERS, 0) != 0; - } - bool half_pixel_centers() const { - return GetField(VT_HALF_PIXEL_CENTERS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ALIGN_CORNERS) && - VerifyField(verifier, VT_HALF_PIXEL_CENTERS) && - verifier.EndTable(); - } - ResizeNearestNeighborOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ResizeNearestNeighborOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ResizeNearestNeighborOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_align_corners(bool align_corners) { - fbb_.AddElement(ResizeNearestNeighborOptions::VT_ALIGN_CORNERS, static_cast(align_corners), 0); - } - void add_half_pixel_centers(bool half_pixel_centers) { - fbb_.AddElement(ResizeNearestNeighborOptions::VT_HALF_PIXEL_CENTERS, static_cast(half_pixel_centers), 0); - } - explicit ResizeNearestNeighborOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ResizeNearestNeighborOptionsBuilder &operator=(const ResizeNearestNeighborOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateResizeNearestNeighborOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool align_corners = false, - bool half_pixel_centers = false) { - ResizeNearestNeighborOptionsBuilder builder_(_fbb); - builder_.add_half_pixel_centers(half_pixel_centers); - builder_.add_align_corners(align_corners); - return builder_.Finish(); -} - -flatbuffers::Offset CreateResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct CallOptionsT : public flatbuffers::NativeTable { - typedef CallOptions TableType; - uint32_t subgraph; - CallOptionsT() - : subgraph(0) { - } -}; - -struct CallOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef CallOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SUBGRAPH = 4 - }; - uint32_t subgraph() const { - return GetField(VT_SUBGRAPH, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SUBGRAPH) && - verifier.EndTable(); - } - CallOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(CallOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct CallOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_subgraph(uint32_t subgraph) { - fbb_.AddElement(CallOptions::VT_SUBGRAPH, subgraph, 0); - } - explicit CallOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - CallOptionsBuilder &operator=(const CallOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateCallOptions( - flatbuffers::FlatBufferBuilder &_fbb, - uint32_t subgraph = 0) { - CallOptionsBuilder builder_(_fbb); - builder_.add_subgraph(subgraph); - return builder_.Finish(); -} - -flatbuffers::Offset CreateCallOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct PadOptionsT : public flatbuffers::NativeTable { - typedef PadOptions TableType; - PadOptionsT() { - } -}; - -struct PadOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef PadOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - PadOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(PadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct PadOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit PadOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - PadOptionsBuilder &operator=(const PadOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreatePadOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - PadOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePadOptions(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct PadV2OptionsT : public flatbuffers::NativeTable { - typedef PadV2Options TableType; - PadV2OptionsT() { - } -}; - -struct PadV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef PadV2OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - PadV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(PadV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct PadV2OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit PadV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - PadV2OptionsBuilder &operator=(const PadV2OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreatePadV2Options( - flatbuffers::FlatBufferBuilder &_fbb) { - PadV2OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePadV2Options(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ReshapeOptionsT : public flatbuffers::NativeTable { - typedef ReshapeOptions TableType; - std::vector new_shape; - ReshapeOptionsT() { - } -}; - -struct ReshapeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ReshapeOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NEW_SHAPE = 4 - }; - const flatbuffers::Vector *new_shape() const { - return GetPointer *>(VT_NEW_SHAPE); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NEW_SHAPE) && - verifier.VerifyVector(new_shape()) && - verifier.EndTable(); - } - ReshapeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ReshapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ReshapeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_new_shape(flatbuffers::Offset> new_shape) { - fbb_.AddOffset(ReshapeOptions::VT_NEW_SHAPE, new_shape); - } - explicit ReshapeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ReshapeOptionsBuilder &operator=(const ReshapeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateReshapeOptions( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> new_shape = 0) { - ReshapeOptionsBuilder builder_(_fbb); - builder_.add_new_shape(new_shape); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateReshapeOptionsDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *new_shape = nullptr) { - auto new_shape__ = new_shape ? _fbb.CreateVector(*new_shape) : 0; - return tflite::CreateReshapeOptions( - _fbb, - new_shape__); -} - -flatbuffers::Offset CreateReshapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SpaceToBatchNDOptionsT : public flatbuffers::NativeTable { - typedef SpaceToBatchNDOptions TableType; - SpaceToBatchNDOptionsT() { - } -}; - -struct SpaceToBatchNDOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SpaceToBatchNDOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SpaceToBatchNDOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SpaceToBatchNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SpaceToBatchNDOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SpaceToBatchNDOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SpaceToBatchNDOptionsBuilder &operator=(const SpaceToBatchNDOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSpaceToBatchNDOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SpaceToBatchNDOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct BatchToSpaceNDOptionsT : public flatbuffers::NativeTable { - typedef BatchToSpaceNDOptions TableType; - BatchToSpaceNDOptionsT() { - } -}; - -struct BatchToSpaceNDOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef BatchToSpaceNDOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - BatchToSpaceNDOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(BatchToSpaceNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct BatchToSpaceNDOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit BatchToSpaceNDOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - BatchToSpaceNDOptionsBuilder &operator=(const BatchToSpaceNDOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateBatchToSpaceNDOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - BatchToSpaceNDOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateBatchToSpaceNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SkipGramOptionsT : public flatbuffers::NativeTable { - typedef SkipGramOptions TableType; - int32_t ngram_size; - int32_t max_skip_size; - bool include_all_ngrams; - SkipGramOptionsT() - : ngram_size(0), - max_skip_size(0), - include_all_ngrams(false) { - } -}; - -struct SkipGramOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SkipGramOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NGRAM_SIZE = 4, - VT_MAX_SKIP_SIZE = 6, - VT_INCLUDE_ALL_NGRAMS = 8 - }; - int32_t ngram_size() const { - return GetField(VT_NGRAM_SIZE, 0); - } - int32_t max_skip_size() const { - return GetField(VT_MAX_SKIP_SIZE, 0); - } - bool include_all_ngrams() const { - return GetField(VT_INCLUDE_ALL_NGRAMS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_NGRAM_SIZE) && - VerifyField(verifier, VT_MAX_SKIP_SIZE) && - VerifyField(verifier, VT_INCLUDE_ALL_NGRAMS) && - verifier.EndTable(); - } - SkipGramOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SkipGramOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SkipGramOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_ngram_size(int32_t ngram_size) { - fbb_.AddElement(SkipGramOptions::VT_NGRAM_SIZE, ngram_size, 0); - } - void add_max_skip_size(int32_t max_skip_size) { - fbb_.AddElement(SkipGramOptions::VT_MAX_SKIP_SIZE, max_skip_size, 0); - } - void add_include_all_ngrams(bool include_all_ngrams) { - fbb_.AddElement(SkipGramOptions::VT_INCLUDE_ALL_NGRAMS, static_cast(include_all_ngrams), 0); - } - explicit SkipGramOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SkipGramOptionsBuilder &operator=(const SkipGramOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSkipGramOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t ngram_size = 0, - int32_t max_skip_size = 0, - bool include_all_ngrams = false) { - SkipGramOptionsBuilder builder_(_fbb); - builder_.add_max_skip_size(max_skip_size); - builder_.add_ngram_size(ngram_size); - builder_.add_include_all_ngrams(include_all_ngrams); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSkipGramOptions(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SpaceToDepthOptionsT : public flatbuffers::NativeTable { - typedef SpaceToDepthOptions TableType; - int32_t block_size; - SpaceToDepthOptionsT() - : block_size(0) { - } -}; - -struct SpaceToDepthOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SpaceToDepthOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BLOCK_SIZE = 4 - }; - int32_t block_size() const { - return GetField(VT_BLOCK_SIZE, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BLOCK_SIZE) && - verifier.EndTable(); - } - SpaceToDepthOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SpaceToDepthOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SpaceToDepthOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_block_size(int32_t block_size) { - fbb_.AddElement(SpaceToDepthOptions::VT_BLOCK_SIZE, block_size, 0); - } - explicit SpaceToDepthOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SpaceToDepthOptionsBuilder &operator=(const SpaceToDepthOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSpaceToDepthOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t block_size = 0) { - SpaceToDepthOptionsBuilder builder_(_fbb); - builder_.add_block_size(block_size); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSpaceToDepthOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DepthToSpaceOptionsT : public flatbuffers::NativeTable { - typedef DepthToSpaceOptions TableType; - int32_t block_size; - DepthToSpaceOptionsT() - : block_size(0) { - } -}; - -struct DepthToSpaceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DepthToSpaceOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BLOCK_SIZE = 4 - }; - int32_t block_size() const { - return GetField(VT_BLOCK_SIZE, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BLOCK_SIZE) && - verifier.EndTable(); - } - DepthToSpaceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DepthToSpaceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DepthToSpaceOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_block_size(int32_t block_size) { - fbb_.AddElement(DepthToSpaceOptions::VT_BLOCK_SIZE, block_size, 0); - } - explicit DepthToSpaceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DepthToSpaceOptionsBuilder &operator=(const DepthToSpaceOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDepthToSpaceOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t block_size = 0) { - DepthToSpaceOptionsBuilder builder_(_fbb); - builder_.add_block_size(block_size); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDepthToSpaceOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SubOptionsT : public flatbuffers::NativeTable { - typedef SubOptions TableType; - bool pot_scale_int16; - tflite::ActivationFunctionType fused_activation_function; - SubOptionsT() - : pot_scale_int16(true), - fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct SubOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SubOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4, - VT_POT_SCALE_INT16 = 6 - }; - bool pot_scale_int16() const { - return GetField(VT_POT_SCALE_INT16, 0) != 0; - } - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_POT_SCALE_INT16) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - SubOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SubOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SubOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(SubOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit SubOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SubOptionsBuilder &operator=(const SubOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSubOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - SubOptionsBuilder builder_(_fbb); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSubOptions(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DivOptionsT : public flatbuffers::NativeTable { - typedef DivOptions TableType; - tflite::ActivationFunctionType fused_activation_function; - DivOptionsT() - : fused_activation_function(tflite::ActivationFunctionType_NONE) { - } -}; - -struct DivOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DivOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_FUSED_ACTIVATION_FUNCTION = 4 - }; - tflite::ActivationFunctionType fused_activation_function() const { - return static_cast(GetField(VT_FUSED_ACTIVATION_FUNCTION, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_FUSED_ACTIVATION_FUNCTION) && - verifier.EndTable(); - } - DivOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DivOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_fused_activation_function(tflite::ActivationFunctionType fused_activation_function) { - fbb_.AddElement(DivOptions::VT_FUSED_ACTIVATION_FUNCTION, static_cast(fused_activation_function), 0); - } - explicit DivOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DivOptionsBuilder &operator=(const DivOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDivOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::ActivationFunctionType fused_activation_function = tflite::ActivationFunctionType_NONE) { - DivOptionsBuilder builder_(_fbb); - builder_.add_fused_activation_function(fused_activation_function); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct TopKV2OptionsT : public flatbuffers::NativeTable { - typedef TopKV2Options TableType; - TopKV2OptionsT() { - } -}; - -struct TopKV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef TopKV2OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - TopKV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(TopKV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct TopKV2OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit TopKV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - TopKV2OptionsBuilder &operator=(const TopKV2OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateTopKV2Options( - flatbuffers::FlatBufferBuilder &_fbb) { - TopKV2OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateTopKV2Options(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct EmbeddingLookupSparseOptionsT : public flatbuffers::NativeTable { - typedef EmbeddingLookupSparseOptions TableType; - tflite::CombinerType combiner; - EmbeddingLookupSparseOptionsT() - : combiner(tflite::CombinerType_SUM) { - } -}; - -struct EmbeddingLookupSparseOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef EmbeddingLookupSparseOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_COMBINER = 4 - }; - tflite::CombinerType combiner() const { - return static_cast(GetField(VT_COMBINER, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_COMBINER) && - verifier.EndTable(); - } - EmbeddingLookupSparseOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(EmbeddingLookupSparseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct EmbeddingLookupSparseOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_combiner(tflite::CombinerType combiner) { - fbb_.AddElement(EmbeddingLookupSparseOptions::VT_COMBINER, static_cast(combiner), 0); - } - explicit EmbeddingLookupSparseOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - EmbeddingLookupSparseOptionsBuilder &operator=(const EmbeddingLookupSparseOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateEmbeddingLookupSparseOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::CombinerType combiner = tflite::CombinerType_SUM) { - EmbeddingLookupSparseOptionsBuilder builder_(_fbb); - builder_.add_combiner(combiner); - return builder_.Finish(); -} - -flatbuffers::Offset CreateEmbeddingLookupSparseOptions(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct GatherOptionsT : public flatbuffers::NativeTable { - typedef GatherOptions TableType; - int32_t axis; - GatherOptionsT() - : axis(0) { - } -}; - -struct GatherOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef GatherOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_AXIS = 4 - }; - int32_t axis() const { - return GetField(VT_AXIS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_AXIS) && - verifier.EndTable(); - } - GatherOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(GatherOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct GatherOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_axis(int32_t axis) { - fbb_.AddElement(GatherOptions::VT_AXIS, axis, 0); - } - explicit GatherOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - GatherOptionsBuilder &operator=(const GatherOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateGatherOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t axis = 0) { - GatherOptionsBuilder builder_(_fbb); - builder_.add_axis(axis); - return builder_.Finish(); -} - -flatbuffers::Offset CreateGatherOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct TransposeOptionsT : public flatbuffers::NativeTable { - typedef TransposeOptions TableType; - TransposeOptionsT() { - } -}; - -struct TransposeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef TransposeOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - TransposeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(TransposeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct TransposeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit TransposeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - TransposeOptionsBuilder &operator=(const TransposeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateTransposeOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - TransposeOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateTransposeOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ExpOptionsT : public flatbuffers::NativeTable { - typedef ExpOptions TableType; - ExpOptionsT() { - } -}; - -struct ExpOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ExpOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - ExpOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ExpOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ExpOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit ExpOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ExpOptionsBuilder &operator=(const ExpOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateExpOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - ExpOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateExpOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct CosOptionsT : public flatbuffers::NativeTable { - typedef CosOptions TableType; - CosOptionsT() { - } -}; - -struct CosOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef CosOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - CosOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(CosOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct CosOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit CosOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - CosOptionsBuilder &operator=(const CosOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateCosOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - CosOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateCosOptions(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ReducerOptionsT : public flatbuffers::NativeTable { - typedef ReducerOptions TableType; - bool keep_dims; - ReducerOptionsT() - : keep_dims(false) { - } -}; - -struct ReducerOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ReducerOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_KEEP_DIMS = 4 - }; - bool keep_dims() const { - return GetField(VT_KEEP_DIMS, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_KEEP_DIMS) && - verifier.EndTable(); - } - ReducerOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ReducerOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ReducerOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_keep_dims(bool keep_dims) { - fbb_.AddElement(ReducerOptions::VT_KEEP_DIMS, static_cast(keep_dims), 0); - } - explicit ReducerOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ReducerOptionsBuilder &operator=(const ReducerOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateReducerOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool keep_dims = false) { - ReducerOptionsBuilder builder_(_fbb); - builder_.add_keep_dims(keep_dims); - return builder_.Finish(); -} - -flatbuffers::Offset CreateReducerOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SqueezeOptionsT : public flatbuffers::NativeTable { - typedef SqueezeOptions TableType; - std::vector squeeze_dims; - SqueezeOptionsT() { - } -}; - -struct SqueezeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SqueezeOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SQUEEZE_DIMS = 4 - }; - const flatbuffers::Vector *squeeze_dims() const { - return GetPointer *>(VT_SQUEEZE_DIMS); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_SQUEEZE_DIMS) && - verifier.VerifyVector(squeeze_dims()) && - verifier.EndTable(); - } - SqueezeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SqueezeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SqueezeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_squeeze_dims(flatbuffers::Offset> squeeze_dims) { - fbb_.AddOffset(SqueezeOptions::VT_SQUEEZE_DIMS, squeeze_dims); - } - explicit SqueezeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SqueezeOptionsBuilder &operator=(const SqueezeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSqueezeOptions( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> squeeze_dims = 0) { - SqueezeOptionsBuilder builder_(_fbb); - builder_.add_squeeze_dims(squeeze_dims); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateSqueezeOptionsDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *squeeze_dims = nullptr) { - auto squeeze_dims__ = squeeze_dims ? _fbb.CreateVector(*squeeze_dims) : 0; - return tflite::CreateSqueezeOptions( - _fbb, - squeeze_dims__); -} - -flatbuffers::Offset CreateSqueezeOptions(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SplitOptionsT : public flatbuffers::NativeTable { - typedef SplitOptions TableType; - int32_t num_splits; - SplitOptionsT() - : num_splits(0) { - } -}; - -struct SplitOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SplitOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NUM_SPLITS = 4 - }; - int32_t num_splits() const { - return GetField(VT_NUM_SPLITS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_NUM_SPLITS) && - verifier.EndTable(); - } - SplitOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SplitOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SplitOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_num_splits(int32_t num_splits) { - fbb_.AddElement(SplitOptions::VT_NUM_SPLITS, num_splits, 0); - } - explicit SplitOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SplitOptionsBuilder &operator=(const SplitOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSplitOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t num_splits = 0) { - SplitOptionsBuilder builder_(_fbb); - builder_.add_num_splits(num_splits); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSplitOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SplitVOptionsT : public flatbuffers::NativeTable { - typedef SplitVOptions TableType; - int32_t num_splits; - SplitVOptionsT() - : num_splits(0) { - } -}; - -struct SplitVOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SplitVOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NUM_SPLITS = 4 - }; - int32_t num_splits() const { - return GetField(VT_NUM_SPLITS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_NUM_SPLITS) && - verifier.EndTable(); - } - SplitVOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SplitVOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SplitVOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_num_splits(int32_t num_splits) { - fbb_.AddElement(SplitVOptions::VT_NUM_SPLITS, num_splits, 0); - } - explicit SplitVOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SplitVOptionsBuilder &operator=(const SplitVOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSplitVOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t num_splits = 0) { - SplitVOptionsBuilder builder_(_fbb); - builder_.add_num_splits(num_splits); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSplitVOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct StridedSliceOptionsT : public flatbuffers::NativeTable { - typedef StridedSliceOptions TableType; - int32_t begin_mask; - int32_t end_mask; - int32_t ellipsis_mask; - int32_t new_axis_mask; - int32_t shrink_axis_mask; - StridedSliceOptionsT() - : begin_mask(0), - end_mask(0), - ellipsis_mask(0), - new_axis_mask(0), - shrink_axis_mask(0) { - } -}; - -struct StridedSliceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef StridedSliceOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BEGIN_MASK = 4, - VT_END_MASK = 6, - VT_ELLIPSIS_MASK = 8, - VT_NEW_AXIS_MASK = 10, - VT_SHRINK_AXIS_MASK = 12 - }; - int32_t begin_mask() const { - return GetField(VT_BEGIN_MASK, 0); - } - int32_t end_mask() const { - return GetField(VT_END_MASK, 0); - } - int32_t ellipsis_mask() const { - return GetField(VT_ELLIPSIS_MASK, 0); - } - int32_t new_axis_mask() const { - return GetField(VT_NEW_AXIS_MASK, 0); - } - int32_t shrink_axis_mask() const { - return GetField(VT_SHRINK_AXIS_MASK, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BEGIN_MASK) && - VerifyField(verifier, VT_END_MASK) && - VerifyField(verifier, VT_ELLIPSIS_MASK) && - VerifyField(verifier, VT_NEW_AXIS_MASK) && - VerifyField(verifier, VT_SHRINK_AXIS_MASK) && - verifier.EndTable(); - } - StridedSliceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(StridedSliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct StridedSliceOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_begin_mask(int32_t begin_mask) { - fbb_.AddElement(StridedSliceOptions::VT_BEGIN_MASK, begin_mask, 0); - } - void add_end_mask(int32_t end_mask) { - fbb_.AddElement(StridedSliceOptions::VT_END_MASK, end_mask, 0); - } - void add_ellipsis_mask(int32_t ellipsis_mask) { - fbb_.AddElement(StridedSliceOptions::VT_ELLIPSIS_MASK, ellipsis_mask, 0); - } - void add_new_axis_mask(int32_t new_axis_mask) { - fbb_.AddElement(StridedSliceOptions::VT_NEW_AXIS_MASK, new_axis_mask, 0); - } - void add_shrink_axis_mask(int32_t shrink_axis_mask) { - fbb_.AddElement(StridedSliceOptions::VT_SHRINK_AXIS_MASK, shrink_axis_mask, 0); - } - explicit StridedSliceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - StridedSliceOptionsBuilder &operator=(const StridedSliceOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateStridedSliceOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t begin_mask = 0, - int32_t end_mask = 0, - int32_t ellipsis_mask = 0, - int32_t new_axis_mask = 0, - int32_t shrink_axis_mask = 0) { - StridedSliceOptionsBuilder builder_(_fbb); - builder_.add_shrink_axis_mask(shrink_axis_mask); - builder_.add_new_axis_mask(new_axis_mask); - builder_.add_ellipsis_mask(ellipsis_mask); - builder_.add_end_mask(end_mask); - builder_.add_begin_mask(begin_mask); - return builder_.Finish(); -} - -flatbuffers::Offset CreateStridedSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LogSoftmaxOptionsT : public flatbuffers::NativeTable { - typedef LogSoftmaxOptions TableType; - LogSoftmaxOptionsT() { - } -}; - -struct LogSoftmaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LogSoftmaxOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LogSoftmaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LogSoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LogSoftmaxOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LogSoftmaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LogSoftmaxOptionsBuilder &operator=(const LogSoftmaxOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLogSoftmaxOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LogSoftmaxOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLogSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct CastOptionsT : public flatbuffers::NativeTable { - typedef CastOptions TableType; - tflite::TensorType in_data_type; - tflite::TensorType out_data_type; - CastOptionsT() - : in_data_type(tflite::TensorType_FLOAT32), - out_data_type(tflite::TensorType_FLOAT32) { - } -}; - -struct CastOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef CastOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_IN_DATA_TYPE = 4, - VT_OUT_DATA_TYPE = 6 - }; - tflite::TensorType in_data_type() const { - return static_cast(GetField(VT_IN_DATA_TYPE, 0)); - } - tflite::TensorType out_data_type() const { - return static_cast(GetField(VT_OUT_DATA_TYPE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_IN_DATA_TYPE) && - VerifyField(verifier, VT_OUT_DATA_TYPE) && - verifier.EndTable(); - } - CastOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(CastOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct CastOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_in_data_type(tflite::TensorType in_data_type) { - fbb_.AddElement(CastOptions::VT_IN_DATA_TYPE, static_cast(in_data_type), 0); - } - void add_out_data_type(tflite::TensorType out_data_type) { - fbb_.AddElement(CastOptions::VT_OUT_DATA_TYPE, static_cast(out_data_type), 0); - } - explicit CastOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - CastOptionsBuilder &operator=(const CastOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateCastOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::TensorType in_data_type = tflite::TensorType_FLOAT32, - tflite::TensorType out_data_type = tflite::TensorType_FLOAT32) { - CastOptionsBuilder builder_(_fbb); - builder_.add_out_data_type(out_data_type); - builder_.add_in_data_type(in_data_type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateCastOptions(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DequantizeOptionsT : public flatbuffers::NativeTable { - typedef DequantizeOptions TableType; - DequantizeOptionsT() { - } -}; - -struct DequantizeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DequantizeOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - DequantizeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DequantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DequantizeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit DequantizeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DequantizeOptionsBuilder &operator=(const DequantizeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDequantizeOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - DequantizeOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDequantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MaximumMinimumOptionsT : public flatbuffers::NativeTable { - typedef MaximumMinimumOptions TableType; - MaximumMinimumOptionsT() { - } -}; - -struct MaximumMinimumOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MaximumMinimumOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - MaximumMinimumOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MaximumMinimumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MaximumMinimumOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit MaximumMinimumOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MaximumMinimumOptionsBuilder &operator=(const MaximumMinimumOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMaximumMinimumOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - MaximumMinimumOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateMaximumMinimumOptions(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct TileOptionsT : public flatbuffers::NativeTable { - typedef TileOptions TableType; - TileOptionsT() { - } -}; - -struct TileOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef TileOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - TileOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(TileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct TileOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit TileOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - TileOptionsBuilder &operator=(const TileOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateTileOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - TileOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateTileOptions(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ArgMaxOptionsT : public flatbuffers::NativeTable { - typedef ArgMaxOptions TableType; - tflite::TensorType output_type; - ArgMaxOptionsT() - : output_type(tflite::TensorType_FLOAT32) { - } -}; - -struct ArgMaxOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ArgMaxOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OUTPUT_TYPE = 4 - }; - tflite::TensorType output_type() const { - return static_cast(GetField(VT_OUTPUT_TYPE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_OUTPUT_TYPE) && - verifier.EndTable(); - } - ArgMaxOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ArgMaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ArgMaxOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_output_type(tflite::TensorType output_type) { - fbb_.AddElement(ArgMaxOptions::VT_OUTPUT_TYPE, static_cast(output_type), 0); - } - explicit ArgMaxOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ArgMaxOptionsBuilder &operator=(const ArgMaxOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateArgMaxOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::TensorType output_type = tflite::TensorType_FLOAT32) { - ArgMaxOptionsBuilder builder_(_fbb); - builder_.add_output_type(output_type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateArgMaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ArgMinOptionsT : public flatbuffers::NativeTable { - typedef ArgMinOptions TableType; - tflite::TensorType output_type; - ArgMinOptionsT() - : output_type(tflite::TensorType_FLOAT32) { - } -}; - -struct ArgMinOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ArgMinOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OUTPUT_TYPE = 4 - }; - tflite::TensorType output_type() const { - return static_cast(GetField(VT_OUTPUT_TYPE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_OUTPUT_TYPE) && - verifier.EndTable(); - } - ArgMinOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ArgMinOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ArgMinOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_output_type(tflite::TensorType output_type) { - fbb_.AddElement(ArgMinOptions::VT_OUTPUT_TYPE, static_cast(output_type), 0); - } - explicit ArgMinOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ArgMinOptionsBuilder &operator=(const ArgMinOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateArgMinOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::TensorType output_type = tflite::TensorType_FLOAT32) { - ArgMinOptionsBuilder builder_(_fbb); - builder_.add_output_type(output_type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateArgMinOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct GreaterOptionsT : public flatbuffers::NativeTable { - typedef GreaterOptions TableType; - GreaterOptionsT() { - } -}; - -struct GreaterOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef GreaterOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - GreaterOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(GreaterOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct GreaterOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit GreaterOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - GreaterOptionsBuilder &operator=(const GreaterOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateGreaterOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - GreaterOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateGreaterOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct GreaterEqualOptionsT : public flatbuffers::NativeTable { - typedef GreaterEqualOptions TableType; - GreaterEqualOptionsT() { - } -}; - -struct GreaterEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef GreaterEqualOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - GreaterEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(GreaterEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct GreaterEqualOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit GreaterEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - GreaterEqualOptionsBuilder &operator=(const GreaterEqualOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateGreaterEqualOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - GreaterEqualOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateGreaterEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LessOptionsT : public flatbuffers::NativeTable { - typedef LessOptions TableType; - LessOptionsT() { - } -}; - -struct LessOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LessOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LessOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LessOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LessOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LessOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LessOptionsBuilder &operator=(const LessOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLessOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LessOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLessOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LessEqualOptionsT : public flatbuffers::NativeTable { - typedef LessEqualOptions TableType; - LessEqualOptionsT() { - } -}; - -struct LessEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LessEqualOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LessEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LessEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LessEqualOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LessEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LessEqualOptionsBuilder &operator=(const LessEqualOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLessEqualOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LessEqualOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLessEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct NegOptionsT : public flatbuffers::NativeTable { - typedef NegOptions TableType; - NegOptionsT() { - } -}; - -struct NegOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef NegOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - NegOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(NegOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct NegOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit NegOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - NegOptionsBuilder &operator=(const NegOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateNegOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - NegOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateNegOptions(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SelectOptionsT : public flatbuffers::NativeTable { - typedef SelectOptions TableType; - SelectOptionsT() { - } -}; - -struct SelectOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SelectOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SelectOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SelectOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SelectOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SelectOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SelectOptionsBuilder &operator=(const SelectOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSelectOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SelectOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSelectOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SliceOptionsT : public flatbuffers::NativeTable { - typedef SliceOptions TableType; - SliceOptionsT() { - } -}; - -struct SliceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SliceOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SliceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SliceOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SliceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SliceOptionsBuilder &operator=(const SliceOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSliceOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SliceOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct TransposeConvOptionsT : public flatbuffers::NativeTable { - typedef TransposeConvOptions TableType; - tflite::Padding padding; - int32_t stride_w; - int32_t stride_h; - TransposeConvOptionsT() - : padding(tflite::Padding_SAME), - stride_w(0), - stride_h(0) { - } -}; - -struct TransposeConvOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef TransposeConvOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_PADDING = 4, - VT_STRIDE_W = 6, - VT_STRIDE_H = 8 - }; - tflite::Padding padding() const { - return static_cast(GetField(VT_PADDING, 0)); - } - int32_t stride_w() const { - return GetField(VT_STRIDE_W, 0); - } - int32_t stride_h() const { - return GetField(VT_STRIDE_H, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_PADDING) && - VerifyField(verifier, VT_STRIDE_W) && - VerifyField(verifier, VT_STRIDE_H) && - verifier.EndTable(); - } - TransposeConvOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(TransposeConvOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct TransposeConvOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_padding(tflite::Padding padding) { - fbb_.AddElement(TransposeConvOptions::VT_PADDING, static_cast(padding), 0); - } - void add_stride_w(int32_t stride_w) { - fbb_.AddElement(TransposeConvOptions::VT_STRIDE_W, stride_w, 0); - } - void add_stride_h(int32_t stride_h) { - fbb_.AddElement(TransposeConvOptions::VT_STRIDE_H, stride_h, 0); - } - explicit TransposeConvOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - TransposeConvOptionsBuilder &operator=(const TransposeConvOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateTransposeConvOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::Padding padding = tflite::Padding_SAME, - int32_t stride_w = 0, - int32_t stride_h = 0) { - TransposeConvOptionsBuilder builder_(_fbb); - builder_.add_stride_h(stride_h); - builder_.add_stride_w(stride_w); - builder_.add_padding(padding); - return builder_.Finish(); -} - -flatbuffers::Offset CreateTransposeConvOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ExpandDimsOptionsT : public flatbuffers::NativeTable { - typedef ExpandDimsOptions TableType; - ExpandDimsOptionsT() { - } -}; - -struct ExpandDimsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ExpandDimsOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - ExpandDimsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ExpandDimsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ExpandDimsOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit ExpandDimsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ExpandDimsOptionsBuilder &operator=(const ExpandDimsOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateExpandDimsOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - ExpandDimsOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateExpandDimsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SparseToDenseOptionsT : public flatbuffers::NativeTable { - typedef SparseToDenseOptions TableType; - bool validate_indices; - SparseToDenseOptionsT() - : validate_indices(false) { - } -}; - -struct SparseToDenseOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SparseToDenseOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VALIDATE_INDICES = 4 - }; - bool validate_indices() const { - return GetField(VT_VALIDATE_INDICES, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_VALIDATE_INDICES) && - verifier.EndTable(); - } - SparseToDenseOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SparseToDenseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SparseToDenseOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_validate_indices(bool validate_indices) { - fbb_.AddElement(SparseToDenseOptions::VT_VALIDATE_INDICES, static_cast(validate_indices), 0); - } - explicit SparseToDenseOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SparseToDenseOptionsBuilder &operator=(const SparseToDenseOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSparseToDenseOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool validate_indices = false) { - SparseToDenseOptionsBuilder builder_(_fbb); - builder_.add_validate_indices(validate_indices); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSparseToDenseOptions(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct EqualOptionsT : public flatbuffers::NativeTable { - typedef EqualOptions TableType; - EqualOptionsT() { - } -}; - -struct EqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef EqualOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - EqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(EqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct EqualOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit EqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - EqualOptionsBuilder &operator=(const EqualOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateEqualOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - EqualOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct NotEqualOptionsT : public flatbuffers::NativeTable { - typedef NotEqualOptions TableType; - NotEqualOptionsT() { - } -}; - -struct NotEqualOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef NotEqualOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - NotEqualOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(NotEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct NotEqualOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit NotEqualOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - NotEqualOptionsBuilder &operator=(const NotEqualOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateNotEqualOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - NotEqualOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateNotEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ShapeOptionsT : public flatbuffers::NativeTable { - typedef ShapeOptions TableType; - tflite::TensorType out_type; - ShapeOptionsT() - : out_type(tflite::TensorType_FLOAT32) { - } -}; - -struct ShapeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ShapeOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OUT_TYPE = 4 - }; - tflite::TensorType out_type() const { - return static_cast(GetField(VT_OUT_TYPE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_OUT_TYPE) && - verifier.EndTable(); - } - ShapeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ShapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ShapeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_out_type(tflite::TensorType out_type) { - fbb_.AddElement(ShapeOptions::VT_OUT_TYPE, static_cast(out_type), 0); - } - explicit ShapeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ShapeOptionsBuilder &operator=(const ShapeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateShapeOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::TensorType out_type = tflite::TensorType_FLOAT32) { - ShapeOptionsBuilder builder_(_fbb); - builder_.add_out_type(out_type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateShapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct RankOptionsT : public flatbuffers::NativeTable { - typedef RankOptions TableType; - RankOptionsT() { - } -}; - -struct RankOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef RankOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - RankOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(RankOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct RankOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit RankOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - RankOptionsBuilder &operator=(const RankOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateRankOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - RankOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateRankOptions(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct PowOptionsT : public flatbuffers::NativeTable { - typedef PowOptions TableType; - PowOptionsT() { - } -}; - -struct PowOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef PowOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - PowOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(PowOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct PowOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit PowOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - PowOptionsBuilder &operator=(const PowOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreatePowOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - PowOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePowOptions(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct FakeQuantOptionsT : public flatbuffers::NativeTable { - typedef FakeQuantOptions TableType; - float min; - float max; - int32_t num_bits; - bool narrow_range; - FakeQuantOptionsT() - : min(0.0f), - max(0.0f), - num_bits(0), - narrow_range(false) { - } -}; - -struct FakeQuantOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef FakeQuantOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_MIN = 4, - VT_MAX = 6, - VT_NUM_BITS = 8, - VT_NARROW_RANGE = 10 - }; - float min() const { - return GetField(VT_MIN, 0.0f); - } - float max() const { - return GetField(VT_MAX, 0.0f); - } - int32_t num_bits() const { - return GetField(VT_NUM_BITS, 0); - } - bool narrow_range() const { - return GetField(VT_NARROW_RANGE, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_MIN) && - VerifyField(verifier, VT_MAX) && - VerifyField(verifier, VT_NUM_BITS) && - VerifyField(verifier, VT_NARROW_RANGE) && - verifier.EndTable(); - } - FakeQuantOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(FakeQuantOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct FakeQuantOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_min(float min) { - fbb_.AddElement(FakeQuantOptions::VT_MIN, min, 0.0f); - } - void add_max(float max) { - fbb_.AddElement(FakeQuantOptions::VT_MAX, max, 0.0f); - } - void add_num_bits(int32_t num_bits) { - fbb_.AddElement(FakeQuantOptions::VT_NUM_BITS, num_bits, 0); - } - void add_narrow_range(bool narrow_range) { - fbb_.AddElement(FakeQuantOptions::VT_NARROW_RANGE, static_cast(narrow_range), 0); - } - explicit FakeQuantOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - FakeQuantOptionsBuilder &operator=(const FakeQuantOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateFakeQuantOptions( - flatbuffers::FlatBufferBuilder &_fbb, - float min = 0.0f, - float max = 0.0f, - int32_t num_bits = 0, - bool narrow_range = false) { - FakeQuantOptionsBuilder builder_(_fbb); - builder_.add_num_bits(num_bits); - builder_.add_max(max); - builder_.add_min(min); - builder_.add_narrow_range(narrow_range); - return builder_.Finish(); -} - -flatbuffers::Offset CreateFakeQuantOptions(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct PackOptionsT : public flatbuffers::NativeTable { - typedef PackOptions TableType; - int32_t values_count; - int32_t axis; - PackOptionsT() - : values_count(0), - axis(0) { - } -}; - -struct PackOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef PackOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VALUES_COUNT = 4, - VT_AXIS = 6 - }; - int32_t values_count() const { - return GetField(VT_VALUES_COUNT, 0); - } - int32_t axis() const { - return GetField(VT_AXIS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_VALUES_COUNT) && - VerifyField(verifier, VT_AXIS) && - verifier.EndTable(); - } - PackOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(PackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct PackOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_values_count(int32_t values_count) { - fbb_.AddElement(PackOptions::VT_VALUES_COUNT, values_count, 0); - } - void add_axis(int32_t axis) { - fbb_.AddElement(PackOptions::VT_AXIS, axis, 0); - } - explicit PackOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - PackOptionsBuilder &operator=(const PackOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreatePackOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t values_count = 0, - int32_t axis = 0) { - PackOptionsBuilder builder_(_fbb); - builder_.add_axis(axis); - builder_.add_values_count(values_count); - return builder_.Finish(); -} - -flatbuffers::Offset CreatePackOptions(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LogicalOrOptionsT : public flatbuffers::NativeTable { - typedef LogicalOrOptions TableType; - LogicalOrOptionsT() { - } -}; - -struct LogicalOrOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LogicalOrOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LogicalOrOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LogicalOrOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LogicalOrOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LogicalOrOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LogicalOrOptionsBuilder &operator=(const LogicalOrOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLogicalOrOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LogicalOrOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLogicalOrOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct OneHotOptionsT : public flatbuffers::NativeTable { - typedef OneHotOptions TableType; - int32_t axis; - OneHotOptionsT() - : axis(0) { - } -}; - -struct OneHotOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef OneHotOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_AXIS = 4 - }; - int32_t axis() const { - return GetField(VT_AXIS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_AXIS) && - verifier.EndTable(); - } - OneHotOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(OneHotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct OneHotOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_axis(int32_t axis) { - fbb_.AddElement(OneHotOptions::VT_AXIS, axis, 0); - } - explicit OneHotOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - OneHotOptionsBuilder &operator=(const OneHotOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateOneHotOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t axis = 0) { - OneHotOptionsBuilder builder_(_fbb); - builder_.add_axis(axis); - return builder_.Finish(); -} - -flatbuffers::Offset CreateOneHotOptions(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct AbsOptionsT : public flatbuffers::NativeTable { - typedef AbsOptions TableType; - AbsOptionsT() { - } -}; - -struct AbsOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef AbsOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - AbsOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(AbsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct AbsOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit AbsOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - AbsOptionsBuilder &operator=(const AbsOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateAbsOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - AbsOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateAbsOptions(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct HardSwishOptionsT : public flatbuffers::NativeTable { - typedef HardSwishOptions TableType; - HardSwishOptionsT() { - } -}; - -struct HardSwishOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef HardSwishOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - HardSwishOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(HardSwishOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct HardSwishOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit HardSwishOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - HardSwishOptionsBuilder &operator=(const HardSwishOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateHardSwishOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - HardSwishOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateHardSwishOptions(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LogicalAndOptionsT : public flatbuffers::NativeTable { - typedef LogicalAndOptions TableType; - LogicalAndOptionsT() { - } -}; - -struct LogicalAndOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LogicalAndOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LogicalAndOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LogicalAndOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LogicalAndOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LogicalAndOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LogicalAndOptionsBuilder &operator=(const LogicalAndOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLogicalAndOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LogicalAndOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLogicalAndOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LogicalNotOptionsT : public flatbuffers::NativeTable { - typedef LogicalNotOptions TableType; - LogicalNotOptionsT() { - } -}; - -struct LogicalNotOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LogicalNotOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - LogicalNotOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LogicalNotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LogicalNotOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit LogicalNotOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LogicalNotOptionsBuilder &operator=(const LogicalNotOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLogicalNotOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - LogicalNotOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLogicalNotOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct UnpackOptionsT : public flatbuffers::NativeTable { - typedef UnpackOptions TableType; - int32_t num; - int32_t axis; - UnpackOptionsT() - : num(0), - axis(0) { - } -}; - -struct UnpackOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef UnpackOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NUM = 4, - VT_AXIS = 6 - }; - int32_t num() const { - return GetField(VT_NUM, 0); - } - int32_t axis() const { - return GetField(VT_AXIS, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_NUM) && - VerifyField(verifier, VT_AXIS) && - verifier.EndTable(); - } - UnpackOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(UnpackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct UnpackOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_num(int32_t num) { - fbb_.AddElement(UnpackOptions::VT_NUM, num, 0); - } - void add_axis(int32_t axis) { - fbb_.AddElement(UnpackOptions::VT_AXIS, axis, 0); - } - explicit UnpackOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - UnpackOptionsBuilder &operator=(const UnpackOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateUnpackOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t num = 0, - int32_t axis = 0) { - UnpackOptionsBuilder builder_(_fbb); - builder_.add_axis(axis); - builder_.add_num(num); - return builder_.Finish(); -} - -flatbuffers::Offset CreateUnpackOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct FloorDivOptionsT : public flatbuffers::NativeTable { - typedef FloorDivOptions TableType; - FloorDivOptionsT() { - } -}; - -struct FloorDivOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef FloorDivOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - FloorDivOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(FloorDivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct FloorDivOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit FloorDivOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - FloorDivOptionsBuilder &operator=(const FloorDivOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateFloorDivOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - FloorDivOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateFloorDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SquareOptionsT : public flatbuffers::NativeTable { - typedef SquareOptions TableType; - SquareOptionsT() { - } -}; - -struct SquareOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SquareOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SquareOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SquareOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SquareOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SquareOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SquareOptionsBuilder &operator=(const SquareOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSquareOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SquareOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSquareOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ZerosLikeOptionsT : public flatbuffers::NativeTable { - typedef ZerosLikeOptions TableType; - ZerosLikeOptionsT() { - } -}; - -struct ZerosLikeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ZerosLikeOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - ZerosLikeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ZerosLikeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ZerosLikeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit ZerosLikeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ZerosLikeOptionsBuilder &operator=(const ZerosLikeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateZerosLikeOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - ZerosLikeOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateZerosLikeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct FillOptionsT : public flatbuffers::NativeTable { - typedef FillOptions TableType; - FillOptionsT() { - } -}; - -struct FillOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef FillOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - FillOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(FillOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct FillOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit FillOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - FillOptionsBuilder &operator=(const FillOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateFillOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - FillOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateFillOptions(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct FloorModOptionsT : public flatbuffers::NativeTable { - typedef FloorModOptions TableType; - FloorModOptionsT() { - } -}; - -struct FloorModOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef FloorModOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - FloorModOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(FloorModOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct FloorModOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit FloorModOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - FloorModOptionsBuilder &operator=(const FloorModOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateFloorModOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - FloorModOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateFloorModOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct RangeOptionsT : public flatbuffers::NativeTable { - typedef RangeOptions TableType; - RangeOptionsT() { - } -}; - -struct RangeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef RangeOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - RangeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(RangeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct RangeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit RangeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - RangeOptionsBuilder &operator=(const RangeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateRangeOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - RangeOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateRangeOptions(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct LeakyReluOptionsT : public flatbuffers::NativeTable { - typedef LeakyReluOptions TableType; - float alpha; - LeakyReluOptionsT() - : alpha(0.0f) { - } -}; - -struct LeakyReluOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef LeakyReluOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ALPHA = 4 - }; - float alpha() const { - return GetField(VT_ALPHA, 0.0f); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ALPHA) && - verifier.EndTable(); - } - LeakyReluOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(LeakyReluOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct LeakyReluOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_alpha(float alpha) { - fbb_.AddElement(LeakyReluOptions::VT_ALPHA, alpha, 0.0f); - } - explicit LeakyReluOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - LeakyReluOptionsBuilder &operator=(const LeakyReluOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateLeakyReluOptions( - flatbuffers::FlatBufferBuilder &_fbb, - float alpha = 0.0f) { - LeakyReluOptionsBuilder builder_(_fbb); - builder_.add_alpha(alpha); - return builder_.Finish(); -} - -flatbuffers::Offset CreateLeakyReluOptions(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SquaredDifferenceOptionsT : public flatbuffers::NativeTable { - typedef SquaredDifferenceOptions TableType; - SquaredDifferenceOptionsT() { - } -}; - -struct SquaredDifferenceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SquaredDifferenceOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SquaredDifferenceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SquaredDifferenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SquaredDifferenceOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SquaredDifferenceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SquaredDifferenceOptionsBuilder &operator=(const SquaredDifferenceOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSquaredDifferenceOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SquaredDifferenceOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MirrorPadOptionsT : public flatbuffers::NativeTable { - typedef MirrorPadOptions TableType; - tflite::MirrorPadMode mode; - MirrorPadOptionsT() - : mode(tflite::MirrorPadMode_REFLECT) { - } -}; - -struct MirrorPadOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MirrorPadOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_MODE = 4 - }; - tflite::MirrorPadMode mode() const { - return static_cast(GetField(VT_MODE, 0)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_MODE) && - verifier.EndTable(); - } - MirrorPadOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MirrorPadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MirrorPadOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_mode(tflite::MirrorPadMode mode) { - fbb_.AddElement(MirrorPadOptions::VT_MODE, static_cast(mode), 0); - } - explicit MirrorPadOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MirrorPadOptionsBuilder &operator=(const MirrorPadOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMirrorPadOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::MirrorPadMode mode = tflite::MirrorPadMode_REFLECT) { - MirrorPadOptionsBuilder builder_(_fbb); - builder_.add_mode(mode); - return builder_.Finish(); -} - -flatbuffers::Offset CreateMirrorPadOptions(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct UniqueOptionsT : public flatbuffers::NativeTable { - typedef UniqueOptions TableType; - tflite::TensorType idx_out_type; - UniqueOptionsT() - : idx_out_type(tflite::TensorType_INT32) { - } -}; - -struct UniqueOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef UniqueOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_IDX_OUT_TYPE = 4 - }; - tflite::TensorType idx_out_type() const { - return static_cast(GetField(VT_IDX_OUT_TYPE, 2)); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_IDX_OUT_TYPE) && - verifier.EndTable(); - } - UniqueOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(UniqueOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct UniqueOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_idx_out_type(tflite::TensorType idx_out_type) { - fbb_.AddElement(UniqueOptions::VT_IDX_OUT_TYPE, static_cast(idx_out_type), 2); - } - explicit UniqueOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - UniqueOptionsBuilder &operator=(const UniqueOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateUniqueOptions( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::TensorType idx_out_type = tflite::TensorType_INT32) { - UniqueOptionsBuilder builder_(_fbb); - builder_.add_idx_out_type(idx_out_type); - return builder_.Finish(); -} - -flatbuffers::Offset CreateUniqueOptions(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ReverseV2OptionsT : public flatbuffers::NativeTable { - typedef ReverseV2Options TableType; - ReverseV2OptionsT() { - } -}; - -struct ReverseV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ReverseV2OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - ReverseV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ReverseV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ReverseV2OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit ReverseV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ReverseV2OptionsBuilder &operator=(const ReverseV2OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateReverseV2Options( - flatbuffers::FlatBufferBuilder &_fbb) { - ReverseV2OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateReverseV2Options(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct AddNOptionsT : public flatbuffers::NativeTable { - typedef AddNOptions TableType; - AddNOptionsT() { - } -}; - -struct AddNOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef AddNOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - AddNOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(AddNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct AddNOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit AddNOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - AddNOptionsBuilder &operator=(const AddNOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateAddNOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - AddNOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateAddNOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct GatherNdOptionsT : public flatbuffers::NativeTable { - typedef GatherNdOptions TableType; - GatherNdOptionsT() { - } -}; - -struct GatherNdOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef GatherNdOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - GatherNdOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(GatherNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct GatherNdOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit GatherNdOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - GatherNdOptionsBuilder &operator=(const GatherNdOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateGatherNdOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - GatherNdOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateGatherNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct WhereOptionsT : public flatbuffers::NativeTable { - typedef WhereOptions TableType; - WhereOptionsT() { - } -}; - -struct WhereOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef WhereOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - WhereOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(WhereOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct WhereOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit WhereOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - WhereOptionsBuilder &operator=(const WhereOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateWhereOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - WhereOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateWhereOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ReverseSequenceOptionsT : public flatbuffers::NativeTable { - typedef ReverseSequenceOptions TableType; - int32_t seq_dim; - int32_t batch_dim; - ReverseSequenceOptionsT() - : seq_dim(0), - batch_dim(0) { - } -}; - -struct ReverseSequenceOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ReverseSequenceOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_SEQ_DIM = 4, - VT_BATCH_DIM = 6 - }; - int32_t seq_dim() const { - return GetField(VT_SEQ_DIM, 0); - } - int32_t batch_dim() const { - return GetField(VT_BATCH_DIM, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_SEQ_DIM) && - VerifyField(verifier, VT_BATCH_DIM) && - verifier.EndTable(); - } - ReverseSequenceOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ReverseSequenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ReverseSequenceOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_seq_dim(int32_t seq_dim) { - fbb_.AddElement(ReverseSequenceOptions::VT_SEQ_DIM, seq_dim, 0); - } - void add_batch_dim(int32_t batch_dim) { - fbb_.AddElement(ReverseSequenceOptions::VT_BATCH_DIM, batch_dim, 0); - } - explicit ReverseSequenceOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ReverseSequenceOptionsBuilder &operator=(const ReverseSequenceOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateReverseSequenceOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t seq_dim = 0, - int32_t batch_dim = 0) { - ReverseSequenceOptionsBuilder builder_(_fbb); - builder_.add_batch_dim(batch_dim); - builder_.add_seq_dim(seq_dim); - return builder_.Finish(); -} - -flatbuffers::Offset CreateReverseSequenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MatrixDiagOptionsT : public flatbuffers::NativeTable { - typedef MatrixDiagOptions TableType; - MatrixDiagOptionsT() { - } -}; - -struct MatrixDiagOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MatrixDiagOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - MatrixDiagOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MatrixDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MatrixDiagOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit MatrixDiagOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MatrixDiagOptionsBuilder &operator=(const MatrixDiagOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMatrixDiagOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - MatrixDiagOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateMatrixDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct QuantizeOptionsT : public flatbuffers::NativeTable { - typedef QuantizeOptions TableType; - QuantizeOptionsT() { - } -}; - -struct QuantizeOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef QuantizeOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - QuantizeOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(QuantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct QuantizeOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit QuantizeOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - QuantizeOptionsBuilder &operator=(const QuantizeOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateQuantizeOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - QuantizeOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateQuantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MatrixSetDiagOptionsT : public flatbuffers::NativeTable { - typedef MatrixSetDiagOptions TableType; - MatrixSetDiagOptionsT() { - } -}; - -struct MatrixSetDiagOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MatrixSetDiagOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - MatrixSetDiagOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MatrixSetDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MatrixSetDiagOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit MatrixSetDiagOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MatrixSetDiagOptionsBuilder &operator=(const MatrixSetDiagOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMatrixSetDiagOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - MatrixSetDiagOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateMatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct IfOptionsT : public flatbuffers::NativeTable { - typedef IfOptions TableType; - int32_t then_subgraph_index; - int32_t else_subgraph_index; - IfOptionsT() - : then_subgraph_index(0), - else_subgraph_index(0) { - } -}; - -struct IfOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef IfOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_THEN_SUBGRAPH_INDEX = 4, - VT_ELSE_SUBGRAPH_INDEX = 6 - }; - int32_t then_subgraph_index() const { - return GetField(VT_THEN_SUBGRAPH_INDEX, 0); - } - int32_t else_subgraph_index() const { - return GetField(VT_ELSE_SUBGRAPH_INDEX, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_THEN_SUBGRAPH_INDEX) && - VerifyField(verifier, VT_ELSE_SUBGRAPH_INDEX) && - verifier.EndTable(); - } - IfOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(IfOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct IfOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_then_subgraph_index(int32_t then_subgraph_index) { - fbb_.AddElement(IfOptions::VT_THEN_SUBGRAPH_INDEX, then_subgraph_index, 0); - } - void add_else_subgraph_index(int32_t else_subgraph_index) { - fbb_.AddElement(IfOptions::VT_ELSE_SUBGRAPH_INDEX, else_subgraph_index, 0); - } - explicit IfOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - IfOptionsBuilder &operator=(const IfOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateIfOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t then_subgraph_index = 0, - int32_t else_subgraph_index = 0) { - IfOptionsBuilder builder_(_fbb); - builder_.add_else_subgraph_index(else_subgraph_index); - builder_.add_then_subgraph_index(then_subgraph_index); - return builder_.Finish(); -} - -flatbuffers::Offset CreateIfOptions(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct WhileOptionsT : public flatbuffers::NativeTable { - typedef WhileOptions TableType; - int32_t cond_subgraph_index; - int32_t body_subgraph_index; - WhileOptionsT() - : cond_subgraph_index(0), - body_subgraph_index(0) { - } -}; - -struct WhileOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef WhileOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_COND_SUBGRAPH_INDEX = 4, - VT_BODY_SUBGRAPH_INDEX = 6 - }; - int32_t cond_subgraph_index() const { - return GetField(VT_COND_SUBGRAPH_INDEX, 0); - } - int32_t body_subgraph_index() const { - return GetField(VT_BODY_SUBGRAPH_INDEX, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_COND_SUBGRAPH_INDEX) && - VerifyField(verifier, VT_BODY_SUBGRAPH_INDEX) && - verifier.EndTable(); - } - WhileOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(WhileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct WhileOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_cond_subgraph_index(int32_t cond_subgraph_index) { - fbb_.AddElement(WhileOptions::VT_COND_SUBGRAPH_INDEX, cond_subgraph_index, 0); - } - void add_body_subgraph_index(int32_t body_subgraph_index) { - fbb_.AddElement(WhileOptions::VT_BODY_SUBGRAPH_INDEX, body_subgraph_index, 0); - } - explicit WhileOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - WhileOptionsBuilder &operator=(const WhileOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateWhileOptions( - flatbuffers::FlatBufferBuilder &_fbb, - int32_t cond_subgraph_index = 0, - int32_t body_subgraph_index = 0) { - WhileOptionsBuilder builder_(_fbb); - builder_.add_body_subgraph_index(body_subgraph_index); - builder_.add_cond_subgraph_index(cond_subgraph_index); - return builder_.Finish(); -} - -flatbuffers::Offset CreateWhileOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct NonMaxSuppressionV4OptionsT : public flatbuffers::NativeTable { - typedef NonMaxSuppressionV4Options TableType; - NonMaxSuppressionV4OptionsT() { - } -}; - -struct NonMaxSuppressionV4Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef NonMaxSuppressionV4OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - NonMaxSuppressionV4OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(NonMaxSuppressionV4OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct NonMaxSuppressionV4OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit NonMaxSuppressionV4OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - NonMaxSuppressionV4OptionsBuilder &operator=(const NonMaxSuppressionV4OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateNonMaxSuppressionV4Options( - flatbuffers::FlatBufferBuilder &_fbb) { - NonMaxSuppressionV4OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateNonMaxSuppressionV4Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct NonMaxSuppressionV5OptionsT : public flatbuffers::NativeTable { - typedef NonMaxSuppressionV5Options TableType; - NonMaxSuppressionV5OptionsT() { - } -}; - -struct NonMaxSuppressionV5Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef NonMaxSuppressionV5OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - NonMaxSuppressionV5OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(NonMaxSuppressionV5OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct NonMaxSuppressionV5OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit NonMaxSuppressionV5OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - NonMaxSuppressionV5OptionsBuilder &operator=(const NonMaxSuppressionV5OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateNonMaxSuppressionV5Options( - flatbuffers::FlatBufferBuilder &_fbb) { - NonMaxSuppressionV5OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateNonMaxSuppressionV5Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ScatterNdOptionsT : public flatbuffers::NativeTable { - typedef ScatterNdOptions TableType; - ScatterNdOptionsT() { - } -}; - -struct ScatterNdOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ScatterNdOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - ScatterNdOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ScatterNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ScatterNdOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit ScatterNdOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ScatterNdOptionsBuilder &operator=(const ScatterNdOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateScatterNdOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - ScatterNdOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateScatterNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SelectV2OptionsT : public flatbuffers::NativeTable { - typedef SelectV2Options TableType; - SelectV2OptionsT() { - } -}; - -struct SelectV2Options FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SelectV2OptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SelectV2OptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SelectV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SelectV2OptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SelectV2OptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SelectV2OptionsBuilder &operator=(const SelectV2OptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSelectV2Options( - flatbuffers::FlatBufferBuilder &_fbb) { - SelectV2OptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSelectV2Options(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct DensifyOptionsT : public flatbuffers::NativeTable { - typedef DensifyOptions TableType; - DensifyOptionsT() { - } -}; - -struct DensifyOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef DensifyOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - DensifyOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(DensifyOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct DensifyOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit DensifyOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - DensifyOptionsBuilder &operator=(const DensifyOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateDensifyOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - DensifyOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateDensifyOptions(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SegmentSumOptionsT : public flatbuffers::NativeTable { - typedef SegmentSumOptions TableType; - SegmentSumOptionsT() { - } -}; - -struct SegmentSumOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SegmentSumOptionsT NativeTableType; - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - verifier.EndTable(); - } - SegmentSumOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SegmentSumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SegmentSumOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - explicit SegmentSumOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SegmentSumOptionsBuilder &operator=(const SegmentSumOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSegmentSumOptions( - flatbuffers::FlatBufferBuilder &_fbb) { - SegmentSumOptionsBuilder builder_(_fbb); - return builder_.Finish(); -} - -flatbuffers::Offset CreateSegmentSumOptions(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct BatchMatMulOptionsT : public flatbuffers::NativeTable { - typedef BatchMatMulOptions TableType; - bool adj_x; - bool adj_y; - BatchMatMulOptionsT() - : adj_x(false), - adj_y(false) { - } -}; - -struct BatchMatMulOptions FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef BatchMatMulOptionsT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_ADJ_X = 4, - VT_ADJ_Y = 6 - }; - bool adj_x() const { - return GetField(VT_ADJ_X, 0) != 0; - } - bool adj_y() const { - return GetField(VT_ADJ_Y, 0) != 0; - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_ADJ_X) && - VerifyField(verifier, VT_ADJ_Y) && - verifier.EndTable(); - } - BatchMatMulOptionsT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(BatchMatMulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct BatchMatMulOptionsBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_adj_x(bool adj_x) { - fbb_.AddElement(BatchMatMulOptions::VT_ADJ_X, static_cast(adj_x), 0); - } - void add_adj_y(bool adj_y) { - fbb_.AddElement(BatchMatMulOptions::VT_ADJ_Y, static_cast(adj_y), 0); - } - explicit BatchMatMulOptionsBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - BatchMatMulOptionsBuilder &operator=(const BatchMatMulOptionsBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateBatchMatMulOptions( - flatbuffers::FlatBufferBuilder &_fbb, - bool adj_x = false, - bool adj_y = false) { - BatchMatMulOptionsBuilder builder_(_fbb); - builder_.add_adj_y(adj_y); - builder_.add_adj_x(adj_x); - return builder_.Finish(); -} - -flatbuffers::Offset CreateBatchMatMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct OperatorCodeT : public flatbuffers::NativeTable { - typedef OperatorCode TableType; - tflite::BuiltinOperator builtin_code; - std::string custom_code; - int32_t version; - OperatorCodeT() - : builtin_code(tflite::BuiltinOperator_ADD), - version(1) { - } -}; - -struct OperatorCode FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef OperatorCodeT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_BUILTIN_CODE = 4, - VT_CUSTOM_CODE = 6, - VT_VERSION = 8 - }; - tflite::BuiltinOperator builtin_code() const { - return static_cast(GetField(VT_BUILTIN_CODE, 0)); - } - const flatbuffers::String *custom_code() const { - return GetPointer(VT_CUSTOM_CODE); - } - int32_t version() const { - return GetField(VT_VERSION, 1); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_BUILTIN_CODE) && - VerifyOffset(verifier, VT_CUSTOM_CODE) && - verifier.VerifyString(custom_code()) && - VerifyField(verifier, VT_VERSION) && - verifier.EndTable(); - } - OperatorCodeT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(OperatorCodeT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct OperatorCodeBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_builtin_code(tflite::BuiltinOperator builtin_code) { - fbb_.AddElement(OperatorCode::VT_BUILTIN_CODE, static_cast(builtin_code), 0); - } - void add_custom_code(flatbuffers::Offset custom_code) { - fbb_.AddOffset(OperatorCode::VT_CUSTOM_CODE, custom_code); - } - void add_version(int32_t version) { - fbb_.AddElement(OperatorCode::VT_VERSION, version, 1); - } - explicit OperatorCodeBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - OperatorCodeBuilder &operator=(const OperatorCodeBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateOperatorCode( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD, - flatbuffers::Offset custom_code = 0, - int32_t version = 1) { - OperatorCodeBuilder builder_(_fbb); - builder_.add_version(version); - builder_.add_custom_code(custom_code); - builder_.add_builtin_code(builtin_code); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateOperatorCodeDirect( - flatbuffers::FlatBufferBuilder &_fbb, - tflite::BuiltinOperator builtin_code = tflite::BuiltinOperator_ADD, - const char *custom_code = nullptr, - int32_t version = 1) { - auto custom_code__ = custom_code ? _fbb.CreateString(custom_code) : 0; - return tflite::CreateOperatorCode( - _fbb, - builtin_code, - custom_code__, - version); -} - -flatbuffers::Offset CreateOperatorCode(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct OperatorT : public flatbuffers::NativeTable { - typedef Operator TableType; - uint32_t opcode_index; - std::vector inputs; - std::vector outputs; - tflite::BuiltinOptionsUnion builtin_options; - std::vector custom_options; - tflite::CustomOptionsFormat custom_options_format; - std::vector mutating_variable_inputs; - std::vector intermediates; - OperatorT() - : opcode_index(0), - custom_options_format(tflite::CustomOptionsFormat_FLEXBUFFERS) { - } -}; - -struct Operator FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef OperatorT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_OPCODE_INDEX = 4, - VT_INPUTS = 6, - VT_OUTPUTS = 8, - VT_BUILTIN_OPTIONS_TYPE = 10, - VT_BUILTIN_OPTIONS = 12, - VT_CUSTOM_OPTIONS = 14, - VT_CUSTOM_OPTIONS_FORMAT = 16, - VT_MUTATING_VARIABLE_INPUTS = 18, - VT_INTERMEDIATES = 20 - }; - uint32_t opcode_index() const { - return GetField(VT_OPCODE_INDEX, 0); - } - const flatbuffers::Vector *inputs() const { - return GetPointer *>(VT_INPUTS); - } - const flatbuffers::Vector *outputs() const { - return GetPointer *>(VT_OUTPUTS); - } - tflite::BuiltinOptions builtin_options_type() const { - return static_cast(GetField(VT_BUILTIN_OPTIONS_TYPE, 0)); - } - const void *builtin_options() const { - return GetPointer(VT_BUILTIN_OPTIONS); - } - template const T *builtin_options_as() const; - const tflite::Conv2DOptions *builtin_options_as_Conv2DOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_Conv2DOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::DepthwiseConv2DOptions *builtin_options_as_DepthwiseConv2DOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_DepthwiseConv2DOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ConcatEmbeddingsOptions *builtin_options_as_ConcatEmbeddingsOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ConcatEmbeddingsOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LSHProjectionOptions *builtin_options_as_LSHProjectionOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LSHProjectionOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::Pool2DOptions *builtin_options_as_Pool2DOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_Pool2DOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SVDFOptions *builtin_options_as_SVDFOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SVDFOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::RNNOptions *builtin_options_as_RNNOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_RNNOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::FullyConnectedOptions *builtin_options_as_FullyConnectedOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_FullyConnectedOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SoftmaxOptions *builtin_options_as_SoftmaxOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SoftmaxOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ConcatenationOptions *builtin_options_as_ConcatenationOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ConcatenationOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::AddOptions *builtin_options_as_AddOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_AddOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::L2NormOptions *builtin_options_as_L2NormOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_L2NormOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LocalResponseNormalizationOptions *builtin_options_as_LocalResponseNormalizationOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LocalResponseNormalizationOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LSTMOptions *builtin_options_as_LSTMOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LSTMOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ResizeBilinearOptions *builtin_options_as_ResizeBilinearOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ResizeBilinearOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::CallOptions *builtin_options_as_CallOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_CallOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ReshapeOptions *builtin_options_as_ReshapeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ReshapeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SkipGramOptions *builtin_options_as_SkipGramOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SkipGramOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SpaceToDepthOptions *builtin_options_as_SpaceToDepthOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SpaceToDepthOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::EmbeddingLookupSparseOptions *builtin_options_as_EmbeddingLookupSparseOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_EmbeddingLookupSparseOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::MulOptions *builtin_options_as_MulOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_MulOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::PadOptions *builtin_options_as_PadOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_PadOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::GatherOptions *builtin_options_as_GatherOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_GatherOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::BatchToSpaceNDOptions *builtin_options_as_BatchToSpaceNDOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_BatchToSpaceNDOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SpaceToBatchNDOptions *builtin_options_as_SpaceToBatchNDOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SpaceToBatchNDOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::TransposeOptions *builtin_options_as_TransposeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_TransposeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ReducerOptions *builtin_options_as_ReducerOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ReducerOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SubOptions *builtin_options_as_SubOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SubOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::DivOptions *builtin_options_as_DivOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_DivOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SqueezeOptions *builtin_options_as_SqueezeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SqueezeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SequenceRNNOptions *builtin_options_as_SequenceRNNOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SequenceRNNOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::StridedSliceOptions *builtin_options_as_StridedSliceOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_StridedSliceOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ExpOptions *builtin_options_as_ExpOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ExpOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::TopKV2Options *builtin_options_as_TopKV2Options() const { - return builtin_options_type() == tflite::BuiltinOptions_TopKV2Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::SplitOptions *builtin_options_as_SplitOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SplitOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LogSoftmaxOptions *builtin_options_as_LogSoftmaxOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LogSoftmaxOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::CastOptions *builtin_options_as_CastOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_CastOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::DequantizeOptions *builtin_options_as_DequantizeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_DequantizeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::MaximumMinimumOptions *builtin_options_as_MaximumMinimumOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_MaximumMinimumOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ArgMaxOptions *builtin_options_as_ArgMaxOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ArgMaxOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LessOptions *builtin_options_as_LessOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LessOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::NegOptions *builtin_options_as_NegOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_NegOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::PadV2Options *builtin_options_as_PadV2Options() const { - return builtin_options_type() == tflite::BuiltinOptions_PadV2Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::GreaterOptions *builtin_options_as_GreaterOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_GreaterOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::GreaterEqualOptions *builtin_options_as_GreaterEqualOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_GreaterEqualOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LessEqualOptions *builtin_options_as_LessEqualOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LessEqualOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SelectOptions *builtin_options_as_SelectOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SelectOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SliceOptions *builtin_options_as_SliceOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SliceOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::TransposeConvOptions *builtin_options_as_TransposeConvOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_TransposeConvOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SparseToDenseOptions *builtin_options_as_SparseToDenseOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SparseToDenseOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::TileOptions *builtin_options_as_TileOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_TileOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ExpandDimsOptions *builtin_options_as_ExpandDimsOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ExpandDimsOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::EqualOptions *builtin_options_as_EqualOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_EqualOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::NotEqualOptions *builtin_options_as_NotEqualOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_NotEqualOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ShapeOptions *builtin_options_as_ShapeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ShapeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::PowOptions *builtin_options_as_PowOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_PowOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ArgMinOptions *builtin_options_as_ArgMinOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ArgMinOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::FakeQuantOptions *builtin_options_as_FakeQuantOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_FakeQuantOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::PackOptions *builtin_options_as_PackOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_PackOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LogicalOrOptions *builtin_options_as_LogicalOrOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LogicalOrOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::OneHotOptions *builtin_options_as_OneHotOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_OneHotOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LogicalAndOptions *builtin_options_as_LogicalAndOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LogicalAndOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LogicalNotOptions *builtin_options_as_LogicalNotOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LogicalNotOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::UnpackOptions *builtin_options_as_UnpackOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_UnpackOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::FloorDivOptions *builtin_options_as_FloorDivOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_FloorDivOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SquareOptions *builtin_options_as_SquareOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SquareOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ZerosLikeOptions *builtin_options_as_ZerosLikeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ZerosLikeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::FillOptions *builtin_options_as_FillOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_FillOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::BidirectionalSequenceLSTMOptions *builtin_options_as_BidirectionalSequenceLSTMOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_BidirectionalSequenceLSTMOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::BidirectionalSequenceRNNOptions *builtin_options_as_BidirectionalSequenceRNNOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_BidirectionalSequenceRNNOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::UnidirectionalSequenceLSTMOptions *builtin_options_as_UnidirectionalSequenceLSTMOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_UnidirectionalSequenceLSTMOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::FloorModOptions *builtin_options_as_FloorModOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_FloorModOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::RangeOptions *builtin_options_as_RangeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_RangeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ResizeNearestNeighborOptions *builtin_options_as_ResizeNearestNeighborOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ResizeNearestNeighborOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::LeakyReluOptions *builtin_options_as_LeakyReluOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_LeakyReluOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SquaredDifferenceOptions *builtin_options_as_SquaredDifferenceOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SquaredDifferenceOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::MirrorPadOptions *builtin_options_as_MirrorPadOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_MirrorPadOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::AbsOptions *builtin_options_as_AbsOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_AbsOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SplitVOptions *builtin_options_as_SplitVOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SplitVOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::UniqueOptions *builtin_options_as_UniqueOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_UniqueOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ReverseV2Options *builtin_options_as_ReverseV2Options() const { - return builtin_options_type() == tflite::BuiltinOptions_ReverseV2Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::AddNOptions *builtin_options_as_AddNOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_AddNOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::GatherNdOptions *builtin_options_as_GatherNdOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_GatherNdOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::CosOptions *builtin_options_as_CosOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_CosOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::WhereOptions *builtin_options_as_WhereOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_WhereOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::RankOptions *builtin_options_as_RankOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_RankOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::ReverseSequenceOptions *builtin_options_as_ReverseSequenceOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ReverseSequenceOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::MatrixDiagOptions *builtin_options_as_MatrixDiagOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_MatrixDiagOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::QuantizeOptions *builtin_options_as_QuantizeOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_QuantizeOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::MatrixSetDiagOptions *builtin_options_as_MatrixSetDiagOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_MatrixSetDiagOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::HardSwishOptions *builtin_options_as_HardSwishOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_HardSwishOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::IfOptions *builtin_options_as_IfOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_IfOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::WhileOptions *builtin_options_as_WhileOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_WhileOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::DepthToSpaceOptions *builtin_options_as_DepthToSpaceOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_DepthToSpaceOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::NonMaxSuppressionV4Options *builtin_options_as_NonMaxSuppressionV4Options() const { - return builtin_options_type() == tflite::BuiltinOptions_NonMaxSuppressionV4Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::NonMaxSuppressionV5Options *builtin_options_as_NonMaxSuppressionV5Options() const { - return builtin_options_type() == tflite::BuiltinOptions_NonMaxSuppressionV5Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::ScatterNdOptions *builtin_options_as_ScatterNdOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_ScatterNdOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SelectV2Options *builtin_options_as_SelectV2Options() const { - return builtin_options_type() == tflite::BuiltinOptions_SelectV2Options ? static_cast(builtin_options()) : nullptr; - } - const tflite::DensifyOptions *builtin_options_as_DensifyOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_DensifyOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::SegmentSumOptions *builtin_options_as_SegmentSumOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_SegmentSumOptions ? static_cast(builtin_options()) : nullptr; - } - const tflite::BatchMatMulOptions *builtin_options_as_BatchMatMulOptions() const { - return builtin_options_type() == tflite::BuiltinOptions_BatchMatMulOptions ? static_cast(builtin_options()) : nullptr; - } - const flatbuffers::Vector *custom_options() const { - return GetPointer *>(VT_CUSTOM_OPTIONS); - } - tflite::CustomOptionsFormat custom_options_format() const { - return static_cast(GetField(VT_CUSTOM_OPTIONS_FORMAT, 0)); - } - const flatbuffers::Vector *mutating_variable_inputs() const { - return GetPointer *>(VT_MUTATING_VARIABLE_INPUTS); - } - const flatbuffers::Vector *intermediates() const { - return GetPointer *>(VT_INTERMEDIATES); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_OPCODE_INDEX) && - VerifyOffset(verifier, VT_INPUTS) && - verifier.VerifyVector(inputs()) && - VerifyOffset(verifier, VT_OUTPUTS) && - verifier.VerifyVector(outputs()) && - VerifyField(verifier, VT_BUILTIN_OPTIONS_TYPE) && - VerifyOffset(verifier, VT_BUILTIN_OPTIONS) && - VerifyBuiltinOptions(verifier, builtin_options(), builtin_options_type()) && - VerifyOffset(verifier, VT_CUSTOM_OPTIONS) && - verifier.VerifyVector(custom_options()) && - VerifyField(verifier, VT_CUSTOM_OPTIONS_FORMAT) && - VerifyOffset(verifier, VT_MUTATING_VARIABLE_INPUTS) && - verifier.VerifyVector(mutating_variable_inputs()) && - VerifyOffset(verifier, VT_INTERMEDIATES) && - verifier.VerifyVector(intermediates()) && - verifier.EndTable(); - } - OperatorT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(OperatorT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -template<> inline const tflite::Conv2DOptions *Operator::builtin_options_as() const { - return builtin_options_as_Conv2DOptions(); -} - -template<> inline const tflite::DepthwiseConv2DOptions *Operator::builtin_options_as() const { - return builtin_options_as_DepthwiseConv2DOptions(); -} - -template<> inline const tflite::ConcatEmbeddingsOptions *Operator::builtin_options_as() const { - return builtin_options_as_ConcatEmbeddingsOptions(); -} - -template<> inline const tflite::LSHProjectionOptions *Operator::builtin_options_as() const { - return builtin_options_as_LSHProjectionOptions(); -} - -template<> inline const tflite::Pool2DOptions *Operator::builtin_options_as() const { - return builtin_options_as_Pool2DOptions(); -} - -template<> inline const tflite::SVDFOptions *Operator::builtin_options_as() const { - return builtin_options_as_SVDFOptions(); -} - -template<> inline const tflite::RNNOptions *Operator::builtin_options_as() const { - return builtin_options_as_RNNOptions(); -} - -template<> inline const tflite::FullyConnectedOptions *Operator::builtin_options_as() const { - return builtin_options_as_FullyConnectedOptions(); -} - -template<> inline const tflite::SoftmaxOptions *Operator::builtin_options_as() const { - return builtin_options_as_SoftmaxOptions(); -} - -template<> inline const tflite::ConcatenationOptions *Operator::builtin_options_as() const { - return builtin_options_as_ConcatenationOptions(); -} - -template<> inline const tflite::AddOptions *Operator::builtin_options_as() const { - return builtin_options_as_AddOptions(); -} - -template<> inline const tflite::L2NormOptions *Operator::builtin_options_as() const { - return builtin_options_as_L2NormOptions(); -} - -template<> inline const tflite::LocalResponseNormalizationOptions *Operator::builtin_options_as() const { - return builtin_options_as_LocalResponseNormalizationOptions(); -} - -template<> inline const tflite::LSTMOptions *Operator::builtin_options_as() const { - return builtin_options_as_LSTMOptions(); -} - -template<> inline const tflite::ResizeBilinearOptions *Operator::builtin_options_as() const { - return builtin_options_as_ResizeBilinearOptions(); -} - -template<> inline const tflite::CallOptions *Operator::builtin_options_as() const { - return builtin_options_as_CallOptions(); -} - -template<> inline const tflite::ReshapeOptions *Operator::builtin_options_as() const { - return builtin_options_as_ReshapeOptions(); -} - -template<> inline const tflite::SkipGramOptions *Operator::builtin_options_as() const { - return builtin_options_as_SkipGramOptions(); -} - -template<> inline const tflite::SpaceToDepthOptions *Operator::builtin_options_as() const { - return builtin_options_as_SpaceToDepthOptions(); -} - -template<> inline const tflite::EmbeddingLookupSparseOptions *Operator::builtin_options_as() const { - return builtin_options_as_EmbeddingLookupSparseOptions(); -} - -template<> inline const tflite::MulOptions *Operator::builtin_options_as() const { - return builtin_options_as_MulOptions(); -} - -template<> inline const tflite::PadOptions *Operator::builtin_options_as() const { - return builtin_options_as_PadOptions(); -} - -template<> inline const tflite::GatherOptions *Operator::builtin_options_as() const { - return builtin_options_as_GatherOptions(); -} - -template<> inline const tflite::BatchToSpaceNDOptions *Operator::builtin_options_as() const { - return builtin_options_as_BatchToSpaceNDOptions(); -} - -template<> inline const tflite::SpaceToBatchNDOptions *Operator::builtin_options_as() const { - return builtin_options_as_SpaceToBatchNDOptions(); -} - -template<> inline const tflite::TransposeOptions *Operator::builtin_options_as() const { - return builtin_options_as_TransposeOptions(); -} - -template<> inline const tflite::ReducerOptions *Operator::builtin_options_as() const { - return builtin_options_as_ReducerOptions(); -} - -template<> inline const tflite::SubOptions *Operator::builtin_options_as() const { - return builtin_options_as_SubOptions(); -} - -template<> inline const tflite::DivOptions *Operator::builtin_options_as() const { - return builtin_options_as_DivOptions(); -} - -template<> inline const tflite::SqueezeOptions *Operator::builtin_options_as() const { - return builtin_options_as_SqueezeOptions(); -} - -template<> inline const tflite::SequenceRNNOptions *Operator::builtin_options_as() const { - return builtin_options_as_SequenceRNNOptions(); -} - -template<> inline const tflite::StridedSliceOptions *Operator::builtin_options_as() const { - return builtin_options_as_StridedSliceOptions(); -} - -template<> inline const tflite::ExpOptions *Operator::builtin_options_as() const { - return builtin_options_as_ExpOptions(); -} - -template<> inline const tflite::TopKV2Options *Operator::builtin_options_as() const { - return builtin_options_as_TopKV2Options(); -} - -template<> inline const tflite::SplitOptions *Operator::builtin_options_as() const { - return builtin_options_as_SplitOptions(); -} - -template<> inline const tflite::LogSoftmaxOptions *Operator::builtin_options_as() const { - return builtin_options_as_LogSoftmaxOptions(); -} - -template<> inline const tflite::CastOptions *Operator::builtin_options_as() const { - return builtin_options_as_CastOptions(); -} - -template<> inline const tflite::DequantizeOptions *Operator::builtin_options_as() const { - return builtin_options_as_DequantizeOptions(); -} - -template<> inline const tflite::MaximumMinimumOptions *Operator::builtin_options_as() const { - return builtin_options_as_MaximumMinimumOptions(); -} - -template<> inline const tflite::ArgMaxOptions *Operator::builtin_options_as() const { - return builtin_options_as_ArgMaxOptions(); -} - -template<> inline const tflite::LessOptions *Operator::builtin_options_as() const { - return builtin_options_as_LessOptions(); -} - -template<> inline const tflite::NegOptions *Operator::builtin_options_as() const { - return builtin_options_as_NegOptions(); -} - -template<> inline const tflite::PadV2Options *Operator::builtin_options_as() const { - return builtin_options_as_PadV2Options(); -} - -template<> inline const tflite::GreaterOptions *Operator::builtin_options_as() const { - return builtin_options_as_GreaterOptions(); -} - -template<> inline const tflite::GreaterEqualOptions *Operator::builtin_options_as() const { - return builtin_options_as_GreaterEqualOptions(); -} - -template<> inline const tflite::LessEqualOptions *Operator::builtin_options_as() const { - return builtin_options_as_LessEqualOptions(); -} - -template<> inline const tflite::SelectOptions *Operator::builtin_options_as() const { - return builtin_options_as_SelectOptions(); -} - -template<> inline const tflite::SliceOptions *Operator::builtin_options_as() const { - return builtin_options_as_SliceOptions(); -} - -template<> inline const tflite::TransposeConvOptions *Operator::builtin_options_as() const { - return builtin_options_as_TransposeConvOptions(); -} - -template<> inline const tflite::SparseToDenseOptions *Operator::builtin_options_as() const { - return builtin_options_as_SparseToDenseOptions(); -} - -template<> inline const tflite::TileOptions *Operator::builtin_options_as() const { - return builtin_options_as_TileOptions(); -} - -template<> inline const tflite::ExpandDimsOptions *Operator::builtin_options_as() const { - return builtin_options_as_ExpandDimsOptions(); -} - -template<> inline const tflite::EqualOptions *Operator::builtin_options_as() const { - return builtin_options_as_EqualOptions(); -} - -template<> inline const tflite::NotEqualOptions *Operator::builtin_options_as() const { - return builtin_options_as_NotEqualOptions(); -} - -template<> inline const tflite::ShapeOptions *Operator::builtin_options_as() const { - return builtin_options_as_ShapeOptions(); -} - -template<> inline const tflite::PowOptions *Operator::builtin_options_as() const { - return builtin_options_as_PowOptions(); -} - -template<> inline const tflite::ArgMinOptions *Operator::builtin_options_as() const { - return builtin_options_as_ArgMinOptions(); -} - -template<> inline const tflite::FakeQuantOptions *Operator::builtin_options_as() const { - return builtin_options_as_FakeQuantOptions(); -} - -template<> inline const tflite::PackOptions *Operator::builtin_options_as() const { - return builtin_options_as_PackOptions(); -} - -template<> inline const tflite::LogicalOrOptions *Operator::builtin_options_as() const { - return builtin_options_as_LogicalOrOptions(); -} - -template<> inline const tflite::OneHotOptions *Operator::builtin_options_as() const { - return builtin_options_as_OneHotOptions(); -} - -template<> inline const tflite::LogicalAndOptions *Operator::builtin_options_as() const { - return builtin_options_as_LogicalAndOptions(); -} - -template<> inline const tflite::LogicalNotOptions *Operator::builtin_options_as() const { - return builtin_options_as_LogicalNotOptions(); -} - -template<> inline const tflite::UnpackOptions *Operator::builtin_options_as() const { - return builtin_options_as_UnpackOptions(); -} - -template<> inline const tflite::FloorDivOptions *Operator::builtin_options_as() const { - return builtin_options_as_FloorDivOptions(); -} - -template<> inline const tflite::SquareOptions *Operator::builtin_options_as() const { - return builtin_options_as_SquareOptions(); -} - -template<> inline const tflite::ZerosLikeOptions *Operator::builtin_options_as() const { - return builtin_options_as_ZerosLikeOptions(); -} - -template<> inline const tflite::FillOptions *Operator::builtin_options_as() const { - return builtin_options_as_FillOptions(); -} - -template<> inline const tflite::BidirectionalSequenceLSTMOptions *Operator::builtin_options_as() const { - return builtin_options_as_BidirectionalSequenceLSTMOptions(); -} - -template<> inline const tflite::BidirectionalSequenceRNNOptions *Operator::builtin_options_as() const { - return builtin_options_as_BidirectionalSequenceRNNOptions(); -} - -template<> inline const tflite::UnidirectionalSequenceLSTMOptions *Operator::builtin_options_as() const { - return builtin_options_as_UnidirectionalSequenceLSTMOptions(); -} - -template<> inline const tflite::FloorModOptions *Operator::builtin_options_as() const { - return builtin_options_as_FloorModOptions(); -} - -template<> inline const tflite::RangeOptions *Operator::builtin_options_as() const { - return builtin_options_as_RangeOptions(); -} - -template<> inline const tflite::ResizeNearestNeighborOptions *Operator::builtin_options_as() const { - return builtin_options_as_ResizeNearestNeighborOptions(); -} - -template<> inline const tflite::LeakyReluOptions *Operator::builtin_options_as() const { - return builtin_options_as_LeakyReluOptions(); -} - -template<> inline const tflite::SquaredDifferenceOptions *Operator::builtin_options_as() const { - return builtin_options_as_SquaredDifferenceOptions(); -} - -template<> inline const tflite::MirrorPadOptions *Operator::builtin_options_as() const { - return builtin_options_as_MirrorPadOptions(); -} - -template<> inline const tflite::AbsOptions *Operator::builtin_options_as() const { - return builtin_options_as_AbsOptions(); -} - -template<> inline const tflite::SplitVOptions *Operator::builtin_options_as() const { - return builtin_options_as_SplitVOptions(); -} - -template<> inline const tflite::UniqueOptions *Operator::builtin_options_as() const { - return builtin_options_as_UniqueOptions(); -} - -template<> inline const tflite::ReverseV2Options *Operator::builtin_options_as() const { - return builtin_options_as_ReverseV2Options(); -} - -template<> inline const tflite::AddNOptions *Operator::builtin_options_as() const { - return builtin_options_as_AddNOptions(); -} - -template<> inline const tflite::GatherNdOptions *Operator::builtin_options_as() const { - return builtin_options_as_GatherNdOptions(); -} - -template<> inline const tflite::CosOptions *Operator::builtin_options_as() const { - return builtin_options_as_CosOptions(); -} - -template<> inline const tflite::WhereOptions *Operator::builtin_options_as() const { - return builtin_options_as_WhereOptions(); -} - -template<> inline const tflite::RankOptions *Operator::builtin_options_as() const { - return builtin_options_as_RankOptions(); -} - -template<> inline const tflite::ReverseSequenceOptions *Operator::builtin_options_as() const { - return builtin_options_as_ReverseSequenceOptions(); -} - -template<> inline const tflite::MatrixDiagOptions *Operator::builtin_options_as() const { - return builtin_options_as_MatrixDiagOptions(); -} - -template<> inline const tflite::QuantizeOptions *Operator::builtin_options_as() const { - return builtin_options_as_QuantizeOptions(); -} - -template<> inline const tflite::MatrixSetDiagOptions *Operator::builtin_options_as() const { - return builtin_options_as_MatrixSetDiagOptions(); -} - -template<> inline const tflite::HardSwishOptions *Operator::builtin_options_as() const { - return builtin_options_as_HardSwishOptions(); -} - -template<> inline const tflite::IfOptions *Operator::builtin_options_as() const { - return builtin_options_as_IfOptions(); -} - -template<> inline const tflite::WhileOptions *Operator::builtin_options_as() const { - return builtin_options_as_WhileOptions(); -} - -template<> inline const tflite::DepthToSpaceOptions *Operator::builtin_options_as() const { - return builtin_options_as_DepthToSpaceOptions(); -} - -template<> inline const tflite::NonMaxSuppressionV4Options *Operator::builtin_options_as() const { - return builtin_options_as_NonMaxSuppressionV4Options(); -} - -template<> inline const tflite::NonMaxSuppressionV5Options *Operator::builtin_options_as() const { - return builtin_options_as_NonMaxSuppressionV5Options(); -} - -template<> inline const tflite::ScatterNdOptions *Operator::builtin_options_as() const { - return builtin_options_as_ScatterNdOptions(); -} - -template<> inline const tflite::SelectV2Options *Operator::builtin_options_as() const { - return builtin_options_as_SelectV2Options(); -} - -template<> inline const tflite::DensifyOptions *Operator::builtin_options_as() const { - return builtin_options_as_DensifyOptions(); -} - -template<> inline const tflite::SegmentSumOptions *Operator::builtin_options_as() const { - return builtin_options_as_SegmentSumOptions(); -} - -template<> inline const tflite::BatchMatMulOptions *Operator::builtin_options_as() const { - return builtin_options_as_BatchMatMulOptions(); -} - -struct OperatorBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_opcode_index(uint32_t opcode_index) { - fbb_.AddElement(Operator::VT_OPCODE_INDEX, opcode_index, 0); - } - void add_inputs(flatbuffers::Offset> inputs) { - fbb_.AddOffset(Operator::VT_INPUTS, inputs); - } - void add_outputs(flatbuffers::Offset> outputs) { - fbb_.AddOffset(Operator::VT_OUTPUTS, outputs); - } - void add_builtin_options_type(tflite::BuiltinOptions builtin_options_type) { - fbb_.AddElement(Operator::VT_BUILTIN_OPTIONS_TYPE, static_cast(builtin_options_type), 0); - } - void add_builtin_options(flatbuffers::Offset builtin_options) { - fbb_.AddOffset(Operator::VT_BUILTIN_OPTIONS, builtin_options); - } - void add_custom_options(flatbuffers::Offset> custom_options) { - fbb_.AddOffset(Operator::VT_CUSTOM_OPTIONS, custom_options); - } - void add_custom_options_format(tflite::CustomOptionsFormat custom_options_format) { - fbb_.AddElement(Operator::VT_CUSTOM_OPTIONS_FORMAT, static_cast(custom_options_format), 0); - } - void add_mutating_variable_inputs(flatbuffers::Offset> mutating_variable_inputs) { - fbb_.AddOffset(Operator::VT_MUTATING_VARIABLE_INPUTS, mutating_variable_inputs); - } - void add_intermediates(flatbuffers::Offset> intermediates) { - fbb_.AddOffset(Operator::VT_INTERMEDIATES, intermediates); - } - explicit OperatorBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - OperatorBuilder &operator=(const OperatorBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateOperator( - flatbuffers::FlatBufferBuilder &_fbb, - uint32_t opcode_index = 0, - flatbuffers::Offset> inputs = 0, - flatbuffers::Offset> outputs = 0, - tflite::BuiltinOptions builtin_options_type = tflite::BuiltinOptions_NONE, - flatbuffers::Offset builtin_options = 0, - flatbuffers::Offset> custom_options = 0, - tflite::CustomOptionsFormat custom_options_format = tflite::CustomOptionsFormat_FLEXBUFFERS, - flatbuffers::Offset> mutating_variable_inputs = 0, - flatbuffers::Offset> intermediates = 0) { - OperatorBuilder builder_(_fbb); - builder_.add_intermediates(intermediates); - builder_.add_mutating_variable_inputs(mutating_variable_inputs); - builder_.add_custom_options(custom_options); - builder_.add_builtin_options(builtin_options); - builder_.add_outputs(outputs); - builder_.add_inputs(inputs); - builder_.add_opcode_index(opcode_index); - builder_.add_custom_options_format(custom_options_format); - builder_.add_builtin_options_type(builtin_options_type); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateOperatorDirect( - flatbuffers::FlatBufferBuilder &_fbb, - uint32_t opcode_index = 0, - const std::vector *inputs = nullptr, - const std::vector *outputs = nullptr, - tflite::BuiltinOptions builtin_options_type = tflite::BuiltinOptions_NONE, - flatbuffers::Offset builtin_options = 0, - const std::vector *custom_options = nullptr, - tflite::CustomOptionsFormat custom_options_format = tflite::CustomOptionsFormat_FLEXBUFFERS, - const std::vector *mutating_variable_inputs = nullptr, - const std::vector *intermediates = nullptr) { - auto inputs__ = inputs ? _fbb.CreateVector(*inputs) : 0; - auto outputs__ = outputs ? _fbb.CreateVector(*outputs) : 0; - auto custom_options__ = custom_options ? _fbb.CreateVector(*custom_options) : 0; - auto mutating_variable_inputs__ = mutating_variable_inputs ? _fbb.CreateVector(*mutating_variable_inputs) : 0; - auto intermediates__ = intermediates ? _fbb.CreateVector(*intermediates) : 0; - return tflite::CreateOperator( - _fbb, - opcode_index, - inputs__, - outputs__, - builtin_options_type, - builtin_options, - custom_options__, - custom_options_format, - mutating_variable_inputs__, - intermediates__); -} - -flatbuffers::Offset CreateOperator(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct SubGraphT : public flatbuffers::NativeTable { - typedef SubGraph TableType; - std::vector> tensors; - std::vector inputs; - std::vector outputs; - std::vector> operators; - std::string name; - SubGraphT() { - } -}; - -struct SubGraph FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef SubGraphT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_TENSORS = 4, - VT_INPUTS = 6, - VT_OUTPUTS = 8, - VT_OPERATORS = 10, - VT_NAME = 12 - }; - const flatbuffers::Vector> *tensors() const { - return GetPointer> *>(VT_TENSORS); - } - const flatbuffers::Vector *inputs() const { - return GetPointer *>(VT_INPUTS); - } - const flatbuffers::Vector *outputs() const { - return GetPointer *>(VT_OUTPUTS); - } - const flatbuffers::Vector> *operators() const { - return GetPointer> *>(VT_OPERATORS); - } - const flatbuffers::String *name() const { - return GetPointer(VT_NAME); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_TENSORS) && - verifier.VerifyVector(tensors()) && - verifier.VerifyVectorOfTables(tensors()) && - VerifyOffset(verifier, VT_INPUTS) && - verifier.VerifyVector(inputs()) && - VerifyOffset(verifier, VT_OUTPUTS) && - verifier.VerifyVector(outputs()) && - VerifyOffset(verifier, VT_OPERATORS) && - verifier.VerifyVector(operators()) && - verifier.VerifyVectorOfTables(operators()) && - VerifyOffset(verifier, VT_NAME) && - verifier.VerifyString(name()) && - verifier.EndTable(); - } - SubGraphT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(SubGraphT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct SubGraphBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_tensors(flatbuffers::Offset>> tensors) { - fbb_.AddOffset(SubGraph::VT_TENSORS, tensors); - } - void add_inputs(flatbuffers::Offset> inputs) { - fbb_.AddOffset(SubGraph::VT_INPUTS, inputs); - } - void add_outputs(flatbuffers::Offset> outputs) { - fbb_.AddOffset(SubGraph::VT_OUTPUTS, outputs); - } - void add_operators(flatbuffers::Offset>> operators) { - fbb_.AddOffset(SubGraph::VT_OPERATORS, operators); - } - void add_name(flatbuffers::Offset name) { - fbb_.AddOffset(SubGraph::VT_NAME, name); - } - explicit SubGraphBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - SubGraphBuilder &operator=(const SubGraphBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateSubGraph( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset>> tensors = 0, - flatbuffers::Offset> inputs = 0, - flatbuffers::Offset> outputs = 0, - flatbuffers::Offset>> operators = 0, - flatbuffers::Offset name = 0) { - SubGraphBuilder builder_(_fbb); - builder_.add_name(name); - builder_.add_operators(operators); - builder_.add_outputs(outputs); - builder_.add_inputs(inputs); - builder_.add_tensors(tensors); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateSubGraphDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector> *tensors = nullptr, - const std::vector *inputs = nullptr, - const std::vector *outputs = nullptr, - const std::vector> *operators = nullptr, - const char *name = nullptr) { - auto tensors__ = tensors ? _fbb.CreateVector>(*tensors) : 0; - auto inputs__ = inputs ? _fbb.CreateVector(*inputs) : 0; - auto outputs__ = outputs ? _fbb.CreateVector(*outputs) : 0; - auto operators__ = operators ? _fbb.CreateVector>(*operators) : 0; - auto name__ = name ? _fbb.CreateString(name) : 0; - return tflite::CreateSubGraph( - _fbb, - tensors__, - inputs__, - outputs__, - operators__, - name__); -} - -flatbuffers::Offset CreateSubGraph(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct BufferT : public flatbuffers::NativeTable { - typedef Buffer TableType; - std::vector data; - BufferT() { - } -}; - -struct Buffer FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef BufferT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_DATA = 4 - }; - const flatbuffers::Vector *data() const { - return GetPointer *>(VT_DATA); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_DATA) && - verifier.VerifyVector(data()) && - verifier.EndTable(); - } - BufferT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(BufferT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const BufferT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct BufferBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_data(flatbuffers::Offset> data) { - fbb_.AddOffset(Buffer::VT_DATA, data); - } - explicit BufferBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - BufferBuilder &operator=(const BufferBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateBuffer( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset> data = 0) { - BufferBuilder builder_(_fbb); - builder_.add_data(data); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateBufferDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const std::vector *data = nullptr) { - if (data) { _fbb.ForceVectorAlignment(data->size(), sizeof(uint8_t), 16); } - auto data__ = data ? _fbb.CreateVector(*data) : 0; - return tflite::CreateBuffer( - _fbb, - data__); -} - -flatbuffers::Offset CreateBuffer(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct MetadataT : public flatbuffers::NativeTable { - typedef Metadata TableType; - std::string name; - uint32_t buffer; - MetadataT() - : buffer(0) { - } -}; - -struct Metadata FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef MetadataT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_NAME = 4, - VT_BUFFER = 6 - }; - const flatbuffers::String *name() const { - return GetPointer(VT_NAME); - } - uint32_t buffer() const { - return GetField(VT_BUFFER, 0); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyOffset(verifier, VT_NAME) && - verifier.VerifyString(name()) && - VerifyField(verifier, VT_BUFFER) && - verifier.EndTable(); - } - MetadataT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(MetadataT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct MetadataBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_name(flatbuffers::Offset name) { - fbb_.AddOffset(Metadata::VT_NAME, name); - } - void add_buffer(uint32_t buffer) { - fbb_.AddElement(Metadata::VT_BUFFER, buffer, 0); - } - explicit MetadataBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - MetadataBuilder &operator=(const MetadataBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateMetadata( - flatbuffers::FlatBufferBuilder &_fbb, - flatbuffers::Offset name = 0, - uint32_t buffer = 0) { - MetadataBuilder builder_(_fbb); - builder_.add_buffer(buffer); - builder_.add_name(name); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateMetadataDirect( - flatbuffers::FlatBufferBuilder &_fbb, - const char *name = nullptr, - uint32_t buffer = 0) { - auto name__ = name ? _fbb.CreateString(name) : 0; - return tflite::CreateMetadata( - _fbb, - name__, - buffer); -} - -flatbuffers::Offset CreateMetadata(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -struct ModelT : public flatbuffers::NativeTable { - typedef Model TableType; - uint32_t version; - std::vector> operator_codes; - std::vector> subgraphs; - std::string description; - std::vector> buffers; - std::vector metadata_buffer; - std::vector> metadata; - ModelT() - : version(0) { - } -}; - -struct Model FLATBUFFERS_FINAL_CLASS : private flatbuffers::Table { - typedef ModelT NativeTableType; - enum FlatBuffersVTableOffset FLATBUFFERS_VTABLE_UNDERLYING_TYPE { - VT_VERSION = 4, - VT_OPERATOR_CODES = 6, - VT_SUBGRAPHS = 8, - VT_DESCRIPTION = 10, - VT_BUFFERS = 12, - VT_METADATA_BUFFER = 14, - VT_METADATA = 16 - }; - uint32_t version() const { - return GetField(VT_VERSION, 0); - } - const flatbuffers::Vector> *operator_codes() const { - return GetPointer> *>(VT_OPERATOR_CODES); - } - const flatbuffers::Vector> *subgraphs() const { - return GetPointer> *>(VT_SUBGRAPHS); - } - const flatbuffers::String *description() const { - return GetPointer(VT_DESCRIPTION); - } - const flatbuffers::Vector> *buffers() const { - return GetPointer> *>(VT_BUFFERS); - } - const flatbuffers::Vector *metadata_buffer() const { - return GetPointer *>(VT_METADATA_BUFFER); - } - const flatbuffers::Vector> *metadata() const { - return GetPointer> *>(VT_METADATA); - } - bool Verify(flatbuffers::Verifier &verifier) const { - return VerifyTableStart(verifier) && - VerifyField(verifier, VT_VERSION) && - VerifyOffset(verifier, VT_OPERATOR_CODES) && - verifier.VerifyVector(operator_codes()) && - verifier.VerifyVectorOfTables(operator_codes()) && - VerifyOffset(verifier, VT_SUBGRAPHS) && - verifier.VerifyVector(subgraphs()) && - verifier.VerifyVectorOfTables(subgraphs()) && - VerifyOffset(verifier, VT_DESCRIPTION) && - verifier.VerifyString(description()) && - VerifyOffset(verifier, VT_BUFFERS) && - verifier.VerifyVector(buffers()) && - verifier.VerifyVectorOfTables(buffers()) && - VerifyOffset(verifier, VT_METADATA_BUFFER) && - verifier.VerifyVector(metadata_buffer()) && - VerifyOffset(verifier, VT_METADATA) && - verifier.VerifyVector(metadata()) && - verifier.VerifyVectorOfTables(metadata()) && - verifier.EndTable(); - } - ModelT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; - void UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver = nullptr) const; - static flatbuffers::Offset Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT* _o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); -}; - -struct ModelBuilder { - flatbuffers::FlatBufferBuilder &fbb_; - flatbuffers::uoffset_t start_; - void add_version(uint32_t version) { - fbb_.AddElement(Model::VT_VERSION, version, 0); - } - void add_operator_codes(flatbuffers::Offset>> operator_codes) { - fbb_.AddOffset(Model::VT_OPERATOR_CODES, operator_codes); - } - void add_subgraphs(flatbuffers::Offset>> subgraphs) { - fbb_.AddOffset(Model::VT_SUBGRAPHS, subgraphs); - } - void add_description(flatbuffers::Offset description) { - fbb_.AddOffset(Model::VT_DESCRIPTION, description); - } - void add_buffers(flatbuffers::Offset>> buffers) { - fbb_.AddOffset(Model::VT_BUFFERS, buffers); - } - void add_metadata_buffer(flatbuffers::Offset> metadata_buffer) { - fbb_.AddOffset(Model::VT_METADATA_BUFFER, metadata_buffer); - } - void add_metadata(flatbuffers::Offset>> metadata) { - fbb_.AddOffset(Model::VT_METADATA, metadata); - } - explicit ModelBuilder(flatbuffers::FlatBufferBuilder &_fbb) - : fbb_(_fbb) { - start_ = fbb_.StartTable(); - } - ModelBuilder &operator=(const ModelBuilder &); - flatbuffers::Offset Finish() { - const auto end = fbb_.EndTable(start_); - auto o = flatbuffers::Offset(end); - return o; - } -}; - -inline flatbuffers::Offset CreateModel( - flatbuffers::FlatBufferBuilder &_fbb, - uint32_t version = 0, - flatbuffers::Offset>> operator_codes = 0, - flatbuffers::Offset>> subgraphs = 0, - flatbuffers::Offset description = 0, - flatbuffers::Offset>> buffers = 0, - flatbuffers::Offset> metadata_buffer = 0, - flatbuffers::Offset>> metadata = 0) { - ModelBuilder builder_(_fbb); - builder_.add_metadata(metadata); - builder_.add_metadata_buffer(metadata_buffer); - builder_.add_buffers(buffers); - builder_.add_description(description); - builder_.add_subgraphs(subgraphs); - builder_.add_operator_codes(operator_codes); - builder_.add_version(version); - return builder_.Finish(); -} - -inline flatbuffers::Offset CreateModelDirect( - flatbuffers::FlatBufferBuilder &_fbb, - uint32_t version = 0, - const std::vector> *operator_codes = nullptr, - const std::vector> *subgraphs = nullptr, - const char *description = nullptr, - const std::vector> *buffers = nullptr, - const std::vector *metadata_buffer = nullptr, - const std::vector> *metadata = nullptr) { - auto operator_codes__ = operator_codes ? _fbb.CreateVector>(*operator_codes) : 0; - auto subgraphs__ = subgraphs ? _fbb.CreateVector>(*subgraphs) : 0; - auto description__ = description ? _fbb.CreateString(description) : 0; - auto buffers__ = buffers ? _fbb.CreateVector>(*buffers) : 0; - auto metadata_buffer__ = metadata_buffer ? _fbb.CreateVector(*metadata_buffer) : 0; - auto metadata__ = metadata ? _fbb.CreateVector>(*metadata) : 0; - return tflite::CreateModel( - _fbb, - version, - operator_codes__, - subgraphs__, - description__, - buffers__, - metadata_buffer__, - metadata__); -} - -flatbuffers::Offset CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); - -inline CustomQuantizationT *CustomQuantization::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new CustomQuantizationT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void CustomQuantization::UnPackTo(CustomQuantizationT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = custom(); if (_e) { _o->custom.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->custom[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset CustomQuantization::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateCustomQuantization(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateCustomQuantization(flatbuffers::FlatBufferBuilder &_fbb, const CustomQuantizationT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CustomQuantizationT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - _fbb.ForceVectorAlignment(_o->custom.size(), sizeof(uint8_t), 16); - auto _custom = _o->custom.size() ? _fbb.CreateVector(_o->custom) : 0; - return tflite::CreateCustomQuantization( - _fbb, - _custom); -} - -inline QuantizationParametersT *QuantizationParameters::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new QuantizationParametersT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void QuantizationParameters::UnPackTo(QuantizationParametersT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = min(); if (_e) { _o->min.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->min[_i] = _e->Get(_i); } } } - { auto _e = max(); if (_e) { _o->max.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->max[_i] = _e->Get(_i); } } } - { auto _e = scale(); if (_e) { _o->scale.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->scale[_i] = _e->Get(_i); } } } - { auto _e = zero_point(); if (_e) { _o->zero_point.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->zero_point[_i] = _e->Get(_i); } } } - { auto _e = details_type(); _o->details.type = _e; } - { auto _e = details(); if (_e) _o->details.value = tflite::QuantizationDetailsUnion::UnPack(_e, details_type(), _resolver); } - { auto _e = quantized_dimension(); _o->quantized_dimension = _e; } -} - -inline flatbuffers::Offset QuantizationParameters::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateQuantizationParameters(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateQuantizationParameters(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const QuantizationParametersT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _min = _o->min.size() ? _fbb.CreateVector(_o->min) : 0; - auto _max = _o->max.size() ? _fbb.CreateVector(_o->max) : 0; - auto _scale = _o->scale.size() ? _fbb.CreateVector(_o->scale) : 0; - auto _zero_point = _o->zero_point.size() ? _fbb.CreateVector(_o->zero_point) : 0; - auto _details_type = _o->details.type; - auto _details = _o->details.Pack(_fbb); - auto _quantized_dimension = _o->quantized_dimension; - return tflite::CreateQuantizationParameters( - _fbb, - _min, - _max, - _scale, - _zero_point, - _details_type, - _details, - _quantized_dimension); -} - -inline Int32VectorT *Int32Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new Int32VectorT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Int32Vector::UnPackTo(Int32VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = values(); if (_e) { _o->values.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->values[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Int32Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateInt32Vector(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateInt32Vector(flatbuffers::FlatBufferBuilder &_fbb, const Int32VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const Int32VectorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; - return tflite::CreateInt32Vector( - _fbb, - _values); -} - -inline Uint16VectorT *Uint16Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new Uint16VectorT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Uint16Vector::UnPackTo(Uint16VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = values(); if (_e) { _o->values.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->values[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Uint16Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateUint16Vector(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateUint16Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint16VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const Uint16VectorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - _fbb.ForceVectorAlignment(_o->values.size(), sizeof(uint16_t), 4); - auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; - return tflite::CreateUint16Vector( - _fbb, - _values); -} - -inline Uint8VectorT *Uint8Vector::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new Uint8VectorT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Uint8Vector::UnPackTo(Uint8VectorT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = values(); if (_e) { _o->values.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->values[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Uint8Vector::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateUint8Vector(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateUint8Vector(flatbuffers::FlatBufferBuilder &_fbb, const Uint8VectorT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const Uint8VectorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - _fbb.ForceVectorAlignment(_o->values.size(), sizeof(uint8_t), 4); - auto _values = _o->values.size() ? _fbb.CreateVector(_o->values) : 0; - return tflite::CreateUint8Vector( - _fbb, - _values); -} - -inline DimensionMetadataT *DimensionMetadata::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DimensionMetadataT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DimensionMetadata::UnPackTo(DimensionMetadataT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = format(); _o->format = _e; } - { auto _e = dense_size(); _o->dense_size = _e; } - { auto _e = array_segments_type(); _o->array_segments.type = _e; } - { auto _e = array_segments(); if (_e) _o->array_segments.value = tflite::SparseIndexVectorUnion::UnPack(_e, array_segments_type(), _resolver); } - { auto _e = array_indices_type(); _o->array_indices.type = _e; } - { auto _e = array_indices(); if (_e) _o->array_indices.value = tflite::SparseIndexVectorUnion::UnPack(_e, array_indices_type(), _resolver); } -} - -inline flatbuffers::Offset DimensionMetadata::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDimensionMetadata(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDimensionMetadata(flatbuffers::FlatBufferBuilder &_fbb, const DimensionMetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DimensionMetadataT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _format = _o->format; - auto _dense_size = _o->dense_size; - auto _array_segments_type = _o->array_segments.type; - auto _array_segments = _o->array_segments.Pack(_fbb); - auto _array_indices_type = _o->array_indices.type; - auto _array_indices = _o->array_indices.Pack(_fbb); - return tflite::CreateDimensionMetadata( - _fbb, - _format, - _dense_size, - _array_segments_type, - _array_segments, - _array_indices_type, - _array_indices); -} - -inline SparsityParametersT *SparsityParameters::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SparsityParametersT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SparsityParameters::UnPackTo(SparsityParametersT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = traversal_order(); if (_e) { _o->traversal_order.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->traversal_order[_i] = _e->Get(_i); } } } - { auto _e = block_map(); if (_e) { _o->block_map.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->block_map[_i] = _e->Get(_i); } } } - { auto _e = dim_metadata(); if (_e) { _o->dim_metadata.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->dim_metadata[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } -} - -inline flatbuffers::Offset SparsityParameters::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSparsityParameters(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSparsityParameters(flatbuffers::FlatBufferBuilder &_fbb, const SparsityParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SparsityParametersT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _traversal_order = _o->traversal_order.size() ? _fbb.CreateVector(_o->traversal_order) : 0; - auto _block_map = _o->block_map.size() ? _fbb.CreateVector(_o->block_map) : 0; - auto _dim_metadata = _o->dim_metadata.size() ? _fbb.CreateVector> (_o->dim_metadata.size(), [](size_t i, _VectorArgs *__va) { return CreateDimensionMetadata(*__va->__fbb, __va->__o->dim_metadata[i].get(), __va->__rehasher); }, &_va ) : 0; - return tflite::CreateSparsityParameters( - _fbb, - _traversal_order, - _block_map, - _dim_metadata); -} - -inline TensorT *Tensor::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new TensorT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Tensor::UnPackTo(TensorT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = shape(); if (_e) { _o->shape.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->shape[_i] = _e->Get(_i); } } } - { auto _e = type(); _o->type = _e; } - { auto _e = buffer(); _o->buffer = _e; } - { auto _e = name(); if (_e) _o->name = _e->str(); } - { auto _e = quantization(); if (_e) _o->quantization = std::unique_ptr(_e->UnPack(_resolver)); } - { auto _e = is_variable(); _o->is_variable = _e; } - { auto _e = sparsity(); if (_e) _o->sparsity = std::unique_ptr(_e->UnPack(_resolver)); } - { auto _e = shape_signature(); if (_e) { _o->shape_signature.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->shape_signature[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Tensor::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TensorT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateTensor(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateTensor(flatbuffers::FlatBufferBuilder &_fbb, const TensorT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TensorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _shape = _o->shape.size() ? _fbb.CreateVector(_o->shape) : 0; - auto _type = _o->type; - auto _buffer = _o->buffer; - auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); - auto _quantization = _o->quantization ? CreateQuantizationParameters(_fbb, _o->quantization.get(), _rehasher) : 0; - auto _is_variable = _o->is_variable; - auto _sparsity = _o->sparsity ? CreateSparsityParameters(_fbb, _o->sparsity.get(), _rehasher) : 0; - auto _shape_signature = _o->shape_signature.size() ? _fbb.CreateVector(_o->shape_signature) : 0; - return tflite::CreateTensor( - _fbb, - _shape, - _type, - _buffer, - _name, - _quantization, - _is_variable, - _sparsity, - _shape_signature); -} - -inline Conv2DOptionsT *Conv2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new Conv2DOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Conv2DOptions::UnPackTo(Conv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = padding(); _o->padding = _e; } - { auto _e = stride_w(); _o->stride_w = _e; } - { auto _e = stride_h(); _o->stride_h = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = dilation_w_factor(); _o->dilation_w_factor = _e; } - { auto _e = dilation_h_factor(); _o->dilation_h_factor = _e; } -} - -inline flatbuffers::Offset Conv2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateConv2DOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Conv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const Conv2DOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _padding = _o->padding; - auto _stride_w = _o->stride_w; - auto _stride_h = _o->stride_h; - auto _fused_activation_function = _o->fused_activation_function; - auto _dilation_w_factor = _o->dilation_w_factor; - auto _dilation_h_factor = _o->dilation_h_factor; - return tflite::CreateConv2DOptions( - _fbb, - _padding, - _stride_w, - _stride_h, - _fused_activation_function, - _dilation_w_factor, - _dilation_h_factor); -} - -inline Pool2DOptionsT *Pool2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new Pool2DOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Pool2DOptions::UnPackTo(Pool2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = padding(); _o->padding = _e; } - { auto _e = stride_w(); _o->stride_w = _e; } - { auto _e = stride_h(); _o->stride_h = _e; } - { auto _e = filter_width(); _o->filter_width = _e; } - { auto _e = filter_height(); _o->filter_height = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset Pool2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePool2DOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePool2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const Pool2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const Pool2DOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _padding = _o->padding; - auto _stride_w = _o->stride_w; - auto _stride_h = _o->stride_h; - auto _filter_width = _o->filter_width; - auto _filter_height = _o->filter_height; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreatePool2DOptions( - _fbb, - _padding, - _stride_w, - _stride_h, - _filter_width, - _filter_height, - _fused_activation_function); -} - -inline DepthwiseConv2DOptionsT *DepthwiseConv2DOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DepthwiseConv2DOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DepthwiseConv2DOptions::UnPackTo(DepthwiseConv2DOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = padding(); _o->padding = _e; } - { auto _e = stride_w(); _o->stride_w = _e; } - { auto _e = stride_h(); _o->stride_h = _e; } - { auto _e = depth_multiplier(); _o->depth_multiplier = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = dilation_w_factor(); _o->dilation_w_factor = _e; } - { auto _e = dilation_h_factor(); _o->dilation_h_factor = _e; } -} - -inline flatbuffers::Offset DepthwiseConv2DOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDepthwiseConv2DOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDepthwiseConv2DOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthwiseConv2DOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DepthwiseConv2DOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _padding = _o->padding; - auto _stride_w = _o->stride_w; - auto _stride_h = _o->stride_h; - auto _depth_multiplier = _o->depth_multiplier; - auto _fused_activation_function = _o->fused_activation_function; - auto _dilation_w_factor = _o->dilation_w_factor; - auto _dilation_h_factor = _o->dilation_h_factor; - return tflite::CreateDepthwiseConv2DOptions( - _fbb, - _padding, - _stride_w, - _stride_h, - _depth_multiplier, - _fused_activation_function, - _dilation_w_factor, - _dilation_h_factor); -} - -inline ConcatEmbeddingsOptionsT *ConcatEmbeddingsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ConcatEmbeddingsOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ConcatEmbeddingsOptions::UnPackTo(ConcatEmbeddingsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = num_channels(); _o->num_channels = _e; } - { auto _e = num_columns_per_channel(); if (_e) { _o->num_columns_per_channel.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->num_columns_per_channel[_i] = _e->Get(_i); } } } - { auto _e = embedding_dim_per_channel(); if (_e) { _o->embedding_dim_per_channel.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->embedding_dim_per_channel[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset ConcatEmbeddingsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateConcatEmbeddingsOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateConcatEmbeddingsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatEmbeddingsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ConcatEmbeddingsOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _num_channels = _o->num_channels; - auto _num_columns_per_channel = _o->num_columns_per_channel.size() ? _fbb.CreateVector(_o->num_columns_per_channel) : 0; - auto _embedding_dim_per_channel = _o->embedding_dim_per_channel.size() ? _fbb.CreateVector(_o->embedding_dim_per_channel) : 0; - return tflite::CreateConcatEmbeddingsOptions( - _fbb, - _num_channels, - _num_columns_per_channel, - _embedding_dim_per_channel); -} - -inline LSHProjectionOptionsT *LSHProjectionOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LSHProjectionOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LSHProjectionOptions::UnPackTo(LSHProjectionOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = type(); _o->type = _e; } -} - -inline flatbuffers::Offset LSHProjectionOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLSHProjectionOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLSHProjectionOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSHProjectionOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LSHProjectionOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _type = _o->type; - return tflite::CreateLSHProjectionOptions( - _fbb, - _type); -} - -inline SVDFOptionsT *SVDFOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SVDFOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SVDFOptions::UnPackTo(SVDFOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = rank(); _o->rank = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset SVDFOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSVDFOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSVDFOptions(flatbuffers::FlatBufferBuilder &_fbb, const SVDFOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SVDFOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _rank = _o->rank; - auto _fused_activation_function = _o->fused_activation_function; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateSVDFOptions( - _fbb, - _rank, - _fused_activation_function, - _asymmetric_quantize_inputs); -} - -inline RNNOptionsT *RNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new RNNOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void RNNOptions::UnPackTo(RNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset RNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateRNNOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const RNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const RNNOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateRNNOptions( - _fbb, - _fused_activation_function, - _asymmetric_quantize_inputs); -} - -inline SequenceRNNOptionsT *SequenceRNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SequenceRNNOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SequenceRNNOptions::UnPackTo(SequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = time_major(); _o->time_major = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset SequenceRNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSequenceRNNOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const SequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SequenceRNNOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _time_major = _o->time_major; - auto _fused_activation_function = _o->fused_activation_function; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateSequenceRNNOptions( - _fbb, - _time_major, - _fused_activation_function, - _asymmetric_quantize_inputs); -} - -inline BidirectionalSequenceRNNOptionsT *BidirectionalSequenceRNNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new BidirectionalSequenceRNNOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void BidirectionalSequenceRNNOptions::UnPackTo(BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = time_major(); _o->time_major = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = merge_outputs(); _o->merge_outputs = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset BidirectionalSequenceRNNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateBidirectionalSequenceRNNOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateBidirectionalSequenceRNNOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceRNNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BidirectionalSequenceRNNOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _time_major = _o->time_major; - auto _fused_activation_function = _o->fused_activation_function; - auto _merge_outputs = _o->merge_outputs; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateBidirectionalSequenceRNNOptions( - _fbb, - _time_major, - _fused_activation_function, - _merge_outputs, - _asymmetric_quantize_inputs); -} - -inline FullyConnectedOptionsT *FullyConnectedOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new FullyConnectedOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void FullyConnectedOptions::UnPackTo(FullyConnectedOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = weights_format(); _o->weights_format = _e; } - { auto _e = keep_num_dims(); _o->keep_num_dims = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset FullyConnectedOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateFullyConnectedOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateFullyConnectedOptions(flatbuffers::FlatBufferBuilder &_fbb, const FullyConnectedOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FullyConnectedOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - auto _weights_format = _o->weights_format; - auto _keep_num_dims = _o->keep_num_dims; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateFullyConnectedOptions( - _fbb, - _fused_activation_function, - _weights_format, - _keep_num_dims, - _asymmetric_quantize_inputs); -} - -inline SoftmaxOptionsT *SoftmaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SoftmaxOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SoftmaxOptions::UnPackTo(SoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = beta(); _o->beta = _e; } -} - -inline flatbuffers::Offset SoftmaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSoftmaxOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const SoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SoftmaxOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _beta = _o->beta; - return tflite::CreateSoftmaxOptions( - _fbb, - _beta); -} - -inline ConcatenationOptionsT *ConcatenationOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ConcatenationOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ConcatenationOptions::UnPackTo(ConcatenationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = axis(); _o->axis = _e; } - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset ConcatenationOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateConcatenationOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateConcatenationOptions(flatbuffers::FlatBufferBuilder &_fbb, const ConcatenationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ConcatenationOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _axis = _o->axis; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateConcatenationOptions( - _fbb, - _axis, - _fused_activation_function); -} - -inline AddOptionsT *AddOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new AddOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void AddOptions::UnPackTo(AddOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset AddOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateAddOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateAddOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const AddOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateAddOptions( - _fbb, - _fused_activation_function); -} - -inline MulOptionsT *MulOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MulOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void MulOptions::UnPackTo(MulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset MulOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMulOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const MulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MulOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateMulOptions( - _fbb, - _fused_activation_function); -} - -inline L2NormOptionsT *L2NormOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new L2NormOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void L2NormOptions::UnPackTo(L2NormOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset L2NormOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateL2NormOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateL2NormOptions(flatbuffers::FlatBufferBuilder &_fbb, const L2NormOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const L2NormOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateL2NormOptions( - _fbb, - _fused_activation_function); -} - -inline LocalResponseNormalizationOptionsT *LocalResponseNormalizationOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LocalResponseNormalizationOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LocalResponseNormalizationOptions::UnPackTo(LocalResponseNormalizationOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = radius(); _o->radius = _e; } - { auto _e = bias(); _o->bias = _e; } - { auto _e = alpha(); _o->alpha = _e; } - { auto _e = beta(); _o->beta = _e; } -} - -inline flatbuffers::Offset LocalResponseNormalizationOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLocalResponseNormalizationOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLocalResponseNormalizationOptions(flatbuffers::FlatBufferBuilder &_fbb, const LocalResponseNormalizationOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LocalResponseNormalizationOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _radius = _o->radius; - auto _bias = _o->bias; - auto _alpha = _o->alpha; - auto _beta = _o->beta; - return tflite::CreateLocalResponseNormalizationOptions( - _fbb, - _radius, - _bias, - _alpha, - _beta); -} - -inline LSTMOptionsT *LSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LSTMOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LSTMOptions::UnPackTo(LSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = cell_clip(); _o->cell_clip = _e; } - { auto _e = proj_clip(); _o->proj_clip = _e; } - { auto _e = kernel_type(); _o->kernel_type = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset LSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLSTMOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const LSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LSTMOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - auto _cell_clip = _o->cell_clip; - auto _proj_clip = _o->proj_clip; - auto _kernel_type = _o->kernel_type; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateLSTMOptions( - _fbb, - _fused_activation_function, - _cell_clip, - _proj_clip, - _kernel_type, - _asymmetric_quantize_inputs); -} - -inline UnidirectionalSequenceLSTMOptionsT *UnidirectionalSequenceLSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new UnidirectionalSequenceLSTMOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void UnidirectionalSequenceLSTMOptions::UnPackTo(UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = cell_clip(); _o->cell_clip = _e; } - { auto _e = proj_clip(); _o->proj_clip = _e; } - { auto _e = time_major(); _o->time_major = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset UnidirectionalSequenceLSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateUnidirectionalSequenceLSTMOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateUnidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const UnidirectionalSequenceLSTMOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - auto _cell_clip = _o->cell_clip; - auto _proj_clip = _o->proj_clip; - auto _time_major = _o->time_major; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateUnidirectionalSequenceLSTMOptions( - _fbb, - _fused_activation_function, - _cell_clip, - _proj_clip, - _time_major, - _asymmetric_quantize_inputs); -} - -inline BidirectionalSequenceLSTMOptionsT *BidirectionalSequenceLSTMOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new BidirectionalSequenceLSTMOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void BidirectionalSequenceLSTMOptions::UnPackTo(BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } - { auto _e = cell_clip(); _o->cell_clip = _e; } - { auto _e = proj_clip(); _o->proj_clip = _e; } - { auto _e = merge_outputs(); _o->merge_outputs = _e; } - { auto _e = time_major(); _o->time_major = _e; } - { auto _e = asymmetric_quantize_inputs(); _o->asymmetric_quantize_inputs = _e; } -} - -inline flatbuffers::Offset BidirectionalSequenceLSTMOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateBidirectionalSequenceLSTMOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateBidirectionalSequenceLSTMOptions(flatbuffers::FlatBufferBuilder &_fbb, const BidirectionalSequenceLSTMOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BidirectionalSequenceLSTMOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - auto _cell_clip = _o->cell_clip; - auto _proj_clip = _o->proj_clip; - auto _merge_outputs = _o->merge_outputs; - auto _time_major = _o->time_major; - auto _asymmetric_quantize_inputs = _o->asymmetric_quantize_inputs; - return tflite::CreateBidirectionalSequenceLSTMOptions( - _fbb, - _fused_activation_function, - _cell_clip, - _proj_clip, - _merge_outputs, - _time_major, - _asymmetric_quantize_inputs); -} - -inline ResizeBilinearOptionsT *ResizeBilinearOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ResizeBilinearOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ResizeBilinearOptions::UnPackTo(ResizeBilinearOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = align_corners(); _o->align_corners = _e; } - { auto _e = half_pixel_centers(); _o->half_pixel_centers = _e; } -} - -inline flatbuffers::Offset ResizeBilinearOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateResizeBilinearOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateResizeBilinearOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeBilinearOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ResizeBilinearOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _align_corners = _o->align_corners; - auto _half_pixel_centers = _o->half_pixel_centers; - return tflite::CreateResizeBilinearOptions( - _fbb, - _align_corners, - _half_pixel_centers); -} - -inline ResizeNearestNeighborOptionsT *ResizeNearestNeighborOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ResizeNearestNeighborOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ResizeNearestNeighborOptions::UnPackTo(ResizeNearestNeighborOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = align_corners(); _o->align_corners = _e; } - { auto _e = half_pixel_centers(); _o->half_pixel_centers = _e; } -} - -inline flatbuffers::Offset ResizeNearestNeighborOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateResizeNearestNeighborOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateResizeNearestNeighborOptions(flatbuffers::FlatBufferBuilder &_fbb, const ResizeNearestNeighborOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ResizeNearestNeighborOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _align_corners = _o->align_corners; - auto _half_pixel_centers = _o->half_pixel_centers; - return tflite::CreateResizeNearestNeighborOptions( - _fbb, - _align_corners, - _half_pixel_centers); -} - -inline CallOptionsT *CallOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new CallOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void CallOptions::UnPackTo(CallOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = subgraph(); _o->subgraph = _e; } -} - -inline flatbuffers::Offset CallOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateCallOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateCallOptions(flatbuffers::FlatBufferBuilder &_fbb, const CallOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CallOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _subgraph = _o->subgraph; - return tflite::CreateCallOptions( - _fbb, - _subgraph); -} - -inline PadOptionsT *PadOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new PadOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void PadOptions::UnPackTo(PadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset PadOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePadOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePadOptions(flatbuffers::FlatBufferBuilder &_fbb, const PadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PadOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreatePadOptions( - _fbb); -} - -inline PadV2OptionsT *PadV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new PadV2OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void PadV2Options::UnPackTo(PadV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset PadV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePadV2Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePadV2Options(flatbuffers::FlatBufferBuilder &_fbb, const PadV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PadV2OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreatePadV2Options( - _fbb); -} - -inline ReshapeOptionsT *ReshapeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ReshapeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ReshapeOptions::UnPackTo(ReshapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = new_shape(); if (_e) { _o->new_shape.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->new_shape[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset ReshapeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateReshapeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateReshapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReshapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ReshapeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _new_shape = _o->new_shape.size() ? _fbb.CreateVector(_o->new_shape) : 0; - return tflite::CreateReshapeOptions( - _fbb, - _new_shape); -} - -inline SpaceToBatchNDOptionsT *SpaceToBatchNDOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SpaceToBatchNDOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SpaceToBatchNDOptions::UnPackTo(SpaceToBatchNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SpaceToBatchNDOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSpaceToBatchNDOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSpaceToBatchNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToBatchNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SpaceToBatchNDOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSpaceToBatchNDOptions( - _fbb); -} - -inline BatchToSpaceNDOptionsT *BatchToSpaceNDOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new BatchToSpaceNDOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void BatchToSpaceNDOptions::UnPackTo(BatchToSpaceNDOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset BatchToSpaceNDOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateBatchToSpaceNDOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateBatchToSpaceNDOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchToSpaceNDOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BatchToSpaceNDOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateBatchToSpaceNDOptions( - _fbb); -} - -inline SkipGramOptionsT *SkipGramOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SkipGramOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SkipGramOptions::UnPackTo(SkipGramOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = ngram_size(); _o->ngram_size = _e; } - { auto _e = max_skip_size(); _o->max_skip_size = _e; } - { auto _e = include_all_ngrams(); _o->include_all_ngrams = _e; } -} - -inline flatbuffers::Offset SkipGramOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSkipGramOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSkipGramOptions(flatbuffers::FlatBufferBuilder &_fbb, const SkipGramOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SkipGramOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _ngram_size = _o->ngram_size; - auto _max_skip_size = _o->max_skip_size; - auto _include_all_ngrams = _o->include_all_ngrams; - return tflite::CreateSkipGramOptions( - _fbb, - _ngram_size, - _max_skip_size, - _include_all_ngrams); -} - -inline SpaceToDepthOptionsT *SpaceToDepthOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SpaceToDepthOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SpaceToDepthOptions::UnPackTo(SpaceToDepthOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = block_size(); _o->block_size = _e; } -} - -inline flatbuffers::Offset SpaceToDepthOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSpaceToDepthOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSpaceToDepthOptions(flatbuffers::FlatBufferBuilder &_fbb, const SpaceToDepthOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SpaceToDepthOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _block_size = _o->block_size; - return tflite::CreateSpaceToDepthOptions( - _fbb, - _block_size); -} - -inline DepthToSpaceOptionsT *DepthToSpaceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DepthToSpaceOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DepthToSpaceOptions::UnPackTo(DepthToSpaceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = block_size(); _o->block_size = _e; } -} - -inline flatbuffers::Offset DepthToSpaceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDepthToSpaceOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDepthToSpaceOptions(flatbuffers::FlatBufferBuilder &_fbb, const DepthToSpaceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DepthToSpaceOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _block_size = _o->block_size; - return tflite::CreateDepthToSpaceOptions( - _fbb, - _block_size); -} - -inline SubOptionsT *SubOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SubOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SubOptions::UnPackTo(SubOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset SubOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSubOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSubOptions(flatbuffers::FlatBufferBuilder &_fbb, const SubOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SubOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateSubOptions( - _fbb, - _fused_activation_function); -} - -inline DivOptionsT *DivOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DivOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DivOptions::UnPackTo(DivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = fused_activation_function(); _o->fused_activation_function = _e; } -} - -inline flatbuffers::Offset DivOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDivOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const DivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DivOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _fused_activation_function = _o->fused_activation_function; - return tflite::CreateDivOptions( - _fbb, - _fused_activation_function); -} - -inline TopKV2OptionsT *TopKV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new TopKV2OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void TopKV2Options::UnPackTo(TopKV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset TopKV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateTopKV2Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateTopKV2Options(flatbuffers::FlatBufferBuilder &_fbb, const TopKV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TopKV2OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateTopKV2Options( - _fbb); -} - -inline EmbeddingLookupSparseOptionsT *EmbeddingLookupSparseOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new EmbeddingLookupSparseOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void EmbeddingLookupSparseOptions::UnPackTo(EmbeddingLookupSparseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = combiner(); _o->combiner = _e; } -} - -inline flatbuffers::Offset EmbeddingLookupSparseOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateEmbeddingLookupSparseOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateEmbeddingLookupSparseOptions(flatbuffers::FlatBufferBuilder &_fbb, const EmbeddingLookupSparseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const EmbeddingLookupSparseOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _combiner = _o->combiner; - return tflite::CreateEmbeddingLookupSparseOptions( - _fbb, - _combiner); -} - -inline GatherOptionsT *GatherOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new GatherOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void GatherOptions::UnPackTo(GatherOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = axis(); _o->axis = _e; } -} - -inline flatbuffers::Offset GatherOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateGatherOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateGatherOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const GatherOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _axis = _o->axis; - return tflite::CreateGatherOptions( - _fbb, - _axis); -} - -inline TransposeOptionsT *TransposeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new TransposeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void TransposeOptions::UnPackTo(TransposeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset TransposeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateTransposeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateTransposeOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TransposeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateTransposeOptions( - _fbb); -} - -inline ExpOptionsT *ExpOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ExpOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ExpOptions::UnPackTo(ExpOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset ExpOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateExpOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateExpOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ExpOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateExpOptions( - _fbb); -} - -inline CosOptionsT *CosOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new CosOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void CosOptions::UnPackTo(CosOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset CosOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateCosOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateCosOptions(flatbuffers::FlatBufferBuilder &_fbb, const CosOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CosOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateCosOptions( - _fbb); -} - -inline ReducerOptionsT *ReducerOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ReducerOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ReducerOptions::UnPackTo(ReducerOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = keep_dims(); _o->keep_dims = _e; } -} - -inline flatbuffers::Offset ReducerOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateReducerOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateReducerOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReducerOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ReducerOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _keep_dims = _o->keep_dims; - return tflite::CreateReducerOptions( - _fbb, - _keep_dims); -} - -inline SqueezeOptionsT *SqueezeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SqueezeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SqueezeOptions::UnPackTo(SqueezeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = squeeze_dims(); if (_e) { _o->squeeze_dims.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->squeeze_dims[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset SqueezeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSqueezeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSqueezeOptions(flatbuffers::FlatBufferBuilder &_fbb, const SqueezeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SqueezeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _squeeze_dims = _o->squeeze_dims.size() ? _fbb.CreateVector(_o->squeeze_dims) : 0; - return tflite::CreateSqueezeOptions( - _fbb, - _squeeze_dims); -} - -inline SplitOptionsT *SplitOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SplitOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SplitOptions::UnPackTo(SplitOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = num_splits(); _o->num_splits = _e; } -} - -inline flatbuffers::Offset SplitOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSplitOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSplitOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SplitOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _num_splits = _o->num_splits; - return tflite::CreateSplitOptions( - _fbb, - _num_splits); -} - -inline SplitVOptionsT *SplitVOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SplitVOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SplitVOptions::UnPackTo(SplitVOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = num_splits(); _o->num_splits = _e; } -} - -inline flatbuffers::Offset SplitVOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSplitVOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSplitVOptions(flatbuffers::FlatBufferBuilder &_fbb, const SplitVOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SplitVOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _num_splits = _o->num_splits; - return tflite::CreateSplitVOptions( - _fbb, - _num_splits); -} - -inline StridedSliceOptionsT *StridedSliceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new StridedSliceOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void StridedSliceOptions::UnPackTo(StridedSliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = begin_mask(); _o->begin_mask = _e; } - { auto _e = end_mask(); _o->end_mask = _e; } - { auto _e = ellipsis_mask(); _o->ellipsis_mask = _e; } - { auto _e = new_axis_mask(); _o->new_axis_mask = _e; } - { auto _e = shrink_axis_mask(); _o->shrink_axis_mask = _e; } -} - -inline flatbuffers::Offset StridedSliceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateStridedSliceOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateStridedSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const StridedSliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const StridedSliceOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _begin_mask = _o->begin_mask; - auto _end_mask = _o->end_mask; - auto _ellipsis_mask = _o->ellipsis_mask; - auto _new_axis_mask = _o->new_axis_mask; - auto _shrink_axis_mask = _o->shrink_axis_mask; - return tflite::CreateStridedSliceOptions( - _fbb, - _begin_mask, - _end_mask, - _ellipsis_mask, - _new_axis_mask, - _shrink_axis_mask); -} - -inline LogSoftmaxOptionsT *LogSoftmaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LogSoftmaxOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LogSoftmaxOptions::UnPackTo(LogSoftmaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LogSoftmaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLogSoftmaxOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLogSoftmaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogSoftmaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LogSoftmaxOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLogSoftmaxOptions( - _fbb); -} - -inline CastOptionsT *CastOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new CastOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void CastOptions::UnPackTo(CastOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = in_data_type(); _o->in_data_type = _e; } - { auto _e = out_data_type(); _o->out_data_type = _e; } -} - -inline flatbuffers::Offset CastOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateCastOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateCastOptions(flatbuffers::FlatBufferBuilder &_fbb, const CastOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const CastOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _in_data_type = _o->in_data_type; - auto _out_data_type = _o->out_data_type; - return tflite::CreateCastOptions( - _fbb, - _in_data_type, - _out_data_type); -} - -inline DequantizeOptionsT *DequantizeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DequantizeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DequantizeOptions::UnPackTo(DequantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset DequantizeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDequantizeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDequantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const DequantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DequantizeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateDequantizeOptions( - _fbb); -} - -inline MaximumMinimumOptionsT *MaximumMinimumOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MaximumMinimumOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void MaximumMinimumOptions::UnPackTo(MaximumMinimumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset MaximumMinimumOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMaximumMinimumOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMaximumMinimumOptions(flatbuffers::FlatBufferBuilder &_fbb, const MaximumMinimumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MaximumMinimumOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateMaximumMinimumOptions( - _fbb); -} - -inline TileOptionsT *TileOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new TileOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void TileOptions::UnPackTo(TileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset TileOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateTileOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateTileOptions(flatbuffers::FlatBufferBuilder &_fbb, const TileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TileOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateTileOptions( - _fbb); -} - -inline ArgMaxOptionsT *ArgMaxOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ArgMaxOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ArgMaxOptions::UnPackTo(ArgMaxOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = output_type(); _o->output_type = _e; } -} - -inline flatbuffers::Offset ArgMaxOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateArgMaxOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateArgMaxOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMaxOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ArgMaxOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _output_type = _o->output_type; - return tflite::CreateArgMaxOptions( - _fbb, - _output_type); -} - -inline ArgMinOptionsT *ArgMinOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ArgMinOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ArgMinOptions::UnPackTo(ArgMinOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = output_type(); _o->output_type = _e; } -} - -inline flatbuffers::Offset ArgMinOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateArgMinOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateArgMinOptions(flatbuffers::FlatBufferBuilder &_fbb, const ArgMinOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ArgMinOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _output_type = _o->output_type; - return tflite::CreateArgMinOptions( - _fbb, - _output_type); -} - -inline GreaterOptionsT *GreaterOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new GreaterOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void GreaterOptions::UnPackTo(GreaterOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset GreaterOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateGreaterOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateGreaterOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const GreaterOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateGreaterOptions( - _fbb); -} - -inline GreaterEqualOptionsT *GreaterEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new GreaterEqualOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void GreaterEqualOptions::UnPackTo(GreaterEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset GreaterEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateGreaterEqualOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateGreaterEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const GreaterEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const GreaterEqualOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateGreaterEqualOptions( - _fbb); -} - -inline LessOptionsT *LessOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LessOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LessOptions::UnPackTo(LessOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LessOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLessOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLessOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LessOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLessOptions( - _fbb); -} - -inline LessEqualOptionsT *LessEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LessEqualOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LessEqualOptions::UnPackTo(LessEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LessEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLessEqualOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLessEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const LessEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LessEqualOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLessEqualOptions( - _fbb); -} - -inline NegOptionsT *NegOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new NegOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void NegOptions::UnPackTo(NegOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset NegOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateNegOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateNegOptions(flatbuffers::FlatBufferBuilder &_fbb, const NegOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const NegOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateNegOptions( - _fbb); -} - -inline SelectOptionsT *SelectOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SelectOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SelectOptions::UnPackTo(SelectOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SelectOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSelectOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSelectOptions(flatbuffers::FlatBufferBuilder &_fbb, const SelectOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SelectOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSelectOptions( - _fbb); -} - -inline SliceOptionsT *SliceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SliceOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SliceOptions::UnPackTo(SliceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SliceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSliceOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSliceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SliceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SliceOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSliceOptions( - _fbb); -} - -inline TransposeConvOptionsT *TransposeConvOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new TransposeConvOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void TransposeConvOptions::UnPackTo(TransposeConvOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = padding(); _o->padding = _e; } - { auto _e = stride_w(); _o->stride_w = _e; } - { auto _e = stride_h(); _o->stride_h = _e; } -} - -inline flatbuffers::Offset TransposeConvOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateTransposeConvOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateTransposeConvOptions(flatbuffers::FlatBufferBuilder &_fbb, const TransposeConvOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const TransposeConvOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _padding = _o->padding; - auto _stride_w = _o->stride_w; - auto _stride_h = _o->stride_h; - return tflite::CreateTransposeConvOptions( - _fbb, - _padding, - _stride_w, - _stride_h); -} - -inline ExpandDimsOptionsT *ExpandDimsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ExpandDimsOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ExpandDimsOptions::UnPackTo(ExpandDimsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset ExpandDimsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateExpandDimsOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateExpandDimsOptions(flatbuffers::FlatBufferBuilder &_fbb, const ExpandDimsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ExpandDimsOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateExpandDimsOptions( - _fbb); -} - -inline SparseToDenseOptionsT *SparseToDenseOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SparseToDenseOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SparseToDenseOptions::UnPackTo(SparseToDenseOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = validate_indices(); _o->validate_indices = _e; } -} - -inline flatbuffers::Offset SparseToDenseOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSparseToDenseOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSparseToDenseOptions(flatbuffers::FlatBufferBuilder &_fbb, const SparseToDenseOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SparseToDenseOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _validate_indices = _o->validate_indices; - return tflite::CreateSparseToDenseOptions( - _fbb, - _validate_indices); -} - -inline EqualOptionsT *EqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new EqualOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void EqualOptions::UnPackTo(EqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset EqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateEqualOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const EqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const EqualOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateEqualOptions( - _fbb); -} - -inline NotEqualOptionsT *NotEqualOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new NotEqualOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void NotEqualOptions::UnPackTo(NotEqualOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset NotEqualOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateNotEqualOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateNotEqualOptions(flatbuffers::FlatBufferBuilder &_fbb, const NotEqualOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const NotEqualOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateNotEqualOptions( - _fbb); -} - -inline ShapeOptionsT *ShapeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ShapeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ShapeOptions::UnPackTo(ShapeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = out_type(); _o->out_type = _e; } -} - -inline flatbuffers::Offset ShapeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateShapeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateShapeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ShapeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ShapeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _out_type = _o->out_type; - return tflite::CreateShapeOptions( - _fbb, - _out_type); -} - -inline RankOptionsT *RankOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new RankOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void RankOptions::UnPackTo(RankOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset RankOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateRankOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateRankOptions(flatbuffers::FlatBufferBuilder &_fbb, const RankOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const RankOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateRankOptions( - _fbb); -} - -inline PowOptionsT *PowOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new PowOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void PowOptions::UnPackTo(PowOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset PowOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePowOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePowOptions(flatbuffers::FlatBufferBuilder &_fbb, const PowOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PowOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreatePowOptions( - _fbb); -} - -inline FakeQuantOptionsT *FakeQuantOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new FakeQuantOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void FakeQuantOptions::UnPackTo(FakeQuantOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = min(); _o->min = _e; } - { auto _e = max(); _o->max = _e; } - { auto _e = num_bits(); _o->num_bits = _e; } - { auto _e = narrow_range(); _o->narrow_range = _e; } -} - -inline flatbuffers::Offset FakeQuantOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateFakeQuantOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateFakeQuantOptions(flatbuffers::FlatBufferBuilder &_fbb, const FakeQuantOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FakeQuantOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _min = _o->min; - auto _max = _o->max; - auto _num_bits = _o->num_bits; - auto _narrow_range = _o->narrow_range; - return tflite::CreateFakeQuantOptions( - _fbb, - _min, - _max, - _num_bits, - _narrow_range); -} - -inline PackOptionsT *PackOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new PackOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void PackOptions::UnPackTo(PackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = values_count(); _o->values_count = _e; } - { auto _e = axis(); _o->axis = _e; } -} - -inline flatbuffers::Offset PackOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreatePackOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreatePackOptions(flatbuffers::FlatBufferBuilder &_fbb, const PackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const PackOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _values_count = _o->values_count; - auto _axis = _o->axis; - return tflite::CreatePackOptions( - _fbb, - _values_count, - _axis); -} - -inline LogicalOrOptionsT *LogicalOrOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LogicalOrOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LogicalOrOptions::UnPackTo(LogicalOrOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LogicalOrOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLogicalOrOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLogicalOrOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalOrOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LogicalOrOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLogicalOrOptions( - _fbb); -} - -inline OneHotOptionsT *OneHotOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new OneHotOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void OneHotOptions::UnPackTo(OneHotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = axis(); _o->axis = _e; } -} - -inline flatbuffers::Offset OneHotOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateOneHotOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateOneHotOptions(flatbuffers::FlatBufferBuilder &_fbb, const OneHotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const OneHotOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _axis = _o->axis; - return tflite::CreateOneHotOptions( - _fbb, - _axis); -} - -inline AbsOptionsT *AbsOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new AbsOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void AbsOptions::UnPackTo(AbsOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset AbsOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateAbsOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateAbsOptions(flatbuffers::FlatBufferBuilder &_fbb, const AbsOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const AbsOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateAbsOptions( - _fbb); -} - -inline HardSwishOptionsT *HardSwishOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new HardSwishOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void HardSwishOptions::UnPackTo(HardSwishOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset HardSwishOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateHardSwishOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateHardSwishOptions(flatbuffers::FlatBufferBuilder &_fbb, const HardSwishOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const HardSwishOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateHardSwishOptions( - _fbb); -} - -inline LogicalAndOptionsT *LogicalAndOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LogicalAndOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LogicalAndOptions::UnPackTo(LogicalAndOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LogicalAndOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLogicalAndOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLogicalAndOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalAndOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LogicalAndOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLogicalAndOptions( - _fbb); -} - -inline LogicalNotOptionsT *LogicalNotOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LogicalNotOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LogicalNotOptions::UnPackTo(LogicalNotOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset LogicalNotOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLogicalNotOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLogicalNotOptions(flatbuffers::FlatBufferBuilder &_fbb, const LogicalNotOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LogicalNotOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateLogicalNotOptions( - _fbb); -} - -inline UnpackOptionsT *UnpackOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new UnpackOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void UnpackOptions::UnPackTo(UnpackOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = num(); _o->num = _e; } - { auto _e = axis(); _o->axis = _e; } -} - -inline flatbuffers::Offset UnpackOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateUnpackOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateUnpackOptions(flatbuffers::FlatBufferBuilder &_fbb, const UnpackOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const UnpackOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _num = _o->num; - auto _axis = _o->axis; - return tflite::CreateUnpackOptions( - _fbb, - _num, - _axis); -} - -inline FloorDivOptionsT *FloorDivOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new FloorDivOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void FloorDivOptions::UnPackTo(FloorDivOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset FloorDivOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateFloorDivOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateFloorDivOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorDivOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FloorDivOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateFloorDivOptions( - _fbb); -} - -inline SquareOptionsT *SquareOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SquareOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SquareOptions::UnPackTo(SquareOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SquareOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSquareOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSquareOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquareOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SquareOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSquareOptions( - _fbb); -} - -inline ZerosLikeOptionsT *ZerosLikeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ZerosLikeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ZerosLikeOptions::UnPackTo(ZerosLikeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset ZerosLikeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateZerosLikeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateZerosLikeOptions(flatbuffers::FlatBufferBuilder &_fbb, const ZerosLikeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ZerosLikeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateZerosLikeOptions( - _fbb); -} - -inline FillOptionsT *FillOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new FillOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void FillOptions::UnPackTo(FillOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset FillOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateFillOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateFillOptions(flatbuffers::FlatBufferBuilder &_fbb, const FillOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FillOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateFillOptions( - _fbb); -} - -inline FloorModOptionsT *FloorModOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new FloorModOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void FloorModOptions::UnPackTo(FloorModOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset FloorModOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateFloorModOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateFloorModOptions(flatbuffers::FlatBufferBuilder &_fbb, const FloorModOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const FloorModOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateFloorModOptions( - _fbb); -} - -inline RangeOptionsT *RangeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new RangeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void RangeOptions::UnPackTo(RangeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset RangeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateRangeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateRangeOptions(flatbuffers::FlatBufferBuilder &_fbb, const RangeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const RangeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateRangeOptions( - _fbb); -} - -inline LeakyReluOptionsT *LeakyReluOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new LeakyReluOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void LeakyReluOptions::UnPackTo(LeakyReluOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = alpha(); _o->alpha = _e; } -} - -inline flatbuffers::Offset LeakyReluOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateLeakyReluOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateLeakyReluOptions(flatbuffers::FlatBufferBuilder &_fbb, const LeakyReluOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const LeakyReluOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _alpha = _o->alpha; - return tflite::CreateLeakyReluOptions( - _fbb, - _alpha); -} - -inline SquaredDifferenceOptionsT *SquaredDifferenceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SquaredDifferenceOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SquaredDifferenceOptions::UnPackTo(SquaredDifferenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SquaredDifferenceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSquaredDifferenceOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSquaredDifferenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const SquaredDifferenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SquaredDifferenceOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSquaredDifferenceOptions( - _fbb); -} - -inline MirrorPadOptionsT *MirrorPadOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MirrorPadOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void MirrorPadOptions::UnPackTo(MirrorPadOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = mode(); _o->mode = _e; } -} - -inline flatbuffers::Offset MirrorPadOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMirrorPadOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMirrorPadOptions(flatbuffers::FlatBufferBuilder &_fbb, const MirrorPadOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MirrorPadOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _mode = _o->mode; - return tflite::CreateMirrorPadOptions( - _fbb, - _mode); -} - -inline UniqueOptionsT *UniqueOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new UniqueOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void UniqueOptions::UnPackTo(UniqueOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = idx_out_type(); _o->idx_out_type = _e; } -} - -inline flatbuffers::Offset UniqueOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateUniqueOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateUniqueOptions(flatbuffers::FlatBufferBuilder &_fbb, const UniqueOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const UniqueOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _idx_out_type = _o->idx_out_type; - return tflite::CreateUniqueOptions( - _fbb, - _idx_out_type); -} - -inline ReverseV2OptionsT *ReverseV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ReverseV2OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ReverseV2Options::UnPackTo(ReverseV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset ReverseV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateReverseV2Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateReverseV2Options(flatbuffers::FlatBufferBuilder &_fbb, const ReverseV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ReverseV2OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateReverseV2Options( - _fbb); -} - -inline AddNOptionsT *AddNOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new AddNOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void AddNOptions::UnPackTo(AddNOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset AddNOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateAddNOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateAddNOptions(flatbuffers::FlatBufferBuilder &_fbb, const AddNOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const AddNOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateAddNOptions( - _fbb); -} - -inline GatherNdOptionsT *GatherNdOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new GatherNdOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void GatherNdOptions::UnPackTo(GatherNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset GatherNdOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateGatherNdOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateGatherNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const GatherNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const GatherNdOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateGatherNdOptions( - _fbb); -} - -inline WhereOptionsT *WhereOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new WhereOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void WhereOptions::UnPackTo(WhereOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset WhereOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateWhereOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateWhereOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhereOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const WhereOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateWhereOptions( - _fbb); -} - -inline ReverseSequenceOptionsT *ReverseSequenceOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ReverseSequenceOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ReverseSequenceOptions::UnPackTo(ReverseSequenceOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = seq_dim(); _o->seq_dim = _e; } - { auto _e = batch_dim(); _o->batch_dim = _e; } -} - -inline flatbuffers::Offset ReverseSequenceOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateReverseSequenceOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateReverseSequenceOptions(flatbuffers::FlatBufferBuilder &_fbb, const ReverseSequenceOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ReverseSequenceOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _seq_dim = _o->seq_dim; - auto _batch_dim = _o->batch_dim; - return tflite::CreateReverseSequenceOptions( - _fbb, - _seq_dim, - _batch_dim); -} - -inline MatrixDiagOptionsT *MatrixDiagOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MatrixDiagOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void MatrixDiagOptions::UnPackTo(MatrixDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset MatrixDiagOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMatrixDiagOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMatrixDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MatrixDiagOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateMatrixDiagOptions( - _fbb); -} - -inline QuantizeOptionsT *QuantizeOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new QuantizeOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void QuantizeOptions::UnPackTo(QuantizeOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset QuantizeOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateQuantizeOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateQuantizeOptions(flatbuffers::FlatBufferBuilder &_fbb, const QuantizeOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const QuantizeOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateQuantizeOptions( - _fbb); -} - -inline MatrixSetDiagOptionsT *MatrixSetDiagOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MatrixSetDiagOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void MatrixSetDiagOptions::UnPackTo(MatrixSetDiagOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset MatrixSetDiagOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMatrixSetDiagOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMatrixSetDiagOptions(flatbuffers::FlatBufferBuilder &_fbb, const MatrixSetDiagOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MatrixSetDiagOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateMatrixSetDiagOptions( - _fbb); -} - -inline IfOptionsT *IfOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new IfOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void IfOptions::UnPackTo(IfOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = then_subgraph_index(); _o->then_subgraph_index = _e; } - { auto _e = else_subgraph_index(); _o->else_subgraph_index = _e; } -} - -inline flatbuffers::Offset IfOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateIfOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateIfOptions(flatbuffers::FlatBufferBuilder &_fbb, const IfOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const IfOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _then_subgraph_index = _o->then_subgraph_index; - auto _else_subgraph_index = _o->else_subgraph_index; - return tflite::CreateIfOptions( - _fbb, - _then_subgraph_index, - _else_subgraph_index); -} - -inline WhileOptionsT *WhileOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new WhileOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void WhileOptions::UnPackTo(WhileOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = cond_subgraph_index(); _o->cond_subgraph_index = _e; } - { auto _e = body_subgraph_index(); _o->body_subgraph_index = _e; } -} - -inline flatbuffers::Offset WhileOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateWhileOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateWhileOptions(flatbuffers::FlatBufferBuilder &_fbb, const WhileOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const WhileOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _cond_subgraph_index = _o->cond_subgraph_index; - auto _body_subgraph_index = _o->body_subgraph_index; - return tflite::CreateWhileOptions( - _fbb, - _cond_subgraph_index, - _body_subgraph_index); -} - -inline NonMaxSuppressionV4OptionsT *NonMaxSuppressionV4Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new NonMaxSuppressionV4OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void NonMaxSuppressionV4Options::UnPackTo(NonMaxSuppressionV4OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset NonMaxSuppressionV4Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateNonMaxSuppressionV4Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateNonMaxSuppressionV4Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV4OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const NonMaxSuppressionV4OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateNonMaxSuppressionV4Options( - _fbb); -} - -inline NonMaxSuppressionV5OptionsT *NonMaxSuppressionV5Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new NonMaxSuppressionV5OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void NonMaxSuppressionV5Options::UnPackTo(NonMaxSuppressionV5OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset NonMaxSuppressionV5Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateNonMaxSuppressionV5Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateNonMaxSuppressionV5Options(flatbuffers::FlatBufferBuilder &_fbb, const NonMaxSuppressionV5OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const NonMaxSuppressionV5OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateNonMaxSuppressionV5Options( - _fbb); -} - -inline ScatterNdOptionsT *ScatterNdOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ScatterNdOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void ScatterNdOptions::UnPackTo(ScatterNdOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset ScatterNdOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateScatterNdOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateScatterNdOptions(flatbuffers::FlatBufferBuilder &_fbb, const ScatterNdOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ScatterNdOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateScatterNdOptions( - _fbb); -} - -inline SelectV2OptionsT *SelectV2Options::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SelectV2OptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SelectV2Options::UnPackTo(SelectV2OptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SelectV2Options::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSelectV2Options(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSelectV2Options(flatbuffers::FlatBufferBuilder &_fbb, const SelectV2OptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SelectV2OptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSelectV2Options( - _fbb); -} - -inline DensifyOptionsT *DensifyOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new DensifyOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void DensifyOptions::UnPackTo(DensifyOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset DensifyOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateDensifyOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateDensifyOptions(flatbuffers::FlatBufferBuilder &_fbb, const DensifyOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const DensifyOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateDensifyOptions( - _fbb); -} - -inline SegmentSumOptionsT *SegmentSumOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SegmentSumOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SegmentSumOptions::UnPackTo(SegmentSumOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; -} - -inline flatbuffers::Offset SegmentSumOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSegmentSumOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSegmentSumOptions(flatbuffers::FlatBufferBuilder &_fbb, const SegmentSumOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SegmentSumOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - return tflite::CreateSegmentSumOptions( - _fbb); -} - -inline BatchMatMulOptionsT *BatchMatMulOptions::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new BatchMatMulOptionsT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void BatchMatMulOptions::UnPackTo(BatchMatMulOptionsT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = adj_x(); _o->adj_x = _e; } - { auto _e = adj_y(); _o->adj_y = _e; } -} - -inline flatbuffers::Offset BatchMatMulOptions::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateBatchMatMulOptions(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateBatchMatMulOptions(flatbuffers::FlatBufferBuilder &_fbb, const BatchMatMulOptionsT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BatchMatMulOptionsT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _adj_x = _o->adj_x; - auto _adj_y = _o->adj_y; - return tflite::CreateBatchMatMulOptions( - _fbb, - _adj_x, - _adj_y); -} - -inline OperatorCodeT *OperatorCode::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new OperatorCodeT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void OperatorCode::UnPackTo(OperatorCodeT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = builtin_code(); _o->builtin_code = _e; } - { auto _e = custom_code(); if (_e) _o->custom_code = _e->str(); } - { auto _e = version(); _o->version = _e; } -} - -inline flatbuffers::Offset OperatorCode::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateOperatorCode(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateOperatorCode(flatbuffers::FlatBufferBuilder &_fbb, const OperatorCodeT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const OperatorCodeT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _builtin_code = _o->builtin_code; - auto _custom_code = _o->custom_code.empty() ? 0 : _fbb.CreateString(_o->custom_code); - auto _version = _o->version; - return tflite::CreateOperatorCode( - _fbb, - _builtin_code, - _custom_code, - _version); -} - -inline OperatorT *Operator::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new OperatorT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Operator::UnPackTo(OperatorT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = opcode_index(); _o->opcode_index = _e; } - { auto _e = inputs(); if (_e) { _o->inputs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->inputs[_i] = _e->Get(_i); } } } - { auto _e = outputs(); if (_e) { _o->outputs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->outputs[_i] = _e->Get(_i); } } } - { auto _e = builtin_options_type(); _o->builtin_options.type = _e; } - { auto _e = builtin_options(); if (_e) _o->builtin_options.value = tflite::BuiltinOptionsUnion::UnPack(_e, builtin_options_type(), _resolver); } - { auto _e = custom_options(); if (_e) { _o->custom_options.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->custom_options[_i] = _e->Get(_i); } } } - { auto _e = custom_options_format(); _o->custom_options_format = _e; } - { auto _e = mutating_variable_inputs(); if (_e) { _o->mutating_variable_inputs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->mutating_variable_inputs[_i] = _e->Get(_i) != 0; } } } - { auto _e = intermediates(); if (_e) { _o->intermediates.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->intermediates[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Operator::Pack(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateOperator(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateOperator(flatbuffers::FlatBufferBuilder &_fbb, const OperatorT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const OperatorT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _opcode_index = _o->opcode_index; - auto _inputs = _o->inputs.size() ? _fbb.CreateVector(_o->inputs) : 0; - auto _outputs = _o->outputs.size() ? _fbb.CreateVector(_o->outputs) : 0; - auto _builtin_options_type = _o->builtin_options.type; - auto _builtin_options = _o->builtin_options.Pack(_fbb); - auto _custom_options = _o->custom_options.size() ? _fbb.CreateVector(_o->custom_options) : 0; - auto _custom_options_format = _o->custom_options_format; - auto _mutating_variable_inputs = _o->mutating_variable_inputs.size() ? _fbb.CreateVector(_o->mutating_variable_inputs) : 0; - auto _intermediates = _o->intermediates.size() ? _fbb.CreateVector(_o->intermediates) : 0; - return tflite::CreateOperator( - _fbb, - _opcode_index, - _inputs, - _outputs, - _builtin_options_type, - _builtin_options, - _custom_options, - _custom_options_format, - _mutating_variable_inputs, - _intermediates); -} - -inline SubGraphT *SubGraph::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new SubGraphT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void SubGraph::UnPackTo(SubGraphT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = tensors(); if (_e) { _o->tensors.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->tensors[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } - { auto _e = inputs(); if (_e) { _o->inputs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->inputs[_i] = _e->Get(_i); } } } - { auto _e = outputs(); if (_e) { _o->outputs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->outputs[_i] = _e->Get(_i); } } } - { auto _e = operators(); if (_e) { _o->operators.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->operators[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } - { auto _e = name(); if (_e) _o->name = _e->str(); } -} - -inline flatbuffers::Offset SubGraph::Pack(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateSubGraph(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateSubGraph(flatbuffers::FlatBufferBuilder &_fbb, const SubGraphT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const SubGraphT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _tensors = _o->tensors.size() ? _fbb.CreateVector> (_o->tensors.size(), [](size_t i, _VectorArgs *__va) { return CreateTensor(*__va->__fbb, __va->__o->tensors[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _inputs = _o->inputs.size() ? _fbb.CreateVector(_o->inputs) : 0; - auto _outputs = _o->outputs.size() ? _fbb.CreateVector(_o->outputs) : 0; - auto _operators = _o->operators.size() ? _fbb.CreateVector> (_o->operators.size(), [](size_t i, _VectorArgs *__va) { return CreateOperator(*__va->__fbb, __va->__o->operators[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); - return tflite::CreateSubGraph( - _fbb, - _tensors, - _inputs, - _outputs, - _operators, - _name); -} - -inline BufferT *Buffer::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new BufferT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Buffer::UnPackTo(BufferT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = data(); if (_e) { _o->data.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->data[_i] = _e->Get(_i); } } } -} - -inline flatbuffers::Offset Buffer::Pack(flatbuffers::FlatBufferBuilder &_fbb, const BufferT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateBuffer(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateBuffer(flatbuffers::FlatBufferBuilder &_fbb, const BufferT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const BufferT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - _fbb.ForceVectorAlignment(_o->data.size(), sizeof(uint8_t), 16); - auto _data = _o->data.size() ? _fbb.CreateVector(_o->data) : 0; - return tflite::CreateBuffer( - _fbb, - _data); -} - -inline MetadataT *Metadata::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new MetadataT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Metadata::UnPackTo(MetadataT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = name(); if (_e) _o->name = _e->str(); } - { auto _e = buffer(); _o->buffer = _e; } -} - -inline flatbuffers::Offset Metadata::Pack(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateMetadata(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateMetadata(flatbuffers::FlatBufferBuilder &_fbb, const MetadataT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const MetadataT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _name = _o->name.empty() ? 0 : _fbb.CreateString(_o->name); - auto _buffer = _o->buffer; - return tflite::CreateMetadata( - _fbb, - _name, - _buffer); -} - -inline ModelT *Model::UnPack(const flatbuffers::resolver_function_t *_resolver) const { - auto _o = new ModelT(); - UnPackTo(_o, _resolver); - return _o; -} - -inline void Model::UnPackTo(ModelT *_o, const flatbuffers::resolver_function_t *_resolver) const { - (void)_o; - (void)_resolver; - { auto _e = version(); _o->version = _e; } - { auto _e = operator_codes(); if (_e) { _o->operator_codes.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->operator_codes[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } - { auto _e = subgraphs(); if (_e) { _o->subgraphs.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->subgraphs[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } - { auto _e = description(); if (_e) _o->description = _e->str(); } - { auto _e = buffers(); if (_e) { _o->buffers.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->buffers[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } - { auto _e = metadata_buffer(); if (_e) { _o->metadata_buffer.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->metadata_buffer[_i] = _e->Get(_i); } } } - { auto _e = metadata(); if (_e) { _o->metadata.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->metadata[_i] = std::unique_ptr(_e->Get(_i)->UnPack(_resolver)); } } } -} - -inline flatbuffers::Offset Model::Pack(flatbuffers::FlatBufferBuilder &_fbb, const ModelT* _o, const flatbuffers::rehasher_function_t *_rehasher) { - return CreateModel(_fbb, _o, _rehasher); -} - -inline flatbuffers::Offset CreateModel(flatbuffers::FlatBufferBuilder &_fbb, const ModelT *_o, const flatbuffers::rehasher_function_t *_rehasher) { - (void)_rehasher; - (void)_o; - struct _VectorArgs { flatbuffers::FlatBufferBuilder *__fbb; const ModelT* __o; const flatbuffers::rehasher_function_t *__rehasher; } _va = { &_fbb, _o, _rehasher}; (void)_va; - auto _version = _o->version; - auto _operator_codes = _o->operator_codes.size() ? _fbb.CreateVector> (_o->operator_codes.size(), [](size_t i, _VectorArgs *__va) { return CreateOperatorCode(*__va->__fbb, __va->__o->operator_codes[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _subgraphs = _o->subgraphs.size() ? _fbb.CreateVector> (_o->subgraphs.size(), [](size_t i, _VectorArgs *__va) { return CreateSubGraph(*__va->__fbb, __va->__o->subgraphs[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _description = _o->description.empty() ? 0 : _fbb.CreateString(_o->description); - auto _buffers = _o->buffers.size() ? _fbb.CreateVector> (_o->buffers.size(), [](size_t i, _VectorArgs *__va) { return CreateBuffer(*__va->__fbb, __va->__o->buffers[i].get(), __va->__rehasher); }, &_va ) : 0; - auto _metadata_buffer = _o->metadata_buffer.size() ? _fbb.CreateVector(_o->metadata_buffer) : 0; - auto _metadata = _o->metadata.size() ? _fbb.CreateVector> (_o->metadata.size(), [](size_t i, _VectorArgs *__va) { return CreateMetadata(*__va->__fbb, __va->__o->metadata[i].get(), __va->__rehasher); }, &_va ) : 0; - return tflite::CreateModel( - _fbb, - _version, - _operator_codes, - _subgraphs, - _description, - _buffers, - _metadata_buffer, - _metadata); -} - -inline bool VerifyQuantizationDetails(flatbuffers::Verifier &verifier, const void *obj, QuantizationDetails type) { - switch (type) { - case QuantizationDetails_NONE: { - return true; - } - case QuantizationDetails_CustomQuantization: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - default: return true; - } -} - -inline bool VerifyQuantizationDetailsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types) { - if (!values || !types) return !values && !types; - if (values->size() != types->size()) return false; - for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { - if (!VerifyQuantizationDetails( - verifier, values->Get(i), types->GetEnum(i))) { - return false; - } - } - return true; -} - -inline void *QuantizationDetailsUnion::UnPack(const void *obj, QuantizationDetails type, const flatbuffers::resolver_function_t *resolver) { - switch (type) { - case QuantizationDetails_CustomQuantization: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - default: return nullptr; - } -} - -inline flatbuffers::Offset QuantizationDetailsUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const { - switch (type) { - case QuantizationDetails_CustomQuantization: { - auto ptr = reinterpret_cast(value); - return CreateCustomQuantization(_fbb, ptr, _rehasher).Union(); - } - default: return 0; - } -} - -inline QuantizationDetailsUnion::QuantizationDetailsUnion(const QuantizationDetailsUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) { - switch (type) { - case QuantizationDetails_CustomQuantization: { - value = new tflite::CustomQuantizationT(*reinterpret_cast(u.value)); - break; - } - default: - break; - } -} - -inline void QuantizationDetailsUnion::Reset() { - switch (type) { - case QuantizationDetails_CustomQuantization: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - default: break; - } - value = nullptr; - type = QuantizationDetails_NONE; -} - -inline bool VerifySparseIndexVector(flatbuffers::Verifier &verifier, const void *obj, SparseIndexVector type) { - switch (type) { - case SparseIndexVector_NONE: { - return true; - } - case SparseIndexVector_Int32Vector: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case SparseIndexVector_Uint16Vector: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case SparseIndexVector_Uint8Vector: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - default: return true; - } -} - -inline bool VerifySparseIndexVectorVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types) { - if (!values || !types) return !values && !types; - if (values->size() != types->size()) return false; - for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { - if (!VerifySparseIndexVector( - verifier, values->Get(i), types->GetEnum(i))) { - return false; - } - } - return true; -} - -inline void *SparseIndexVectorUnion::UnPack(const void *obj, SparseIndexVector type, const flatbuffers::resolver_function_t *resolver) { - switch (type) { - case SparseIndexVector_Int32Vector: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case SparseIndexVector_Uint16Vector: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case SparseIndexVector_Uint8Vector: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - default: return nullptr; - } -} - -inline flatbuffers::Offset SparseIndexVectorUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const { - switch (type) { - case SparseIndexVector_Int32Vector: { - auto ptr = reinterpret_cast(value); - return CreateInt32Vector(_fbb, ptr, _rehasher).Union(); - } - case SparseIndexVector_Uint16Vector: { - auto ptr = reinterpret_cast(value); - return CreateUint16Vector(_fbb, ptr, _rehasher).Union(); - } - case SparseIndexVector_Uint8Vector: { - auto ptr = reinterpret_cast(value); - return CreateUint8Vector(_fbb, ptr, _rehasher).Union(); - } - default: return 0; - } -} - -inline SparseIndexVectorUnion::SparseIndexVectorUnion(const SparseIndexVectorUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) { - switch (type) { - case SparseIndexVector_Int32Vector: { - value = new tflite::Int32VectorT(*reinterpret_cast(u.value)); - break; - } - case SparseIndexVector_Uint16Vector: { - value = new tflite::Uint16VectorT(*reinterpret_cast(u.value)); - break; - } - case SparseIndexVector_Uint8Vector: { - value = new tflite::Uint8VectorT(*reinterpret_cast(u.value)); - break; - } - default: - break; - } -} - -inline void SparseIndexVectorUnion::Reset() { - switch (type) { - case SparseIndexVector_Int32Vector: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case SparseIndexVector_Uint16Vector: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case SparseIndexVector_Uint8Vector: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - default: break; - } - value = nullptr; - type = SparseIndexVector_NONE; -} - -inline bool VerifyBuiltinOptions(flatbuffers::Verifier &verifier, const void *obj, BuiltinOptions type) { - switch (type) { - case BuiltinOptions_NONE: { - return true; - } - case BuiltinOptions_Conv2DOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_DepthwiseConv2DOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ConcatEmbeddingsOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LSHProjectionOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_Pool2DOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SVDFOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_RNNOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_FullyConnectedOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SoftmaxOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ConcatenationOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_AddOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_L2NormOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LocalResponseNormalizationOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LSTMOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ResizeBilinearOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_CallOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ReshapeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SkipGramOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SpaceToDepthOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_EmbeddingLookupSparseOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_MulOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_PadOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_GatherOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_BatchToSpaceNDOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SpaceToBatchNDOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_TransposeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ReducerOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SubOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_DivOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SqueezeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SequenceRNNOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_StridedSliceOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ExpOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_TopKV2Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SplitOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LogSoftmaxOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_CastOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_DequantizeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_MaximumMinimumOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ArgMaxOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LessOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_NegOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_PadV2Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_GreaterOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_GreaterEqualOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LessEqualOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SelectOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SliceOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_TransposeConvOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SparseToDenseOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_TileOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ExpandDimsOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_EqualOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_NotEqualOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ShapeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_PowOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ArgMinOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_FakeQuantOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_PackOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LogicalOrOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_OneHotOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LogicalAndOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LogicalNotOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_UnpackOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_FloorDivOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SquareOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ZerosLikeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_FillOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_BidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_BidirectionalSequenceRNNOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_FloorModOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_RangeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ResizeNearestNeighborOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_LeakyReluOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SquaredDifferenceOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_MirrorPadOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_AbsOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SplitVOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_UniqueOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ReverseV2Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_AddNOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_GatherNdOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_CosOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_WhereOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_RankOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ReverseSequenceOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_MatrixDiagOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_QuantizeOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_MatrixSetDiagOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_HardSwishOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_IfOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_WhileOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_DepthToSpaceOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_NonMaxSuppressionV4Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_NonMaxSuppressionV5Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_ScatterNdOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SelectV2Options: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_DensifyOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_SegmentSumOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - case BuiltinOptions_BatchMatMulOptions: { - auto ptr = reinterpret_cast(obj); - return verifier.VerifyTable(ptr); - } - default: return true; - } -} - -inline bool VerifyBuiltinOptionsVector(flatbuffers::Verifier &verifier, const flatbuffers::Vector> *values, const flatbuffers::Vector *types) { - if (!values || !types) return !values && !types; - if (values->size() != types->size()) return false; - for (flatbuffers::uoffset_t i = 0; i < values->size(); ++i) { - if (!VerifyBuiltinOptions( - verifier, values->Get(i), types->GetEnum(i))) { - return false; - } - } - return true; -} - -inline void *BuiltinOptionsUnion::UnPack(const void *obj, BuiltinOptions type, const flatbuffers::resolver_function_t *resolver) { - switch (type) { - case BuiltinOptions_Conv2DOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_DepthwiseConv2DOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ConcatEmbeddingsOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LSHProjectionOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_Pool2DOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SVDFOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_RNNOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_FullyConnectedOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SoftmaxOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ConcatenationOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_AddOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_L2NormOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LocalResponseNormalizationOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LSTMOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ResizeBilinearOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_CallOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ReshapeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SkipGramOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SpaceToDepthOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_EmbeddingLookupSparseOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_MulOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_PadOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_GatherOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_BatchToSpaceNDOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SpaceToBatchNDOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_TransposeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ReducerOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SubOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_DivOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SqueezeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SequenceRNNOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_StridedSliceOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ExpOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_TopKV2Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SplitOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LogSoftmaxOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_CastOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_DequantizeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_MaximumMinimumOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ArgMaxOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LessOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_NegOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_PadV2Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_GreaterOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_GreaterEqualOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LessEqualOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SelectOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SliceOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_TransposeConvOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SparseToDenseOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_TileOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ExpandDimsOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_EqualOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_NotEqualOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ShapeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_PowOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ArgMinOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_FakeQuantOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_PackOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LogicalOrOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_OneHotOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LogicalAndOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LogicalNotOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_UnpackOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_FloorDivOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SquareOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ZerosLikeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_FillOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_BidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_BidirectionalSequenceRNNOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_FloorModOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_RangeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ResizeNearestNeighborOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_LeakyReluOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SquaredDifferenceOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_MirrorPadOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_AbsOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SplitVOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_UniqueOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ReverseV2Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_AddNOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_GatherNdOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_CosOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_WhereOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_RankOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ReverseSequenceOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_MatrixDiagOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_QuantizeOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_MatrixSetDiagOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_HardSwishOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_IfOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_WhileOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_DepthToSpaceOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_NonMaxSuppressionV4Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_NonMaxSuppressionV5Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_ScatterNdOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SelectV2Options: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_DensifyOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_SegmentSumOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - case BuiltinOptions_BatchMatMulOptions: { - auto ptr = reinterpret_cast(obj); - return ptr->UnPack(resolver); - } - default: return nullptr; - } -} - -inline flatbuffers::Offset BuiltinOptionsUnion::Pack(flatbuffers::FlatBufferBuilder &_fbb, const flatbuffers::rehasher_function_t *_rehasher) const { - switch (type) { - case BuiltinOptions_Conv2DOptions: { - auto ptr = reinterpret_cast(value); - return CreateConv2DOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_DepthwiseConv2DOptions: { - auto ptr = reinterpret_cast(value); - return CreateDepthwiseConv2DOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ConcatEmbeddingsOptions: { - auto ptr = reinterpret_cast(value); - return CreateConcatEmbeddingsOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LSHProjectionOptions: { - auto ptr = reinterpret_cast(value); - return CreateLSHProjectionOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_Pool2DOptions: { - auto ptr = reinterpret_cast(value); - return CreatePool2DOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SVDFOptions: { - auto ptr = reinterpret_cast(value); - return CreateSVDFOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_RNNOptions: { - auto ptr = reinterpret_cast(value); - return CreateRNNOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_FullyConnectedOptions: { - auto ptr = reinterpret_cast(value); - return CreateFullyConnectedOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SoftmaxOptions: { - auto ptr = reinterpret_cast(value); - return CreateSoftmaxOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ConcatenationOptions: { - auto ptr = reinterpret_cast(value); - return CreateConcatenationOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_AddOptions: { - auto ptr = reinterpret_cast(value); - return CreateAddOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_L2NormOptions: { - auto ptr = reinterpret_cast(value); - return CreateL2NormOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LocalResponseNormalizationOptions: { - auto ptr = reinterpret_cast(value); - return CreateLocalResponseNormalizationOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LSTMOptions: { - auto ptr = reinterpret_cast(value); - return CreateLSTMOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ResizeBilinearOptions: { - auto ptr = reinterpret_cast(value); - return CreateResizeBilinearOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_CallOptions: { - auto ptr = reinterpret_cast(value); - return CreateCallOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ReshapeOptions: { - auto ptr = reinterpret_cast(value); - return CreateReshapeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SkipGramOptions: { - auto ptr = reinterpret_cast(value); - return CreateSkipGramOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SpaceToDepthOptions: { - auto ptr = reinterpret_cast(value); - return CreateSpaceToDepthOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_EmbeddingLookupSparseOptions: { - auto ptr = reinterpret_cast(value); - return CreateEmbeddingLookupSparseOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_MulOptions: { - auto ptr = reinterpret_cast(value); - return CreateMulOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_PadOptions: { - auto ptr = reinterpret_cast(value); - return CreatePadOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_GatherOptions: { - auto ptr = reinterpret_cast(value); - return CreateGatherOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_BatchToSpaceNDOptions: { - auto ptr = reinterpret_cast(value); - return CreateBatchToSpaceNDOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SpaceToBatchNDOptions: { - auto ptr = reinterpret_cast(value); - return CreateSpaceToBatchNDOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_TransposeOptions: { - auto ptr = reinterpret_cast(value); - return CreateTransposeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ReducerOptions: { - auto ptr = reinterpret_cast(value); - return CreateReducerOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SubOptions: { - auto ptr = reinterpret_cast(value); - return CreateSubOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_DivOptions: { - auto ptr = reinterpret_cast(value); - return CreateDivOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SqueezeOptions: { - auto ptr = reinterpret_cast(value); - return CreateSqueezeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SequenceRNNOptions: { - auto ptr = reinterpret_cast(value); - return CreateSequenceRNNOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_StridedSliceOptions: { - auto ptr = reinterpret_cast(value); - return CreateStridedSliceOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ExpOptions: { - auto ptr = reinterpret_cast(value); - return CreateExpOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_TopKV2Options: { - auto ptr = reinterpret_cast(value); - return CreateTopKV2Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SplitOptions: { - auto ptr = reinterpret_cast(value); - return CreateSplitOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LogSoftmaxOptions: { - auto ptr = reinterpret_cast(value); - return CreateLogSoftmaxOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_CastOptions: { - auto ptr = reinterpret_cast(value); - return CreateCastOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_DequantizeOptions: { - auto ptr = reinterpret_cast(value); - return CreateDequantizeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_MaximumMinimumOptions: { - auto ptr = reinterpret_cast(value); - return CreateMaximumMinimumOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ArgMaxOptions: { - auto ptr = reinterpret_cast(value); - return CreateArgMaxOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LessOptions: { - auto ptr = reinterpret_cast(value); - return CreateLessOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_NegOptions: { - auto ptr = reinterpret_cast(value); - return CreateNegOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_PadV2Options: { - auto ptr = reinterpret_cast(value); - return CreatePadV2Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_GreaterOptions: { - auto ptr = reinterpret_cast(value); - return CreateGreaterOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_GreaterEqualOptions: { - auto ptr = reinterpret_cast(value); - return CreateGreaterEqualOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LessEqualOptions: { - auto ptr = reinterpret_cast(value); - return CreateLessEqualOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SelectOptions: { - auto ptr = reinterpret_cast(value); - return CreateSelectOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SliceOptions: { - auto ptr = reinterpret_cast(value); - return CreateSliceOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_TransposeConvOptions: { - auto ptr = reinterpret_cast(value); - return CreateTransposeConvOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SparseToDenseOptions: { - auto ptr = reinterpret_cast(value); - return CreateSparseToDenseOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_TileOptions: { - auto ptr = reinterpret_cast(value); - return CreateTileOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ExpandDimsOptions: { - auto ptr = reinterpret_cast(value); - return CreateExpandDimsOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_EqualOptions: { - auto ptr = reinterpret_cast(value); - return CreateEqualOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_NotEqualOptions: { - auto ptr = reinterpret_cast(value); - return CreateNotEqualOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ShapeOptions: { - auto ptr = reinterpret_cast(value); - return CreateShapeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_PowOptions: { - auto ptr = reinterpret_cast(value); - return CreatePowOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ArgMinOptions: { - auto ptr = reinterpret_cast(value); - return CreateArgMinOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_FakeQuantOptions: { - auto ptr = reinterpret_cast(value); - return CreateFakeQuantOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_PackOptions: { - auto ptr = reinterpret_cast(value); - return CreatePackOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LogicalOrOptions: { - auto ptr = reinterpret_cast(value); - return CreateLogicalOrOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_OneHotOptions: { - auto ptr = reinterpret_cast(value); - return CreateOneHotOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LogicalAndOptions: { - auto ptr = reinterpret_cast(value); - return CreateLogicalAndOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LogicalNotOptions: { - auto ptr = reinterpret_cast(value); - return CreateLogicalNotOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_UnpackOptions: { - auto ptr = reinterpret_cast(value); - return CreateUnpackOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_FloorDivOptions: { - auto ptr = reinterpret_cast(value); - return CreateFloorDivOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SquareOptions: { - auto ptr = reinterpret_cast(value); - return CreateSquareOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ZerosLikeOptions: { - auto ptr = reinterpret_cast(value); - return CreateZerosLikeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_FillOptions: { - auto ptr = reinterpret_cast(value); - return CreateFillOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_BidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(value); - return CreateBidirectionalSequenceLSTMOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_BidirectionalSequenceRNNOptions: { - auto ptr = reinterpret_cast(value); - return CreateBidirectionalSequenceRNNOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(value); - return CreateUnidirectionalSequenceLSTMOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_FloorModOptions: { - auto ptr = reinterpret_cast(value); - return CreateFloorModOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_RangeOptions: { - auto ptr = reinterpret_cast(value); - return CreateRangeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ResizeNearestNeighborOptions: { - auto ptr = reinterpret_cast(value); - return CreateResizeNearestNeighborOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_LeakyReluOptions: { - auto ptr = reinterpret_cast(value); - return CreateLeakyReluOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SquaredDifferenceOptions: { - auto ptr = reinterpret_cast(value); - return CreateSquaredDifferenceOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_MirrorPadOptions: { - auto ptr = reinterpret_cast(value); - return CreateMirrorPadOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_AbsOptions: { - auto ptr = reinterpret_cast(value); - return CreateAbsOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SplitVOptions: { - auto ptr = reinterpret_cast(value); - return CreateSplitVOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_UniqueOptions: { - auto ptr = reinterpret_cast(value); - return CreateUniqueOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ReverseV2Options: { - auto ptr = reinterpret_cast(value); - return CreateReverseV2Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_AddNOptions: { - auto ptr = reinterpret_cast(value); - return CreateAddNOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_GatherNdOptions: { - auto ptr = reinterpret_cast(value); - return CreateGatherNdOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_CosOptions: { - auto ptr = reinterpret_cast(value); - return CreateCosOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_WhereOptions: { - auto ptr = reinterpret_cast(value); - return CreateWhereOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_RankOptions: { - auto ptr = reinterpret_cast(value); - return CreateRankOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ReverseSequenceOptions: { - auto ptr = reinterpret_cast(value); - return CreateReverseSequenceOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_MatrixDiagOptions: { - auto ptr = reinterpret_cast(value); - return CreateMatrixDiagOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_QuantizeOptions: { - auto ptr = reinterpret_cast(value); - return CreateQuantizeOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_MatrixSetDiagOptions: { - auto ptr = reinterpret_cast(value); - return CreateMatrixSetDiagOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_HardSwishOptions: { - auto ptr = reinterpret_cast(value); - return CreateHardSwishOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_IfOptions: { - auto ptr = reinterpret_cast(value); - return CreateIfOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_WhileOptions: { - auto ptr = reinterpret_cast(value); - return CreateWhileOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_DepthToSpaceOptions: { - auto ptr = reinterpret_cast(value); - return CreateDepthToSpaceOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_NonMaxSuppressionV4Options: { - auto ptr = reinterpret_cast(value); - return CreateNonMaxSuppressionV4Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_NonMaxSuppressionV5Options: { - auto ptr = reinterpret_cast(value); - return CreateNonMaxSuppressionV5Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_ScatterNdOptions: { - auto ptr = reinterpret_cast(value); - return CreateScatterNdOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SelectV2Options: { - auto ptr = reinterpret_cast(value); - return CreateSelectV2Options(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_DensifyOptions: { - auto ptr = reinterpret_cast(value); - return CreateDensifyOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_SegmentSumOptions: { - auto ptr = reinterpret_cast(value); - return CreateSegmentSumOptions(_fbb, ptr, _rehasher).Union(); - } - case BuiltinOptions_BatchMatMulOptions: { - auto ptr = reinterpret_cast(value); - return CreateBatchMatMulOptions(_fbb, ptr, _rehasher).Union(); - } - default: return 0; - } -} - -inline BuiltinOptionsUnion::BuiltinOptionsUnion(const BuiltinOptionsUnion &u) FLATBUFFERS_NOEXCEPT : type(u.type), value(nullptr) { - switch (type) { - case BuiltinOptions_Conv2DOptions: { - value = new tflite::Conv2DOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_DepthwiseConv2DOptions: { - value = new tflite::DepthwiseConv2DOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ConcatEmbeddingsOptions: { - value = new tflite::ConcatEmbeddingsOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LSHProjectionOptions: { - value = new tflite::LSHProjectionOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_Pool2DOptions: { - value = new tflite::Pool2DOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SVDFOptions: { - value = new tflite::SVDFOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_RNNOptions: { - value = new tflite::RNNOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_FullyConnectedOptions: { - value = new tflite::FullyConnectedOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SoftmaxOptions: { - value = new tflite::SoftmaxOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ConcatenationOptions: { - value = new tflite::ConcatenationOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_AddOptions: { - value = new tflite::AddOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_L2NormOptions: { - value = new tflite::L2NormOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LocalResponseNormalizationOptions: { - value = new tflite::LocalResponseNormalizationOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LSTMOptions: { - value = new tflite::LSTMOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ResizeBilinearOptions: { - value = new tflite::ResizeBilinearOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_CallOptions: { - value = new tflite::CallOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ReshapeOptions: { - value = new tflite::ReshapeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SkipGramOptions: { - value = new tflite::SkipGramOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SpaceToDepthOptions: { - value = new tflite::SpaceToDepthOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_EmbeddingLookupSparseOptions: { - value = new tflite::EmbeddingLookupSparseOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_MulOptions: { - value = new tflite::MulOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_PadOptions: { - value = new tflite::PadOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_GatherOptions: { - value = new tflite::GatherOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_BatchToSpaceNDOptions: { - value = new tflite::BatchToSpaceNDOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SpaceToBatchNDOptions: { - value = new tflite::SpaceToBatchNDOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_TransposeOptions: { - value = new tflite::TransposeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ReducerOptions: { - value = new tflite::ReducerOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SubOptions: { - value = new tflite::SubOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_DivOptions: { - value = new tflite::DivOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SqueezeOptions: { - value = new tflite::SqueezeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SequenceRNNOptions: { - value = new tflite::SequenceRNNOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_StridedSliceOptions: { - value = new tflite::StridedSliceOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ExpOptions: { - value = new tflite::ExpOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_TopKV2Options: { - value = new tflite::TopKV2OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SplitOptions: { - value = new tflite::SplitOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LogSoftmaxOptions: { - value = new tflite::LogSoftmaxOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_CastOptions: { - value = new tflite::CastOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_DequantizeOptions: { - value = new tflite::DequantizeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_MaximumMinimumOptions: { - value = new tflite::MaximumMinimumOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ArgMaxOptions: { - value = new tflite::ArgMaxOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LessOptions: { - value = new tflite::LessOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_NegOptions: { - value = new tflite::NegOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_PadV2Options: { - value = new tflite::PadV2OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_GreaterOptions: { - value = new tflite::GreaterOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_GreaterEqualOptions: { - value = new tflite::GreaterEqualOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LessEqualOptions: { - value = new tflite::LessEqualOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SelectOptions: { - value = new tflite::SelectOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SliceOptions: { - value = new tflite::SliceOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_TransposeConvOptions: { - value = new tflite::TransposeConvOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SparseToDenseOptions: { - value = new tflite::SparseToDenseOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_TileOptions: { - value = new tflite::TileOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ExpandDimsOptions: { - value = new tflite::ExpandDimsOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_EqualOptions: { - value = new tflite::EqualOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_NotEqualOptions: { - value = new tflite::NotEqualOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ShapeOptions: { - value = new tflite::ShapeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_PowOptions: { - value = new tflite::PowOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ArgMinOptions: { - value = new tflite::ArgMinOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_FakeQuantOptions: { - value = new tflite::FakeQuantOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_PackOptions: { - value = new tflite::PackOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LogicalOrOptions: { - value = new tflite::LogicalOrOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_OneHotOptions: { - value = new tflite::OneHotOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LogicalAndOptions: { - value = new tflite::LogicalAndOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LogicalNotOptions: { - value = new tflite::LogicalNotOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_UnpackOptions: { - value = new tflite::UnpackOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_FloorDivOptions: { - value = new tflite::FloorDivOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SquareOptions: { - value = new tflite::SquareOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ZerosLikeOptions: { - value = new tflite::ZerosLikeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_FillOptions: { - value = new tflite::FillOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_BidirectionalSequenceLSTMOptions: { - value = new tflite::BidirectionalSequenceLSTMOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_BidirectionalSequenceRNNOptions: { - value = new tflite::BidirectionalSequenceRNNOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { - value = new tflite::UnidirectionalSequenceLSTMOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_FloorModOptions: { - value = new tflite::FloorModOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_RangeOptions: { - value = new tflite::RangeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ResizeNearestNeighborOptions: { - value = new tflite::ResizeNearestNeighborOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_LeakyReluOptions: { - value = new tflite::LeakyReluOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SquaredDifferenceOptions: { - value = new tflite::SquaredDifferenceOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_MirrorPadOptions: { - value = new tflite::MirrorPadOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_AbsOptions: { - value = new tflite::AbsOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SplitVOptions: { - value = new tflite::SplitVOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_UniqueOptions: { - value = new tflite::UniqueOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ReverseV2Options: { - value = new tflite::ReverseV2OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_AddNOptions: { - value = new tflite::AddNOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_GatherNdOptions: { - value = new tflite::GatherNdOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_CosOptions: { - value = new tflite::CosOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_WhereOptions: { - value = new tflite::WhereOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_RankOptions: { - value = new tflite::RankOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ReverseSequenceOptions: { - value = new tflite::ReverseSequenceOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_MatrixDiagOptions: { - value = new tflite::MatrixDiagOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_QuantizeOptions: { - value = new tflite::QuantizeOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_MatrixSetDiagOptions: { - value = new tflite::MatrixSetDiagOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_HardSwishOptions: { - value = new tflite::HardSwishOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_IfOptions: { - value = new tflite::IfOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_WhileOptions: { - value = new tflite::WhileOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_DepthToSpaceOptions: { - value = new tflite::DepthToSpaceOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_NonMaxSuppressionV4Options: { - value = new tflite::NonMaxSuppressionV4OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_NonMaxSuppressionV5Options: { - value = new tflite::NonMaxSuppressionV5OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_ScatterNdOptions: { - value = new tflite::ScatterNdOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SelectV2Options: { - value = new tflite::SelectV2OptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_DensifyOptions: { - value = new tflite::DensifyOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_SegmentSumOptions: { - value = new tflite::SegmentSumOptionsT(*reinterpret_cast(u.value)); - break; - } - case BuiltinOptions_BatchMatMulOptions: { - value = new tflite::BatchMatMulOptionsT(*reinterpret_cast(u.value)); - break; - } - default: - break; - } -} - -inline void BuiltinOptionsUnion::Reset() { - switch (type) { - case BuiltinOptions_Conv2DOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_DepthwiseConv2DOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ConcatEmbeddingsOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LSHProjectionOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_Pool2DOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SVDFOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_RNNOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_FullyConnectedOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SoftmaxOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ConcatenationOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_AddOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_L2NormOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LocalResponseNormalizationOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LSTMOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ResizeBilinearOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_CallOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ReshapeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SkipGramOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SpaceToDepthOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_EmbeddingLookupSparseOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_MulOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_PadOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_GatherOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_BatchToSpaceNDOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SpaceToBatchNDOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_TransposeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ReducerOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SubOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_DivOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SqueezeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SequenceRNNOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_StridedSliceOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ExpOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_TopKV2Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SplitOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LogSoftmaxOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_CastOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_DequantizeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_MaximumMinimumOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ArgMaxOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LessOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_NegOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_PadV2Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_GreaterOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_GreaterEqualOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LessEqualOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SelectOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SliceOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_TransposeConvOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SparseToDenseOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_TileOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ExpandDimsOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_EqualOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_NotEqualOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ShapeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_PowOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ArgMinOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_FakeQuantOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_PackOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LogicalOrOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_OneHotOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LogicalAndOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LogicalNotOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_UnpackOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_FloorDivOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SquareOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ZerosLikeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_FillOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_BidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_BidirectionalSequenceRNNOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_UnidirectionalSequenceLSTMOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_FloorModOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_RangeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ResizeNearestNeighborOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_LeakyReluOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SquaredDifferenceOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_MirrorPadOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_AbsOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SplitVOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_UniqueOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ReverseV2Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_AddNOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_GatherNdOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_CosOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_WhereOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_RankOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ReverseSequenceOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_MatrixDiagOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_QuantizeOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_MatrixSetDiagOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_HardSwishOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_IfOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_WhileOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_DepthToSpaceOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_NonMaxSuppressionV4Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_NonMaxSuppressionV5Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_ScatterNdOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SelectV2Options: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_DensifyOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_SegmentSumOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - case BuiltinOptions_BatchMatMulOptions: { - auto ptr = reinterpret_cast(value); - delete ptr; - break; - } - default: break; - } - value = nullptr; - type = BuiltinOptions_NONE; -} - -inline const tflite::Model *GetModel(const void *buf) { - return flatbuffers::GetRoot(buf); -} - -inline const tflite::Model *GetSizePrefixedModel(const void *buf) { - return flatbuffers::GetSizePrefixedRoot(buf); -} - -inline const char *ModelIdentifier() { - return "TFL3"; -} - -inline bool ModelBufferHasIdentifier(const void *buf) { - return flatbuffers::BufferHasIdentifier( - buf, ModelIdentifier()); -} - -inline bool VerifyModelBuffer( - flatbuffers::Verifier &verifier) { - return verifier.VerifyBuffer(ModelIdentifier()); -} - -inline bool VerifySizePrefixedModelBuffer( - flatbuffers::Verifier &verifier) { - return verifier.VerifySizePrefixedBuffer(ModelIdentifier()); -} - -inline const char *ModelExtension() { - return "tflite"; -} - -inline void FinishModelBuffer( - flatbuffers::FlatBufferBuilder &fbb, - flatbuffers::Offset root) { - fbb.Finish(root, ModelIdentifier()); -} - -inline void FinishSizePrefixedModelBuffer( - flatbuffers::FlatBufferBuilder &fbb, - flatbuffers::Offset root) { - fbb.FinishSizePrefixed(root, ModelIdentifier()); -} - -inline std::unique_ptr UnPackModel( - const void *buf, - const flatbuffers::resolver_function_t *res = nullptr) { - return std::unique_ptr(GetModel(buf)->UnPack(res)); -} - -inline std::unique_ptr UnPackSizePrefixedModel( - const void *buf, - const flatbuffers::resolver_function_t *res = nullptr) { - return std::unique_ptr(GetSizePrefixedModel(buf)->UnPack(res)); -} - -} // namespace tflite - -#endif // FLATBUFFERS_GENERATED_SCHEMA_TFLITE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_type.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_type.h deleted file mode 100644 index f5a7f833..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_type.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -// Abstract string. We don't want even absl at this level. -#ifndef TENSORFLOW_LITE_STRING_TYPE_H_ -#define TENSORFLOW_LITE_STRING_TYPE_H_ - -#include - -namespace tflite { - -using std::string; - -} // namespace tflite - -#endif // TENSORFLOW_LITE_STRING_TYPE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_util.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_util.h deleted file mode 100644 index 2086f9ba..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/string_util.h +++ /dev/null @@ -1,109 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ - -// Util methods to read and write String tensors. -// String tensors are considered to be char tensor with protocol. -// [0, 3] 4 bytes: N, num of strings in the tensor in little endian. -// [(i+1)*4, (i+1)*4+3] 4 bytes: offset of i-th string in little endian. -// [(N+2)*4, (N+2)*4+3] 4 bytes: length of the whole char buffer. -// [offset(i), offset(i+1) - 1] : content of i-th string. -// Example of a string tensor: -// [ -// 2, 0, 0, 0, # 2 strings. -// 16, 0, 0, 0, # 0-th string starts from index 16. -// 18, 0, 0, 0, # 1-st string starts from index 18. -// 18, 0, 0, 0, # total length of array. -// 'A', 'B', # 0-th string [16..17]: "AB" -// ] # 1-th string, empty -// -// A typical usage: -// In op.Eval(context, node): -// DynamicBuffer buf; -// # Add string "AB" to tensor, string is stored in dynamic buffer. -// buf.AddString("AB", 2); -// # Write content of DynamicBuffer to tensor in format of string tensor -// # described above. -// buf.WriteToTensor(tensor, nullptr) - -#ifndef TENSORFLOW_LITE_STRING_UTIL_H_ -#define TENSORFLOW_LITE_STRING_UTIL_H_ - -#include - -#include "tensorflow/lite/c/common.h" -#include "tensorflow/lite/string_type.h" - -namespace tflite { - -// Convenient structure to store string pointer and length. -typedef struct { - const char* str; - int len; -} StringRef; - -// DynamicBuffer holds temporary buffer that will be used to create a dynamic -// tensor. A typical usage is to initialize a DynamicBuffer object, fill in -// content and call CreateStringTensor in op.Eval(). -class DynamicBuffer { - public: - DynamicBuffer() : offset_({0}) {} - - // Add string to dynamic buffer by resizing the buffer and copying the data. - void AddString(const StringRef& string); - - // Add string to dynamic buffer by resizing the buffer and copying the data. - void AddString(const char* str, size_t len); - - // Join a list of string with separator, and add as a single string to the - // buffer. - void AddJoinedString(const std::vector& strings, char separator); - void AddJoinedString(const std::vector& strings, - StringRef separator); - - // Fill content into a buffer and returns the number of bytes stored. - // The function allocates space for the buffer but does NOT take ownership. - int WriteToBuffer(char** buffer); - - // String tensors are not generally supported on platforms w/ static memory. - // TODO(b/156130024): Remove this guard after removing header from TFLM deps. -#ifndef TF_LITE_STATIC_MEMORY - // Fill content into a string tensor, with the given new_shape. The new shape - // must match the number of strings in this object. Caller relinquishes - // ownership of new_shape. If 'new_shape' is nullptr, keep the tensor's - // existing shape. - void WriteToTensor(TfLiteTensor* tensor, TfLiteIntArray* new_shape); - - // Fill content into a string tensor. Set shape to {num_strings}. - void WriteToTensorAsVector(TfLiteTensor* tensor); -#endif // TF_LITE_STATIC_MEMORY - - private: - // Data buffer to store contents of strings, not including headers. - std::vector data_; - // Offset of the starting index of each string in data buffer. - std::vector offset_; -}; - -// Return num of strings in a String tensor. -int GetStringCount(const void* raw_buffer); -int GetStringCount(const TfLiteTensor* tensor); - -// Get String pointer and length of index-th string in tensor. -// NOTE: This will not create a copy of string data. -StringRef GetString(const void* raw_buffer, int string_index); -StringRef GetString(const TfLiteTensor* tensor, int string_index); -} // namespace tflite - -#endif // TENSORFLOW_LITE_STRING_UTIL_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/type_to_tflitetype.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/type_to_tflitetype.h deleted file mode 100644 index a95b233c..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/type_to_tflitetype.h +++ /dev/null @@ -1,70 +0,0 @@ -/* Copyright 2019 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_TYPE_TO_TFLITETYPE_H_ -#define TENSORFLOW_LITE_TYPE_TO_TFLITETYPE_H_ - -// Arduino build defines abs as a macro here. That is invalid C++, and breaks -// libc++'s header, undefine it. -#ifdef abs -#undef abs -#endif - -#include -#include - -#include "tensorflow/lite/c/common.h" - -namespace tflite { - -// Map statically from a C++ type to a TfLiteType. Used in interpreter for -// safe casts. -// Example: -// typeToTfLiteType() -> kTfLiteBool -template -constexpr TfLiteType typeToTfLiteType() { - return kTfLiteNoType; -} -// Map from TfLiteType to the corresponding C++ type. -// Example: -// TfLiteTypeToType::Type -> bool -template -struct TfLiteTypeToType {}; // Specializations below - -// Template specialization for both typeToTfLiteType and TfLiteTypeToType. -#define MATCH_TYPE_AND_TFLITE_TYPE(CPP_TYPE, TFLITE_TYPE_ENUM) \ - template <> \ - constexpr TfLiteType typeToTfLiteType() { \ - return TFLITE_TYPE_ENUM; \ - } \ - template <> \ - struct TfLiteTypeToType { \ - using Type = CPP_TYPE; \ - } - -MATCH_TYPE_AND_TFLITE_TYPE(int, kTfLiteInt32); -MATCH_TYPE_AND_TFLITE_TYPE(int16_t, kTfLiteInt16); -MATCH_TYPE_AND_TFLITE_TYPE(int64_t, kTfLiteInt64); -MATCH_TYPE_AND_TFLITE_TYPE(float, kTfLiteFloat32); -MATCH_TYPE_AND_TFLITE_TYPE(unsigned char, kTfLiteUInt8); -MATCH_TYPE_AND_TFLITE_TYPE(int8_t, kTfLiteInt8); -MATCH_TYPE_AND_TFLITE_TYPE(bool, kTfLiteBool); -MATCH_TYPE_AND_TFLITE_TYPE(std::complex, kTfLiteComplex64); -MATCH_TYPE_AND_TFLITE_TYPE(std::complex, kTfLiteComplex128); -MATCH_TYPE_AND_TFLITE_TYPE(std::string, kTfLiteString); -MATCH_TYPE_AND_TFLITE_TYPE(TfLiteFloat16, kTfLiteFloat16); -MATCH_TYPE_AND_TFLITE_TYPE(double, kTfLiteFloat64); - -} // namespace tflite -#endif // TENSORFLOW_LITE_TYPE_TO_TFLITETYPE_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/version.h b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/version.h deleted file mode 100644 index f667447b..00000000 --- a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow/lite/version.h +++ /dev/null @@ -1,29 +0,0 @@ -/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -==============================================================================*/ -#ifndef TENSORFLOW_LITE_VERSION_H_ -#define TENSORFLOW_LITE_VERSION_H_ - -#include "tensorflow/core/public/version.h" - -// The version number of the Schema. Ideally all changes will be backward -// compatible. If that ever changes, we must ensure that version is the first -// entry in the new tflite root so that we can see that version is not 1. -#define TFLITE_SCHEMA_VERSION (3) - -// TensorFlow Lite Runtime version. -// This value is currently shared with that of TensorFlow. -#define TFLITE_VERSION_STRING TF_VERSION_STRING - -#endif // TENSORFLOW_LITE_VERSION_H_ diff --git a/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow_lite_micro_M55.lib b/components/ai/tflite_micro/ARM_CortexM55_lib/tensorflow_lite_micro_M55.lib deleted file mode 100644 index f21cf04a7f621c3a27c08ea263c27a918f5d8a4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14265788 zcmeFa3w)eanLmEsnM|5qC}}CBg#szmlD3d$CYPpw&@`7eZJLB6g@VQDG?_F*b7N*w zS_CPGQUnpfMRvWx?&_|J3WEOBMX9dqZQWfi{#?ARb=S3ku2$9`vaYMY@Aq8ZIdf(v z$)qXv^ZWnb&%E=z&$&G3InQ~{bIyC-^FHtLOJm8t!OP~Xt;jyAEmU3G{}mPW)in+E zGR>|zLIf`p;{OaC_v!8WmXPQ5w+rw8!E?bUzAbp3zUz15^mmOFbuK=Z7SlPG%t?!4 z&$AXD5mPzOUb;gRI?w%!S~1yq-q}Y)G3Sb34T`Cr7p(kiF_m-Gzuqe*I@f%uS4{Q1 zsC~0AXVs-?;ht+3Jt6*IJJOTU*E_IcTRR)~qt%m1ra@Z50fP3nBPUu?*8 zZoIBU6ni$E^%K$b=!OZ;)}P!i>~r(RcZ)*jmWI2|QcUR_yHMN1|iR%{y+@Ax=SP${6Hiw zXcmb}H;csPgCa5hK9Tr9iAa3(TO#rKa*_DvkVt&**Ydos@=0-B?;>^H{{wN|H&=+g z;&)7O53Nq{3epsg3(Z>X8RU>Wfc{)VC`|y5cJn zpAAUU`GiRKEfVP)8$|l9C)N3UyBMGKygF}wP>dg{6ytyTh#3FqgJR!%elGUCyh!Z( z!;1gUp0_-)Q{3`wdBO8-k5r03*7=^2evx%9yH!%u`f z|KbVpX`Y`xG$ZF{4zCc$dw%7}3!<3w@Als-X8QcIy4$fHzt#@0|kOxlkwcNo8sx7#EtQ`k&Oq^@suXjHlhiQjva7=>>^FN zmg~o3Lry{&mXiE9F%}<&Kwd7c7>|vl6F0`viO~@&PtRB^nM$M&SV6t4*)-Mf94E`t-mMBp$A5NhU{=-SM%}WICP< zht-t~Z0Xw9wYBfY!l~|&bhJ~)EQxU;><4lkB zS=6bKGdf#a$KfrWOsh$5FDAAv9Du4VybGATrC@Bn;liF)uFEppkoV9G^DF81q?3vM zcz@4OqHl)VvO&^^P%vqZkI4IqnXSNjSwQRf(9i*tG7|4g$7gnO7*R9(=J;585H=uw z0_HEei1tXwXmU66GR8En4DJP6c=&l`cOk7gwj(B3v;O-f|Ur`O-xH~nY>}#t1 zGuyOAIZp(yFkdG?0^7!Cw*M;$bi_{tuefDB0TSq$;kyzgfu8Z*Gs>&7N=@;^%r=)I zD`yNdIch1gT{C^pp~;Spo(LgudEo>!SJ<5xxuZ$%VvE4&)HMwf(3P<$BO0G@X>1#K~_QiWZ zrH8jRgc|D|Hh_{W5jboA+u2Hlx{HNpl(;%Q{aUGCN!pa+g%D^0Jau@1ELdS68@Jv1?X)Z3d5%_+<2J zC;)Ri*3aqE=+HRDfx#=C7#pIJj*aYz z`?bj7I1*O!Z5>a=`!l&573@m%)Y*zvv#x7&Og5_}7F~!e6_d2sFw}E$`RIytZ!N@0 zqGx^7{@J4ZBeG$4l?Et^?p{;x8|&G<#?!@h%5b=8Fy6N}-j8Wnq-CJX<{}(HCyDQg zCtH&(`^Q@Pvm@8F#`gMpARn!?3=9l(Z5`+u7_dYdZZNu{wLAee2dSQFyZs~8zNX1~ zcgOk@ zu;y@AlUoN>{m5h%iNBgjTq1U5&aKD}y*#j;TIW@0WwP{U`4!0&_ z=w_oMxV7&YObn!3_S@C3sm{ zFjy&*N9jbisKPbL_&_`vAL)xnN5@j(+D6=(48@1zBWd0vwhgwl>`SP@vA!{xNDmIj zv8HBv_txHM&pOzlEZg9cZ162UXxBFP42|BZ3gkQT%sh zsj9-ODT677

wFty9*DT3Nw`i8UQjHhk~!0%_0Ude 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

t<#SIimA=h7A0SYwm*}boDi$t`0xy&|u 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%0DM&B2iS-sp3_o!b)#H2iLE$I;LiT^jjrmr5s8L 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%0ADY}}@^(o~{rF0xlrEYp2TQmCf`vs&x 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π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%0AEM0 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�yoX%73?1Z)iBDb@Dl?*eRXU!sne1XMaOJ zMBjl7jopZd;dokfoGAExqv+%q$ozvFm&6#NM+WBLkTnWvi)AhNC z!c{=Lr*ls5r+_Y-G_#>G%B#IUA1cbLgTDgG<<&CEYYU=GAr0xAj{Zxa%d3!i(HP~` z$^R0{rEVLY3h=&FF5il`fSgw8oX$S)EV+z2MLTK~(8cGiCYML|WFD|}^?Cov*?LE| z@E{)MpUx@rd1tEVTDFvTq7&;Qgd@PA{K#%ese&RxnYN z+bKTppE<)TNkea+chp>-8>2HP*<$+myv^oppG4(}?Np!l-kk0GsI!XC>EmI^T?sc_ z|G~TKr`QKQahlINcdnbtd8lpN+u@M9wCS9_KJV~X(?#I%KPa2VioXXYFRsL}`dyv68jXY8-! z!9H&{7QKQuzH+8};a?cgq5jjfY>O-x$ChFKW?KG;ESJQV;r>oUy5cVNm|jLXH#~}` zb4K{txP$2&uJo7<9Jp!chDYgi&PcyO>~O8e+@c&pukZ{aopXj?6noA0Xo<3s-Nc#x zgxKL3FR>eTn`1g>l+XLCt|IFqhw##UxPy|7YP8SWug>e^$ctw!;YB_4{TQD&W}U+x zkEu|ReX<$r^S-U~D(#C`_?aWTXds1+^LbnM43!Zg5P6XH)XpnsEk|JuHiG4 z?fRfmY`am}ZU|0_ZTDI^2O?13jlt;H)=s6nDYz`QouX_v2Y1D`&%Ba(-V!_;+rCt` z`2m+zxHe?_a=sN_P)nCx5b)N#vwfw~-4<{ehO-^0(k%>lE8p3^Nv6w{M&2H9&4zP0 zD494{O1>lD&41_cbutI^(47GnemGm1WMbGB1zbGfYMM4vz+XVuwRY@C4zl-nJmAV5=TNCc4&tyZ;1Uq$ zurrwhX3P@-m-#qbm1JVrmIpt_wjWfwCj%}Ma_K6obSnZbHF36IlIe0Qx{Z8g&^2~A zG?_T}QpB4=_FcN{s(>q0TsFH(WFwo=QvsJEIftqxvXRbzI^fzC=kR$l2ju=tuqn2E zt8A+Su4!`VswFcfaFrPT;~QMNk~v^R-U=4Rwmr(WK3Emo zepR-&gUzw6qQ_$)PWyNqipX5x5u_?)f9O@;PN(C-VGirfksMQwgg-% zaaEF9XmW&q6l&L zIN&-vm&0TGE8>%Y3%H!alO>9fq53pf89O|cbU>GH3%10zXOlMhTvqn8U~la3e2MzG zPj+QL54gV175{RH`ia9A0T+%rhu2FKA-m`8!D+F>TP2DRhc5#z9dtQtEK!6wd=+p_ zS`SV*uHCX_tMIJ;>)`1)SslORDbY6pS7o{^>#DuOw*go9Ia@uI?z@1iIGyb%mG1k1 zD*~OZzDl3$BljMdp1t8~8vToUPQ zO;oyH11?u}wx%lGZvmG+I$N`3x?I^2{T^^ltaE6dOq?q{`$xbl_M`iKCLe6qj2%hvSktAa_5-CA7}gDw!CzAjM^w zMPUQEf6c-~&q#5}bWymuGwuMyl}d5>w9BJ|Pm}E2k;eh4w_;mIRd#lY%Z^>TPO9t! zQ(VI8Y@L&NM*GV$sUu>CF3F6eZaFB$Ma(XTuF2e^Zple;RjhM3WuGFVa>}M=#a_Ml zDJLqdT#75DU0$c|Q&?1Dg%sD{IN{WlTT@HixSHz(yt{Qd@gOf#|_^PSZv292)ci0X~aTT~r zH#C_sY}Ha+QS5BPeD2MQr%?4&g_9!N@W>`xU5yl1lDl*xBb#h+HB(%b>};caxyUHT zsamNKv2Ao@lRS?|aTU8uH#V|Ko=2v*BHG!;N99SLbyKTi+u4y#@~oHQN_UrTVq}v% z>!-MC+Sw*Y4-sT^G9b+&UOo8+0F;wpP*J3q2Xo=2y+V%yoKMq}hI_Le<1#ntxC zHZ2+>u{BI_1-`Rg6pfMC8mG9b+u3GEc}hK-rk2OHE2BK6p3PER&F|7(73C@QY@Xr@ zac7&8%rlo6=gP;jbSfKH`JC6>WbU~vBJygH;j9RhZ(MbLVwkvP8_n zR;j76?fPUnu(eL{I|eS@4awYLYm?%-b!WR#<#~K+eQdi)<=HmH?*6`rMTwZ z*=|vJo{*{?+iq2Pwomc94ldn%m1l<(*U#g4>t1E=mW!BSXQLfmQs!v3JL_e?!n!v0Xw9#ywj>g}Xc`I46a;!!ETTfPb( zPTS(qDqqW!(FnJlVt+4SgnZO+pX%fL#}yl;D?Z@!7a;S`#~WW22jU(9{L>X5^vBV_ zwdQ3E1&@7D;z)!=Kg`GP88W zNBwu=l)ogFFu?Sf{{u|nY^_*2x+%rPus!Z)pAy;P<&a`q=GTdBhgnxzZg?YtZ%F)v z-!^vWxQ|2b#W0$-OqZ^>+#d>67ZIjnFWzONF^J{r~InDqYk-Q8=v-@#m3tsW4ug@ zr9b2MianO>*JHImIrdmy!h=l=`^wot-mMssuOu79iI0O>l1ZC-4YH-uNVBn*z5JbZplmjkl1Z(l-d4T zlCJo&e?{y%C3595gScDP`O9LD3-K=LRzsNWJKVsKM|GE)x`E^f? zdL%E(G3<+_|5 zQta?y(gBIT^2f)v?U79md0+ci#kL)hEt&B*{(Z4SR(P1j;Uiq|9qtLkH)-;>{;RQT zm3>{s>pTCa*sEUT6)qm%C&Taks;5Ui(l|Pi3+LAW#GAH5@m|OSe7fQezkTf5I&x)q z=Z4E7*dloS;E#{Jx<_7Nh7X4sE@Or(@s{Uu-Ra*L`}dDN)5sw1@?V0@9aBf+mU^zl z@AkLF@skqqKl;DLc}baI>2Sr|3;`#xIJ;`&w;T1Nfr{`Ms+dx?Qc$uc?L-_C&^s}d= z!asseu3vhhxBx$&7-n@F6Pzf5cc}vWdSYl$F!7iPVO0>2m;if}OcT6E2X#(29IwxY-J7Ph9emA<-^ zHlBLt8*s>fFY@|RoIYdPAEMYGO3Nj>MNDAaEbJO`@s;`OYie%*MplqH?P9l&-dKC+A{=}+dVh0$_|BC&mzJl!I-$6RVvScn6zqrKWv?IwQblUL>*2}irD!A6o(QqDLFY_Rr z?l&d3-TAWZc4N2RCfn{s6nDwy8V=HZvbl!a?)|d4h7$-Ku0Hk@$x^BIa89ZrS zw}w5r+9tYnjcpJ%_a?f%U|kpnL!iRGF~JJno7&~ z4e_9v4NTFdsFTLoB93*Kc!DjuE6ON8&Zw@-=oJ=rRB}_vV@7WB!BpE8z7Ln8FQOc- zie~*z#N=^bRrnkJN{kohZ!U+&6dsJ3*xQXFJFFeP|BaZ0FDvOT;}o{pkEJi-a);r~ z6b{6DA@|jVXY#Lccyn7+ji8eIjl)k771WX6IP^FJkMiCAtUSdrzH3w{8vAaGszXal z-)&K0KeqGT78MR~XFsv0?uKFtx1*2~xk=>mF$LkV$$eNXCDc?(edeU0m9Ua-jiD%41SK_90PH zScMl^1^&ix!r(E}@Xh@~sI9uH7Ne@J!L^i{JHi@47V>dGZGOR99-n%W_sbD@*_IUI<0e_4~xW;#nSBT_T4+w}}(IX@N(|G=v`WA!$XMTLd0w2M^$6ZFR z=!p&gX*{3Dz+YjXjJ)_P13v43Ppynz(W4Rm(|A7kU;;w)&;UMEfDfOHULC~#pT_g7 zmThGl`JmzG6+N(+aeSs{-?HxK+ao(4urrPUHa_<=di`De!Q#)S`$n%Y4)Kgj=EH}C zUWG6hVH*OU6#5;)4umr0@Y}-(1qggVD1TNydNGgv)pr8RKw#fLmnffOvJHW8d}Qck z7t1_(#vmWn3~JK7;f=grx`>D7Oqk4njGE0)&PL z-4Xcw(PX`%=a}mHZb#Xi8=Mn-sBQG(FHrYF*^J{8Nf#hL{%n5q+AH?xnX~^%{2xd| z|GY#wjAJ>B<0DR^*K;WEJ%lX?RZ(s=goX&M5cn9(4hVeU=_my5*!Y;!Wc{MYrRsW* zM*(*rEJb(#p@K!;2+`|8{6YJF8qYkIBQOvC{(bafTseu0o|8n|-^H(jop}sM zJdN-i!diqk5xzqhQpT7`2g@+rU)TwcSE$f141W+?g&voG({hDL+FlhDnisR z^%DKE8GW)9;dAMqZRm&35q?Yb2d@g0Ltww0iopIDfx!M)jj#@3Jp%jX7_>FnAFn_s z`=bron(T*%r2Wg$&i%E&7uw7AuSH<{3(#)1zb4wrcGp9@*v_hGQ?gxAJ2Fux)}Qqq zgTVSehwusl>&v5P{><9bq}b3WS$Xuh$R;pzJ{i>k!^VXpTCxK&X#89K(P* zG)Aa}delkuZ`6!3Y-5u)vweHy)z`#0{_?n4_sL7lcG>eUJL>4MM=VFbeG2wx$5hp-c2Hv;!py;0A; z2xlO0KgIp*{`OCs(1!OAwjgXni0a)Ob#8&s3W58jsQ!hhds~DK2;474?MUvY|Ly*r z&!6B!iMF7wKV@MXK|l7uITJr5y@0R|VH?5-l=~q<3-sMJiTe}C<2g?6xA%MjSEdT0;ZbvN3<_AExdlkJ#{x+m+;`gW1}-Y50Vl=|`^GpuJe z0_!&cVKM^inXKP7=%{||?-vkQuMSeL<=`rW)d;L#eS`vphEmT5q@MSot`8tQf-nX3 zoSx`s*0CD`>-Ycy>zIweI_-ryve`c@J9@Fq z9#ZBbAj`}_;5dfo*P#z%n0W*)l$C>x@LX zER*wyWpW;|OwJ>g$?bz>a=T!e+zwbK=LyT?d}o=Q7c7(Wf@N}EuuRU2XkN3- z+Y2$5x!q=?Y|fEU2%OWeAaG9CLx{Fp&h51boGVQcI9KjNNX`*%mz*QtA+$h!h9Pjy zzK6g$(FGye4(~wyK17K2Gn~Vl5u)vnV-&rT`y1AGFZNqCP?wsC`pv-KGZ8LFSc*^$ zb*qU`51~H7F5e3HN*Z+mCEO-8Un=hwuqPRNtpj*VPDX5!NT_y$p3`Kd(l3 z4&eoabqG;AlKaj7>3%o)IflnAehy%NMCbR>{+#FetT)f|qy0IL8+t#^{>33IeDU)G zUpGp>*LTvrA3t{VxUpk~j+xNBM(gffYfz3HHFSK9#(76KtkGla*ip@E3>-gt@Th@f zhSxZ)(U3s}jRzML^fRqHBl*Cg0|$-7PnO`%h5)i!KX^7<9q)}~B_tL&xTO#hN#MygGjI<>@?V4K^PsdbgT!n@qRESQzL zG-GC|OEPDaZc`?C86tch#?82r@0%iYo3+2<0tzm?vF8x%@y+|1yuK5LjyZem_+g{Q zo|8Xn!Q;n9_4w-y_G2lTGFjd66VL67kUwtx z*kPOscsl#o@n?=4GyLSS!zP?FaQx7|o!fQn(x@+njN$k$t&7_CZ8LIA-@LrOBgYIL zHF3z$zGqJuf>!2@VCRh=de+2&VoNzXan{e*9p=TpEobU}PE_v`^PMv?9{m3yRCyX383T+tQf7HmcC$OOZ zJ~Q;nkfFm+w||xToWUaoj{mobrJDx3D*U?&oIPPYX2Jiw2F&H()j(SDf2$&#qyMfV z=tk7#-*(05ffGjj+q8*+#Gn7J_L9f{jcPEDe^&|aBF6p?d!c{-F%w6P8aHA5zpH}u zLvpipd))pLCyX40y5VG`WCYHh;@wrr9Za}u8#xA3bK+rK)H6jq_4fR;K)g8Gd`DZLuO%>XOt^T~hTsrw;4bIn|_ds(R5K~n6@U`oLK|)4l+`u{rR?2>VO8R()p=Fic%FbGAH;q zPR)Z?sSJOO$xGE7xgW=4iXBTKQ-8M2%kXzkosJAEWcXLvFg==r*r%oqi(^yS{!7R* z<+tdR;eU6*F#j5_Q|j={-lfnswsqz_+868zkukS9Hj^bJFJ7Kvglv~=rXIiI>VdyrrV&$}9 zVMS(7TL1@tFDl-wGb(V5->wrpj`Y*)%PjxtX`NE7GNuO}=F+qPmvJ)uE}`-pdbO?J zC3CLdu#?}VQ{bnnVBkHJ{rCmL;C^U^-)MTOE{3EED&~KW`3M*P9*fR-`~r?OCd##V zbPk8VrvE7F^AAIYfqenh{5!8y=?wo#J1muRMmQ--XH1npU8A3vHl2-TgR_T4?R{#R zYw#N5TD;7)*zd?zU;}EHr{&Bo~Mx5dN$ro|a<*cQaY#_rDW*I~R%otUb5Nr{$W zxH`*}oy#ff(hmDyPb+Z-~i!Xh!BlG;(@0tl`LWSX0&RNYxvWs#ZT$Zw5An zRZ};m>iBChy^qEm2nI{a(x=+b`D%ql--Z=dgWY%J>^$ zr(q?=$HN}1kDEZ(dc(q!X1J1Is^EWp!6vxY@vlS1D2m`^qT25b)5 z{?k)C`Q16P%rI4lG5o05k3C!{Jg#y)p42WqjczhnEw`sj$=A~pT0oq{q;rn48LtB z*$4e~Rg(Q8BZNv|8gIscFOUIuGl`>(agX}D!WrCw`R}lgzMUHFDR!dshhc}ojie>o zy5es)k_@zs+X!3d=2o((Xws)D$b8yQ*XiMl=IH-QKKq^DiJibg^wnYhr{Vmr=g-Id zu9GpnL_@>Q47X0s>cmKL-i2Mw*%nT$5_20fJRI5um}5A^_>J?d~E)2vyINs{&%wVa7M#9cbJd$$}LjWI){7Q4yk%wQq{tDcNCCm6K=yjdA!K> z%X7y1{%AL2kIM7&&;h%qV!OqGD7nezrTjs1EWobt;^f&viIc!#sl#yk<7F=W%UWO? z&BOk&_=wK!2IZF66aV!gJUkb5g-rj;GU5&7U+0aT%-{E-KjN?Q-tQ3+-O4j$clOEC z12yMbe&)(-h8@7_g{7s|( zx{vpNdiU3D`B#Pf-9Tb*k>MXX9eaxvK&o=au2f-usu@1DR?fJHAEcWUgr}_)GCHR! zcZh6F!h_|16X&-_5yOzFUk96DgH&Mw3gJh>i&ITHMkQq6ggdNHr&Q(qRH`6Vh)?wJ zDlX1%&$Bn29lMMo7ko~QYJ^>0X@3q53CYh{Mf}L+uffM;`Dlmf!c!yHdWiq9^_|0> ziOULmF;ZOd}`{V9~g{FA5jBj>2eTC9ZmEL`nOKptv|3>M%lwPRxP^G&l zJwuiES-q0wy`c03%D=y|N2#OwHi;u#{Rb;OP3f6R&r|v~rSDXFiPFoIen#oFO0QRX zi_%{z{fE*A#PhR7uN_n~b`YAn9=}Agos`Rx=-=XxwO0Q9Rz0zBi z{$A06Y3L}`8}BbokVrGHbJ>nM``Rg~s> zk)*wz(#I*?Rq4J;k5&3&rLR-^ZlzZ#y-DfqO7r_5$@=e9`gf(v;-+}g{}83CDP33T zLZ!PY-B0PUN>5UHiqg}So~!irO5dvVLrOob^hZj6sq{}u|EY8-+@(wQAJ=XtwfjCJ zW8D0%uk0r(-9zcgN>5dKq0)<#Uaa)fN^e#AYo&K6&9%4g<=S&pvKdAI_r9V)*G;XOT>sLwX=1R9#dX&0gyD%^Tj~%gw(-mF9Zk zq`k4yt(5MpbWf#EQ~FG$&r$jwrI#rEzS18l&Gn+m`d3!EtI|D{<~qe>dahYa>Nk|$ ztaO2^wYQJUXfOVL>&Q}#=hzDnuql)hEzJC(jy=?9fwu5|Ht zPhI_9RQ5NN-l+8ZN`I>KS4w}c^d6=ERJt_Qw1iQ|Y=&7bx9C>Eo2{sB}-I`Mt1Yefiy}q&`#Wvz6xekdpq>mA*{rxk}%t^qopS zsPq#`Kcn;;N^es7Go`;#dbiRUTx=b_-1c8a>1s;XR=R=G{H|FtzjjJ@QM#AX{gfW2 z^k}6gDt&>{mn(gP(um;{fK1$lvTRA(yf)|_nngIXDYo| z=~tCruQb1}k<9NCrN2`8XQe%S_aK@60HrG^eYn#3O1D(Hv(kN(9-;I(O3zgK8l`Vj zda2S+D*b}e8^3-aHWq>x`EQiD&1V^9>`BPw9`8{#@zrl-{d! z;JOWy!2QABdT=lI$H7V;rgTlE>nNSCbYrCpm2Rtak<$F_iDdoyDLqi>VM?E=^jS)u zqx1}=uU4AB|B$TD14=)w^g5;a8x+a(Tb2Go>F<=@qqM>Iu#)*zP`bX-{H=?me|M#a zD?MH5`AR>e^czZVQ2Je^KT>*|(qAh5tUymA2~sOor0gN|#f*lG0U`K3wS| zl&-6Ep3=uE-ArkImpeIrZI$k*bT_5>J@#aJekVMs`91BV9-;JDr6(ypMd|5E&r5bTy@Om9DFFzS0eqZmx7IrQ0dpS?QCM?xi$;cOlt+{&qo9^LGW3 zdbHA$l)g~u8A@NK^c^6;aHWfX^TQpuj#c*NO1DwElhUUtJxJ-1N{>_e9Hpl!eTmX@l)g^s zTa;d?^j%6XQTkz}mn;2@(l03ey3!kzeqZTNmHt}kpOm)z0lx6%#;=sp2P$1r>1s;n zDqUCUe5D&I-CXHbO1D+IqtZo6pR9BrrTZ&AMCmh>9;fs~rO#LTBBd`?`YNTbQ~Fk= z7b(3|=|`1bsq`A9UsZa8(jO@OvC^L_{k76RDsAK!Y@_|n0ZNxsx{A^@m9C?7zS51A zZmD!TrMoJ9veKt2Jy7Yhm7c2fl}cZ)^gT*Htn^DtzoYc0N`I;J9;N?Kx*UJNGqFFY zrgTH4+bCV6bPuHmD?Li-3zeR&^gN{(D7{$eN0nZq^ealgq4XxDKT!HJrN2>nm(sr| zZSb2A$^On%`XHqbQM$U)b(GFmx{1=qDcwQolaxM9>A^~$q4apArzm}?($_0}x6;d$ zeqQOfm3~j@Pn6!S^!G~tr1T$3mx_NZ#2r5mQri92G)LIk-H(eG>$=MS7^U40u^0Qd zQ}z>;?y2-?N)J?exYDDPo}l!(N>5dKrqWj^eT~vLD!o+cN0nZw^s`F8tn?d7Z&Lar zrMD^lwbDD4{#EG;hjFa9o@Alpd+{*-B4VdYaNRl)hH!Ta><6>Bp6RM(Nj- z-m3J^N_*8@Z$$l3R_Urrw^6#Q(({yFtn^Z)A5!`erI#taR_T|Neog63N^ep6L#01a z`g5g!QuryOe%N>Bp5`qx2@F zw<*0t>ED&ksZp{&D=S?`=_X3IRl1YXrzkyG=`l)QqV(lTU!(L*O5dmS6H2d9`cMC8JbaSQKD&0}(Q4=DYq(z})ZMd{31CEHtG z=>nyXQF@Hh7c2dg(r+sLzS3VPUE_$7^=qPZ8>RaxeYVmUD?Lx?g-S0``eCIXSNd6{ zUsHO$(jP0mUFkoRu28#Vf7DXCyVB#79W?*AOA^wCPURJxPWJ(M0X`ch# zAAk1|JrjC4{>~K*#4n$}jF@=&@vnKhNZ({7to+@|c%fGq?-$>g79HPM5FKAw5*?q& zimqYai2Dw|UyIlQi7HVakA~8Pzp+`)%Q8L$bp}E?&kvthK+WIiEQjy+4Zz>j?5}cI zSa>dlyqI5GrQ@Yku+d(q?6<4>FspiFd{YC=y1)<1$(rh$GpHx~=5jC}Kae{YECAI-!Tj7QcvzUd+C z4d##b&FNqPIFIr0UoG5BPD8zgoUhDxJqf>UqWK*o>H-q>Gei%_c6x>IV5}Xby)V|h zFyAwTQ*mlaJy*D*g43@F!*=q=#_`HO&*$%en*4M9@YzKL&>Z{x^WBUt0C~x}0Cv9W zo#p&J^iw@(@-*RW;XT6Vgd8XO@w-vej4 zcMAC(3~K&9IN3$GNVrkB0^cQ|y%6(}d_p)K^OCwNc9GL9oOQKrwS(uUlIN)9E|OVe)EKH z3i&)8#t#+t#M%Yw&xC_<2%yfx{+j$*cqKL{>cKc9kh~{C-XwfQ_?hqk9Q0_fE$kv3 zFT7Fsv~Zj7Phk~Yqh{gRWsY`wzOelub1{vfQ`%*CH9oFRN%xLsJLx$|o$94(wByi>SAm`XeU z#=_ykn}w@|dxX_nIRECtp2C^JCxqLDm0LRhF2eD`dxdWazY&%ybpADk6NPhyON4(2 zD<9|l8wxKKZWEr^%Gs9+4{7c6NFjF9#yi^&e-EAOu(3NZ9^QCn=S{+S0f~J9rl;{H z_y*I;c-R+Ux)}WUy1}p;56-BL@hamt`$hK_J(R5On~`J<-%KJ8^UX98U%Z|{9`2ht z(aU|+@K8gCxBvHSs zN!0IF67{=>MExEiQNO22)bAA%_1j3Iep^Y@kI&Cy{eC7mb?9DDiQdX_tsM7cO+4$BSCgHY~;)F}4~66Ib`BJKwlRb<% zg6xUyfW+s7#=;gP&LLWnIM*m5-|$Qy@*w<-JeiI8M2_{tXEKoIQR5tDDp?B8p&-Zm z<|-2DZxTJ9yw@{}MK2|nc;*SwD@n|=7ev28VxGNAqMQ$epNV~!=siMy=bh!2PC5Sr zg?zRY;}0g`lS|^ba-^^UiJi*PBtlCP{;f&Wzl-Q@Bf=>8OY&rerTS=&llb;d{pc!MXwdUF5Dt^KD&wa+9~7*Oy-+OBEGD!iZEALK*F!3Xg*Ji z{^9vB;s=NxDI71HMxviC7S5IU1)}c|K0zX%XT<)J@GT*qrN;8UAmPX7N>TqV%)*>u z{2?UbYY6KK8yKC_1YbA&ev?;=s(dxgs+p3mT6{7b?u!mYwx!ac%2N#uVZKmVW}6-j75ABQ|r zSRiak!mpF)lZ68$ezfRG!fC?UB%@0e4cDtfSx&(38$zavi0kodWx`CV|9vp_Vz`%TT~ z+mfp!eywOeTbB8}CwjY(&x)l#ziUlq^7AlQR>)_9|*q}?h>YOZo~AYg@+2O3mcGV$1x=8+nB_8 zL_3KOKmQ}1&l{w@zi@HME37YUBy2;X-6sfp3;PO3l1R^IUXjxz{$k-=iN8sBhwwqMKPu$& z_L!c}A7gpzh5U{y>-n?TGjOg+U4exEVZwS6-%MC2@qCsU{RarglgNLPa4Ly>W{aLH zyiwxsCXxOD(N73h3ttxUyROXVec?9YP7>+&h&E-NPLc30BRoV{OYD5c9PN#S#|wLk zy`SjtIuHEDik>VCulpeWa?#fc7m{fIBH{fKzf8E6M18~SL`c6$;`tnG#(yiC9{{OK zlknp+vB??|UsrTX(d|SR3HjYk`VSC}Cpj*{sS-b1^jzVM5`Q;|@*fcWgmAU+W#M|^ z`@(I)og~ul5zQr8)F~46DkD5ZSWE2nMK=;2FYGCHen*k%`CUYEtZ=gMBH`u2YlRC* zj*IYqiC-pMOQL?Si{2{wOVK-py!ArA(j>|+C#)gybw#%n-A;6o@D$+y;aTKazL_XI zpTuXKY2+Y$-XOaha|3yzF^kBPjCqtCV9ZLg51#!;o@&e&eH*gB zF*Qh}J6gzRmr@TFP8H4*-baqXa~;XCcup^QmND;=LyvH;AE{wO> zGpCUFJT#bm!ZX9k<(`=!@fVU^jNx}#yeB<#8M(qU*OT~MbvudlOG)b+e&@u)fUY8a z+?OQb$M2HR?;{d^{H}rG3+l%))gCvNHAqBtG&6i z#QvPv*O4dTctUo^^#`$U7yEAV6yNM6dt{cfct!8N8h|g zc0#>LT(k+V$9KW!IqH*r^CQ^<_a#wRmVW?=d=Dm(Z%wi%J{OU_P=6ABElBvaC*jwR ztby&5JPeP{BC8p57Fiw7o+Yc|xt8SNcxESA6WcABi|dJGEn^mvN8ov-WNlm*B9FxN zEwT>onUi(#>}|3hp4&+th5Z{@AJ4)j8yNFG*$~emCG+r%RWcvjJ6VAJ5P3A7@lGCt zfVz3d;<^#p1lLu`MtEj7+1QvPNnHEQCz~46h-_v|nrx0|SdwXD+LJAC9f`!n)|1KO zjOj_5N8vb0K7->kdADc2CtDfw zE7{GML$NJ*r=Wkx-ni~c_QiHZ4#D{VIT-CF$Dv&k|04MWo_k9^Y0Ssua$~+HR~Yj< zxzd=rM}n*H++y-6%t!KR^cRVG-A}GY{mEyseUZ-@OdxO#t}l{nao#{ak9^1%&@beR zn78Ch=x6d}Jd2ln1?M5;t2hs+3%-W!i+ml=xh2=(iJs&e7(en&w2OSpm^aAv*uKfP z@tnPS;0Ek($&JPwM{dG=A>T1(BDop+8S-6>Gx?q|ACd24J{|>b!84G_4=}ID4>7;V zk5C@D704Ed=sr;*$6tZ?!(V=g5>$97A8f%6e^JDw#>eu;9)uWum{;U)xQ%YDP+o;TS+W>d6q0?&F5sMH5o^PrL8%N#A2AvB!19&9GPv+T=GC` z9w)I#=1KA(Yd$1%toej2Yu&!PoHaF%fi7=NZ4!%VP9Q5<(}_ITnls2lths{3O{O^{ z7J)oOVo}Xo6!jbFHb@5UgcQ zFY*X$rjxaCpN2frn)gWjFm*;Fu&y=7koBxNojl5#%SkL;TShjpW(A3MzeD0?*!v{f zy^GAZW)F$>9@H2tu%8CTJIlMKMp3 zO|5y2Y-Y_zWOHkFlDHX{Y67;frV`l_<&jvVRY>9{-AQCCYle`mtvQEmgZ7cfTQi@; zqOXU@cGj#RPq1ba*&g?K$PO3}vLo8p6zqg?Av;^sh{R364rEu%JF>`{N#se^Ocl-~ zPqgM5vYRza$nMrWB3w(JjCKk)knrD1!v9CIhc!9PK-_FRitL5?MV?~KnPhLwE3yyr zCvh|KP4YCPC;M7+Xmb!hDBhYp9rY#qTQim%V9f>OKx-C|gREIe4z}iHa)>owkwdL1 zl?I1dQ;WoQcq};_<4caPW;lr-DxXcBfp(H-TJr`u3iTmJTa(!W9E15vjh`b8h9XZFE&E#Bbz9p|ly~t}Yo~^)Z zvEL)-S<{=m&YB72_1J%rH(0ZjywRGM$eXO$M&68mYz^LGO;z$%Yg&@?v3-&YteHmM zX3Z_+LbQ*(9ql9UK>Nr$t*O!mTx3mS@-Az-lXs(i*M$$PDNj=T^1QF4hj zzmQ9CIUHBWHP$>u zu0?yu=g}VW1+?b`@I|zTdjy@-^&V$=9)8CD&np(;j>S+dKKD zHSNi_tQkzM$M}$MV|>UB7$0(@HE)xftofdN$C?8=fSav3l6)828Tp_DXI=dpd$2qdnv&Xb<@*j%(yLYi5$4S#t;ZxiwFdU*LE{Znx$q z@=I$D=>&d-@gcvqrVsgzHRqAvqCMny)~q7G$9yAqSo1Ua1Lj+2aHlnCau>EIayRy0 zPBJV0WR$8%&k&#WiQd*(Z`f@iW$1hM#|HhHjT+LL$y!w9kx zt^<*kJ@X)0#WNepLp}2=S=BRDyMc#!rX^X;GpCc)Ju{80;hBZx;huSx#Nv_<$Xw6- zOxE&D#go7zJaaTz+cRCsBRw;ctmBzW$hx@xMAq}nQzRCryi3;i%#UOP&y?*B=6R+8 zneUm7Bo?m>C6D&ZMI;u<&L@xc%#&n8w1;funIFi;o;mPju!(1mC7WVB1=$SkA)9;V z77~kLo*-Lz=54YiKKGD?o;jcgc${aBBwKmrc(S!;`jc%ub3S=I@*~?KKeC-?ZX-|d z%u2GoXPzNDcxEfv(KFk~PM%5i1Uq}CG}*;7N041TQiY7$>riXMQIqSyQ$bcq+z?MEP~e)6nlE z@@q|EQBXS)`~5-W5PXgyv8a0r*$?xR?2qvv2cUd%Aj%~NVS6D5V?0g)hoBsCDDowT zd1e?n+%s2`BQVd&k(d|c8JM5snVvbUH#o{O&B@WY4oZ&k%(>)P^glTc+Xs1;XTBt# zF=j70-ZRzufM@mz?aGKgn~keV+=RhwYL)-!tcsQ?R~< z#Nw!x1+q`hv4O z(~!K(GpCZ5BOQ5#XKp2Dqn+fHp81r#$}>SfaE@nckaIoLn7rCE-N|b(Z^&ysGl!h# znI+_Po_USD-ZOj18_>_EgExAn19=nDkvF5gF$@ zvHg>`qo2t;u-%e(dgfYkk!S8A@51&$F7wPw!ner#Jo6!Wzh}NCAHe>Sd=T5s0PrDP zZzdo1Om*@R&(tR$MSqizd8Qk=)HA(>1IXd{Tum@UezJaY|+`aVEDgX4&B1Now7-WPsFzKrcnXa_;Rj(JEL-_#J+CEvvS zAm74%ja-lZB0t4-RB{{ESCOA#zLTGOW(N5Mwo`J4XBLn@U>=b>vE7rq(O=|`I6jd- z;r;=+$1~rMd$AuPfA&nqVDJ~ulqY}1yd{6b{)hYn+d28CX9kirj5(kD1oaSJNn%`X zCec6lkQlGW$hUEvA~$+w9k~hpM81RVjNFXvl*ByYKFxdAGY66H<2Xoe!G4PT0R2RM zgnlAF_DoN51IA4_oIDZNiAWs7W|9q!xrTfX{X~9<`UxK*QSYZn)bkCp3C=&st*D=H z{7~rcahxHyduA3n9OsSXmzb~QS2&)NUwdX1`3<&D@>`s*kl!KwFmRV=rVD42Esg1o zZNdB9GXsPVkO$y?5Sfj2D55_Qy`98;n_c9ASkFP0!TO&OAkrN|B3(@qetG0UxK1zj zlZ0mqCz3h7xrl`SRV418+%5Kp$wRQdP4p{dU986>F|Rg~M`3*;Sr7MXMuO-szIY!s z5M~Oqg*n0s!WzO_!aBnG!U7?NG|ab^u&uCz5T}Kq9fzBc*e!<~AjGhSdYo{AaI$cU zaF%ekaISEkaG`LKaItWyaJg`maJ6u)@J-KNI9E7NxKOxAxLCMUxLmkOxLUYY_>%B7 z;hRG2lEZ%5EZid8D%>XAA>1w8EBsA}TfVNph1f-fx`MEVu$Hinu)eTBh+DE@x>iEm zN)0t`jfU(Z>@5t}uVb7Ch#n$DROmlJI9WJFI7>KNI9E7NxKOxAxLCMU_>k~1;d0?B z;cDSp;Y-5Tgqww1gjR8KM}8ATPZmxQ&JxZR&K1rR-YC3PxKOxAxLCMU_>k~1;d0?B z;Y-5Tgl`Hr2)7Ei3AYQs5$+J~7MhgnuRs`m&of(eC1F)z4Ph-|fv};lsj!8xgD_mb zkA4i-?}O3zM+b;~h;W2(lyI_eits|=4B=d1xUT>Iu=h6LRTS6%_|DzE$u&U;31~#r ztAZN@Lc*H~B7~QOS202mL^OothD7paas#2Iii(1Yitkjd#THw%s8rG7YiYF>TdJt2 z)LKg|tyrjnQnjts|L4q{nY(uqUVQ2I`St&FpS$~+Gv~~inKNf*XJ>csLhmZ3?_^xd zxQ=l>;|9h}jL$M|X57NKo$*b^9gI5}cQNi^+{?J1@e{^R8J!fiH)954H^ywno{Uk( zUW_@6{TStY1*rF6rVAK{GZrz9WgO2qnX#0yjBzF-eT$F!(HzDq#u~;t#wNx%V;kdQ z#wCnP8J9DzU|h*~Gvg}8I~i9qu3=ouxQ=l>;|9i!j88IdVtkfyGvgMyNFk=DZaK<7= z{oeF=rYAF&GL|vUWSq@7hp~#WhOv&Zi80RD#<-Yq3FA`6<%}yBS2EtrxQg*k#?_2# z7}qkcV_eU;fpH__lZ=}fpJm+4xP@^m<2J_ajBhgTVBE>Li*XO*UdH{5^v3|yULIqF z(S9GL8^>oe_GFAQ_F|-OJd(bCjCqWM84DPPGZr!G_uI!aJ(*Fy-vWJQOwVMT%{Yg# zim`^Vj2GVWsB!?>4mKjSBipE5c}aCaX&81onh zGZruoXDnhI%Q&8KGGi%Y8RJaG*^F}-s~Bq->lm9D%?l`x!rB{FIUY z%0~8Q#t364#%#u(j8Vp3j5&<`80Gs;X#c@X7cdTIEMgqXIG$1euS6-+WsEZ!XEV-W ztYWNTtYd6qj5D?|E@oW9xRh}@;|j)=j5jl`V!V@aHRBq_wT$Z+*E4Ql+{pMO<0i&u z88Q+*D-Ene3Ee!YsklW_;*PR3n~dl>gJ?q~dj@l!_UNN#UN`92}+-ihf9 z#%_#J#$Jp$jQtqpdxuCrnCSw>;fzI$V;RRYPG&4+EMuI>IGb?}V-;f!V;!S>pAq@T znQmiT%(#ScDdTd+6^ttxZ)RM@cqij(#x;y<8P_qcXWYQJk?~2!O^nYnZf4xVxRr4m z;||81jJp{3Fz#jC&-e-Br;JW#ZePX-V<*N8#%_$+j6E5njJ+6h82d5iF%D)dU>wd^ z#5k65JmX}>QpPgInT+)9R~m=rFjg_j_d5|^$8-~8oUx5@G2?Q^6^ttxZ)RM@cqij( z#x;y<8P_qcXWYQJk?~2!O^nYnZf4xVxRr4m<95b38Fw)5WZcELhjB0CenzJYw=ZLa zu@hqkV>iZZ#-5B(#$Jp$jPkuz*g22s!Hflr!x@Vh$1;v*oXl9tSjK3-?>dL$s~Bq- z>loV@7c(wlT*|ndaRsA%KNjV_ndw!GcQUSKT*J7QaUJ7&#tn=c8J}d_#P}@ZX2vay zTN$@8ZfAUxaR=j0#=VUD89!nCl+nrH_GOGPc4Ew6l<)7N-q}p|WQ;QQV$5Oe$C$@B zn6ZFyIAamxSjO>;lNn1H%NS=e&Ssp$SjAYwSjX7J7-wu_T+FzHaVg_+#ubb!8E z&A5hfE#o@I^^6-BH!?oSxQX#u#?6dd7`HNRW8BX8CgTpqos7E}_b~2d+|T$4;EaP~_$&96pWsEZ! zXEV|_eW_e^j7^Mj#x};qj7u1oGA?Ia!MKv~X2w;FcQUSJT*tVcaRcK<#wQs!F+R(< znQ;r_R>p0N+Zo?v+`+h$aTntr#!mIe>rjhOo z<4=~d38AMK(>a9DGnVP`gk)!?n+T!jd|Ed}x&?%g&*ybE`t}R)o!qL}+}3&J6?5k{ z#}+u{v#Kge7dW}ivAWz*Q_swewbfR&<;G)e@!axRQ-;Q?>uTe%L5)ohw!~x22Ze?SAeXIciDnLa%-dsDkH6CkGg;J$$ zu4tG?F^X!5H#@nLb0tv0RcviTb)%Ep&=`;9j+-*Qe@ncga{l30EUzkdQENp*y!IQh z!4n#4pP6lPWKSxf&|ys4Y`CE*3wlHQvy@TPcPG{LGet_W*VWBJk*h+*aU7VGJ#D z8_cKyw?yUkZyaqoorVOo+=oi8=`xDMHXJ*aiA`Cw-1~^b@}k)`o{#rkK%Io0WN0TE zkJTmRI~H;DJc{15K0Nl8q;C`SZH5r(qjG9}*C>6aeDn+o<)iDO_2DtoBz?;-NR*G{ zwZ1cyK9ioFVWI!q)|=K>Xz5!CeLEm@5_T-Z8GU#?fa+_?7e7Xok7Q`m`tX`TQu&(7 z6XnA)fYFCXZIkRr@7VVvMZ9T!cmz2~UmNt1yHWXYSz`3{KsZ>wwOl@up-t;M3gKY; zt__qA(;}nqb@(Lo$^X6tIP0PBcNE}_c(gyosJj5YWBrp+Frq~!$hyU)^Vb>6jGb! zy$CXBmsQnx&j$6Ne93Kez7Ha-(;(<<`3U+jpU|7;{Rk03eML9nJ)RSkKA6(zyAfeZ zqwTi`52Y1=)*JC?{{y3r?{$RENyTXD4v;WmQ&8?aO#rnVUIQ{=VlRQdwt$>A<J2#< zhV(21kL1W-V|6i_&@8NNiRCs9h(_~=<`oPrC>)YMBpS_&(x#62d3i&J4vj_&^M>XR zl<{-YE-9W|A_Qqvo4^a%2@3B`Pm@$wjlDU}Y;cP{a6;H!=fq72VRyxxQFAuE8#;N@ zyI$8#@1}HZf@iC8?tSEn^_@$OsPRhDYee5;UTUgwf&E{KmgJW>Cw>0$XP<{l65*7R zoVNV7<)aHh#Vj39sM#6!H?-9ppq9s;(8i5q884pzvy0w1ha=L!q1coP5*{ zip73d@~58c-m-q2%4c3Jl_$R~ToNgvP)Z4DA#Ixi+J5t{)GqTwyoi?cKRI-Zd+Ww= zg3DW7>qIGi-!@7clBJ85tT%jZoBr?a9kq15R}!f?vSe=ksG4ZW%5k+dVT7Y46KYnD z>+=oKXTnPPbhuImoy^K!+GZJ%^oqHL5}BBG-A7qQmqCx>oxZ`}l&d+VRtwfE9NCGLQNS2p#y z!}(*jSD^BAQ$zbQLR8vi$oGc7i8OCthNox&I+UiuA%tBHyJ>H|)NMy}ubU!H&OgE3 zeM9H0k`qg&>=iqHyvIA?vCoTAzrQEr_%3^o*tCB1CHw0iB=1rs(CvZNI&8m2+nsgA zA=<8+X}ecHaaL37z4nQ-@~pk+{5cI*pFK0h}~Ywl?dMgTM~UG@D|ung+mCtGVGm}G5Cq%D?$C?rH%WXEY`Tx)w=akt$);>x8D2Au(^HRe5yzqz8XH<{;I>(nU?_Za$@Bg>Z zHHR9Z2bfy6@8x4nFCT?oPW{Q*d(#r`QCF{jZ@lbt8{R8Q+xK3^KbP!Vw&V!(Hr>OD z_Fl8Z>HXB#GB(`4!|ANFaibmQIB?`B(vH*pwS-SU z^U~sXbgh47LfcH}O%vMrj?=qnhn5XmW#sqm^^1S!XmmRanr@TY@)S!d-)Oh1l#m1-ZK8R2KYROODb8f%t zJtr+_#iG4e!M8SiExvUFeCvAlEy~OB5A0v3y{1ZH&PMI5-&aZ;$j?q>ZpXfMwB#oI z?TMEfj7R<4gkCVA?I!d#{H_0v1N)UKRnWHte5>1z1ACDw3#ABpl4p5Ro+&}1R49ww zXy*L|&xwZ|lfT~iWE5U?p!p>6I-XCeRIZ$b{$I`~DPNjL>NzFR%P@( zO`*q{UTP!!N7JsC9GTzT*<)~}MtNLV=H~8y<;}o&(z|6?@2Y6;mgtFR&@o4c`Z)1e zLrY_GbzS4a0dx~)fV=@SV1BH*Ay(HiAh^a*S?Sc${e=D_;f=mlt(UhUT5=k2hoX;@PciClhK_2K_cmCs6pqp|bCfiz;#T#E*0w}(*CpE0 z+SJt8jC^yQF^%<2jSW}=85YGFf0W4Dx>$2`Xm0-CXjx-p-LPmybA4qU?&?I(8&Wkl zZ)jy+-uVZw@ocNcV}{M1-V$qWnLU2dPH#eH-vCuoOA|6wbN_1MhBHr4f#iumV{S{4>)HPPb2MyHZgoXey z9aKSpGjy;frs1wu!#qumh6!{SN%Dtkf-F@RYfGdHDwH`VWF?u9K+aja}4G0ngK9LIA3iu}0O^HC9%{Ya1Ja zW}4E-cRwUYCm&T^joVmB9Hk@}6;xAPJ1^G2ci^;=ak2XP$&Cw}tmxvZd9kvlRx5T) zQ|oBl2#hsUS&TC)+KSt7BeS8RjyWw{AuC!I2i>qD?#!ijQ};w2+!J+VmkciV1@6Z= z6I!O}9wAj!#2f4CoVrH%ygbyx$kIPAYHf@=&9Qo?uCA(fL3!L!M75=}`hkB3RBOIoyavM)H^xUrtfw zxaS&=IV#-jluNmC1V&AnHX%tO5uv$Swz7iU$!WoTSXiREITmy3RaA3KVR?B?tfHx@ zIgVRp6rxO9IE>qvwN*~VT#Q374Q^(~F&g4fUQEY%F?jX@r)3d5yxy7H602ygtZ^>F zC<}>M)8d0F=C-sUHM9|hW@u}p#&GH=j+y~YB!eV*Zw(T}89I3G zA`BGe<<0S+WJ`_Ak75H!j5P!7Bqh~N(!3a!>fr$mIK~?nRyqsGgMS{>xk9RT0b|2w&$CjXO1o(Gkt3LnWJWMUKN#R2bsfiO}cOvM2~peRM4 zU?^R+Jjy~Mh*GMfjHsg$SJRj;bu{jsA|OCS=XkQAXeZDomWv`Um**QmLfhKWa;PDISqIO zqoNw)bs|)q2r522zoNNH#;Tx_P~kcnVk>GJs-OaHi6IX|&D=V)yF%1g1yFqoFoVn^ zNm#HVUQ-@xZmz*lho>>-DI+Lfs8P-UBT1Vm2Ox?pN3E>vf)LDvw#O08-drthBSV$S zOwt+Z^FffgRC7|}qB+sj(t6bjw8g-bmJ3v{I#E}|qOypX@x zmYH&%oMl`&qXKw7TR7g_+ED4pBO-~YljjQbxF$?zTUu(X7h$k5VaY70ZNaPuQ}`-J zhh%(VZOc52%kb$c;&52$8*FHLEU7LiAS0yI5RBRl)s&XZPv@+mwJmkAmKG^a0i`To z#U?ZnE1@QTkm3gmLlVIPAuE`evLcgHR;X1&V>5h0M#_-MtrZ;fvsjfZh@qUOcym>4 zbv67BZd8tQ^}GgzTku~$<>mQEttx~W1ci_hh3KSAIGD!2SZNH;-&EGcF(J=sXsxS* z#y$=QNL66k4?ieC6d-@7!a)NS4jl|^Wj>)4pn#O1fD{3i*TpJYv>ruhZHm%56=gIh z(vh}6!USpZ3M3`j>Oh7RHu(`@vLhmqn@%IOn?#06WMz^eC)kedphAeEW>Kb5A@vZF z1E_CY5TjWlo=GBTV8p~+=s6G%uw;_HN@7C(~? zVPeM{ky;_9t|(DUOjZ#CKPD4k(BzANEl@`$po!Al+Bl+cstOQz9?WoX8VC?U&cYyP zq2Z9p6Y3x&e$@PP18>1j4sWC|*x<+iIH3IxP#E)Y)x;36+;G zsK7+Dg_6&0t;M9b!NjyI#Hk!3C8SlLTBk2BFPSj8*jZpAsrvE{H6h3P6lUJg_#s8)c1TgKKYz-6H#4J`xY<)lX<^-rRKF7WU^Bup1LT2x*~u&90^fJEHAHaYHTUT1r^S| zmAF8Zlp|XY=XEL+Eo{Iy;`L3{Sac!;?NnFRHR3!{U0v6TON8piCMd=HSt1nAZN)q< z7GFSE%}#}^ly_;Gu|?B5(9*y$3lgDf?P~0CiYzw*dDTwv3Qlv3Ox z7qqZPb3UBC&Q%tIManfUU?CJm@_{O_Kvz%)7HCV9o6rJNToWSSS3N*=0OkKJq_AfNKQ{57a&8K5r zQt=oZsyT*%qspnoDZ3e?wNo9#B(GYH+f53}t7}{Egn8hKwk1|yThrKrVPal+%R&rt z@^Tp$w*dx5HS@r?Su`y!os{%^v|%{3nyMCLTQDK{24*a{3V`BKQ>TtPw|p9&m@h9o zx3svtoL7q`G{i?WH&-lj)M{%BO<7{i^|7j2jD0Ow6~$sIuB&Si#-)67xm2geHc3>r z(#3u`4HmT(bxNRvxN=n*Uhw4H_4+51^ssuMzWI5HHQ^3w%&WzL1o}OJak2QBt#}~1 zE=JFmALirk9VBvUv4m2KWll6DmRZzlVF|6qfvQG)bHzg1%PSijFzC~ir@+CbCAgK~ zD*42+Y9+0YCPh+&Or&B<XrTcYKd?P5{3-@jqf9Qz<7!U65y0!!Ey}DYdvRN= zvXxdTO0lx7xegv#uYf9aEsRFrh&4BsH#H(dRvTRSELD<}@`oVhopEQ!OQFudgI8We=Cu;3X$6Q<7p7qpqSdMtM$a z#kEAdWkzkhM!Wqabw34zN2PoXr3&{=usBs7uc4txmeyJi<~;1!Y1IBn>&ddo7UC>| z={H_ep{aEvD0rr-7ZxH$skL)l*64M2)r5wj$dblpazB{&qSjbTd|D-JR#~HX6B^`F zKAANsKB+B=u})N5iKzr$p;%BGTc~RfkBei>Xl$V64Aq_i7P&3da&wY{C;EUA)@$mt ztkTwg6d1^94!`@G!NMsEs0+M+lpnYals~Y1+~l)HkD6RwKBYXrK&FKoPN*&}&L7CW zEAQmAdzU9Ta+j8rl}{U0UaaHfV!hTi9II~?@exinUH4g@LFzy#Bit5di8|T$x4sdYSDJ_{hSM_EVm-ieG z(wPIj1ob@3-e=dM|H8$2%7Kw}@j@;6~-Mb%_j zecGV%fdePB@W7aKe>G|R#+t?#IR#*t3+6Wb6m^ex*f8AW9X3qf=CYoc~gek%10NHVh1D{$? zn^xO!80BH9j(ii4DAOyl9$how5!o+!`cv&IGO1G3{32PqFa>tWc3 zr8?F=$n=+KXHP8)7KrGM(;T=&1=9}eOyy{?j`a^VWtwUiN=9^?>cFKs+!Lr{PP858 zFvOH=8eT%5N^hWBF&(EnaLEq;^aqpa^JIsa49qh{fhSEEgW2hnvy$2~5Z$4M{DTzp z;Nv2nGyY#37dtB27akY$2eXsG;wzA20rdJSf^oo=Du|=p4v?1K2}A-GGUcFX`kRLiSiKNELb9f>13apN z`vIM0Y4On^wdowGcvLp%q6AN?ASL)n1#y&{PC$fuXSI|-Rj=%E1XB)dk4|929t5i3 z?aBepf3Mn8Wc51qgfCq4ucV7wlt8(^%v=?`6nwd9BNTvAIZRFDFg20GRF*dur36*j@eVt|H)QY}f+aFI z?N-2@D!2illusk&^pOrEODL!6$xWB00n`HQ_`v%T`kc3OqbAlMKwVXGvZ1IKc1iR@ zV6Y~JBT%G?@d!-T1k%b)XGH`#4u&;?@5x|0dm`5P!p{8vs;;lp$;c7`dwnHcq$i4o z5l;T8fQc$dInbtCh&thy?7MT26n&T6kQ@g=9Ob5!_X3rJ9nDWb{Q_N+fI1;!6KUJ^ zO6p{zRRSF4rqvQl>6%3fqOxYQ5|x~##1oYqY!U==Bn@)YYH4^-YR^rmJvX8DT$VSs zOC-okR3wjVu@O7IzxxJYrwaZR5RwI*;Q^?pLV)0S87!lGMyMb}<)#ZpU2;8k*%O~c zV3Q^`Bd|pi+Ys2Ui4PF?NE0+dWnz~Ks2dk(0upl5SrI{w^S=&DmiWSh(*HUvxlV_D z`F|ajPPhN*4ogEL<}oy_x=#ghlv}Wee__A=?^64fdLbDrFamxhU8IL*J2(X=TIB1T zKIcj0(@8na>JEJhrimpwC?%+pLF$%r)BZs!S&BL4d`GO|*gMFE97M6&&F+R7R=aT_ z!6Mai)5RzPH5R)(Wl0VWnn^VMVH3_$1j@u^D-e8B#G5C<7KejbOo{h zy=wc(I(3MIs@xb^cL+s0xy8Y12(eO+eXnbj_%F9b7XKOEvd&YVJF+!y8`) zY*WG40B@-vj&jpko(d`#JG_QKsX2$#+^AwnjY`|jQ>jOcms01D6y?&vd5)w=A3h~d zQpyUm5>{w8F{KWm%2Argyj_>1exTHzn^1dhLT$T=DJ4*9^JXKs6gwuH%Z-{DiOlk- z!aOmZf>~h|cF0}{xLpPB0<2a+g6CwgY%^eo3cd~SWGj~?%0$`AOeqMGzq4QP05KOFi;c25a4UeBj9{Z9=K)GljerKi6EP$!1z(A&{d9x?(NS#8d=mkdk8S5O`V>Zy`XRT9q8m$((N}E2^Dj zQdW0qNvaDqh2&_f{l|1rxoBF5CMBSG4^DHB1E}sDobkZ<;@6@7U24D59GmPDFz8p( zMS3ol&G2+;kc<4YT?`&+2zER0h>-&J|Bvqys_K;z&{Q77<~IPFR1inG z>9Y(GWG>i);3yev*YObR{MV|bQR4vTjxSvEucV7CNGsXG8A?7rS_R3rwCNV1CZKFO zy7<$)4yr?}!PqgFQgbg=K^*0#m7fIa6zu3E1SE+|HG+#(>?Xh#89WC^x#_gzOvA8u zaBW8{rK@Zcf}cvMvP31z5Ft0Mi_XC+LFpz0Rf5t)f>J4sgHA9MVU=L|CInT2>4^mG zTsDy)j}p9q9e4f+-ju;<1nOvu7X z`V% z;$y;2&m$?&BkT|yn=WnCGhLS6agGa#p)iT6)A6~etjc3}r;(ioBL5S@$bWDr2Y#st2>O2e~vR>1Ra&e3uFh=T%zvmuz1 zg`y?evComH^MouaUIDb7ngwz=vg&)9ELcC*6sE#a5&GvU8<~h)Eur`W;1W(=HV*k( zk{HVb(hls7=s`hw89kVK=#WI!jOw954UTgflV~fIR{^!xgshRBsBTo~LRrmps^&2A zu&XH7(@%#K7A6xJ7zJkpYyq>4Ft!MjEk+7y*`gC+iIYH&B2Q0GAA#WLqZ39%!ZF?9 zD`OKGpa!aOirKvo;W#ByU|d!-y$aMgVksvWpDW1z@KItq&IHARRj$Ink>mfnv3bY= z?nZ~CtsoU$vzViV7@(x(QOIM+@rWA{VUiM}lZsYqSwsrD^61H9SRPa4F;yNT@_2+i zrpaTvJa%$Y61mqNmhNDRXi|z`O$w#@0~XUsjlv=k{L#6ppXa4gIF$yo$mu#ZBvL6X z|C8N1q@|yqsmvBS1zy4vsqc zG*stpn(X&Cr0udhLro?~d#I0_F&9W*Q*ydQ@Q4frx)JA8H)A>Q7Fd5_HD32;70d(H|i|V@haT8hr!A=|bF{2=t)9_i)I=p1mK3(<#s!&Qn5x z#R!~Df%_4dO@X%%n1{g8=fmK6q_gnkj5I_vP@|BVMFv8Rvj? zI>{_XphU`?jU%M!Q&4jd2n{JeQtDo{9=jDGAU9J0Hh>$X6}(SZ5}BGd>A4eOh=94LNprt0 zyFHRjlji=nA&t4WBYmhWE#qX2VA9+ecM|6Qgt#zwBO;}_Z$Utsdm3f~(%kD2kmi03 z0cr037>%U4FF-(=n?4tB%uNftWbP-RN}BtR2w3K(i3yoIm6XFg8U0B)0>?N3bB`xY zF!wEBCd|DERI<4TQZ16qO)(=V7Us@G;gq>oLtpkIAf>ry!n|`R2blY~h~r#%Fmun4 z=3Wjl+Cnp=xgRj3G501?I5RDSK431*{Z9mpckduB%pJurCCy!efHb#<$-6Xn1p?CC z%Mg&}ehUFu3wWM%%TE& z69UrQzeB*7dpqfbcVil%%w2_mW$wL@A#-01mNYkgmbIO^>10dh&W8Ggx#`QP$>wf9 zn2>i5BR7P1Uyan#+&w9#414xRh$54BxfLcZLd;m~WcIF@wyjMvdlX^;vzJS==hEyB zTc})`z1)z->`^NEoV1K9z>;Qv6ai!Q0^-8#^wCLa_9HXc?7v1pnmq?yU7EcL0crN< z5Rhj77y)Va<1j=Tv(rbS$n1llL3;VQ2v}yXfee}b60oG%??IrQ*_V(enEgoPlQ8=} zh$hTF7`2z9b<&_hG18PU`)Z_CUcMdrvZtV|(#s!#c~?;mF!$St{AH54<>GkalvzpU zJ}xXmRmVfM6RM&q06xER!ZxH5Q8^(vkvJT$Vw@w-#LSYmP^E03iw$WS=o2bJRa(Xx zuw(AM3Gg!d+b3tqXL|d5ICCJ6IYtx6lHt_9i}}y zo&?R)En1^mv_`k+ameN%E&49EAeS1*`nJKkS%&d4{p&p2*?(_0Rh?NevW`?(bc3AE&3i*$rkMf4OWY8 zgbcOlFj9^#kue8>b}hPPhYk}opcYH1I0653MUI)4spz9gh&_7Uz16&JKqdH2U;E>k> z`A~=+0cFDj*8;R4bf9a2iR8*c>7Phm$w9J%3QnQ|sL82ZSxT64zC4fgJ&rO&mh+`k z&o-oV>J>Okt)v#JOUt+nEcyg?#={8w5P_pZIMB>9G&wEfw}?EJxM}EAr%+%s0>cr= z?v3w#EC8qO1KQ~_1V@S)O0jV2Wk`J%agNP~ zzU(1U$GHS$Roh7fy|4#P(aj5BbkPy#;sbK7J|O4T19HB1K+XdPr&U2E3wJlXK zc+jZ%IQa>J5ZLPbQRuCYA9tFkQz?C z7E(#0L3>@Y^Vw2Lm*b?)g?IHL4N)2-oZgdhpiT4;rx3b7UV(TaqBjv6CqXRnMp9RS zh^M?N-IX$vV@THBZ+-JD&8nJC$DkG-+*>^{}8Bn0|`jDnuL0w8nDojN+ zi`*d)pkc^yvjjJEJB_2<3M181+;b3>DC1~%83g)EmA!>BuJ4Xw2GzR@=9aX%3q)!+gnN-;Wd_o5 z^Pp;~>w=-OUr5VMaE(rQ8={=l zJ8>N7yXUx*zzMiRz4&+USEWvt8)w^gELl?LCP?aqSO z5ULw(?z|B95dx?=-@P=6zbLd045%Z%JV59I_ihNO>W&I=w_!iqekwg5b4(X zq%diQ0WNgkGE(0O5l3s2eb0C2yB@9-RIz>fI8P?2kGbIct=}P_hR1TSnmH5UD}QEWN(l=-y?dj&ND(ZA3-ip@Yhu z)b`y2I&~io5z4@Ko7`uCLy?!`_H?N;UgUmeVvdtB&29#+bCk^SGN#2n$;6x>W8&^$ z6BCs&t!@co)EIq|OTCMYsv?u|9PNfz%aZ;s)eXYsD~78~B97VjEwmEk>Z@m6>n4Dab6Pgn9tfQ zn24YqWSbcx8sSD9DRmC9|h? z^t~IsCL?u8k`%Y|P2R0W;PjvX65s6o#PCWj-YwoMhIggKyVZN&@K#y8+q`sK0;=lX zD|mWEfc#c@zTp*H>AvlaF}xWT?{=@;@ctZ1)_I5bO~ZTF;(f=v&G0(8Je8A|F}`<~ zN7t{aoPV{_eb;-@@Q$?7t@d^s-kxAOwczJ_cYCS0u2hQg$tpEQ5=1%Y?|C^!V0Tah zEcAVEg5h-zCI)Yf7c;z%t#tQzml|G%mF@@LcMR_xE8P#h#|-a1i?`N$)$lSco%eeC z46m!jyU#lk7s|>2do7(m^7GEyMf7O821mZNuws zrCaYkVtD@urqeC?WA7y+a8xj{Zpnwd4~)P^NgCt`;d>8zSy63@qmwkSzy@!y5%_zO z1|B^g@unMr>?92=@Tj-I2z(IK0FU{Jcbnn$2qp$^qxZ1k?X%K7=Dlcm$5`ne_jViJ zKZEI_beRmrPk5;(>N+1AOdK7Bcqf&5f$u%(6O7u!Q1YgYt=b&+iC>v32N8F-yghvM&Q1rEZ819yv*L(9uFpE!2*Bu1{r}39cA&h zS7rnrOUiQ7#)5qK&n0F&?ZZZ*801$lfu=l$7x$O!x*seI~+(EE$`iV=7|seCN( zjSM?H7N@g_^USq0tIj|=Sl>G*F%U1@qBN$ z*Jje@xXJUPJ>E@**T)(n{^mVsc&A$F-t&HKczvyO?|bhUUOy|{UeEP)Mf+Rn_IW25 zUT%=5J?R7QbR#gpQv9Je+wk&&iD7{KUYp_NTj~Dp-E4RRt#luG>kV&^mF{D2i{TBn z(tYCXGQ1&Hx_@|HjyAwhE8Rc6sNtPvrTdpR-0%vlbf0=N4X-emPWRD&dvPN$ESOkZ z_A~DmBXD|91FZMC_o(3w4<-iB3BPQ3X9UyfoJIIOBQPSESmzuHcfs4`SJQ=*+a=3-hduh0kO$pafob2-ymyWp9@M5E5yc-zdp(8!K((oo&d3Or0 zGrWmb-baQv8{VX#PCaOL4(~JqlY@%2S-OP7Sk_UsJ~OCYnL6E(@Jc*YG$a zHM3nlIil*&!dgd#A2R|Mw95e{_NaslccqfEkF}!)2$8&&a_ofJ+->njJSb9sf5PgcFczTwqt9_#EK z9%Fcon#Vf*aJk_%>-<<}pYS&guSN4%=c(b_46jx5SZBZR!-m(U^JAU4;TH`Lt4eAi zlywdW?>4+|Y98y%52s=s3v6`Ji**~R^xw5%F;O|e1qYA z+tN8Ue81t{Zs{xzKW}(e>S{3EuG`SVt}sScPyRb!^eSV*6qC?@N%Xe>n4W_ zllVV$=?-Y3C!QHTH;KPC$k$4ygcl_V-P@7SS>d~qgzgIp!J?(%XOj3o3i5SMXNUik zB($z0p{d~r9*0TP`TmZCriJ?_2|W-LLUGE%Q z_9LUk0*R9aouU26nS##Bexy`fC*#WmEy4Mba|A7^`H`7|7P$P#EJ3Seeq^?wg)2XD zfuMybKQc$qqLUw~6tqy}N2&!a{P>X?K?^y4WWJy^89&k>Xl2EZG>PdFTf~bJ7YJJN z@FNSw4`lvrf>tB^$TtNoC-{+z1+5JDktKpw0sP42g09^C$Q6RF#Qn%}L08>=PK!9G|TiO-xf4$^dol&nqByj?+BU=`jPJn znh*Gq)q+mde&qXtPNjb29zo|jKk`FC6F5I|ub|6HKk_3%b22}2zo65BA9+yFaO+2Y zENGVKM;;b*I`bos2)gw1BR>&zD)J+b2^#AC$PtcTy7KWOFABOm@gpw@8Z`XKD|n-Y z@Kr&}r+(x$LCc|j@ZRj(+3~L5qQYU1TDh(kv|ApO7kN-1TBd9kw1zB65kfPCH_g!a+M$1DQMlukNjEC>W?4!i`Xgg z9YHHMeq@)R)fPYUuAo&AKeAiUN{JuYBj}RHkNi#0C5#_=PtYZaA9-KU6@(wzC+G^q zk9;WT%D|887c|rNBYzh(BlII537WzCk&gvU-~7lw1Wl^^$iD>5eEi6#f~F^a0ZmVeCh`hG>@UN3ue6g7G8WLo|E#BS(ekA%5xPIvEg-4D*Tf&5kBuup7gLvPcoZ^j;FqSt=uE6iMpbUrFk` zu4j zsf2rOmhgigN?7~2gnNG@;l3Rbe)OS)`%}mgT^=|_!h`)JtRE@ip{Wucj!D?iCgG85 zB>dzq2^)Vb;qhlBJn=d~X4Pz}W@d~Yqbba+raQ}pnKg8Gx-j!Xditd>b3Q%dQkYps zkFykJHqhfcg_%wCph{upMbArUepf;ZJyBAa*;*lCAw4rvn7N3a^C-;xCOz0un7No9 z;3&-e7Ciz{n0YZh@lcp~2|e6Un7M==VJOVJl%6Cg%)E>q7bwiUoE{D+%v?&30u*Lm zNq7AVGndf~{=&?w=;nN3=GAoby)g3{8rBOlSJ0jE!p!UFo_As9O1h_Bn0W);9WTth ziSBb3X5K0AK|ATEyzXF<-K;2 z8tJEJ3vyR;LQXI8(~lA4y6N;V4{hnA{PZ4z+&EFZaen%-f?PULuJL|)PeJaTDAxo( z{Ww9co+#HuKmB+?Zl5UEnSS~Sg1SJWTvPn?sG#nUDA!qj`iX+NMxtD$e)>s*x=A9( z>3;gjg1Ss1>Ks44m!R&Gh??Q2_ZHNZ66Kodr=KFITP1Ql&rkOSb+JU$Y(G6mP!_9Dgo zPQMm3+A5(l`N13cECN0A1tnVq4a16GX7g2^ey86E8l;ub`L+<0ydY@wR{ScPua&$g zXlz$Ptu!x0e=!f}XrZlwMt&vqEf%6{G=5m9(@TO*35vhe=4&M{3p!yap=)g+6!#TT zZ1}g>e63`gh#8@~Y#}IlRnX~3WpXbW8`Uv})kv(^Z|ei%(3BZ*Y!5+x%A0NidPwpMyHog>I)e#PB4U{XrQj5Nh^2F$Xf37{CpM zbV*b#n9-YpPON75>y)ma=#r)7oPICvF

*DI{6m+Uryt9JUf%ZQOI{z!)IhvO!1NWi7h(;rI;Q^)I z5w}1J^B$OODLoXI=!>$b!Se1BPZ-%N4k7!lc*n?Ic?j9RimVa349gB7yIYJjvda%4 zyGP77vR55K_HW`gBYX8BWZx6d7};wMA^W~~-^i{wgzR2%ET)C3Ev`L;>^?Eh$X<5{ z*$+gEk-h#9vLA}?LKe=ew$7Cu_x*&xly-eF!J8iB$sU&A%?|RU(LeWT3*Wy51#&R`l@-y1RWku#G+l)ox4p4IV%eax0z~QTo z!C*yU^`P6Y5pw!&#WD3&93qs!&-jM87pM~6P8qjLh(}v97K^uy)OR|Rik>>kK{!o6o5qiKDqOx5k{%iz(Yzt^Dmy49qx`vOkkgnWP z(bw=c26#H{6=Iy>KOW#y=2wb&hWBKEr_(MImmB`i$X5iOTt{({bh-GxVf~z*uLMgv z1*wUW;UILCc-ja(!|CbqN3G;)@h8K7Hkd!Bzec!YbiIGUe9E6slNl?-$%g-2a`~6~>5bwA z!+If^b+dTauwLW}9z7PRQhVYUxeOWj8Mg=zg!1pL-2dcb{IdU*ka*uoIHoG`TSXru z{&KLpT50@@+r&&G`6^4w)3$6Qso2k0B`z~UuLspVk7zXns3N=oI+ey9KjYithbGM% zLB;>J($N2!q|&3Ye#Y(McP7p6JI;qzL>Hu0M)_mMSp>!J6eEoIhqT%cccpxz zS0LI+B?tC1?iTe%Xg@9cCkgo(-xD_){@?jBFrmcH_`Z0^@IT_aKZdV;c8z%12z|nD zaI_P;M|^CA{>Ar8Psc}Gkz#~B1+le-~9H5CFy6Z6(taobDxZ`2=-PI zg_irod?S$BPC&LYq<$n;7^x!;D78*JWTes$D0RQsZlsQECxy%&5T6-=F6{(#kscH$ zjMFvis^2J(_2-(c7sW;(tDS&W^J7tMq`J40LTMfnD~!O=?F6)%hsFIy>X>#?P_se2 zVg!zrCuF#o95!W{$zvh)h}dtWj%%kzXZEP*Fj-UrN(|m3?zaukxD)dpbssUj%?&D`Y z?hZ4eElHwOCd>h{o^WGE;_411o^+QPi5s*3Wvzonlh?I+e7f zJXy*Fe%7<@QX`e4rGf&#aPKn$eUb!%QqQ@+Hd4Pia7{M5`;1tlR@PBX{H*8Q?8(|T zi?t|SO&hbk;Epj8-)bkJEaGRq=*EoHR4vtUmRsFxjOfD$uEb03qed)OYm~+aTI6N- z_eSbft<0F8n)MaeJyX~4lMW@exxI~q6U>Q{zv_-N%ru+%np4aLrKNaSecSDH zmag?pAs(t_J~ZH~QPa=*lbd6t?$#Ql0IS*QPB8*M(gM=DRDbx&pWQ|y@Q@bZ#D8&D zg4Z8%PS#V*^RwP@*O?U0>yl9cp>3D@bHjU8YYUd=UH2^`@K#U&iT~<;Zg{&ik575K z-D69&IreH^Q1Kr3G$W8EPqR3E$hBoT63PQt`ETw_Bif_AC`-NPUT&mL)lzDmnnvKD z!uQ>Kjp$JQScdekzaie~`vH!rbb|M@_PX1Q=qN2p=8n?LnPdf?z1#3Ew|F1BPZ@p7Ngub|C+=@enp>Y=)<4}Nr|K9yRfCv+ zxhEhdbtn#z({boM4hP!A$Ks4I1$v3s#Rv-g5*+bcA^!$V5pN1F!Py}q3F6P9lO*Jt z)h>~dAohrElAxt~u~%eEf?Q4P6Fnu-X&Q)+MAS*$f*jLd*9DrR-stzl^gdJ^ndThz zM*lykXcu_SNQx{9LjnGGlMa#8)UKdTrLaitiD2&>$ptwpq$=1+ObN-1XMrQ||22}3 zwVfVP6{J5p5a)&>c>h(WK3|NM=JCWtWgfo_GWZONOx=%&vos+>RKY! zgp^Btmxy~q%B3D7;(?HIsmEr5*bs_JYf8s?Jk(1P+lljZC`S^V&js;JsGlU{E!^ir zd6JMN*b*8niC!f3N~k~*g+%-=G+YuhiTG2fND|FNyc-%TiDg8*9~v)-9}$u2PL{-9 zi0JH=N+LW9L^rq0N!<(s^xBR?^iOoyg@cnWuU8NdgHp+;spO=oAAr^SGvX8HW$v~` z;wI&n(sys=wwEsc?O?b44tLuv=OFQSx!eAmhjSZV~~rJ|p_e>UJlw=Y+EHR3d&Ylv!(ucu5R*dT&QrWX*zQO`HTD=?#d9&@h$ShESlr$bX~MJWlG3;EYkNNCwMuQr9HQQX$ndn5j>9 zz}b$t=-W6rsq{ZbsWeQdzC)osIH(>K71^#dLpk|#j;m~PF%f-THHKYJ#6VZ|C`k-; zRgYRjoHJb2qof^+UDcyx15a`TgLJ9e(@CvDf?m`mqVzvZ>fRoCiIYnGJ@s-#j!`TU za#C+5dFjhio@(Kw-b;~`L6rUmCz>y9^|X6A;>>o&#^rlSe`eYed*|Ez~a zE&TD-d7!$P&`%TDD2r< z7)bIR#Rub}0r_Tx7ht~*`;FMwVqb?niZb-VPXCxopDfW|dlPoO6(I09 z_KwPbGve>WPC8G;PID8zQF#x=50*WcuA}&1TvQ7KsZQ&$KZ$)4_RZM0VBdy)JN6H- ze}ug=%0^$KqB`TGVKy2zCu9FA^|<*E>4Rn08Gq6C{J*GY847m+_V4LJ0;!w_ivK$5 z)tT}L!QZjdzsKtBVDUX5gsHQ0ycPzMd`I!YI6Z%&WHdI^Vc&(FP8ReHE%FiaP9xg0yq5)M>;`Zk#UESOG5sG5&Zy(bpJ_V~ zeV<|*z8+t+JpFw#ZJM_A>wJUuamF;(H#IiI8sfvEqo$r2C9<|I)*Kz0n?E>O*4S7# zELzcAUs+etFfV%EkgBxjjjI~}S1L=|zgQSE57)Em`mbmwl@iDjWH-7CDM;nAIQqM8XLD~#=&eVtey zTIOEqT@hZI0tuCe79*Y7Y7|E;F}8EB>%=votKF--<>6&1SEgPOS$f3i&IMF9y?vE* zQLO|>Eqgd+#01`K)cOY~W6s#ldEw=uPNO>)wXf%3qX9kUpgIb|SA{x3Pv_B{$G6uL z4d^*s8y~9Of_(B)yIp5=#a!9>(8H`${HybkI0{HP*hTK_c&wqNvAMdgap8cv+IVb0 zrDMm`*H$(+4wxTnZiv;jIAey*cG{=X-1eO0)J|n%eSKp?ZVlxgtBcj63oWc|iRD&S zIv1sG{L#i4e>AAA}#S|xZamdtqrNPd_^OCJq00Se7S-wtgNYMR+jiW`e?#7 z)K|Y;k*IAORgu(KQ{Eb{twRJxwd4q_$PbsEFhUNs__BCdp5fhnjtHlv;nQ>}k!Uz= zV%VJ+O2b%~5b%Z9Eqq3rdrWn>IAx+2f}~rMi?|W)F%!e%QgU@v_=HK}9#4ebCsHPc zQ&T3TxKk&FMT$E(H|)Bt)hX_bNYw3LJ}U*0)M`4CjB@bE9CtO6yKtJWDXNh#4=4{ykzG4+2S&C#* z+-(lrFvVSW$z=zU@0wCg{i@qU%jkF|;NZRUHEs0C|4E}CM@FC5&gf6W&}84AFA5m_ zX*o#fNH+RGB6HlIA$fbFE9GIS{J=)e8evJLR>*jLi8?(80Rm+*B0G5#ccUF1g-gfi6v+%w1ZSfs6jCDS9qW z3@T|bWneH!PT4i(17zYxCnCc+uUV(p`w!JtZ|k-y`af%{5$^qM=Pb20~?L z!%RHz9kl6a;MJ9vS};1yehns-4BdQ59NF53%gJ%ido9?MBi!C_oI5X})|Bm5-L3#( zDnOv{+)M`$ z7*R*vrFsOW-~Gc~2ZVEC)N?V<9!ZJkQEZN$=@2VdjoFj>50K*7n2~g)zG5gh5$u}l z7Rd?A9t;oJZW%leVwf_;_Pqz3)7Ja!Tzr!qfEB!4N|0Rn* z-J&O1^6ws(T;5R@|8k3ej77g|`Co>`f5YO_|D>x;mH&rk!BNo~W{QE5aO&0$e zi@w~Vr&;O0Y4M9KezV2brC0ZO`Lzuhsmfnv1Qfl*qOY^)RTh1ZML%xQzqIIAEqbR# z@3ZL7ESf$quQpZQV=P)e;vfYSf1t%5W6^jr^5(PJ!nhDA46^iqrdjzw>@=$9>;zTT=fW$)ix^iGT3Wzp|h^gk_H zeNvrrQ2M*OoE_80T679xt2h$I-X!X!JNhp7wYVj|y=qihz zZ_zCl{SAx0+@e=l^lFQy@3*Q=m5;vE8l>N{=npNrGd)HiH=^DKIfMaL|9 zzC|}#bgM((T`j7Pc8Zv z7QMxy>2s$+d%SAVZ(8)*7EPZ*4W@t3qW4?$zbraLPdvy?`A5W}J6m)&i|%33Cs=fE zi|%XDc@{myqK8>@kwuqS^qCf2X3?`OdX7cUv*-qkZnfye7Ja!zUv1IXTlCEqeY-`k zw&;5-`aX+((4rr)=qD_ClSMyg(OWF~C5wLDqJMAEZ(H;(i+<0d_gnNoEE;RpN&ec& zqBAVIyG0*s(I;B8Z_&9HJ;b7iTl8p)9%s>KTJ$uFKHs8iEV{*_FSh8bE&5iAUTx9$ zSoHlC{isF%)S{oW=oc*dHH&`7qTjRVzgzUD7VYAJb+xJSD$Sz1TJ*6NeWFGC7TwRH z^DX)`i$24m$6E9xi=JxH=UVg}i=JoEjTXJoqA#=PYc2Yw|Bt-$0I#aZ!~V>-WAh|8wrWBf7f#?el!k^Bu_f%{%2k<;-bw=A7&3OB{Wrqi=BZ&5pj^(SLRH z21h^Q=uM8^?C2LA{i>tibo6_U-sb4-j{e%wKR8%?eqo+IiAV<%0bhV>v9o^{YMUFnf(aRitv7`Uw=xZH)lcU!=`mc_D(9w@O z`dLT6;^;RW{l23=arDoQZiRPPQv1iQj_&5@L5?2j=vj^~cXYj@n;m_UqtA5opB#OI zqc=GEX-B{6=q--sJ3XoG@vWn?v(v+K9No>)d5#|F=%J1t?dbg-J=4*LIlA7_OB{WK zGakCk318vpRgPZc=o=k_^kzrD?C3Wg{eh!Db@bPc{?XBX_)KexY4>bL z@8an0j^5kRgB(59(fd34U`Nk$bd{rza`cIgKHt%oI{HdS-|FbQ9lgQPPdNHnN5AUm zw;cVUqd#}_Pma#ws{m%P+b74-JsmyJ(W4wa)zODKy4ul;9DRzTFL3njj{du&zjJh# zcIovS<>>K_p6Tehj*dCH%F#zU`e;X=;^>PVeTAdfI{Fqz-{t5B9sPu(pLg_Yj(*qC z+Z_F+qrY>s#`^+xvHdC2(QO^Qv!gpZx`(6tI(m?!_jPoUqbE3ex}y(t^x=-KbaaEG zk8<>>jy~VfmpFR0qt`n6W=G%Y==&Z0n4_O@^h=I@)6rWU{h6b`ar94)Zo${L%wqdP zdq?l?=$?-5@8}_p9_i?Dj-Kr3nT|fh(MLG?NJlSp^s$aU+0nsICj{f|{9r+9dtB=1 zD;<5Eqi=Tf9ge=w(T_O#8At!!(Qi2VeMf)h=x-hEbx5yYD@V6?^sbKX?&v&6k971@ zM<3?s8b|Y|M^fAW1V^9Y=yM%?k)tnn^fivY$`hG`0>gdgme#O!6IQnBpf9>cW z9PRNnOtZ-G+R<$s-NDhF9i8jwo{sMC=z)$N?&wjDE^+iBjxKX_m7^ORz0lFeI{H*c zpXKQD9es(TuX6NX9lhDnUpe|GM@RTUl$7n&%F%5d-OJbj;Bej&5}HDUQCt(N{S7Mn~W8=*JxWlB3^u^p}qQm!n(cq_^izj^5qTgB?BG z(M67)=;(tTUFqmXM<3!0iBK8_ya=sAu~IQkSvU+U;P z9Q~xDUv%_4j{e-y-#B_0Kf_@bd%PIu=<$wz(9zF1`Xxud=jd&Y{=(7UIXc=oy?pH) zy_2IG9etdm&v5h;j(*wE9i8#VK90_J^q$?5I>0au2nM=k^uGM7q5W?y1FZyQa32@MWh}E{U^9NWJuiy`p}o|@lq@YEo06QRU%F$yT&7PB7B5G<< zz!g!`9X-?02RZs+bze9)F6d*)DC~2Cv0b=*df;y-FQPUBzJF9$X>^3SNnoHjwJo8nnR=Y>ce$;A@i1{+!08A8~i0}cQcxL8bKJ*Og4?Q&p z%!mKs)E|4Qk{UdMM0kS!h`*Tp%u~nEA9^V@!cV7$|2fo1cM&ysDT(l#z*Ze1>Mr4Z z;DC=j^W~la+dcIN<3T?`LO;!Lr29LG3D2+6ANmav`dg6peq#9NXb)_Je2`1uA3a;| zjuEv1n(=6t+zc|`7szd%`MMkPeH}UWs_eA`3*n8nv7It3|2Izgp-nt3{Ri#%KPms7Qhv~sA2j6$P5D7ne$bR3H08p6 z%_S`Vw@&$?x%7=B%Rd^rRc^$5v5nh-?M<3~jdnNv8trcSHS|)1b32?2ayu*|(eBIX z550m6`U4LtSiyG6`b6TYz3(8QO?{=FtoI}Ihkk;D zHpc^$Yd0w;zs|^V9wl8BKaZoN*{{*h zxL>p1nf)4iB{cgT_e<_??5FH^Yv~Wo<8QeCw~m;F%9x^UmD!fJbwy=Y5<249h zBXPdaxb7x<38xA<_n-ck2=5oZC(LSL!wZB536B+CB3v(gRoE#i>4as%(}i~nIhU3B zFC)E(x>fkH@F!sp+!ru>e_@00BH_Klw}qLlZ2Uao{=&HMEa9WVw}l;WiO+n73y%;! zCmflLaGWpdgq%A={jhMGunX>c=s!kSB|JyCUihkzJ3Qle5%Ru@`Y_=+!s~?_g>MSK z6Yh*#5~kxbeh)S)gv*4t3ZD}GBpiTuemxu) z=Lt_0-YNWtu+1Je-eBP&!llA%g`0$52;1P+m-hPzrwh*#@||slza-4ewR*S^hZ*Iy zjhJx_Zy)>BQ4hDb*j&on3D*(i2&KA_?d+YiSES4xGJkhsIQ>U)ga;h0)Od2FGS|u8 z7^UV?k5#IS9EY#vlEungcY27Npq^mAUg}L$YAN+3WzI|9{>q*=Cfl!WdsCD-A9+*l zScx}Hsp}bkwlddA-gIT|tGpS?Tn~B&D7BH{GnKjC@Jf`q-tcBA^&0)>DD^IRpfdNj z9&WS$Nqx9dKavOI-kj&1LzFV-sY8`&ON~nHOdf_`y(44xYrEb&r6y9BDm9fvrTGP3 zuN>c0Br7mRL{{3b2J?JaLk;r!6Q3wGUlQhX;}fXcMARwdnK&I%_UlaJtf zQS`0kqn>(zgx!aQPf7S|qTdwq9bxA44f&v_z9%2@RF((gB+BbQ=HHn_zI%}yJyk$H z?5PnX@}EE=-q^M#=|YBA$DEkk4qq33`J>&~p8DjjKM4#N1gq__Xm1-BX0;2rm|{7XF2VeZKR?`1c9<&Kmt+5&gFC8}a{HbZcH8 zBOTunV?Fm276|$77yU<)h{t!ks3!|&h(F)qqJOEdTKpH0xK2A-cmg>T-?SkI;w$VV z?5-fuepiUTnne4V>v`1U9`S!jxS52%xz0!Wx5WP=;g>?bOGWz`=;LG?;VwdRUjRFN z2a4fCgcC{l&k)UbmKa_q{tHE)EIgk?J8=>Um-kF{FjJ6QE2XK zU~h%!%Z1kpZx-Gqe3*p&r$ql<_@VfJF8VuRTiypD{w^f)=_%wpBCPi?;UwWy;cOD| zVF#ecHsSwg;h!SG5U-@Tw-EIdJYrto4C_OB4VR`^%(e@OHu z;alSWq3Caf8N5$Ky;}#C1p03iekuMD-pBUD zlU=fhQhc|7*K_8+82R_2M!tM5%Imq2B(CQslE}Y=M81cUxSp#faXptHpTM{dcGmtF8oUP1Bv`w@ctk9Ws%Ukk$hey>_OsQw>OEKvB4xRVhe@)k+3y}L>o;b z@tlHl_Q^RU_Fc}|$M+)@=jMBO4p1X(BysLrNa7mhL_>@R3YU>D;=Y3{#4q}g7{6XE zyq3(zbrRWMsXIuF^WG!eK<E5Mwlm&L@;>xq@_tX1ksCZ!Pa+=Y zs59OvB;uV%KI5qiN!(mqMIzo`NW{B~M7)jUv!3Fda_>1$y+UIDdV_r4Qy-Bp;66mc zf0l5c<249xN8;YUBZ;vE&h=*cz7jr^#Lf3U63)5X44)z4jbt46&E$L>U&t!l7n9XW z-9pwVb+_;V@(Ap2K$?!e(?tToOd>Ujg~w|smbKIN}2Jj#`N z{NrRvE)68*zU`{za*W$(!&yDdf%Ap6ILII;Fakw2lHXDZ+L%IstQDX+<0#~PN*znyuhb>v2J{p1 z0i~WLAH*+~kq_b5-*Bw)He$Srd|0X3O;POeuZl*??u#y{5$p|@+GAz z$(PYT$XBo*lds~};>g!wOKSh1If}f#2 zP@5nE3T|j=R)L+Q2lzN=}r&8~cUt`WlH}D($ups#@wh#F)Y#;JFY#;J_ z^cV66jQ5d0qW_UUDfJflGsf#krPZ$8L9Nw3q^H%PBnI&ok-kH`+AUgcs!cKhXUu4*;*|oTWhs~#6$UYBnAbaCEIEB1=(J!4n4u0v>Hry z&}ue`$yy6Z3?5!g;^(?I4!GtIs2cYxNfr4+S45@sp76kt4Kf(H9)4RWA|`^Cyy{w5lUVqg}`%t?nT) z`Rz4wtX4meStMw#)h)gfdl`WacK)%j$(RyUCqT0KF=wR)ed z)Yx|5e698%tFYgY)v!k%0ej>Etqvz^v^t8c)#^C1POB@(dabS|8?@R;9;wx1WTRH^ zl1=EBWJ0T!`CzkFt;vO2<&lfD8b~hIs)Ssk)j{M@S~ZbJWB(;FIpYHISnNOKaa!F= zo}tv!(kb-*z2bnHju8`$pTNm`YYDCZ*bWUY=Sk?*dt`6#Yy$$w<5#$wG9ZRm(YB_l&wjX(wR(FtBW4|NUX!SaI4fbOa?fesYtycZ_0k6|)Cb?Ft zM)G=W7xD%i2gpAoJ$WPAV_)zuIF67vX*Hg_S*uENomOX&x1fE=Td}{8x1oK>^;-Rl zyj`mw$vdzgj{xt)@rb-jt0MAltxCyzw2G5|)#?=TUahVr|EARqM{y^8pkd28LblJX029}&tm^3pF{mg)cX_id96MtQSX+c!56Uqkf?7@@6+T@;$AhW5D;d>PLQndXrnVsvSXdGt=5p+ z(9g+_aoiw3!Fg;f_$iK) z8?E}1-{Sm5{!6Qq$nUgTOMZ|3O8$WJRWbOZR-?$DaDE|w#_@o}zuQRdspm-?0KO$7 zp4xpp=;QvA%)s+KvIWLT$SBg0nYdphTYBnevX!TDCxCe9HlED()O@lv(vg_-aueAW z^EF94l=~;y9?#__f;)Mti0pv-Te734P9k^q)b%8O4)$Sk7f*dgqCfB%tG6reugM(P zAu-9TFNueJ#bg)ElOcEa)bZpVn8!-)iTP+`E}mPFT|M z=EahGVICjZ%Tte%y*>3V*~e2YCWC$P+<@HMQ`5EL+GLn0@j zp5#PNHIS1q{y^@J@dk3Trye4wcpOA6%mlCiND#R79L41#Qb7%k*Cfg z7h~QVxx`b~kVoVB3weyE?kA5$|09n>`N-ov^**^2`vG|Z+Itpw61F#a3dXHSlxJV^ zC{K+Q&LvOuRJpK`JQ?Fs!VAd1VZ2y)4S5#ILoP#k$g@!%ay80BUWxLMSD`%Q)hN$w za1F{s{srYBZ^Ae*c{AqIk+#2W`I2U|FUV(BPXxWm)_UJ^SUAmLlPWj|H7>_2;$8&1(0#6-8uJBX^ zd7-C{B+*ZfBQL^sBUfU(k(Xe*k(Z*K$W>@3@=xejgNKdZw)K9|9gP{*s>J{=HPrW7F=Md;KaotW{qSO>}IL2MbVM-lF zK91k`6aU5J5R6-pe^csA@xPcHtkh-XBe>rd|2xP*7>^*IRO&JDf0G=5aYQl?+nL1v z)9O&LFUA*0=-y->jLVUTH(LBl$X+O)=%Y!r8yC)t@P(PeY+;VDi!fK%Lzpi_Rg9fN zAujif#%a(HrvpPACJnK>7|s(`2&;rO!o|X4giD1d3r`m=6D}975Uv!i60R1m5v~>9 zC|oC8FWey9D11z~N%%6U@H|DhMfk38tMFstx56KUO560lFjJT<%n^1G<_dcV^M!+j zg~AcSiNYzu8Nyk@dBO@|m9R$GAWR4s3y%>l6`m|SUARoRT)0BGTDV5IR(PXuop8Ny z1Br~YF&)D~cnZj&gjtnFPgo(W64nSCgb5*bd1L1o;pxISA_yTa|luY}(Ue-PpkyvZMrRt@o}&d|&oL%DLPTj0GC zVQ*nSp_xC1@DZX%3&#m(2xkfB2 z7~xXk$-?C%=25H=t`x2kt`@Elt`n{o-X*+OxIws4xLNpu@MYoa!mYxOh1-Q+302gV z&&-EJIWt9P3v+~Bgt@{VLNh-S>H3K-BysW?AskKqi17^JL=xA-Q-m|fpE2$roI|RJ znk$?~Vjf6^u!_Way++tTVm?ShxR~@K>KNft67OlAEIggW`D~eRIf?loD}*aa9QRfU zSCg0zvPQU;M8CRGxQ@hpkoCg5$ZX6<6K){UJ{yG{d0pBb=K&J!)I)S{lI0ofeBW*XwAf)uPvsXeV=h4g2Q$8tr7RpP|k5Gup{qFGHK_WwcW^uhXF0k!UA# z9SogIjdq$L;j>7z(>&1?B-&}E=v5@z$y{$Dy}8~*JDKZ9XmcHjc6wdno9jrl(+{Gt z(M>yX4iDR~`Gy+xI58VU z`L8BX?*45+ly@45a+>*2DBpu^p;4}h?Lcfd6+2|w&_rcTbs}Ccu(&2(8?Q@@t#7VN z6wjPoFnCtw6a-AFOB6LWmM&3w74fp>`LWWnvc~vAmDd=r$t#*UH7~xnx?*u&BEC40 zm$WvhzM*MIZFPBLeZioa@%hzFiFjkI{^Y>--D+zu_UIX*P zyrxW_FllVjl-RWC|Gsj+o$PnyTQD%pckJ|%f8UrpjQ+>+DH`*K@=1yQ$MPweH0_Vn zCnfqH%Lm)*kK~gQ{rBWEB-}nF2h1*-S^V#_+EEJb9V)N9zLqjE$vr^XX$%Q=(DjP02Ih?rD9i>niJ2UR`}6o;P9I?EX!O(((l3;ct*h>yU&lUuVWErOfJZ`9@FY8;?*gM3Xy11ok=tK-zADwl{QvXHpH5aY)n+D zSRl*mn^II0N|_9+sh?k&TFsj3x_GLtY%HyfD_gW#OB&)R%{2P_?t@Z6+#c)}RX5?t z7n?9;`WWoOv1ze_g25Bwb@9gP@)?cshSJ9Pq&cM(Q*dA_85A2ha8lEh`uWx6r8OnZ z4Gr~;iFgHbFAiGCh~nbnf`PVZC5h5RbJH(cHHgkewMG8*qv8K!1^qp{z<*riY0b54 z`2Y9Y_J32*|E_I^&*c79ys)(9m%H)*oeuZMa`^9RQ&{ppuFN0G;J>R&!C*OPOsoH& zZlC`opZ~6A!^YM({V#jmAF=;m)}*NHe_NA3VE@0YNlA6x|8$%D0sH@DO|aYiPiyiA z?EiN)DabE5vKiMB|I6C^(LC(6VNHFxO1TuuD=$~Pd`y&E$~H_Da@wyD_V(XF`+euM-@UN69O+rU4k`9lSbJgl z_*{kgFbN^YeauLq*?IQ7L z?`&%?EFYiG(4TR*1oqBw>?Kmlx2wcsx+83V3CnjE4D6`=DxLmv4D1E%*Ez)=KeUIe z!}9s4IP+l~E9RYju5Q*jM zj=!LMhg*AL`@JjWV;nAly+a&(t5V9>Q{u6FOYoOkK0Zh20l#1g>@~w9wR~$*+OHSF zg7RVdZ`$^4hXWt;VH_@jy?x)e0?OI*&bM>mM;hPa?$p|64>K7ajLydu=f}u zvHkYOUr@e7ti7=P3Xuq2CJqpm??A`iik8X#*FVMHyKtwLZ#3-npdnd;@@;`mE#E5G z%Y`4yhiOS+`L2f>_QLX2Nck9tOJMIBxKr)jn^L|4iN|_)9K8H!Qx2#pN{V<&?v{#MeaccSa{(lc+ z$*ux>al}itw*vNZ5ryT$w6V}$e`_ynzl~Bp#^Dm!>*Ls4pHeGY5#uy;P$= z3sJ-4-|4WoqwA}a5HGcS<6tkiz8afikMjm#FD&0GT$?f<#^Dl_kMj&t?Tx^LFveqj zizOcQN<>O6-x}B(Ll0R3dn*tx)!sPR3%2hB#AQ6%+soPu%eNI5F7#&{E`hynj=fbW z<(nk&m~Iow!{Q9Y9~Zu-|Dtu8HN*J#nC*Tv&E1S+POt>_?r`jVJQVLt;M~ZpF-1GHce&Wh7X#1T zr&M8J45U5&edOfZ>i(2S5{Ew5A|C!X1fh(VQr)o4Zb5~DvNCQJ;^pk%`1}{dOKq1Q z&`EQVkT%ieVLh&N>@9r&ad<&2OOV&)j=e6p&s&Z-w0AK65N!Ib`3?u%!SecZ_*NG> zBkkaGtR`MNxZ{bc`ljZ*`T@CiDHxhxIJ9v1kb=Rvx%tM+t_$+>hYlT@n>%D^!9W{x zUaRAar;OJ+C>d?{PHPi>ivUZ8y~pgWc4cU8gW08+YV;RMZNQ)Pk@g&0U)xY$hlfY| z^^g6H^m#9=1yEPrMh|UxOmfoM18~D1@Y<{)m+z9 zJ-;qqkz0*NS54JN#bXIYXG5Z~qPnsYs-_;fR@66_)x=e8>Ec*v4HCe=DN&&+;^j37 zJX7gi*IZMBBz=@P7;f#B<9QM-7SgK3loLPqzYA#6Se_c2_>*DIJnKMmvz|*1PYJ*mFY05ytye+Uz_r{ zFgYDys0}MfKJ_e~HF0{$Y&<6opPX7BdAw(R8%q<_^>x2#aVQ=Fmf#s_-TYW+()Chi z)9d!SXPXWgkv8pGbZ*mL&&EYRKHf5^L!`|g zKhxKBJY}O02t83k@$vy`kIW;37t;R{@%K4WfXeEq-$9?lklTWg;Wi^L>UY#@84?u1 z-zVzttRJM;mLT%JHgaav@1%L+=Enle;_qidGLgY9`ZIw>@1|d*SD54MsNY?0 zP4hZ1>i5uituZCmK~cY_Zi7={vRreb{$9E(y}|}LH0t-#gVVg`M*ZG;LYmiMQNNEq zgkE8@9Uk@jYP`^ul4CsT@2!`nC9I74{WM&n=vW27DW9#jhBj)=~~W; zS8?VvsSlI(#YaqXu+g*$X$8-ekk0(DC)xo!4?p?YiuWm8S{x9;&WNCvgW;3SE@(n< zo6Ci#Yc8}FF8|>vuxK(Yl*UWTs+BH+bL_yp{NXC2oKO1~_pco?M77vCIyFv{?U#; z-O=Yd`T|E^?&#|seY>OYcJz~uPTs%S^1kJSZ*}yij{e%wKRFt=YO+}S!4W%XuWn9w zUq=sjbn<@K+MDczmpOWYqfc?R->FXc3P)e%=yi_9=Md8BhtCwGX?zYKO@HXPY{GiQDmkhg~X4ss`QjQw3Zejm9T^=Lb;%kK*g zq(&y=NQ`YvCSio_Q)A%dEfU-DJ>fR8 zn^K>V*v#LP*q)g3ZHTGdnBR@79&$LgABiiezQTP-b{bX*cIhOs=}mgmA7BrgNO?sV zLy>SamC^6cH*ol zoJ^kB;jGl;rNs_rQtW7&0{YwUT@J@~LstlwW3aED2ESkloSWf6cW}f)mrYxwE2-V# z>&6Shm>_UtmuI|iTo+y3^u3@gK|CG-Q^)DDaZF(!Wq)KG{!#NdlA7;mXdVNDC9ro9 zJW}m(eg>*+?6Gcvy#wJ+E#DMq<`dLEus0KasrGuLl#lTPdrdIL@?qCE%Pg#^gN1JM zhZPxY!r5^1#wA$7c<`V*SQ-&$Ss=h5Y!^5JH-mpdJbQ<0BL`s};7F}UKh%TAI<_+o z?_oW@ggZzBry7NG2IB-v5cU~7((Iv;bK%Fh+@?Xh{2gwl3F>=i->3&Z%wdvr2b z&PBY`B?x;Ho~U9&5XN|i1_BJ?O>pdejCesA7(Lj&V-YX49#c~4!DC}kk716zF4*{& z2brbhJIJwD1AF*y+ND#9y-LJG^M?z6pJ@g%qsg)OW4=s>k=6Rf8sDWvTOIJK2+_NU70)n{Hwf+BNuI$(0hElb${Es{RGvk)y25C z>R0&e^zGOwbD#RQ-O?5VX1=NiRK3>f`c}L91Ez1+diwLdwnrkn@2R(4*kAIbJpUTmP)PK5x;Mxwd(&H)^)Dm^GXJ(dlV*%UG_r_(%_buaB{i zTh(H~jjv^0YRh-?bE><1yW5!xu*__4`DgYqdpp z_4`DhZ?WwJZ~2%*pHtvPV-9*w_55gT`|S~5Z}YNyZ*H;e6i@d%{}UYY;QH%Nqg$N_ zcky=Zbw=2U5wG6`ChWur!|?qq?AF3Vp}Y6pGqUac zHs1I_W?S6$vA^d%KW}Jp)yM7jXuG}ThU>?yc$O{ezm~C5_0GB9^o0TbYgwUEJ%c{5 zz`hSLzNWqugVPE_@_2Qm|9%|kS3R5d=~4B=^rx8Xz8e#3{}P8&Y-!4~b4&rANpaiQNV%G|Ihzx8C~7vtn6m0Dn4 zq?u(Nz3^d$T3}zt5ufm>gBiP)mYlvoiL1D=vA!`7<1m+VerY0ZJyTyo31UpE=SwPq z3O0z?n#4yQLD+1l!a%@1bZ{W-D0`sB;Av9eMl{U*6l-kgn)u>mx>SQE=VV+XlQAV} z!N9NpQ{%PM@IWiDJ+-#9VP<`xiW=i}r85^fat0ny@x?>7sBMaIOX^C|g#ww308=(b zQ4MCqnr98E%`~n4facP=MDJ>UJR{cHs&c|@<|+wCm$SE zC#vy$@F?U~gN?}?Czqg;RoA5lOsXy(Ofz_nMEq8~Atql$H2kfYgV555hqa0oH(=jP z&vOI{x}QlOzC)W@%lMIQBaBpK+*yuGjrHs43xh)`Tzt*q-;V;0iRI83iba|F&`&pb6YH`op{FEB-<&DjmJ>W7R= zv1~nlwJ<|x#?7X##v{XEWA8YNf|>D#n$q(4LDh+>;_4ZbnIiP~Rr>{lxYyKG#4Ai^ zF0QtHInDD|6AvHLTwPN!zOlZx_*eR=3S<063y!ZTO_bRF95{bHc3s@*X~%FY z&XaI+20601KA{@pwW_A3qIw}7mI8#QFtcaV1d3)N;vs)Z8Pnq7)mCI=)-kSQcyTp>9ox7YRm=p%;3%3_GAS)a z(jy2B;^NIszVT4m80X9b<8F*w;=R;(X+r~M6Id5>!=7V&@lsuNg(@xMTmzJ0adkqO zRjioK`Ehg>9CnuATvMycn&PF6{py1ZU}3tTB-q(@tM7z9~t<7EK9GGs5?B&0DIf z7Sl26uujx3Dp!lxRnRvUmE%Ev8GP|Te^Gf8G@tCVDzWCKc#Mt5gT84c*AHc_=D|z+ z6N~B*e?B~7wei~e#wFrkSD%_%l*B}ou{iFRHI_Cmi7n*$9I4T9@C0jzL3PcwWpQlu zn0bH~n>r>ocJ|EJ)S@|(S7~{9GtNgSINzH_CKb))W@14p-bPlXcnKNXx3q4cS*vnR zXJG*Ts<6cyR3$f4Wi9pqbRp=P3bU@Ck5^4<>gOwjRH}yhMK}l5@vlnprA+kIa9ycj zpMO;eC?sY#t-gf~AS7SiG^Z3P(4*;XdCsg6#`v7tMv8he#RayishCtJD zDHW_t))l^}EIhC_U8*#}bBLME1qX5&XjUdebll2{>RPix_kxrCu9Sa}I0AFE*sP3R zOb_fjT+xI30ZKa1tW2R{vBtEvS;NbgqeeUf-@v;OA2Y%E$$*h5VZk~AA|MEL%QIV18bO3S7p2cy-f!9FftdD;OefYj1F<<9HRZ zCN+ZbFtLW z*cYFHi-34-dBYN-wtgY*eiDt8K%EdbgI0o!T-#tGS=0rxv?(smy7HvETrP7KS2l7o z99okWsv2i3tUkgRtHP;@-pm%><<-VEeCg5DVB2LFL_=BQf*IvACYLjW!lYwJN;DS(F;GC=6kfC(Rj^7M3)~u%tz*q)DTY?ht9+*`>oV8i0$LSas#3IaA6C@IemK z;)sE2p^|i1*4l=bUC zJJHSSdUJtaVNq#;1G4e0vA|88m7z8c9xZ6ckjFV{kh>=XcoZ?=mONY*0LOLUGU# zeIrrZP>H$mB($n5uc^m5qO!8485jMP7{J2iNMqa(hRd39{T5FwBrBy;AuHRv0xfI` zbl_;J6Q6}iS7p%Eq{mqq3nRpmaXB70HC7r}vvQ%UlPOJfM=orV9xeGu_Cc#yAcf6{;Mw z_8W25QoGi=@Fm6{<0)F%D zh2$Wdd>D@(-kREsPb}1!4@3OU&uQ%-k>Ym`R5b<#sxgF)s$k&2jzpVbb*M`CHMiN@J=yt~ImeK6QODfm=ig3lOi zYBS<&o&5ZTJk&rT%v24GoM4=!$&3IiRIPY%yu6ur7Hz>vTzM9N^Q(R#v zxISh^pe2XY;r1CerWw*PgY_{}6w^Ue(ifNa*z+soX^Geg9-b)d+vpAWP8seMf@+L0 zeiN-1+dEc`QYT6g0gi>Gjn&+a3fI=j=LELasl`)Gs7g~c`jrhU2_zd4jWE9s9}H^@ z@|3o!#$%M240VbZMlmtERBXCxQALIIZDIrRn_@+E6=`oxn5S(`s@{C$t%(~k-dG#2 zsKyzy32lrwg)qKS4L62#8e^t21!qJf>?<2F8UD5rcHn0>qOF+uw3#_4HQ3LnA=icV z3*xGwu^vZTvlH22oFJ!iehf{lnyn+lJV6OEBZte2Y7?+H`%_fgx$Q{ zd_WK5xR`xh8%tF2pkZ3cc`71#xV|Oqk7%ppQx(&N7U6i0D=~avkMF_MLt!7X^}&sITLIg54M?LEMdCR=N>)xa2-*BL`2G>bN~Py0IA7yusrG zIdTn@gunlg#cWLMUm6=E#)5AU{=4r9rbYjyIeflPs%Ho9@eRYFwq_|+O^+kT8T)L@ z^my4F@f;~pRo%n@c@Bf4CmwUDil#)&9QTq_Gdt;Wxq;s#(7*JsZProN+kD zOsd4K%j8+H->w5=jxf*i%)=;o5)yoU^_K==ZwF0MW)FJic}nV+9t(y}WzR%!3Z6sY zS;MrFSbBYnO9sZ28xe2k;aMQwxr&!Bh#7Y*-!`&s#l|=ev+=s}c#N-(r8L!`w2&b< zi(zlsQLZy4SK_;jGb)vdg6@h72Ah+(&DOLBKJgb}0xI#4#U8clD|v~4G7LdOa*#9@ z!~JhVEVc8e*Ld7OJg`cZIr)a0wJ?~y?caQfk5P7Lq9FNU+VNASPoIgL?C}qWXX9aO zCr5PiMv0vRVQ0N*HG`AcdgBj2k;gf2CtD}hX5lL+ftyoD@xzNmKjS=*2`a6V>CUuH ztj!XnWezqiC*PSRH3*Y?nYo07Mf}fFajMlkV{kT0w8}a^1w72K!q2wCWtN}>%w4K4 zAz=v^gc-p|^^0-`L7u{tXITP^w8n-(W-P)v*2yBkYez*$CYZ$p%T26Vg_tEa4}Uvo z8n%AEG53pt(c5NzAanfT-^Jo9(PjxspEPh#vdF&?>-S~z`(pjR9Dgg;>8Oh|xOpRQ z#|_SYx(a`2S~k!a+u(4SC1{Be@cxycm59jJLC@F^vA!|}4oq&bUu>3Sf*HvKGm;5r z*sSd%&ng!N|8*>mwKdypiE7IywM@VOCx z_(jklENGZ7;KA0#!NU#WPSyf{JJ`|aZJYBK`yhkzOsYAq!DOo62-=~+-^j}b{f5C` z1Pw&#*dKOKM!y7@!4{&7SU}8c#!jTh*TsV3Jq8}Xjfe1>mqj#X~3(k?j zctv?q2fp^)1#^G>JVf2W+szpn{PMhcW14R{w-}rzqr2;Z4oo*E>)@<|@CHgIqZc4z z%M8_}H65)OWp;}oLKY3sKRZJat;669rf-vF-qUWIWlDqDw7>Gwb$d?_&5E?i%CfI= z@6V0v_i&@-bDraQLAtJsKc#Lm0m)!*!)c=?+?c(W!?r@YoZB6}2U z;Co^jNHQ3wzZ^Q0+BFaFhBL&tJM7IGbCEr@_o=k@PY_cAb3?54Llw?Nig|E=4Udbd` zHbHOu>Uy8#Tk?HW|Eb)ADn~QnWi2bZoDjRydkL#jUTRKAI1j6XOWU`?iVKC)gKbPuqPq>;AKy!Ot%bcb=9Q$*jb`2l@?&qASHtlQ94*cJbkVgb@jCTsmB~wwyXjX8 z2Y;2OrFsTySZsq=5W2v@>pa~(nu#x7sXgJB*%OYwbc}{$2ppr zbsrpu(NT%o@`qotZiS->j#f)igIvV#G^thgIdEq#L&!=xM#FJ69If`pst{59t1_~A ziJ!R}LJp_n71*tYBWt9O3Dj^zdtwz_0s5b2WDj68{7SMK4u^{Fj*Yk-jxT8Lvt6@$ zL1T&DjL=izU>kHAm!17L##XJ4M+td}pnK+IzKl#SfwonwqVHZgnfxlDsp1@zz*O-~ zI7}6H##Uq%jqw$TzY>3;@hB_KivymO!^(e$#HRB6RV`LN%E|}P!Unh=p{4PVgbi>Gq9q$3A3?kxNNE7o>Kc@kwb#9JGJBwx-fybfDO0J{^z9MJ?hbb* zKUk3mNA_?k{s!DQII<=q`{{7B+Jt0xA;B(PcFleR?(C1S%DNKqzJ{aq+o;WE1pA-r zcG(|8WIf6tI=Z2Z9yUko$Dp<{PJ2B(`#A{JMxnG>-yvpOyS>_0!ebtqKC2QLABv3I z%wv?Bpysm}0}(F=KD*?0&U_r6<7_$=Jpc|SY``BY#b4jGzVzYywV|(ljm32QlpVC+ z5l8{c?NMCh;h(w_$-Ub@6JIRI=s&qqt@FWI^TsY|Cc#g9KqGs$nm|P6+jFHN?KW+#2e*O^pXNpKi9^{0kadM_M?3bPjI!wu{7YQqNowqcW=i=#%EZrGA|M{m+NIlU!l)7dbR$i;nljV5942>A2z&B|6t->uNQZt|DW}KrXByH zpX^J0vu;8^EzG(_Z#404!z+W-w`;#Ud8b}v^xb+-6YsD3&xZHvM-A`So%=D~1Ntx% z{~^7>@L|2sKS_l$nX@L4^iKlSta48s@oXtVwPt`{4= zq`xqHS>JB>itcN++pGFg!`Jk2hOg`A4F929neFz59%J~XKHhMPe!%c89WmSMZN1p= z9X;CcU46UZd-?~%_w|uxdwrm18*bIt8-A#FHQQ&K{?X`<^)R#DKGF4tpX%!jKhw&z z>*x9*qrcRJMt`Ln4F9QTnC`X;0Qr8}GL_q{&J@CW_A;g5QE(~dvs6=r+> ztPe3-dmotX0MxSOK)EjFWY;^u#Gp&Y?rp)aVB0n z?=8dj-o?g#2k#0KzO(m&(Ve^>jo!sO!EC=A?_I-Py#vhl+s(TM9M-z{8SEy*T91F* zU_$$Rs)<7lCLL(7|Ir4MFEg03!C>lp2Ge+pIIQ*bdV?9~8XT|=$E;zkXFh9CqH!=B z)_T?_M$K-CQQF5>}pSld+# zjr!9W23M>ySbej>l@A(R{i4B|tp?Y8Z*XlJd_ZJa+qGQ{t{-f0!vuprA7b#AT7#RG z8r*z=!MbY=ZoS*!woL}>-!!=W3xhi|aH}}1?Oizr_v~%(*Zqi{Dh@D+AA^JOu$?L| zG^mP;oIKg!)Cz;smKvO~%HYfo49?fHG?> zGg@Y>JqZ73nYCu!z7)+bj1G-()7!%T>0LO}3h!qYMu$b%9c+v>JOu|a3ZsP)b`cwN z15GD`hDX?KY|!0ew+KEthDHbe{-2mre6DuU}v;nWiv0BEnv0 z!=Jej&a`mTxGeC<2z#ZC_JWiuG-GcM3ZtVU?6Wq~m+w2aY$RhaiZ&V@VUHfkEfeja zxj|Ah4lEW$*!^v+E*c|_JBVdXqKsoA+&lI&CVR?tcVTpFggXmPHpplIu849>-z$uc zi*WA=Hg|DkA(YK%A4!|D5?(5g0fo`=k&{7dW?!0NU|?%PW+IccP;Uqmv`t_pPPTR3iwR8sQPbhRq4Wn9gQU7@Zd3v19ZqthhuM>bxuAE@D458JInB3{1_8 zEJuLNei5^0nxG6Nk$a$QKBorF5Jm{L@T|y7h&9$^bO}sgN1h$wLCYpw6C~_`!;;GD zgY~$==z$R)&x%c=dzdJ&c2I;zI2-UpYQUTbk9pSSi<=C?I1r1 zJ0!xRqYe8kXsnI!$}y{OyW~6pKb7}5*5mV@!P>S~7!!?kXoN>t+gLk!vaOO^)>q9uZj(#=6{NNMKEl9Sb7og%R%eQjXujE>siYS<#mJ z=^(=A@Uq8Vb{jR~Yv{c1v9d=n6t6bIv#3q>R*;OHHHXo#Y3d?8zuE}jcr=5OId%)9 z^%0(aZLF3NiB%7;oCH@kcbXls1Um0Hta>wp!e~Q;XY7f{OGUdxxHBFZIV<$p-S{*{ zE)RY7Fg{I@n?s*HjZY%-KCe2wv;F8F$yGju=i?E9qW*+b7!N*iLvzwOlBB2U1Px42HVS71YC;M~5u>91p z97%kNzc`H0FEs)TpXy%{hTZ0bo#x*jh7EPXPWPV;!zMdnXZW9lVTU?lXZkI73o3bs z6Lyy0GYq@O30vkDg<xi^icAv>S*IyGx zXiklQwp#8#9ER09Vdwd8g<(rl!*V)t=roU;qA>G(|Hm-a@oBMSQ(fS9M|9f<_Dzj| z#4G%9Vb}~O>_UHD78|iOR%63jJLy*Y zyx+HBAE&0vkxE|ab703tXq%ciM{>T(=Lms~ur1XBN_Dl*(IFewCN(j_*7zJ@uwmag z>8|lPie$suIq9zTITB&RK5)`q=X2D_hJEUUt@Sw)Wy5xIY+mnkG{c6qcfxM)IpSf% zwmUZe>~mDhhIMe#-RN^<#D=}=r2C7{Q7{|U(Mflc&yf@x_N|ldW}l;GHf(1n-8!Em zFE;F7sp*0(d5h1XHXET+YT{r^-s*GA#zy!$&4M{X6lUJ$uMQ*Zl4e07toJ$EV=eqM z&4L^~ZudF7XCvgKS&#^K_#7v)5xz*ZfF5(F&#^!owp(gqgx%$HJjsTA?xefh=UAc* z+to>TkI(Ta8}?mlx*QI!!|-2y4mjEfol_I%JPm)9$GxC1^Io6BST@#|X=Y?M`kT-3 zN*kd|ni<)R?(;bSW+S|xY5~^o_jk_?!ai}rHu%HCusu=@Bi#f3>@aM1C+tE0$S~|H z$L2%+*CjWpi>@_FsDZe%hd(#Pf+CL)1A_Os1Chmxf) zq*}lhdDj0R4Ex3jd(Mwwh|#9|-U)l&-!lx`+2gqo*Mme*su%oy!w6l1D@r+MzUa>l z!*YW#>6d@^IZkae?Gc1Ymwd_Rn5PXpH8oRIhF#!v zk=J~Vf!q8p_E-p1Qp)nW&+$|nc3G;;paK5jj|d~IPBk2CmN$Hkm|F|iq*@QMc+=-l ztc`F(S{71(4QW{)E8LG6TxQU+a8TwoqMtIj?w}R=T84kl z;98TGtZ@I%;F^?{^|QkLlEL*2E$eTE`!$1WSXwr~3b#Fj>mgb; z&sBxxOP*hMp}V2;Vd-t%n;XA3srZgUu*ca2yu;7+Zg9kWCnNG zXdUX{%f?%AXNR~psl!dM;%*b-I+vDB4BGU@%eJ9PUtvFgGO%FP_~)ulic^QsVI<+atu~RBda1N@QM)?Lu6n(^`k8#E8<`Gc?jyI3gu7 zDC`yDa;>%yO^F8z9YS3H(+UgIMX`7224A5hT@)QdTnW||7Nv_~pAeT8wL)ny3Pj&2 z)B?+eT2>ac4%xmTE){E8ENB?A{X$%J)UtAyqj{nU?H@YKmo4^W=JKBx;&QVN7x!f5 zYSuZ#rAsZVbUEReu-PSamoKaGWX5LK5SO}jxEfDpY#tQivZP1=c8O(kbZBoZY-`!2md!CCZeq}~ z%PgBkAufz-+2xka;!u?@yTY%adYN%V1(yc)yl<2h3#3cD`LAe*x^w82IrQ6df z%?PbdQo19Z(#+6(NlJGHm5`iSq4$#HcUkh;q2H3^YlCtxxpP7txmKOIlslIE?OU1M z4$iFPR;IqHOQ2#hqX%bJ&x4O&QCZu}Hb{LTN%(hhOa-a13IF8Tg@nJ8K}GXaq9*|S zWxDL%k?a>Fw_gll>&PBrmh^VOr$a_Qekc>e=sk?Z6RhTA)+QNlHDE z{i5V14y`oVENH1YelE+x$V+mNFP~-0b)1pxm*pH^>2O;KMqZKJ6rv+3v*n(VS0%TM zXr)Hp&Z8jwg)dKOqvVDXt#qtW;s9tC;j&+o+-aiaC);w*$m=px;3=JLDU z31-zY`(62gALDx_#$eg}OLA{bBC^keHmHbHzb6k!(%BZ&VS=EuNftpzjbYhRHA!SG z7}5KZ`*r+wo!#17DOIU8F?}G<@U3+46#N20G#^Ut^U=}l?J4*cI&g;qv_6p=eXWt+ z%BpJR!Q%T=a-X>@vVh@2Wr1 z{Z3Bvbx;2j-S6cwzApb3VOQm_MXvF6&-@eJALN_9?pc4LyH$#TUf$0B6Wt$WZ(o;x z+OVti{v_x5y666h?$7dM==$BUZE5Ak1Z_mtdk*Vo&J z?GBH)_!CZgsa14pjfmh|j@*amU*Fuqh`YDsp1i)?pTol)8F4#G?$1l4X>7#ZM{=)T zA~EA4ZYRlod;Ue+9UpP`mE6OZNY{jjyPxEKzC^kvN8J4-_x2^yH6`NaN$&GYq-$!# zJwS5LUm{)8B5r3npI)jonbg@4_dv;{KGeJjWM9MIq-)u94Ch(s7}ZA zwt_Yu$vIv|eWf)<=}P#h42}}Ru7f*#Gk)-271Bz1GMw7#ZFT_9>Iw2bU+GR;iD^4g zzUM34Z7X}>=Mj#r`y2^P@iy}Ga$eF(W^J&s^uB`CoF9hVs%4)gF z7yZ+S2wqmslh^z5myMh$M$q%+Q@-exWYGokLtpf&$zb*{gbMGD-|p;%k(>+Ve|)8l zrvIs(m#Y5_rTVZ!{D!sqMRGq7lpAvXda%1%VInyf%gMgxTSime#;H0|h9fzb$mPD$ zJ3(`g!@ENu2~UBCc^!)6Tq>{d!@L(X{F4>tSBBvhq)5(Xa-$#SgY@wvB8%i)E;Dd% zr*rvn`Y3|xSIGXp`p=wNL33ri9ggB1Vwep$l5?$GpQ44- ztdl4B3VWp}cxLXA*ZEp|r)a^{}A$OfS7;<$L$o;t-PAS7Q7RkNGJ=72RTi{L_qI=zXh*WRMZRHg|14DM7 zdyX&jo0E~<@80Um_LVv|z1vey$mBlYKIh5U;6`pag_7!?0DFn5i zbvO80FYi1j&%0mvYBip*bUBISzTmbQ<7N67PnEMPezCmbMtqH9Q#5pmL~>ts=lfbS zJgxLmZgf}rs`uGGAlAv>NZam-rgJJPkhwUitpZec0FP?P&!I z;yrh>uh1t+A*i*@AaK6W?xTBmzjW?22im6(szquoCoGgPa1INlP^ne{iqzRR?)%V5)t60)H{=OZFbzksRM|!F(ZvB@i%n`JHbhr6hGdwM2us^Tr!y@<%AA+Cm+UiekM-bguqTX__ zsl=b%36SY)Y8Cz@p@Z??=9c^Z%L4xYc8~LI9p}Yu!u;Z1xNgWC_-j46=t!SE;?jUOJ) zd}nfqj%;U&qbA}SA#tWV`b98&^@TIr$xxCHNDg&cioz4T(1*(@Ds+Z3LBB@k(N@rz zVqPONiUFn?!X2>AG(*NxGTjhv*>`3b!mi-VG=zoV%rfK%l@>!vN#+<*K{D5nDw27I zoJ4Y{A(xTh9gZq9oPBlpDyT4LFT;}{E1ZWP9!@K%Z!N=|#td^+FU;xBa2*u-9_wlC zFiNW!_5#m0!wbtf)bI@qahE4ssQ(-^!I-L|*KMmwwCr=TTi-(;qihM}P<4$))+D!*} z%IU2LOVN43$yY>`{!7jPMS4>04JV?=2$D_CFh!0a`P3;?q>1EfXN)3ell7j7vR;A%D(C>mrC6~RA;$T>M|~1NnR~=880HaQR-qpmaCr#rh(_$#;qRmY~>fn_bi4jSb& zU7;+yQ6k(9J^@`OQtvehhto*L!LP%I_z_{g!Y(`mKZQq-<8Xd8nd#!Zqcfu_7;kq| zC925#!K&YEs$NMxH&w4%`d3nSFGapH?LbxiR?`ktC;HK}16B3E$UG7Ll&Sg(Ke`d- zIUQUT`C;s4-CdoMqeyzWx)Gj9($Ce6P?15dZiLrRa)_%_qN=yZ)h$xByNRxDkt!wA z+)g6A5CKLq$sHQu(o4QcCwon5M0jt= zOtWB!4m2Rbec{yEQBmofjG<>@SfFQzL*XaF%u~2DjadJI+p)>kRBs5MpRBH0s%nCK zeU1pHm1{1$!+KgJIa=LGXNt>N$BgKy73_rGxIdBL#6=+=D)>!LMW zBl#Aopg50WUhSv9gNwA}O9$~Ef9Q-~nFoi+*re0Vmkv$;kxG1%p{?{im9+l%{tK`& ze&D5E%%qtO2rl`WL_6fQiICT-*OMvrW2w$}879=l^cxxb>z?Naa7dxv<}iJHCfwg8 zNxCxDj2!iBr`@|t7O{C3)*ecLES*K8e4An*rUMz4N7kKYvsRY?(;4c@aC`}0AY38a zCJ$%2tKK+&cS&B&P#Ao##b|X$N6wj zMnAr(+B>Mb1to(A_UoZi7#Ghc@D3Y@p&0sk4_r&FTcNouiRHR49P=x%Ol07sp|3ug$oAc z&BC|Chvb#iRpG;s)r<2E8(6j|e^6rJ3u_cYl zpP9Bz^z}bOfo8_fLWE08nPz@grlvYv!K$8HQ@0e~#+X@C-hgk##uiL08b4{^0u&(6 z(UV3_8M|Oqym~=6ydaKmdp4HE7SuPCA&m&_;_amPPEtLb7?S?FA$%9Pw5bVplfOz& zyMNsnQdJf!*Qxqjp^=)u8=Bw2{kvgJA>bQuO#k1@yRq^AMlxvQ?ZbSS?X}f2y*w7T;g}TYb~7 zm_!%VLsb-?N~=WLFs|x?st~wa!5bOXwFSG9GWHDRXPp+x&72VG84hKIGi1okEXxej zKhw>b07+O&LM<}gJ<3C!3qt$%&BzF~a<7yVLaqCRTJ;U>)i2aOvt@&O$#FWodq6lO zot_;t-MJ@1wOyurj-Sx=%!w+22V{;9g)%2VjH^*-K&JbK42KSO_YK2Wna^}zIj$V` zL!BolC31YI)kKrX)l8%gJHZP(0ZA*&be}t}9I456uZGnwD34I4J1oq^oQT9Q74N82 zgfjbN>=km|vyMYb7d`Cm7goO$+(i@M4t2|XG~|v8b<1Z`GqOSpkogu95Mpolr=|&^ z1IM9!CqOGdz1D&5R%q=#DIpDYOKS#kPe3a6qpfQ~?RzuEy+#AV)Vir5yGm6eOaxyspt-qyhzHt)y~KklIW2;PaPqqX|IKTk8f(povrwfKt` zKf~fGkowW#5B5DYKf>ZiS^NZxpJMSdEq-~-r}<@zR2SB7C+wN=UDtoi{E8&zCS;hKHiWA`6i3=COs&3 z)gVb9oxi;-&W8hiX!$6MFR*yM#ZR;NRTjV3;xAj=dqD8g=iu5AOiz}@b1c4}#k*L% zr^Sa`e3HehEWX_0CtG}##m}?&r53-*;&)j5af^R!@h>c%g`4VNdF5EVpT!4Re2B%T zS-j5ToL30OccR5tTl_JLzija>7XR7ed*Z4ejBj6ykF@v%i`Q8Ea*N+;@s}+AhQv!%s%v-n;XKfvOBEY6R81nrNoc(KJNT70_2=UF^zael)i7+;me z`38!h{Ai1xYVk8Hey+tYu=r&bzsBNsSo~p&KWFiGEdGJTzqj~*EuL*=+`aLogT?o= zcvp+}vG@RsA7b%hi_f=soyE_v_$3y{?tHpa-ysyRk zTRdX%VHO{0@nVZlviJ;(&$IXfi)#m8BEip6JH{7{P@VewLn$1PrC@dk?@W$~33 zKgHr_TKqhVUu5wsEPkEE*I4`xi{EeY4Hkde;xAbIRg1r6@l6*0#NuCDe5=KOvH0&6 z=g0Yi?V*Lmcei*aiyvh1eik2Y@d*~6W${BTUSjbj7O%JXQ5HYZ;%8X=a*JPQ@mnmu z*5VIX{BesvWARrl{+7izS$wm_Keza|7XQ)W+bzDs;+bud>%Wb~@tM%1_OXw}543nM zix0B+NQ;lP_+*REw)hbiFSU5w;x!g;u=r6HUup4^Eq=Pi&$0MFEPkoQueSIN7QfZv zYb}1C#UHWw6Bd8Y;;&fzEsMWz@y{&&oyC8)`0p0y_gD3y2cFgzZ)fp+Eq;K-yIH)K z#Rpov(BcyeyzptvH0T_f7#-1Tl`Cl z|7h`+)_n9{7C+G9JuH5(#fMvbhQ%l4CAXIbOMaro&$0Lg7Qf!&w_ALJ#b2`c+ZO-C z;$K*NtHpn_xRaBdzcvMrn;AA#b37g8y4SW@lP!Njm3Ym_)iM{*5{On=z{Vd+q;=L_Cz~VzKKHB2^Hc>GC zSr$Lc;-wZ}YVih(A8qlIEPjT?&$sxM7Qe;fcU$}+i$7s;ekLiH-;EZ3$KoGa{0oc! zV(~vL?(CTyUn`5}SiFP9_qTXAi}$g3e~S;b_$Z4{u=os%A7=4I7GGlVI*T7|@slln zj>Rvs_>~sF(c*Vm{9%i~U~%v3P~P?IYfHY};+cCT*Pr*LC@*|_OTLfAJ6pVm#S1Jx z#NwkYKGEVcE$+Q8%S&I(lGj+g$>Jwke3iw|vG@fRzs%xSTl{8=-)`}{E&h`HjDq);!cO;_Rz}Wdsuugi|=Rgt`-kle5}P6SiIWeO%`8oaefL* zANu~{U5meO@y!aee_zAG$p*vG}nTKh@$FTAZH(3);Ke;tyE-X^U^P_$G`0Wbyx4T;lJLgYoZX z@qH}b)#CjuUTpEG#g|yT#^TE@ew@Y6wfGelUt{sL7Jtg(Ut3)Ie;K3ex1Gg%TKo`; z&#`#a;`~-vu)NQ)_^lRy#Nrz*{+-3;zRC7mTYPVeA7t^~7Vl^AI*T7~@eLM##o`(2 zwE|3|F5g^>ceHpHi-#@V-{NB|KH1_`7C*z{XIcDti+^D8z4lKo?*lE~)#CFlzSQDJ zTKss6pJDM!EdG|o`OPeS=<@#3;y+n@hs9gxC5LZs@lF=+X7Roje|Ms+q`~(voJTP`eai9Y z>55k(o~$n%ag;%*iJtH40_^*_qy7pbAE^94aQOFK!hw9C!6OZxW$BqBX? z4IWOclcI!($g7ASIzrWFog;8NQ|}mqCm8>;iO3iC&=W5*{#O&Be}mz78~%{t z|0F{H6@!}%er9kR5#!T#gQ`EXFY<)n?!;k2>`lbr)t!jWQbar$e`HP^EW|?M5FyHl z=tRd65$;@rHyM1w;QI!DGT4&+c_RK!m^cZ4Nl%=Dmj)51qF)lH;k63H>G)%9;tV0G ziRh$t#92a|O`I*ndBizF+(bm@wUbIO1C(I@7Pj7ja$0SnWLPh&_leIf8qz9sD88 zK16i3F2q+I(U-W<5krWtVca6V?uco`Hyp8m2s;(THyv>-5jO#=i0y?~O~l3FA|lpJ zt{`GQ{d(f=Lfk{#Q;3I%n73I^#C*du#Jz=hk%)`QYs7to;NE4YlMvjq?CdMVr$pS3 zeoe%E+YiJ%A^uG~K#1Roo$-2mT#K9@LhMF75bcWCMTmWfU4=M+*iDFohzAM5J<3jZ zyj6^di`GbDPh6jfz0m)N{e<9NWTy}MAu)`<1|{|tqLP@8{y{7d;w)l+A+972z)KB? z5g|4a4-w*HB5sDhCJsmXi6d}tg=?lW3h6Z1n>bpCeBv042gD-0wvBc6nDig+^8g*NP*f_6eg`3)nUigF>ICIr{m zoK-?xNIYGLM~G)&+#}-V#ABc6luC7vrpjJO)*NjwkjhIl^ivx)ye z{OB{z1w!N!FU0srya;xP7b6|SOOOuYr5Klqm*KvLcsa_Ocm-b6VemWRl_+(Jhb*9&nz@dos3;*CPQNxTU!Fd^QICtmbzXASNH ziMOC15pPBRAl@d#Rm9tcSWCP^h$o46!Vd8+AvkyGtc5+|-9mK47~!l#{)zXXpAzpy zx`_7)v4VI%UMfO-0PT+WAo5Rq2rn}sK8$Ayj4{q5xc(6z#Ve(VZP4C`j|p)+@o}^> z;(8&TC2qh=NQh6MK8a7_h1q2CZU3$c>; zu@Ki1KS6yFKgGCA{0uK-*&p~h@`( z@g~MR;1={>;txX1A#TO^O8gNo%OU=R`wimHs2}1s)DQ9Bs2}1lXfFoML zj}*1UPEwpj#KX)Q;(oA0+#hy`c~Z!3K>PvozQoQ_3??2Z#cX01DUKv|mEvq79_DW$ z9wfyx#O_jjOvFR>AH<$g>~|0l4^1P8y`?ye*hh-x#IO{X5c^8;5HVkhw}=H&{F~TM zidNl$c-Y#TH~^pjAr6#cI&qK`Rm6j(IERQyg}aD@rPxRuBE>Jnp(vLgKs>CCA|4_| zDG_f&I+-{^iW`ZAQano>DaDt>QBt(*2^@`jA!5>?kXR(e0%EZgO~kQMTtFNr#aiNc zDPAH@km4)iL@6?Q0Vhe3N1TjyM#RJ7JmOR-8i;tS=4#?}DQ+jukm7mbOesDi&XVeZ z+rb}*cj^s32lY(ED>G*i=SguC@ldog;(X+Xco^Clae);7BOWeA$3DO#q!>huN-=}D zP>O0|i410(a`3R583vC_aS(Bd6upQ`rI}6Y+=iR}*ply@$9`iU){K;(A3K ziE)s4f)sn?15cFVVB$$q%q5;I#WBQFq_~23D*8F`G?Wu@70Raocsk03cm~o*JQL+W zJPY+tJX?zUi07bR5YLt3L*ixv0M~cbBby6%O-i!PY@58u3 zydU`@J|M-t#0RB#j`)xi?-3uC;(OvF=zj+TAH}O9iH{*Z;^QbU;(D}m;sz#Eod*#8=U;h_9ht6JM9&UE&)U2Z(QCTpJ90OX3Ssz_&3@6W>8O5#L3+ ziT}d&g7_Z#C2Gld@nb12C4PePC4MT!zlfiq z{SZIL_&yZ)1H&){eKwn2Pviy zw_k#Gi4!J_NW;iUGub<9a~+MT%9#Uy)zpc8tHo|DgVfzoFj`2mX%n zoA_T`pNW6q`b_*E!Vz~!@d^?Dwh^Tx+K&KYKpRTLr1An{h9gcSh8%G{G1Cz*5L-Cn z8)8dG26r|0C`OJMeRMcf|h0 zJ@EWb%yqf{^900w z9dR{rKSw-D#H8cDhO6MH-24PqZh{D&CE{6`V6uOkj2<|Dtv0!J(-_H)Fg z#Qu(WggC$v9}@?n=8A!XFn>=x*b(E25l1W`4tB(9;t)sNPaKMQCgL!J8w)%H>jlK& z$R}|G=23}-jyRP#(h=7YM>*m_;%G;_NgU&de-n!wvHLh+u_O8r$2wvPahxMo5XYmO zi4z?0PvS&`BThno#{(xjVj^*hBNh{Va5=`66Ns)^UiHjyTESS;Pe>XX4?Q?;;+7_=!mA;;kqr;%!LZWZ>;6C*qwbC*ob0wIe-Xoq9gtwp5%zEDZrCaPQ+7DPQ+Ch&xk7= zF~ZO|pf5a0UaR%`eNBqO!6-1=}79!I72(dR_DoQ*J{mS6n zso)o5z0Y8rc&;Os5m%$V63;`wCZ6wzD~bQWye#noM?65h&=F4)FT#8*5&8axc(o&b zCSKxTVjXy@5N(K;V%>~*8Tt|Na;(P@ufX~q@k;b-;#DXw;`NxvovyJh5%*;85$`}d zG?+gF{85bG#K%xxhDQxwLVVZ}jl{<>J`&esTqh#jr9_0gfe5{|#0`#k+{oWB_`Shj ziO*nMn5p%1h|i+m5n-=C@hwLjOl*UB65`vAm_d98cga2ul#mvx1O2GNBTN3klLWpJLs1qLe&RvN4|*kG{9;4ubQ89dA2 zYJ(RTyvE=S2G-8hq2>y9VDk_?5x$3~n{J&7hDvzZnKw8q7A> z!C)tYc?P=}>~65P!F+=Q3`PtNGgxSFjKOgRCmEb(aF)S^2Fnaq7_2l{Yp}s!lfh#Q zt~7YE!Bqy&GPv5{1qLrMc!j}h4BlXHjltUut~GeC!3_qVHuya814q5InAncx{;?xE znDUPpK8y(Yks)0le5Ve%2$#hcH7<^pELv0-TPC9O%Sxs#!v`s1m0`T*HXLh;mory*P~WXee1E!u2bvh|#EeZFICMR#jTNVu0w<5bh_s zl!XiE%13Kx-hoFx;RaNXLC4iyD`1a$w1+O?+nWt{FnwKMs1y9W z!?TCWUsC#RfV~{}(H^>%Z;u@I{PY!?^ihY0XKzoqgZaHTkUsi*`Mn2jrq8Rvaj^G# z9z4uJ8Ba_lDD?b0cEJnFy~;5zW1-Pt(3cxjWTcTDLiM6s86czUuY z18(YG5XRaUuC?Cb={*jQV1C;@hBZDEG~?Y3rx)*yaC>3k6s=Lw?*=?P=e3Xp?H%(k zAvQYN-tLfj_Ey2oFkbn6dJ@)P!M%erp0616{P#K8b7`awkMnS%3ThR>5A_c72+-5p z9&l6K1idkIm?Og=ubaVqOhSLlgCEOA)p?^Rg~0~MeCQx>np-Fee?423I^pz21N!BEQsXg z<%4^_1^M}d1`W!~8$1Xu<-aiN_@YV0`t|TS8i~&xcq*pCp=_dn^(L6SbSjLo5V#A zj+I>tH^W~pj>A_{WB+SpS9u=&#A>B0A#t34^ghtN@WHV?EbR_E(e9(P_t<>(_uaBW zKem(^YnW~?tr?f-6h63qx9q!Cimu&@GuJ-$9cFUZZhdS@W7YWT+Qx?Z?$x*w^$_4w z8yf;1s&vJ$+7et1>-!9^QNn0dV`W3Uwla>3d#p)+ydZDbA$j?tYyFU}WqDoe^Ol#? z=i!Q**HG6OLt7C-eR^HhQ=hN5jyz{=i{h3Q*~LdyjjV_iuO3@ckqLLCczng`u?0uH zxjkoPMscei9XH~&!W(6eQLl;c;Tsz(W^d0pIee0kteIA;PuhI{JQ*tj~8w|X(fF=*enie zc`-GHy*70#I%(d^+gq;8?7Q-(^H++#g+G72vgIuq1sQ#(Zk6tat>++buG4;h_uC8G zuKZ!TXk9#ItK2Ns-}7C@h|WJuYqi_f78}-X8QE*=mXe-%Kg?)#@u>VQIYY0*NtUxE zXGqm+%Qv@Nlac?h=%Lcfn4jDjWBHx=;E$QRG4}DBx}#K97O@1UezPj6T-?>eRQOxP zU_bnM8yA~0buOH|X=f$st{#~Za>TY{?@EN7wu`W1Hakc)Qsd}!=T&6(-SJEHU9B$F zWwU-;-Cd%y{Psk7^S4f0mdf<)8NFtX-fe5>dD&~prp#|olB1OkFXabSw7kW+t+2RX zvA9^(+$EXaGd8)Gi0&QMleYwSH?_K?<=te$)F)H%S1f!23!?i+8-q3q_U*Utd81aX z&no_L^zLJ1XXo4V+Ft$rULDtNX_p(o%JNDZ>*{b*UAdxn-eUCAuJsJ=_0Op&*P)rcZ8L;b z{)1$E;a3QN!CXB?P>D*Z(DeEIP?fr zhxZiA@Pq5oqt2C^5nt<8mrnXgW{vwvWTSTve)X3fM`4t00v>Z%asKB1>y94%{$B34 zvqpcE>&BrmU~=)}>kb?BVezbQ+6=t&N7?rC(XwBkbq9Tukx`Y?WnJjow+9YiH+EI= zZ|=`O7Y`kC`>2`Uyz!4t>vr^Bvwp{coz{uo@2(dI%I$LK<3Hj?WQwUo~pP#(mc1{@!BSy+7_4F{}9b^;5U490P7r@?q{N6|zsOO-uJ1 zwl3p0_t&vSYu1k~UR?C<`o+a3t$K9by~@fJqdM=>%161fPy03Cak^75>u5#msQrvIz;B`lierYfH?W~cn z=F0ft#VnV{*Nq?b1xu#=uG)tDaa-|Vw2kTCymnsA*5g}buR9*?EoIpxF$pbYiqJN? zZf5NWwDN#FG88@TT*EyeDBen9DO zd{1eYkt|4#1YaYXT_3BfUodXPqo=1BWYr(o=%v$)N>Wp)z$dkV`7!D#U%|f?Wt8~Hk33p)_dwxYBxJ(aPhM7W?q6>~yY(S)W6TF}o= zz~orf6x6k6dvaAt?Ti|ajl>16WX5ufPD8zMUW%o!i(<@*>Jn6yM-vJ#r8P!YVnU^) zAzo7*ET$*hTWkdTl)ZqJBWl`0vJ)dZG z40kH^4JMdT!5kjHd9@q{Mc8x^Gtj*|%<9xJH)}ysGaikSz!60-f^BBW;jRdor zjd*emKG~GVn_^`u9O7UDPNU;J{dg7w4@N1$cmC`o#-S8u^2vFcdd?DMHI0iY`_FPo#Mtz6$_P9HSw#s=nkpbUvN0ZOh)yY)qC`w35?;O7 z_t8y52~8`htf{Y8DT|d395|S+MQkz1E1Xp|WsQ|JqM@z?18PIOdPQ}t9tyGYnmVs# z>B`0=^vs6-Xu$pO!>=dR*5V6HRk6BwDQFc6X?%RrqJpBL{>Un3qggV4Aq=__!k`G7 z9cB=QY_wwp(~jncJUCWcAFr%oDvhi8VG9a$4~X#s00RNmd?OLBMq$8nHb3-WzX>3? z?{0qhg8oUZ21b(jUoez!T9~f!1QF3$wdfIPTgfnVklt$EVt8|6st>lQX0#1YU$v)Z z>nGY$vx5X0QM1F?ji=cGgAJzHfs)!uvqPn}j^+nVZVx+a0O|(IYXVCrmo&|+DygiT ziP0Ag@u*l7gKbrP6zyl^j2R;jjm{iDzbHEE&}l_cBT?53OpUSmn02v&elr?zr%)A} zSy56OE16j|W8%#GC~gvCbtMfob%%(c7?u}d?W~$n=m`CrJ+w`o242goPe3BJi8FDX zvIXPgMFVI?^&{kA7kUF#yiioQE6x76+khT^MYO0kB{A$os{2e#TL7^m?E*MN9G6@K z$V}Rx1p~*R7;*DkQ(ZqAmkExqmXAtz+Q0*#Szi=qfcl-*&Y+pG1}GH8<3hW3su`i3 zF(nNpIt|LX^T>nRtb?>EEKo_L&DpiHY6gx8Sk@jpP0XMfF;&ZPp&dI_EGU=}tF0_4 zjm?cWR20RhO=Jk)W9Py8^QMuPWz~j@;<^bZdG0ju;8Bh7%Ch3RnyR9mG*RJe&`A2i zi4<3sG|bdZ*>mn(yEUrHU+K!mzshO^4FSz4)Zsf zf)4l>n}QDXSDS)K)0^e|;t6i}2+%5?7W4w`0_lX(-oFX=tUU zjV3m~;i~ICgCQL%I6f^KNKld<_QJrL`i=58iVZJ#YS->M5mlln93!X99G|3-@bILb zZYgenxTT~n7Q;i3a@WN)Mxzz6lG<8KNof~j!^KtkV(&}5Oq49*gcZ`z6mJmfCt5`3 zV$3O20J*F2N;u7AB(cscq6FF$M!=i3|y{;bwB!-vF9vf`lP;BL2|0<74rnsCxl`7rk>KAS%AA|s=63bt>nHxw5 z=#b1+xdwJmf zIBJS={;1S1sub0+riPMo%myZ0q$H1tDRayyDK?jmT*e3PM}%hfd-??qDs`e zM&wsJkbOFgfW@OIN)R7hk79zO0;3z}mUJQLwosuP0}4r%iEaR7EIHP)E*H2^OsISO zqT1`qRoN(4sV*kf7^(_DSX{a~S-GfARJAI-at&UIL8wYDkiqgqUg3+(!UMmmNtHD4 zf}v*m;6N<>)Q^e~4Y#~3UZsA}yx?TJE8z)>5tu(s>PPV=dZ6p@haT()NNGRyqY@2^ zm8!JWFT8X*DvhV->v^kbBPekqj><$>&<+nF@FdmfoH$X>C5W0+xQkY>ZhaS9fbmr2 zgG(pN2B69a2ye!sf8nX4Y|xES16sZ*VeBiZF2$@Me&I=|R96Y~xZ2XnlKT31`3ej+ zzFP?+@p?5;sb&_nOZg9u*DuDnj5b}yIY;Bx_6GPoc4T8oWl%wRD6N4QwX4e+mc`Gj z)u4ENB_=ABIvv_rf%Z*Uq9|depud&}6GM$)f)Evom{GCF85MHHNqVG>p33FN)(DP% z7AsQ;@fqa2xW+gkjx7R&K?8thtAIi^QBDuF1Vx8Z0Y)ohCG}o7O_Z`PQXzciTTXS8pCzL5gCSM888qdfUGUmu#1*ZZ4fI(ngXd@RjZUVRC~0fK4zTNr3rVbxx;HJud7nEIEWT1>ZUD= zFHy!SaII$hVzlrsjVs&mrAK|OZW0HB)Gn%9I<0it#8OH~R5(fk0qLaN3rMs0?}vk% z;)WW8)`%NNq=>7N;A)bY4&Db5ObJx72zbx3DBb`sTr~m&8<2eoM&tkqN|pyD%Y6xp zJYi0;Bw4~BWfe)Xgh|S1bG|9v*(HOqREWE|XuN#vOWI4MG@3DDf$@?+1E#K8p#oNqs-dBqH<+b`kv&?rzqsvNgPlz=& z%q(Ie2FobEPyKRSRWWEmTRY0V@X=`T_(?@#neS2Vsd^4ibD8Jx6g*S7!^fR*IRQ6; zSd1ehfGv+>>$_G^zg))F8tRv{5qF#n;@x03)TsMvPH-ags?h;>n~m%P^=-HEQ1{)+ z3qvmos@nKQQBHL8hFsm5muV>1fH740R%*a=n5I5g4z_aIQON#D4rH^UfURH2HL{y4 zs?qE1T0@Tl48)!fR6U>8Ofc1{;mMHF*;vge>kys{BD^W~VV#tlYY zOd;Z3)QCH>Si>@6xoLBVN;f`_8?5)Z=cunXKFboWa<3(t2B~S(SBNHbIrly}TH;yL zbeYW)A(gsCm(`mFZ{ji0d$FoS7?r4p%Zw6|qU1pBSmtHWb1d^pBI>)A`N{QN>>9d* z=>DO*M?L#Rsrq3z0I6r!C{;hEpVaH#fdII3;ljPb=%N+)%a~}%vJyOpl`pTu->#_c zhXx?9r6jhLzYU5t#L(XAVi;G-L@BQ59Lz;|47X$DdRWKW1ox0c%j5O*y1rXAi%bO(#i(xDd}E~sR~?6dkEv;Am*=&4E8r57fqX(^hYti zKyYU=?odzwSmwrUyxGDqzPe##U0ulvv-FM?WGrmgRmIBU7#*=x9K$XkJOsz#M)K;S zDyTR5DN@?VCv&V`tA!M;kj77~!5}|+4~>c4+frkw`a7OPwhHo*e7&`&K264qBv20h z3&zweubzqLn;7!dzu&AHK*6BN{yuBW)7OhX(Gh{&2Ph16gOlu~Zkw>V0%ik|n?KkZ zJT}%axetV=2QB$n6k+T}pDmlrZr9y9dS5KWWwe`yE713sc+j-2k4K*RA zHUmZ3^o8n-BH@dNBaE^bFVVxI>fzP<1G7=eZycXzvA+h5Jc_LkxXy#Yu?)?a)q=(J zz<#6DWQcksxt_aZv}~qFSukqD2=;to+k}>yGKph5R@AH+880jcVGgcHb^noNW!kr% z1;utgvbs$FX&jO{;&jQw<3&C-~tt*gP6L=6yn>dEVPrR>b6lc~}$Q&c8R zNrug;6yu!Ph^Li?dahV`J#QlRHN`6HF@%+>zYoO16!&{X8!9*;s?=J$oJ<_H?@ZP| zhK|H8DOF|5aVH+;$o!U5r*rlx0_5?p)b(1n0qkrv_1n5dDsgw zvlL}kTA^j*t4H#>%VJIPPpXR|%qzu9albPSe}fs1E%$Pd7T17btEQUMAG$sRBK)le z&6?_D15fk;t?ca-<1~!g(_&U5%~;USglYaD;13z8151BnOb>g_8d7LYtEZY9;O9&) zL}G{pW0%SYYKst*j?km}R!2*=GIeZZ2s2x#99= z8^&yDiQWUS%aqa}@}H&(7wK_QjnRD2^7m2DElW#29NXh>y1b9m!*rHl{#}k zblS{;(Zue)VWv#2tFKqwsE2zttbD|91J}4h95)lQ znz2cW2b_9;+b#>AtuKAy2lAd&tYg@$6GAgwq-lLSHH$qe+@&`NyKgYHHNL#OsI(Fl zSU$6VVn0mx9@wE(fRoELRMREbJI`xWQH)tp+>-JxftMYmNSo#6zVYQ~4FUT_MX-RQEqfY{c6;UNCqDCsY|N7MaRoqgG6tI%|A=Q4tEJAc`#@snTI;1#Gxz;=Hul zQIDDT`lW&!u6dP(7|+WMJBxA9sCWbJ75q35jnH16;iUBC&#Z`-H_Sk$8vG#Gf#Z96 zfok;L_+Z%nxJmKDFdA@AJxQ;BqI~`QCRaj|nLpL`BB^e~#_T}1uqwS^aKh50Sb2lW zR8c*0=eGslTj0vq7!xH`>M|5eeL?@pD19{Un(F!3xa_ACqg=q-OHxwE0a|4edeSW1 zcltqDR>`73a5HiQUg?mJON99o--7;$F%ZvBsc$%#Sh^%J@Qvq;4N|mglY@MdxY=R1 zPPLl!h-j<-c?^j}^H!m`=BXR7ZB=gIVt}izxfl#gq)qMUPJ4w?*NB60jfe!V5j(vg z?>t@%3kAuHtKwm0d+_O(tv}&a{bJ2thSYyg#rV@kE?yGFSocN}OqJ>>^wi z64ntX%;ykw=2ObA9Yh^)rZvBda7dAQHw045H$mV{k4XI7MSybcJO^;Tc0LTit01WG z31EwM^6eA9XeWNv;nfI9pv83uP17zJuhyEyw@d6oi%koW<5wMCH2-G2|N)tfLdH(_8GTFr~5d0NejaaUT*I{Of+lm%`Y z1?$b!IXumn5(rI6^YZOx^DZRv|Lp_Nid0a3!hF0`5#P4l#7H!H?nX}yi? zo2G~tO7E;GQsWaJHU6p=IHe(7WExpPrV1TI$w z=JbXZ3kq$OBXPbOXHz0i1elfxFf9=vtO2PA@+!U|jtq0?Dqk#93ohi765yjjp`Zhnq}x4vSf^bmUMLZ6)|^j&Dp zv!hKIn3piH3$5lw(>$%_#kec2TakVCz%+&SFuWgEqLd1z_hv0h^u}FirIcsF!0d#9 zU1-fsXze1J=4mxA#$9QBhOBcCNmFQe{kix}myF#|=&c8oxrqTKB{vDJl;Q}85(ajm z)x2n$r!~7-G44t$551aWSDHfOn7|5_>Jyhqo%#r0l+xeJAgWZMQiiFU;LVXaOwoC-X{ zxB=?$lFQ(=I61ZwkHU!oKM`biG&z0PK~U75TAEVNLZG%d)09I%lmm@+S}S2IrQjIA zJcPle4lgl`!lYk#7I*>h4o|On5i$42;6w=!Sb+Fe4t~|)*`gNXN*B)>_}_~Y7TAw- zR0~SEXx<8q+m%*Ib<@D(+Q4uaxC$q1@jbb_u%%;683-7~y7bX7#AYQ*3B}m?$j&AK zr#if>ZvfkjGtHenMPDgVN}gVV_eLd38ESSRVu;NuR7w&lViF}@iDM2gg$Yra zd2pViwfG)r-L&VjX@97Fc|rU|JMGAe;cd*M6VY^juOP&CIMa=MldCpqeTB-zYUlbxS}Gf`tXJW=B^g!|4(lNj#F8i zMPMo5Q*-!LhgSg2yA7D@;1-~xx(!GfO%k^ODYraqAot?L=sgBSf4gdcbJqfPVM_-{ zx!XwG2Bbv85Sw*0_*I9OJ>CYiMSST-rVWs7#+l~YLeW=BloHu4uJyYRZG^GS%3wf!ly>pcrAbPU2?0S+@ZxS^SgR0G-&BAtrGfkYbRx0XkHQ zh!@>XD)%X(4)C6#M04139@I`di{0TpOo>tqMBqJKiBbxNQ8Hwjk&U7WN|e$D*@#Vw zI7f4Z*18p-oAw+w?QgX2b^v<~?tASdPlCvpNhg}445Z|SAsA~KgB9>zmOd0k=cf zD#hSe2=$$cE2UmpwpLtnciFXVZpdw$letgZ-R0~|RPA8t;%U_#Al$a&bBDAZ+PV|o z_@5Dm>K?K%>$JkQZd>|}&mEDCx50<-ojK0~3&J6U(o%eA0kX^lZ8;!`w%S(~TIM+91{gk)1;cBUt86A~1*4T(-|=-7?s=*aQ)LNv2`z^?MxBa8>c zG)d15qdeN_Y>voAqVb`L_PKIUYqxFd)|&3w#w&zS1g7_L5>n6(zO?m->|xpcT6e-1 zjrMMXkBc)j19aR=o-VTowf5}o6PAJU8XKHW^+!nP0xvD}zV zlJ15eun;}^A`@&uJp&flSZJeHYm|BKga8Fc?>;H5i^&SNR&7p*z5`U%=XX=ZQ_uxb z4@a3|-C$1@7t0FYJ`YqS=zt8#bf}^S#g~BHwrt6R=jiF(YrXGjoBQ=cTkd}f;>VVQ1uACt{Mzgmt!;k->@T6gqge-lb#8qy0u-|>TDKk!=hz&jGtM)iTL3?GpVVk49IVtPdM&_H!xwkG z3e}BbGBP5j_yvs8nc7}OKdl1<(>--6pT-iK(H`D2J+r>|tZwk09n{9ch@ogNI14}n|VgmT1xu?M|+yIH&~eSjXVp2F{*a4_StkDFBoe3O#atlE}O;fIHetnCB3 zSrO3w=aOcsG6Nl=q=P&G`@6}ZtUQEFh)s!Jg4zm{=xkl0L%m35s}kim_;|?K zszlG%?Lx>o<7$w=&pbL`WxbcGDJahyU4aBnY@ir>I%&T;8{Cha4{ThMIC;# zag7k;V83IJtgO!<>OmcRXip4KIwSB4t>XX-;gE;6$XX6d=Td6{9GB5i2*-_7%)T4H zE2$T4oi!bac@liL6XAH7j-F_>@6xdhj!)spz5|)K2KpVxXSI0*?yPB$JVQqY92?=t zUXGs!q0-{IP@5Ad`4HyLq~l6BE`npXQ!%f7EgY@zE@rj$WD)hZgxV~i+EY-&x4j@< zR;#C~mY`-@{IGYMmEiP$AJSjo*p9Q~nCv#+P+MdVMQ7d!hg{e?YfpRxXEwObqIxbX zY5o7O_a0DE6m9!=)%5f(yDV`@0!tD}!tM%!iZFylfdv*s1XPfmBnqft02K*>0%lAI zA_hRjtf(jkf&n9fAc}~Hq9TfsNBOR+s=BA=UVPH~{=f5`@BC-a%&)Jy@5Z`T#ZZM8zyclUX~$2#mB?nRQz}>gcaxb2`m05GBFi@ z0Sl($C!j=O#izmd0s03O-vhT~#cQBXISeBeS6PFQKwHGogG*+PMP)8GRjg6Qo$b3I zz0}EA&YS~N8!VJ6qrUY*1UA7jnL)#L;|aOnOUV~GxP~05V%(VBO|NSMw=p1nTI7_ zn&)8FsQ4YUm{5lFh=!VBZVm*-R>-^?1J#Uyx3OTxz{Qwo%@|mZg>abjszcb@cfn$M zyE_(=z0K|khIvC+OmFW;x~8|E$H)kK`$Cj%KE7dZmxh0`x7mU#*otD9e~2g_;Tw)b zm30uKv@LSh<4R^WErB|tUF|UM%h2&9Gy5XcRPiH}z*KQsmaF0$SO|ytr--;Gnz$L} zc>8Ix;`hVfRJ<=1!iq11OIY!yu$YP;LT;wwm!L#p#n+)$yIHefm{*2>vf_i06t6}` zDy}kSBLQBXG`FfuD4BU3Dzucjr4j&RR1?tW<<%%`%&UNHixMqugdC?B{Sa$dc7nD zh^gWeSTI#QiiNP(e?Y{;(Zo%!b5#l}{xSSb#c#kuSaH64F042=Nv7iUuwW{FBT5uj z{14QM7wp4|cZFNB;`hVE3(YCL{s`z0Pgi7JT)vXsB&ROo4wtuFtBP1vambc_x5vE~bxRYJXt8H@Wvp1@#gdlg zUfhTa5k37uuSC+a%F9YxR(oYtWo*N6JeNL;`#*|1b?I~QDm34Cao;4pG2S`f7E@$; z6CJOr{R*Hl#&Z#d14$#QP~@T9)tC%F>DT8V3`te5L*~@SueqCBrOyvTRZZi%5CMT7 z%k2E_ObyLpahz$XFg<_{-RckVR8(NF`Cd*N^K6jXdDD{(38YH7M5K)>$b7_){lADZ@ zE26Y-Y(|JJLVIS}fF-Yb=FcdYUF^gTwTm6OCP&KHYO5JW4d(#-*koEUnW)zW>vfwO zn1AE7(t17hPt$7g!m+$su;P&%TYP4{Qp;7$>s{-WS}yCQ8nHh7q<`hcVLhifg6;Bt z&1KW?>ECF!&52eVFj3qnXl#A|6VwbLu&=rnzEX_g(W)QYuF-y2Gfp7f)E zY;CMPupe!lTeA;K%qr_-TXupicY+O*!5w^Vi!Q^rTHE6?t0Lk)gk?6zg4x+$i3RTL zm-`a_bS;4|y0cbh4pKdcKvj;%0Ssm;>EG+JncpIkIUbmT1#>(w5Y9XvD97Ug`a+vy zg3R~eVvY-P8N?*YoQkF3*kA(kEU}6ve5#q*r(`FFWt4Ma-D>jKenKE`F|r)a$naBb z5j&wo<3JV|YsWx#GV0^SkByp?AZ=wzQ@ATTxf~h)?*>> zEvj>%wqZeK-GcU=!l;X?XFiC~N1-!c!NT)cDDxW@HgX{s=SV)_LT4;|#)Y9+IKYLS zSojqSW#d(G;Dn^&qjl}fY=qW8K;|wa(GUx&Tyy*eyZ`aAx@4*Dw9kY6JYye@-|cYZ zr8n5qGv^|Ws}NXf9_?ire-qOmr%PwP44a9+91F?#`{1~r@yF@R%wJOCtE}6Rz;4#H zC?j(nTJUk`%w6v9tO=p(Dzh-;74VAj}|)3ltv0T5W-aV| z9Yt8?=~&1_OPA@5g^KKYlh<#|Yf{C`>k(@5x(Ev42MeYj=V8J0<8N3n{g{pY zG1HIJvB2&tb0-$qp{5_pV!)by+=U3HA17eJ_Ty=o_TNWVAL5ICs-O7^OlKo7^8qYe zfQ5|gsLQ6zQca*S0@%Zh#lvUza4Gg~W-c;L_HaIPW)BZVu<7B>SV;CT4=-3z)5A}} zlpG<*qG2%i+bOEnKcAxBMRb1L6m=k!+zh6tRd!Z8MfC|KH%29HFnhv?`!A=c+K6bT zs8(1oQ`F;FIQA4(7peZu6!jA#nJH>I7R(ei0?x;tqPD|DOi^v%986JbaF|fyiJ$^@ zikic)vgm()s@W;((m>iNs*34FSnU+mERc4JDhi~XqIL%|IYrGu*M?KnJILNlQ9onB zOi}HSTXKr(2bG+nmM|)&sMQEHLwhq8%+NlH1v9icJ(!{00}EzokH&(TqPUiYQ`Eb` z(5{M5Gqm?2iGMal-2{7b0B%S7gj3XwNFzA_%@p-RFn~A0W(M#oEF|NnOi_QP#JAH% z3G@V~sMpbgX4+VR1v70-#)6ol79c2`JM6U46>G|Mr>I)Y z3scn12sL?4!Gg(aH5QUn)MltKo5&OuT<+!+wHH2SiaLq~lUKEzATLf)r!p^0PwfzD z`mi4sOdsBa1=EK|v0(bJY7N(iv#?;Mr=?g3rzf7JHPh2xL@<4LDHf8`6E8LM9F3Wt zHp675r$?|5PEVmr>h#1|oMMvGQ*&gToSr5yXHHL}5o~(52NsgO8(cy*)6)wuB}WIw zO}Jx?WwZNt5*Cyn&*xrMQ?n}%9cyWhHnN-1I2s+S&nC0YNVf;*yU7E?xghm!45w1UG1QTi_TyJVxm+9~m zzu=e=OsI`u79&m2TiZQV(F8WQo=LNhak14t&m7y?<#Qv;{Ubj8BFpDTeEOPW(@5>^ zK4xJ}XvAydF}+Nvt&&;9D4?Gm1+kNZjhFWGnwyp}zuNr9tXB!$f?nFsvcW3qVwOGg z8#lkc`Asvw>E^eD`OPrDndY~o`OQ+NBy%72Z>1fLQ7a{eiqzyZll^kOgF#E{Av|3TSJQ3IK|Abrz&GDMS^LYTatURy-wSrbxbGayOh}S*ppdl z??Ki~%J(5NlJWycW#kV`>O)BUSN~O0!ZkMSt)z7;th_@lJ(<}K1V!@3sh4QppFqZv zneB$Oneo^s?ekQ*Cslqynat?RRJkuzeig?3nbp{zYW+G@9!!-#Kt`%?DAoFFs{EbO z)aVap^athXY-@hfK5Bq@7(vO9ZN);i7Yo@{EacN-A>R}WIZ!O*+hQT#xsZmz{M*W$ zjr#8fQJG{%auCInGC7EjCI`{9rd=@|x7Z#TI7HG?a57+g6QJGZS%ObBMfw@)@$bgRJ~&l6?tSkJ`D+{puq)@APEfmrJ@ckeZUi+?q^ zH?tc9m*f~M%{N$9U~qqLgXN4bm>#^9OB%2jXHmy zLBFh?4D8hsQ^?xx2X_R#FoM8#fuKK9@f6?^LqhJAHgY}OJL z&(nVy-A_+3`U1ViaG>U9FHv!bu7$nHM8)B{ui;3&&~UWgWQeoDt!SU1yBbc?8w@Ye z^9?W62Ti%A=)a7jZ%!x{Ql!X3GFVk-sF4uV-sUOtCJCG0S zJtn=C`XQqq(ak$C{87Ej@G+fh!k^GLn0Qa=acyaTMt^SfbNV{t_q?vync*+!lMG+d zGY!}4jmG~~-KZVyuj}0=y^Z<{W8bXnm~y_UyA;y?wtmC-y`!6$dcUXdHQ^uVpA5I^ z6{i0_(t8ZI>3*i)w(FXPAM0BTcj&n3ubq0o(Vys6M(@&-4L{YZ3_sIf8}8O8n*RD+ zk2Tz*_ZWVmR~YWqHBEngsfQcx(>o2n(k~hA*V(53zSc7g59kqw-|D5N9^dJY4Zqjr zO#d9z7aAVYO$>k1_Zc46I}Cr;YfZcSqRX51`c+pk{r9_`X?R3`XZR1@!}P6ePJgwd5^BaE&bJ7D~(#EMM4kBdET!mGy0bit`SU*V&x zZ;qj`_EY_>n7wpg{r(9s<*df9`BCA8(QqMo{-*kG8FY+XJ#ARIu}!cZ;q1p+Hhzt) zFaK*QQzT^L*x=|g{x`vtzC?-B+cNh0COF;QTA5{T8A~MMs5#gk_a}5hfX<;y4sG_1 zkrHR|Rs>^8-gr^s96Hd@jf@!1W%Oei`llMgqfUhuM~tRtk04Rr)9e|aG+n?O9>W90 z*lE~!;-p!L0^XQVz)QsWya;VW;{{wU;HiUxH)-MlLV@|&LCGDy0{-N)-%OmC&gT(u z{-xFF&L1Anbl{fojB>2Lug+wSCDIER){(b=6!51b?={HhQvOzSU(TNT!mX_j+==vjCADj z*kf44O(?uq+}6V{QSc%}{ww$~F-qt}MpKWwF-ntAUrQn@_3z+s^6nnXr(kGoGz8wG~JHnkENgWJ-vE5b7d+tloG+!ZaJ$Y|kl zpUW10@x5sLpzw)|Q#|f~S=0SI3z0OP>T##cnpQB)r0Fz|J8IVSoJ;UEgyd|-k1Axt z6mG#{!3X?dt0Xd7dfc6}akg-zAh~3mL`Ex*`+3&>4m&{DTYKCAwDu2Oal-iazMMox z8;`q(*6F9gSd1oOo!kIPWVH3T^N7g>EtjobpB788oyR>*>s4Jp^-q#4k;rK8aYwYP zN%91DuSX)Iz~g=?#vU@t!+M!xMr$IYgU21!po7oweuT0awRCZFDzLN#G$b<4^w^^| znbVmJjX_!+z1mPgTAjQElufI3kk&v1sR9}j8J)eZpiL{mv}g>{D)jLBOBcI?HvcN2 z&1__+q;83fE*|%-ZS+D$rxTLx>Tze==G!wG6Si(1_rR^KZ(w6Qn`$DX$lDE7R0_M@ z{A66B3(8};J4dC-z^rgRkW^1k!(g+&l-V;*P=>R;6QOKAvx2&Z4#7a_<#mGBStg@9 zkObD(b37gt*ogNB5pPA1D!3EBJrfzdJsvNdZ6d8@q#(6E9*-cb;f<)Fug7Bwo90%{ zwE>aLyphN_*W-bPwe1P=bGGw59(`Eb!Jx64UnRRU$E1+R=;!eWC)~PbjEK24f%1E&i- z9tzoFw~M)zlz?r3$Aczo>k{LHgvhj+A258YE<#&1v66#)aP2(CeNUEkSB-rWoxV2_0UF zMW*Rs-5KNYaMKoeOW<%mg6tG)b|nf2LKh6fPguOM9uH4#w9kWR9HlvQL!XTEc;IRs zevR23jvSG0B4fPA<67&L;W@955tQ>Oe{Akdw(tw+g8lf(X9kIk2_6rH&tY?ARQI?R zUgZ58hUA!#iC%h(z^8@@ndBW8hSW46lf4tekXk0>Vy`tq>{MLG<7&m!FY&sEp~ri+ zArl#wdczQ!$e3cv-rJOBUSOQ+&4AGqF{>Tc?L^k}_#%Xu>Soo^Zu3W|MAnS>iqKY1 z*shIl2yOXMTaJr7GrlKuXdHDw!n5MuDM6-B2;1y<&Cu3D*yhAf4{cq9?YelM(00DC z&5chAZBGl^y!e99wpQ4#kFN}E>!P-xk~hRRh7N;M9Q3JZ!UDE?B5Qtpf9Q2#iWlv0 zSP(A_ciRaUM;%~W7|#oBoB?~C(*-Z~tJrhpb&7U#(vYbza%4BP#2o)ECM zUq!s-ah~+Cwz4AL196@>u(q#6ya(evNn~x`3)@3+o;b3$@*>TL<2?CbZRLb*MVu!n ztnCMp=E^uvLRnk3h_@=v6B*XFSHycH&XZQwRzbvD9p{M;Yx_;ado<3IT-H`m#9I^R zi4tr3JsL0Q$;aY6GiDtsMI#42`FNbCSggY@DJhs4B9Zk(oafZ6L*%4ZJ+v-ZV#&faFfIi-Bg;j1`L23v=>Q?hW= z^Zs}ij_<6)dns8shp*$j9AF)`rext9zKQcZb038d&sgfLs@%0d5FZ~#Yv85s5`7!z zl@^<1Loqvi7w1`fYilIpeIMtQ8EZRH#5)-0S$=D4EaLqT=an35Ya-$uiu0;~wdF=_ z!65oE&dUVWAx|XyQ=FHEtSvtp8J&AL&dUtec9MwqbDWoutgWet_e-3YBdo2Ni1%xp zmz=EaWD)PTI4@sVTXPZb_c$+2Sz8Mc?~gbyb6DFcBHocWFF{$`sUqG#;=G(;ZKp-! z1*_+uabD-L4lSdRgO>d(&I>2j;q+(g|Lbqt@L9>+gd8Nxb^eL7_kWV@Pw9u<>v3!Ee%KNV{Ru;$krE&euIt)5i7FB&-xU~+0 zkCjC=pH~8{!;oke$iBLNQD_?)O&zuzpI3HmykXIVVXNWuDxtLv_c)s;hfq!b_0TpV zu({2DEuUA1ZM;!|&27!<_`K3+ZDTxlR?=;!>iWmwWWTkI4QwvW6MSBowzlzs&81o2 z=T%N?n;7Kh(roCD4Q-PGn@h8i&#Tuq-o=5sW$XuCtC*}>;M2R7cFBF!^=UdOh!yF{92`rAU=-6GA7KJQ<@bON_k-K=66Z4KNPhGPDTFc6sL!e<<#9@nBue|>Vy{U;XjpP zUm3LrIi2NiO>tUvET^9SA1O|c9Lwo!zb4N3CL3mT)CtAu<#$N2KPv3!_(N0dYohj` zxV`;rqfVt$PXUDYHO5X&#IiMS@k+!hnE&ud#44Kq?r3T*si5y-rzc{SG;jC{Z>EhU z60ypfH-9xXR}$#eCK0Qmc_UbO?K;*r5j#%vrm&{GBFRszT_RRh^9HeG2|6ZX)iiGw zOJ2e6l!#T=y%}WogBh`NB9^0h6Irrcg^5@VeFcMpn|x#460w?^HTC!Yy z6R~=lH>@RdJUN0?U66=1(!9Yfnd7iT>_j~& zCF1Zztg+^eZ^=Sjn20seya_Iu*62hmSM!FrFvqfu6J)Da z{Gm-1GPsbJ>k?(((C>%t?VUSeFZmhwMA4km2r!|RTL)4O_2=yauX;%3NQ z11hX-gbjpjKGnPn(`IvA;1H&e!`ngNwMV}kdbJBKY@1OYZN4uwZ{@UUbqvyS z)!D0gf2Xx|k5&h%f2n!Xr?vGCY{@dXb!eaN5PDtsw_bQw2fU6q&2}xX^(WUwQ`BgA z_v?kB@63PU`?Y={^quuDe818AL*Lo|!uNo#aCT7MIsd}SY`kBz{o@09D9EF2wn%SGhLpl2tUDCuZR;Y^7 zUa5D52`q65n41gu!yKmR8i;Dku}nJH#1q-mb(_%XA?I`@LQDmFsKRToTre9yL9<+? zhlUYW$_PQKSL<6tr`6JlWxGbN4ILhn4nZn2^v=-fY3CGF?ppJb1Y5ahBeo#!OkEvk zGOc}W#LmoT=~kibg@`SPJ6rb+?dv&K(1C0RM4h9jgr-+`_ejvUOeTj72dC@w&7sq) zEMG(SvTxT- z5Y0BnR_AFp+oq39!inrfx=-k|Et=e71m{GGu#83EypzbjLthcb*%3|neGz9HLscs)S z9p;&h6sJV?eR@P_|CwhugngNw9om0!C%D2)f-!r)elT?U&E1At%xSrPD|9;IPHUMd zt@Qc9=r3f+6WI^yL!sxN?iN(xnaF-fS3^9r@00E8=-NtGq_RS{4IR>pIhbCC*GfGo z^vd{KuT^?>=vDG>y&lnzgkGhJc_Fja`h(D+OfiR`NRR5np;x)!MoCkDSF<&`YQLcB z*~J`!WFFI}hh7znd7(6q>p`JI~37?Y^9#yb^3X3nd$+s(N4Fs9ODUYF3cKVotRq?I1` zhQn^ss`S&%Sk$_Ji6tsM;mrzT{t?*?gXu|c2~1|ytCSJ+B_qT3l=pmS3&*CjJ?(7^ zZ8_TJW^dTENAs1Q@qP*&Iu~=uX*vK|6f$0-(z9L#D08?{sW*3JX*5T$Fh1wCfwBd> zAShtyU}mix^SJv&rL|ta&~;LZE6ao(ib~IWvqO)$$Mkr?dpPvCDewrQzv#Ug8t;_G zb>9BaxHK?^N14q1CC?uiRAuEcJznWyd+3%Mq-Yu=+9L0JM?wbRQDz4BAM+(7-r>lHejdMt-s-o>FqB5){H+)usRLa&j3>-CxULg>{g@CsM% zpz6E5J)zg2zxDduD={>v|8;?vn^yODxuNamn479iKAiCFteL3vg;yAQEe%pI4lbF! z-h|L$W#C|1m-WY3`O>>Fba*^)aFO?UkHd!3_}Emv=xm8fUwK=?7@LEVv4BWzzqdEE zZ4FY3mgj3v4GXILY19Fczwv5^w*7(4ZSoFytwY-nfi0Twx8Av-L#ElxV)J26RGXR5 z{J1KA=Uo=MRxR%8yuSCAhhB{WFLTnnSb_(=H$&GJ!DTEnzRCIA9Z!%{vmt zxmCpZ-OC=~{w<->9f*^t^oN%hhTLgFj(F`5fswHvWp+sCyV@ujwpYv;)@f4?qUiAfsqt*&4M zuL<}+=qg6AlYE?^Gosl@h+lLqRqzLLZ0bYu;}5j|+8FoGX-jS5^j2oMKBHU^R~;C5 zUODV4qE4qGusxS_0UxDM&D`p=HZz^$4%vNvZC|J&o zl~6@D1+n|<^L-{A_X};~R6(A8k!zf@8KJuqyiwQh;Y43r&T@kPS>WRZf~MA7-Tkwj zU`PACoEXnI=QuH$qPG)#Cb-|niK(>UL9iyZ1r+Bx@c_knPMA*Ur_mm~z*x{9wxUt^ z;m6O=uEBVvv4B^H3#P%=^t!;|XwaaHwj>CR2hn(0v*?~`F14z<;03tkuc!0dfpaC# zHhf=yhHZGR{QgYW@V{ILahq#+z7xs6GiJw?Dfm4xJFXrW1IyBw9ak??+#j>!>V1lb zV|HA9OR+j;$JMuEA)buYG7V%#&)QgBBT9~gWnHX+5$z~mjWsrcP2g{iWYh}bdiZ5bqjaW|cb*zICYbg%KIvMdXMY`A3hzjE&N_#zwXhu=N z>!k{gpf$SlB}h4y_)`r(s_CUc`!*|JqZV+i7MuW6(Mh!9t-JYbyyb3nHJ!A=t*&O>eZ;M!MykLV00A4Q)bGnc0cawIr7b@p+{tay?xz7cND& z1u4uAM*UKR#+2*y~qaZp$fL8`m&JrCYFLj$FP*d;LWLs zA63A&UKMbzE~v_-n)tD6R4u=Xeaps82=W`aw`@E{aiV*%#w!#}-HSDhXyIP0v5l72 zo?W9%JD%a$HOh2w7cVkX_wcH#g4+?HJ6DMuzLm>fIpio&1zg_?oAT!9}y99E~yATQvg`Q^Avw}Gs3OO8Is6SSm?zQk^o3jO$F#hq|G@pz3 z_}%R^)wEsEd2I^Lgw1sTW8^RaRnQN=wh|^QTmFj}m|W`^m@~_`vnB-#k72g|qqZV7 zH8buCUP^U0W5RScpSqw5K20^7dj5tmHx~ZHVnGZOLQ!e_@Z(?Y{vWmAID~XJ={3ZX zJ;_**i^Y61FPutq0h%l)V(vyWw}kz7l*E>?A0+!sO~itIc|`h7TW&r@q5okzU40Cv z@931qnCahzZ*NFHSS1%B+znQ*BD&@a%w+OQlQEYvrgguH?%$-itNsr$cRn@Rq>(uR z%09QDf7dK5^V!o$OMT{=Ue+Aj+2wMYP3&HnP~I4DFACkvk9~uT&fzn0(MYf2>`3*C zOdgO0e71l81uOvHiI%K{Ep7uE_&%(Nq2OWYd_E4OBOig$zc!Zii-FH>Ea-a72~Q~D zBSNCf%Eaw|8dK%Nwv)9|MI8S8_-AeOgM0^t8-;iEr zB%P-bwhrG{@ZEs#8~DD3?-qPN#dkNpEKBft0Sokh7vG@o*v7%<6D$PrShwI)3HjE- zw+_Aue1i{m?ajCu3F4A)_<0Mcue9C(8Iad3n!OrzN+8&o7LePHEaHf;y5?kWZUF6n#zT$?TT8`Mp zBtHe?$4(eOZrHfVEo-&w*{v4ks4>GP)@qS^(#f@YjUPXzWvxLI#|{}YXxxZe=QkfZ zIKRb^{QUl^T^A%VXxN~^qm*uk#e$}}`KKv=$oPqqhfQfRws~`vRx!O>36#B4P`b)|JtsEXn-!nw zUz^sxbdSi(gW${7>QK7wd_6BV*Sju0$Df@xD}82(Yq7~pJ{cX$Y|X#(WBG#*Tl+aw z(Nnjg=vp5sT?)UN)x=j%9yV^$_=&^EjK4H*%&5u3^2UxDGI4y~=wTDb4I48Fk7Mbl za{EaiXU!WmZZiA^jZu?Fj+!`hz=S~)Cr`~AF>LHuq&A`7@KIBS4V^F^PRB@M$T7l# zOp9ljTBzc7S)ja$!-fx=IBeXIVJStMc=6PJ_~uQRIDR+>88-KWQ0_^Wj+!(wcgPU7 zN1yQ%M~@me;_UImCto^f;;?>Q&gk5=c|VK}eha#`E9%&<{it#Ma&!BQ8aHIj#Y2bn zn>2YSs+c>HJ7`13j~zRH9G20~$?8MLBQ~6b`OkA1GivaVDO38588vp)(oY#8#Q^5XB*(Ziam7L@c%ZpYnCA>15)|# z%0G6{h@oD<3tSn|9L|&mH(~;t|2B({+|@&(ji!KP$6|9oX!0mCQ*yJWe3-C>s;m9%%nE*H zT5c?kZB!84P{)t+TW5Ne*ZOCq6~?virFo-s5ti^O75W|1a)TiJ%Zy)jn_qf~e|%c5 z-z05Ln%Ak&FG%y675dFj_Vc>>x!z@kex8?+>*sq@3jG>Q{Muetu3yu;xX{n(>HA&% zjBaV(i_>#`Kh4{qu8Dg%-MKr)9DHxdl^;Q?G;i&68?Zs;=0cR1%n~)uO^Y=ypO(j8 z@9bQ^cAEE=Dopd9oQ@pRyv-`t&q*spy3E6*yFHf6)OK947|H82?*qC&GJS1qOr-K3 z;=MIh{rpU?=o&v8@f+p(nJ9glSGv&8^d{!|*CuaM@=*UYS`w+4-!-i(c27#h;NAE)KQqmUkH5tn4#zjZ;gq9 zw7hM|HOt$i(Cl8T;c4FYR}S}XiWT~`(Pe(FUny;bY17(iozX9aFk`RKKN&rtbNy4i z9F780$TV-uwBabFY`xBYMi;+wQ?}khww{e!_;1CvEpOtQmjCB*M;)Ux{x&X~t!mv%e+I}zIwld`}UCJN+eabe~b<-E4 z*tNW;rw{kNJik(`ZnodBv)}oocy+(PyWKB@wY2v&*7q!|Hr)%cUUc?P?Sxe|mqkzW zW@G%9y)Y=aU)IziOq(UXCe{{fV!T=~5w+5Y*(}qWiI`blg+jDyp|=9vj+RA>vT4_1 zVYpxWqhky&GW)U%Syux+E`;4vh8HQPvG_NlHgUru4$#0j3Q{sm(4aNO7 z-aF{VEbp@`hns4@Pxr5|!orm1?Z*_wKHPyc<9-wGff&=S2u%lS8#fn|S|R5zuL>p& zFPC1`y;5|_@+Kk0pEw9m6oi-ePDhtsd#zt#1X5mxX{`1P|5S8vUasFht(jk;Ct_9g z=9sK8k3DqdVg%%*c{`C=qi%kKw6*?8%%E(Vw_w^eX!2aYHDQ|7XSt%HVlxP)v>x_RastMo5~sZ`yG0 zPOK3bY58)jV9WQvG*-Of=$bUITH(F_+XH4e2WE1>n9*`Tb0w?l-EP+}H+mNTpBz2G z9P=06N|u?Kjd>x~sC+EOJppr|u6UNBEWYKO&IT*sTM=LRxjb^lHLeaFrM+a;z{_4{ z>~M0bepTp`gf1oY5!?)6KQ_JXLcb~WeIovI!oE`I+k`(K#~RJ=I$>WV?30B3CSea! z!|N2y;wfQ()kB1yF7zy+lUFZn{Ds1Pm(V=pW(78>hfO8LtP-AL%ugzhFZuSnRBZQm(E-z4!Nj~9BH&^HRbTSm;GUKOyw1 zLcbw2-=G^U-)BPa75aOje-`>Lp-Y;Zy_kdT?{Y#{61uw3^@YwCx`ogMLiZGUfY9TF zzFg?*guYAY2ZVlF=$D0lQ|PTi?-crg(7y^@A7@SM$F}c@LZ2`60HJRZ`VOJr7J94D zrFpf&d~E(zh3+nNU!msNa2Maw?=qrStEA&dCpAz~Nq2Cnx1EF^d{gu$a30)00 zYS@o$zgj|f5V}z4F+xueda}@SggJ9_&QY>m&4Rq1Ouiz0mb};1o%(pU^i6{kG74`PBINLbnw9 zOrd)U-B;-0LXQ@Dg3yzNzC!40gq|n#O+w!;^xZ-)75X8e9~Jr;q1Oq$LFny5?-u%N zp;dNjfA~U|6uPp|HHB^<^l3t$DReKP&lh^2&?AH%FZ5KQX9|6z(6bb zp`Q`@C81vz`W>M^5c*T0_Xz!!(BBIEqtL$z?N>G!Y4xtwdeZSBvgkB@`lR`fy^ov5T7kY!xZwmdM(A$OnMCi|j-Y@j`LLV0T z525Y0edY?LSW>?e&EHM4?X-`V^tMw* zOX&B7-Y)bmp}!FNYoWgv`moS{2(2o!Z~3v~)fc+7&{c%4E_7|7>kHjP=w?E<6uOMx`BJ@_FcM1Ka&Y@UMsb~%L$z$bVH%@g+4{-HbS2%bdk`#g&rXEaG}QueTmT1g`Oq! ze4%d@`W~Sl68cG@Ul95=q2ChvL!oyHy+`P;g+3(o5uyFs%6;s7RaWR)Lf03%vCz$g zZYgwop*suRL+Cz2_ZNDY&|`$2Ec6vZ&lLK4p>GlTZlRY8y;|sJg??G+jY7X8^v6Q) z75XQky*jD=nJsi3q4R}4Md&s{pCNQtq0bije4&R5Jx1t@g}zegSwb%m`VOJ*6MB`< zj|=^*(CdVLP3X-+zbEuZLhls%3!(Q5eNgD1h0ZuWwZF>>T}9{`Le~?zvCz$gZY6X( zp*soPUFg0-UnKM_p%)2#pU@kGepl$NLVqIk=R*G=^lw6^)lF^h@7J9SL2Zc^=klH>~h0YhcK%OEq^(o zYYN>&=w?Ds68b8k*9-lQ(0-%T@>CGIn$RZ*ohS6kLZ2aYkj<4M^yxx(7Wzh^?-P2p(9a3ILFo5|-YxW3 zLVqXpA))^ixTkkA&VX^e&rIup9#HBXfHptex-#j6nc`-Q-xkB^h-j&F7#VM9}+t4q}1}|34MmpbA?_c z^w&cFA#|svsrmI5`YEBe2;D?npX(s>1fj1Ly6EI&{@dbs!krFuntBbouNUY{^*eO( zF~t0)8UB{r^6jfryH0j^cjJlviR0Q zec0T!P@y`pZ1o7LK+R`k)xq<+rbpU`{udyec0OOLd@R#E^^KY}Eg$n#H5Y#g0?WtJ z)IfyO&h{&hCpyoia37|JCs&6b>S&8l<2l*khx$oT9vT}h^~}>IGoSPnhi2weo*GF$ z>X|1T=H2V5+o1Eo2f(}~o?1l>uAxTwT5_>xp3;{OZlE3EA2J+%JE*}=sS&=Pgx?Pg z2M?17uYmG0Uw#_h=c)6+O#Fl0EXT(k*O99{HIDwzdTKEVztv9j>2lP3iX83i59)d( z^hihkFJmS;Z4UV~>gl+`+1HY*J@tkQ-{HvrIi!D~BZ{LMEpz3*-_iY}VBTXMAFHME z)_CUWpZU=2i@e8CE-)YDEgt!>^V8@7>mNh?xobwA?|6yhjgIUG+BZ7xb<9M)8Q#)y zsN>a+4>`W>xZ5!u^<%ucj%`TP>u$$a9QQl&e>G`u=-9z=pd(p&xA9JK z?C&_mak1lTj^8+zEn(xeaO~%JgX2SvTO5x%R?V>S+B#n3c)jC`j^8_0z*NY3b#xr> z$p7VH_;SaW9rrovlGa||v76&0$2%Nfa^!Q2ncmNi)v~N^;n>gd8pnqmw>TblEK|zH zYvkC&akS%&j{M&t=C{kyD{XZ{#}1AI94~Xc)p3pE+a%V*{f-_cM(P@lr#bd=yu$HO z$E}V(IM&7r%lNGvhdR!6T;uqbA1o1bH{%;RxWSTY3kU` zairsX$A=wXbNtNl566nwM6w?Fj$Irta=hO0LC04dcRAL@gvI#$p9Jze$BP{oI<9ow z;P|=YKOC#zo^QraIG*b`*>Qm*?}euy?^!2#uQ~Y-$I95mQ#W<&<~Y)EhT~$#=NvyI zF+U%4%)~vN)F(K$bv)m3hU3$YpE&;N*Z>naCDe|1%s1 zI$rL0nRGIX>q2w&Q+B z54(0ur-tKcj=dbmJI-}n?)b7JHUld5kY}E!irqSe)knoJb}?L3Y^7)RY4Mm=Rfqav zPt_-3Y)oQIoJ69JTaf6h(@C^-M-p{Co5X%sAIJXW98V1*uk+M+@~4=(jJ(BDGs$gQ z-AH2le5>PKF4x765F`ZPLC(C zjl9h1X(YC_*ExLyiO%9PHkkh1B)0u4NtEje7tW^;vtDmFzVE`nAhEsq%JDn$dQTl9 zZ}8NgB+}K~-$8q3kvo)w&lW5pNjzl~@8-w}o za{7SNhaENdL*ZA}k?#_re{HAhIo*szc}{Wc{CQQys5#T;O=K<8l)DK0+ct zK68S6$#Ih-pDjVZJx=pk67>7ch5OtehA!<`*|9E(@-}d6?!pV4?&!#8OVE$clprUP z$nP=|>CSO_q0@Y}1jFxhTv)dixsHQKq%+>>NscoeuXDVMM7frc@L%Qll;b+bH%a(ycbdjQlw(zQyimjOL>GRV)2$uPay-XzB#HbckVtQu)3cmj;JC6)8jn|yU$#4Lsq9$Sg*SD&g(IJp!Th>A_8}2}nA4*iFL#{oxPZiQ z^UaQTkT-ei9ukw#DiZq!&y#(XdW}3wsrN{1j6WrNVf#m(gD2IKz45$P9yehlZH~9F zv8_&h3*LJ|Vk6v%ybb4J$VGT|HhG6qBgi|Ix|&41n;ai@e9iGQ$DbWb@;K{ZoW~(o zDAkZ$sZ>jH72ZrhK7#!Ray1@yOJZYx5xGXGi^<27T1Y;w)Gg!_Ny3wRq4`6BjjNbFp6BVSVLEb?X4 zpIndaIQa_RoI;`<9wf1`T1jqfEycT2zd7`HllJL8WM0yX9Nbhm7G3HsaiKkvAb3L_%{2``3Ci6VCm&C^P2l5nb z*T_>nyq*kffis*W;#DF~!+s{&(o-iod%m-`B2V{JTM{Ru&T{tN&OVsL#(TK4U+V09 zRtD3bL!Rxa>q+E)kF($B?5oLhP%jeszv}FpoP8_V)>9vo*g5!$Z11U`$O2CtB|BjM zxeV9_^&ro{em!}nr;aB(;y9EuC{7sJUIqq=$!jaF^px@7qJl1BpN|Fe#;8=%5y7e6StPI*ubv(m` zcXsUOIM8t%3I8idq(9T?`Hpv!NPmgr!!GCWhy>Cw<|1%wnNaWMUaiHT^ zXXmpo=zp0DpX2oPj<>pSK9hp!Jm|=0OfcTFj_X}GpB2IIcN{--;k!w+=a)`@O=7+0 zvmO}!y9@u5#Cl(%5{Ue=NUVeAJRWp4YOMG5oV^i=^}e~&r;%9i`N~hm??hs~??WP= zp)P!^<0X#QI^IOW?@p(eIr5nWOz$bjb&h=Y0K?yP-o z!gHMF|Mb(|$c48ik#m-vpm&Eq+i!*{!cT*PbZOn8^=yA z`~ni|`)IP7Qs#Ut&JA8ejsJg{L)KF2R&t!D?jXnG{2MtI*G0(*I9??$!u&^0#Pv{e zlBaf)i2p5ljaI*rIEms{1uwyNh`bd0P2|Ox$H@^GKP2{NT97!|(vqBt{Us89JxKVS zPhN(8AaN0HGc>IW9&z5qaKCr z5Q+V$gXDDVKakj;N=KV}{UY)NrEVwd;5dV{vXN3RktZtkI@wsM zH_0YA9wc*>+D7InwTsMG>I?EDrTD+Dv8GBLB%9$4ieyXNi@@{OCo7dfHplTB*#ghJ zCQreC`jMw9Rhv8w=ZVSIN;M}>$N6Eh74D573-CfxGNDv2vJKvhNVZjq|H~R{hj%uS z?Ufo!cEDR4$urPCWFgvz?1=UuJE48Z&PwrrQDZ&uws5iwjtj}INuS5Hg=i`lSBu-X;OxE$g$`bavatla=cPU$O%eiVjYcL zgyTSRBHn*SPEzU=ax&VNycoyp&Q$74au(W=oQ?96bClx$PR4G= zVF!u!u1WS+ivJ_Y_HIoMz)d%s4a zy+0t)-g`*2_aPGPt!ja2?=mFXy9SB&ZbG8HTajq*E+pFfJQD3aibQ))A<^EmNwoKE zne@MQH>pLXcdms54-m*xdy?-NL zSLz=m+B@@jaD!5%Nwjx$awEz~qP=s;O-eN-uU4upxf%OmHl5b%BCehwQ$v5$G zCKBy^8Hx6uO@4&+h(voYCehxHkZA80NVNBxB-(oiIS6kVB?sfY6gdRv2p`juRQ^`ePo9daqwSMolz7r9KSHst--9+Jy(Pb2vN z+J}4)xsbHUq@4|y-%k4Y}Z_SNYr z5%Q8*-mgpOatVUcr2Dzf!fyud%%&zrlHF@&NV| z$Zs)!kl&#_$nP<4kOy%dnEV0r7I_Hiodo`<3dRmok2FA5I zm&8TstH?C1cu#CBU8^Nz39arYak2V!5;wzrPL|YWA1#)pRgIIOOW}p*WNEFsIQA#Y zXf@37QW9@ko$h!8iHqN>$?{rlB(qUY5;rgYgRH1kPIC~i6i$$pwHi)V(duIIIIV6Y zt7`QEiHqpJka)Fj3G6e*a&V_CSwpMFWKE<)*3zm6SsUq*bx?2ec&+Xraq)d6c>>Bs z*3;?>vc6XFQ@{pV)gl{e)rxGSRbTQ%ttOL=wOU9v(P|Z$tJNkF7xTX+^R+62ec0GZ zTIG{XwdzXZBL7GdHy+O?n``wb*+Q!~$y2oYiab>-?=M}0`#1W~Is*k7wN$qTd^K@QMr4ml9xnjECn z%j96KJ|TzT_>ml{RfPmN4E;k6NB@u`&_Cozj2Chg))VqVj6ZU;R@=!jS{)|GYE`xk zI8LjRNZf?clbnG1kQZq+mz=281LP#shn$T1kQbvqM#v3_Pt8d9! zT9s-K&ekfIoTF8D@;a?1kaM+~Mb6XeKJt34){!@8wS%0G^^#nmRrvyNA<`jlL^|Y6 zT8$=e)@n9+i&o3XTeW(LyiKc}kYX^tMAFjFb{MDAICT&pU~&BnBE}iH4&#h`3FC}>S*usb^;&&O zzM|D1I}Z7Ra5eHt%}GET3twPM19Cj=x1^>`k8z~tG(o#7-xmxTc{8DHpUsb z1?vs@4%Qp;U930cdsuJC_p#oPA7H&9Kg4>|1>A~xfcyyQkue;vk=rqUlOJm}hTMU1 zNbbb^LVkkzirl5u)8waGttCIh_J!PyaY=rz)e&+J)-&=8t!i}z_i9y_{8Fnk$bDLM zCcnb=jNGr)DDrEqW|H4%bsc#C{X~9??HZYm{vyA_dPshc?HYLy{oW1yL906CA+4H| zKWf#9{7I|x$;0SB@@K8CCV$cD7V=lD=j3mw7x_EJ75Rr&yU8P3{Y3sltF$8UPmE9U zFSI9l6yu%5Ur$p1KeU|(U=>x`{@-ZEVQMW>~70C z5)XUbKyGErOJomQz9qNDb6<5}Pg};5_`uRqvbQa3$Ue4QO5#TcSCIW|d5YY|mgmS~ zTfQXw+tPb4aDXk_kOOgDkHkY|`!iI%c11Y|E)+sV(=A!)*D0+{KoD3qd@*HksVjmKJijEoYOv+43-n zhuXd%N8tYYBCx`iS!AUx?PQfL7m_1Ue-ib6fULIV5fb(O8#&6Bw@B3Yd$PuspGeeq zo5kR0TLzM-XAOz}`%j@I}9Fgt=&P2V*S+?v>&bDPga*i#l$+@Md)ZP=EC z`I+3$mh%0;{cYKoJiwOUkW0{C$pi7c1bGmii`XBG*)o+}isu{1IO*@Spx%9d-%<+i*)uCV1BvKiaO60pUV31lnck!f3wCfl$* zkO$lHIGM5Kb25wdeju2$Wi;82dXXKr98RvZq9=*Q$yw%kn~ZOhB#TBJ)J zgY6{-9*cfN9%sve-WZ^ZM%OFoY0iOCminMZzU%ifwXZEq$&$9P0y z9iBvfhI(tBPriZvNxq5aV#vRv9muzAd6s+!<0ttKTRtM+wPh3eo-JMqd>{KQ@&k;g za-h+2kkK-ZZZ#zd%1EcgB5Y&6mlq(Lcy< zFiw%*qP@s&xR1OXEOcZ5*&Wxp$RbBZl3O`4iQLAKd1Ntuw?g*E{V{T&BRO(g+!rGU z;dhVZc8;7&;^FAa$sKTim@L8lRdO)OM-IX7Xvv|Dd_eAm=S^3DJByT&T~Q9r2_)9b zEE4UrH;MJtKz?US8~FpqbMi;D6ZtP}XXH=VPD%8W8_1t+xtFvY`7?+D5 zwo9AuH&AmZxd)!}BH_O~IT80?$vtuZl|=v9o7@ZaB`1ld7|jWqGd1UG)@kCfOvPKO ziQ!pk3?TRR-Vor07=333;HP>mb*F0Twqvj==mup_FdAsJ_n)hoyr1^~I3z{!$ zzOMPc=Es_!YksY{N%KcdvHbeDnmsl9YWCM0q&ZA;xMqbW4nb7AOwydDIa714=DwOs zG?!{NYBp&$Yp&8fOmmIqTFv#Er)zG|JWum-&8s!9*SuNte$9t8AJu$9^JUG~HQ&^H zNAq*duQfMm{-}vTMzxEp*;BKxW`E5=n!_}QYgTAhYfjRfra4n{uI9d)OEi~iHflC$ zHfyfZJWO+q=3345nx|`S&^%A`a?PtXuh+a;^LEX40YO$@n8V`x>xu1^s|l_GX&ir9rIR%l|VRCBCOyj$~8%_lUU z(R@MkP0e>S-`D(DbCc$enjDx}UstoIW?#+znu9b;G>2+dXjW^E(VU<;Q**9no#rCV zeKnV8F4b(*Y}3qXuF^bA^LX-7?4LB(Yo4yTQS%Z_^?NAzU#<1^nm23Su6eiS{hAMH zKBM`9=F6I|Yrd)Zj^^i@Uu$mC{86*3=a;`oQ~llwL|=n(vdS=f|3#lYhYToSJ>PpS;q4Zw2!is`W4u z`P6B>h(ta)tyhuA=RB=9lE~*Ftsf!sm4|1xx}hmd2IjrHMwMSDwi0U zZp)5pNi}5Bm17qqmZh?}L?$+K@`7oxh5O7}II~vA|DVTV3@L9&x3nZ$vA_bvbGb~a zzCD-7`i1gKn~AqBV~DS^xr~(0Emv5UNw>E}T~n>ew3N4|bBXd9^B3=y&Bbxb@L$)j zqA8wfjAd7*vQ3pEXJUCF7iYDmanRrV={2UgoZc8B1 z`3(7A*1fhP-n@C;qowk5_~o^~r=6oL`y^4>S`IJM5RN{X)UA+SL;;;`5CLErtiRWot#_+4AYRv#a z6c7qZ#{gN9?Kb|$K&&8`FI|~e1f_J>G60zn%-fho#mr{klwz2dSU#J zksgm(gDFUFk&)h7q<1--SiVC11?k}yT3-3qVn59M=));U54Ym-$~SyiXZeb>ALBiZ zzh3wYrs|J`KXp_2UW;-vJ^o!5v@^=diN`B_^)hvk@A50>882 zr`k{ZRY%Il{OPx)@=c4B@0v*Y1|kBgECo8f%aL!%7RuMt_Y2GSCkMh>XG^EGvmFssK`~~R^#4_p;ZXZAD z^3jJ=kRG)vp9&SpMatJ-`>}i(PWu8&4u5yk&Qj@Yt#L} z_Y&D|BA$udK2UyIRL#Nq)uzKxzBO1UtnVQF1@#Tm)o$v3%{M_M5lB0ySMe7tQ-4s8 zXDbipl0OBumms6<^5Y0>=cqjM-2s0=zSm(nh=WDx@d9SSMjo+Uh2>~^>*|pn8kXq| z#$S-$X*y2Oemzj&F$fDL=Ec8vHG}Z!tXO0U%5*Nm(1dM)iGH}X7EXa59y!RX$0hK4 zCiLp;FL-nzuO5Ri-Y#;Nbf_mT)ioEo4uc2=Q8!!BVeDNqoUV4WiJ=UG+4U43A zDk>4#3}q3v-}U4DbgqVt`S!%$ibSS0(HzUPx3(rS<>?WXH5FrO#*7_RIi{qfqJ)z_ zudJx3si`R`sUB558o;!)@QB*E(=96~8PgsXmJ>^N8B%#+Dq%LlBEp{Wyr?HUE}`X@hdcf7yJz0x}E{wAmC+@=jP?CbA&f6XNO`nDOJzV|n+ zX_AkQ>=_Na{+5TEil!G09@b0-jru8y&(8KVTlEF;-zS>m{i9}10W^ zArsFvG?nBMt=V)YTM}<>POpUbu$>xrDQCGj`DJ@%)4Gxqr#yF`l%T%y404Lrx#ulY zn%wDqns&W`YfVt+`lgM`PHUQ?wEIPqwSI;S>x$St?@@m`-8HvNZu)c6_#5Plo_MgK z$?7?sZQOsx{Y|#6>6&}|^A7*)5XDWUTT5C}*=(wHSxKt3BfTO~l5B5nP~mOq6i%Qr zgTr!TS1CP9MW&`(+S08!6&zQBqy7@gR5RM3ro6JcWKlZZJgy|3X=!N2$zaI=qZ;cg zY8omk4ivv#l4z6>JX;;1&QwSE8%%ad{)W@gAXCRJS)5H|vP)*Jo||f4GA)r^kxRG1 zFV!sm`L3uGWX1gUmW6)XPiar$=sOz|lw4NKQQIO8tFbBimW4Qsjcv&gllInZYFR5* zR|Ag!r5y>3iRExeJ9)u^$@|3?&f32=wrIb)+E`4uUK`@MbS5SXQ!Q=HiFt{ZbY}JB zAXqZ$+}m$m7A2L_bZP8QN+EK#DV#STuXDK7aMnT441$TBU1|S7Lc3m#BxD~5g z8dEJ2WK+4-x^N2v$yJ4ocv&kpwM(ADZRH&TC7PTN|STG5Rg8EoCLGu1jUvjT4!cL}Louc^2C-2Hgyr z0n6!)mFovC8EZ3At#2Zy*YFDA8t?_1k#Z5Pw8LInMZE9JfHSpA7 zGZHN=bJHu^jNsbFWr;;??MCR-w)QEwSeR&SGz|0NtBgE@(a;E1YkeU{-28I0|E`QB z+c2)+Do=b>ESHAD0MM36C%KEm;{wGvvbytemx4lQPj4X9*+cct&tP9Lp9h3y{&=0M)x+gp?7cu!B+2QlGmwo{?SlO65M~G zUAaY|`-<8s{0#&R+u&cUjY%ugj$s&7$5JspQZ%G-ZOjbCZa%t)k6ftL7s0Ed=E`bb z9mXaXUT&PzAo)T6A%&V*s#$Ou-Cy_*?!3h8w>>WA8JCNrSCzL|*pYcF?|+^^RrN3R z)XgrlMlXwRsVr5a|4lF6Jhi(2ShpI~EwATqmdJlhVx-@1_H0v~XtVgZ71CTEiTZkqo&U=0_1`N70#E5Jx2! zMhaDDR$(-h5zWO`3YW0J=JkX8rC6*I=K;yKbT*dbNZ8(hLrSF(Jbl*OT2ZqM&H_4c zJc%PL9Qx#1+PKFcp(WYSoX#dBnQU&)Hc2wwmS`0Wxr*4~Vwe-4gG{zztj#3_Ir9*LTuua7ADVMI4jSiGa#@A zzBm`c;g+=cK$|NWi!~+UZEZLs^Ou-WRxjgtC)FtNdY-Q#`&BrCQnOes7qJc#tsRnG zjgy@g!I5q})6gUb<7y4k+J9kgWV}AR3bBzI6`F0;DmI=pGmPzrCRK}SITp(zXk=CW zY8)bBeMAKhx;oVvd}#4XQ@@6U_0?fqG~2H48=&PLp9$ww=#`GvSm1S<6S#k#nArfaBSp! zr9BZi72`@hPDWP8^pRh1gt#S>e}xRO{JVqmro^T$UJ#o%d0(A+yrH2TM|%l&ie;E5 z8ZpB1Xfob_Eh&y`Q&^Sp)+#lZ244T60e?+cxo!B#0IH5NeOw($wxBCx<3wn4qnf9e zRaT(;E)!Ui(w1I{^YK>xHA(hhuJ+D(QjiP(nlSbvO>8B|!=E>+a$p%TvCQIdBLaNo z3lt2cORBjlBohyT7&25IoMV~ASJx}j87Ng)&auqez(Qa{WUZ1uxLKlh zP=r!yxmndUspieBvZ^;WRXlQ`YVOZf0A^?f1YnNKYTPBT0sOfNK>bupv*t~z%1zQx zkCtmlx2@)xaJYbKp$hnGVEtMurD=5=2BH*-SMSf0K2X$U@s^gjDmc~@?VPF7*EdUR zVpT4l#7RQuQnGW=x1;CdsSg$EFZv$-GKbifIL25c!F{N@s#4#K^^Oq*M1B1QRG$ml z5QJk5x5RTzF$~4(5(Uq-R3rF(p~>$IXe8Apeg~jp%W*CH?SdsV6V^TESnZjlY8$oG z;5U=%3@w!qY%YIwa^+%mVpXfwOZo^}3`W&*kqRa|>xxiy@k`Z=uC+e{Dpup1eR88ocP0fjw9<So1eRg)&_9(<)m2vedX~PxjR$1vI_mgb&B$6_ zVF<1$)Jm=?#j93)4$i+8Z(M?qcxD-QBkCzJ9FwDhIBZgP3-ncUTuQ@uD+wG`#Qf_R z!KF*zz%}h(X3NUYnADvT%y?59KaD2NREvu+S5wrh5Fz-XIpKTl?fXbxTD+-oPCZ|O`SVjKEzY`oK{rY)oyJ_Qii=*UMeP(u|5v#5!8?NKe$ z#2CGmX^XLVZ*>a^GMIJPf(fDOX^~$r@g6veLGb3AC7Z1Srt6zFYf|3X_f7wYg~i?W zU#f@SFnbMz2XA6;q4^N1?k}S&(2GwhV3F8EEpD-PzG<`CA%eP>y@i%zd;gnt>o;m0 zQGvfLG%7;%YTm2|umke8`WCY7j8(_(!x~1stX|emJ^FY~kDdkF_UL6TM)r8+3csY~ zRO5xecHwb+Yq)D$HQk*a-Mf$LKE6Bdl5ZtWk6C>vCKgR78ieO-3-W{TRS4+j$*exrXpcfJ;AKbU7P9hvX7vfYiXx#w*jB7YkFmJhyLEL~jzM_- z0C#4c9utscubowry@x{Y(Vef!?_*iar0-xDhIHqLGx}|VML#U-!fd?ocbkH0EJe`IeO?+d?*cy*r_ z)>mZrAUds#xkojB2ddix@2i4DLP6X~NGf8T9K`lBXZ$JMRe4aMk>i5L6Zw#%zm<{s z6Gs65Nf&1(mOMP$;!iHtGu~%ql_>54KWn08d7WyqWvze8fA(k;ty3(k3!^Ndm?mmD z&gEKHE%PT9*7UAw`5~+aYetb;#;;z*n#B*CU~|DUOV;crwOr1)bJwZm$LK$g4={m4 z@X$=Rml#sW^b47AA-xOF;gXuUNVJf-2>;Y%l_gn%Fzyhh+-V(=XN?%DRKYE~un(M7 zJ`rOz#|`Tjj5RC;jcnCIexf20bF`md#8~(i>(^PLae2{MK{ZwbNOe5ZUC;Wm9vJN$ z9!_+wJ|~$cd#Goj-bLaC`~(30BMpBpy_ht2N#ePEreeA8V&;WMKl;t*0w#M8W$$Wj zL)EoQ@gNxbCo$`_0(zR);fFJ(_Pt#`Xm-_ZYnQfnqO;Gi|?kTH*z+-nb0VrLv3 zx)0jJm8fB5AG0fzP$hW6u2y0K-JZ9{D8VC2_ceQh5^WT3+mn>w$28p!>}g6|K=GM9 zQ;7#Dx;S%{_=%#2Q>VmsZ2P{>BI!4q4T#ApSL?ouTf8?y2C>`v9q$Y}^gCF)xg)m^ zdW+?b;4_Qn!G1srp?RL|j@zU#s{Q1Pu6N5c-_u_oPYg?<`fa zQ_!*8Gx16;dVfW6w&kxXrsEr^U3a$MdiQfPny*{$8Hzo%c#onkXjh88v?yfjEzn{ciiKLJ23w@Xa9S2?QAx44 z7Q0jIqs1bMeYIFlv7Z)4QtYpV>gY?b$13KQ-;WzPCwpA+i_~voru2A!#Ohl7F+$X` z>lSaq@&JE#gCx6IC3Lllw?+oOOV{FUgXOMPaVeI2F`$^kUNP6NaL~o zSU)qnnBUXt*QkTtpG#=9iuqNo0fz>muBC&IrSqve*dC+OD6j@x5;%_2UA(J1+Fwbm ziaSO(gc|t9TCNOuF^JG+?bx}ErT(klBgIANfkTUXW9}DgK+vRa&KgjGU{3Ccuq?ay zW#N~%++Cw9rJQAn2N8CTmZc=GEKv2X6EuZUghDCJ0(Bq66TE4YPP=A(+ zd(GmjuoP(th81$qD5SF#KTh+jnE6feIhLgO4b1y}$VE)VO z9Ac!HUjozZ&BP0tmlRJ%sJ};5#~2(srFd@!c8>oHEL?#we8rGMd;1p5>X4@Rl>F3G z2Q0oM-(7V9wQlcKN%DxZ_|beH)h=%#Ot1gqX>E+MUA2RpJsD$&m4 zw&MN>?4|ZYLulr~Tja2=cr^5YshDwc_qY8$P?0;|KUh#ZoxSwIg6a&5^}&MLH|>WH zeHI^r*gN?Ld~6gcJ_!MSqp4#Pc1J1R$Ut?Nay^y`@5D@sZ^675k5`KM_3B>iv&BQu z3Vk@h?yQc8-LB+!vr4;NHC5pnekH54+qEf$>-a6} z(r(wEqHyCy3OC)NaPy-Ix4fos+ouY*^FX$=+ns$C?kXj=s$$Jcw;IXjDeckdBf(1z zr9F}Z6q^1#fNJ@CrBfnbIGVds4dDKzbqkXZ$N`4Zew8!d0 z6%M^n;jr5jezOc$mP&gZe!RjF8x_{vt#IV*?PxpdK!u}^P*}S`;aGkaxU|P{{3>v1 zj}tynII$d;e@c6tlp0N}J4dOL`6HIn9_!l`PQ6v(cV8)-@e#KD(jI3Pl@Mo5RoKv| zaQ2Brui-}`G4Z>(+kK!v8nWMF8HQc(hx7XCQgoIwye63aq71JIX2&SQYl7J`%J7jLM=zH`?yyj7UJsdK+M zqYN(?X3y%}9nUPoyN21z!p?5bD#L4s+2cBo5N4O*4aDqyou@JL%J4E`_QcLo&M(7z ziPcLp6;hF2eR3+OD@L1lOgGPj1#91~@DAu_j& z&WOn}yc?NYNoOIJm*F+Z++sS@T2Y2KCUffvBNmP-E4x8VBmgKwM)<0XVuR(PE= zkA{N-Lvvub-bo^CSGpCx$r0VM)Jdw872e<+5t`nQm;(Ea&N;9TS5d$E6BaG2n2D7Y z-sIdF#{8bgqDYj0>1O8zn08Z-6^MuzPc=d;k($FSY%bjME!{dn71er|=65Ts^O z&hfdd@HVG3^qRGqSK$g6rJRw=3U7DjL5)xa*&7!cl(F!)%7bMsE4;(uhvEDz4+@II zB$Stb5rfSQ*E^kaLf34bD~q@lJnnKH4n0oXqQ~9Nd!ff^fkzPi9)}-`^UHFMX}s6j zIW%4v7+Dk5Hq8A#XKLti)fPSOcM_q;?Rg%oVwlha&T*mJVq331l~w3g_$)l6-|L)X zDx6kPhRvE&S>c1uwPEzqAi8Q&wJKH2vciX)PeQL@fmhVwVW$tSp82h@OP)j2>k+3q z^m_7_tMsU|f9RGD65CRh$_gKIjtpH73tS&TkZzx1zvDdRTphaoW-~XxeaZ@-cAgKt z76e{f&i5JTpP}nbzg&}NouPe$W+@L+R4o#1mgk%~q1TH+V&OVqZ+YH1IP}=GMUNMp z--R9$&56-pbZ!Zag{JW(=ef|>D{2h8*k7E_LXYjY=<%}C3m1X?)xT@t5!N7R-&Y)d z$IkZ}9(Y9?;#FtA&|$Ychp5+U4nJq-CsUEijWu*duV*thj%3 z-U_{%e$ndTf#bp;!DDz5ebj3cXGUy!24~mUBpG`<<iNt?ZqIqXn8(x=7tV`i#nhvA380e?ft;U-3n|UIVXg+ z&jVXD;g6k5Lx)1O6UH9p0|XVSaZ$}wmCJd+R#y0l^GN7FaC3j%I-fenl%o~7wp#(yysQE9P?rx2$U6m?#vBcCkL)<_`)*~?q4}qBe>_5 z6@KBY44oGQ&Z-CBgK#N-0Q2HMVb;q}{7dJO&_CudL6k$U)vufvp#A-Bi_;nYwexux z-Vq7^#_5Wqd%sSH2YKtXzI94M+tG&YJ7)rHem=)DJ-sS7Is1lj&M@Nq(`kdP3RRNA zvk|AP@Ox)n7;=sZ`N8=;Lev41cLOhQg-Lr=4o^h-y@VMjFELVG*6Zmd*o%bDUc$fE z;xBiVGH;~AGn;u3o)Ljjig{`>FZME>f#;c)H}5 z?)SWs)>*pI4$qx@(8t5DWs4>f z>9AegGH;T@6Ft>wygrs*OPi%Q+2L8C?={Hc+0EujmU&Ygo-L|j$lFQp4a>Z#4o@Cc z_wq*Y@KIfXFY~53Jew@xsbNQ!AF^JY1_fPPwgFfAH`v}QZAq5Rm>EDl0&;EA?>tEz0bSGCIMY$Sp9U+nP2 z-H&)l5b+^sZ5FE&DmV z7~tF93i8vo{T*H*@NJ(3jm2@hP|d=1QP>L?1aJcebHANJA2ibe4zDlx&D0y;EK)7h zxgPzvW!@5p*B?f+R-C+Lw%!H^By*s{ZxVLeSKAzfkR0u52B(7@Ua0U3JlWQpB>`K^ z;Ux{c1uHb+ z^hMx+ae?LN(2{ic*}?&f0?RR>WtlS*fqr(!*^IB(a-q6qQ06r`^`XOWZ6*T;ZqJ44 z@<^GNa*hrierGeaAO+>c-i#_QcP)0(k=7S z4lg(P$#iqHmpbOV9N~T$%df#=@r{`EV%lY1n{y(lcA4HF?jXH`o%_O&?Nms{c{U8$ zUWH_xx5JPfR7lSGCJZT2A?;3=!NIsY#9=cr^$ur17`mh0eV2JFoe>Bv^H!;1t4k8z zN&Y^r%vlC%A({+X05{M0fYlcB^4K$=xrs z-D%j?x$U9t-l#38}2z4sq>ewydH{3xa0 zvp+Cw=ezSmTalv=!_@7DvZCL+%R}3TM!XB$V?*0kM!b#gMWOBEXuLvQ$qU_kLx-)S zkqdRs7rAeQ4j)BRKnq>$%1%LTdPF0`c8NPEw0&p9yVM;M+IkxC{@^YOZSNWJE_2&L z+oy)@a(7*5>uscYg?o8u>t)!kbRPbcMcuiji!Lq?{jB_woeS({cb~O+di5w;{DM*BD8I1*dB1t z4Q*c=X+G%Q7TR_&;yvU(AKKnG;yvts7TP{DY>&9zaf8cmfWbzZe{xGhTZv(N)SVjI zo;L>4KfAHe_7}tUgnMXcd(E&t>7EtZ-Y{%Wxi^Kjx1+XT@ACI8~y8`_SIW{Qfu?7kY>PBLt-xZj4hQw-ayZtq=#2Kb%P zMP75uL)%$43xP`Nvb^rj4sGW~(+nEmuWmAQ*ceSXSS^2Zj|&|xjiw%C@rHYO=x}9T z7P<^?x{rkp*X3oQ9scfq7&_d%r7YfZyW`l_-w5u=%R;ZJx832P!#z<4H2FL3ywLW? zs7;@;75&3ag$@trmCrxvD|**GF?4t=uYB6!J@=~6;mN!#^zi(?`$XvQY+e@H;RE-R z(BZ|rEVRRiZV%Ld42Diok2x0&|dNkEeWx8}UAOZwYO?8S%bwpABv0QCrZ7zH~nc9Yz=lf93Wl4>GNY zM#jqh+ARxhl}5a8-07jM%82)^TOZm+8u7k!4-akCM!Ze#IiYQo5$~Vwt)Z>Pi1)qw zTxc6@#QVYhG_;K|;{E6r;-ZJ&;A5llg3a?^?#`jZxM<{{Wq)#Kgbw4QDWLU!cAG-m zglJ^g#9JHMc8|sja<;sUp~D{0$U)Aw_s7s-Vl)M$?s#v7wn@>*u({q(unkZnEjwBv zI(mUOumWLfb7xq0gmv-wR%X9#W;!(K!5wLI_ojrlSw`MP-a(;lwvqQ%-XWoFPBhJ6 zyzJqf89L03CLA=&*4}NQ!@OwfL9_JqUJf1h*({47pI+WSL$7@|%O}XJx3>c>(E3fV z|7Mv5IrjBxL$3oj%Mq=$jkh9nIB2uX;85(X3msycNJOXuY|Uiz^2pO$@?a>r30Hz zv()P~GDtHMTa_`8{wmPusG)H*n zhqglln@+RRyCbw69;_q(I&jfQ@5Rt|M6iyut=jt{v>h3&BWwT1G zzs#x08_ef<-ElvnGydgKdoWnQ*w7|PF&*_>iIW6?w$aA_j>V)Df@?6xqv*Ono_Ql@NJp1)gdr;iHy=hUWt@AGd zgwHGW99G)%6h3J=mPdDI;?FwpYRCfIk-#UN@i&eOoIdIf<9J-LP*cJ7{DIr}xq;k) z&ofV;D%gPsuj4a;rG$?ok3TtIUKz;2ye~HXkx;51#_djt>!K)3!G;$sIJ^}&Y~VxR z|#5hIUZ8%h-&AAa|v@6G5F@x63k?#BnZ{nW58Vrt1% zu#JB+a7gkQ?4T&ict2tyKHBX^PIVS#jUPFE1|x5S0&^-zGxGS#K(;aZ_W5FLRDDaOwJ(CK1BW1>VDe5(3(o_nNu?#d_-MbH z*hM)F@ezKdfvboU8<*1>HTPeDz(p386Eg}Yz99EkygqvJ9HgLLAtV+{Keej7Vyt)# ze4XT~-C9PCl7fC+=5>{BPGQ#`g5TicbLIV{*y?W$um)O#tnKl@?oexItK6!vw?=%t z#Z1%>RC}W4ss?h^4%A5Ezguh(#In>n5}$96H^bY{E(uMn78xUs>-DMhx);E2wv8{UM^brS*((a1D~~AmCKfoaO1U=@juXqh9SV;3YOvTZ ziN!fwESR&K*Kfpbo>O6@@~+OMccr&|LAl*EFN@EWvC7-J((6(%+w+i?<@CDK+uAv# z+}jo*Lko^X1!jBWXL}U|dwRVJj`FMm6zSW;XWNtVk~&G%xv%FSsX1O@%Cn9(N>XEa zT?$8d{g7Oja&Omy5neGD3+8(LhF5^)$bUqEGwt`t!kL&Xa3+^K6U&W6?njCJRLYr3 zNx?{@G~2_v@Cpw1tm6ut+mD!S<0B&6|C!U9`bdD`u6*$`S;yU`nueC(cL-XOyX!^Su`fWq+Wat5ge%;WXpO9%HtWgP$v|rRQHDOj(5D#sVnbhM==%-*qM_e5^hbtPoj`^8$1R$vYB*Q+>(D*&Mp8WI^hE5y$Fhiee=-(Uq8bjY==sOMlsGU8Kfd#_;|78+s>0*BE+=q47&pJ^AS^HFU<%zcKVthCbHNCmZ@SLvJ+n<%Yh} z(ELW7Kl$ao+0YLd`Vm7vY3OGS{gR>IH1xZM<~OLL<@vt5@ zL(egEy`fhb`cy+-ZRke~{feQ#H1rRK?u#ol(ejrWdb*+aF?6$`k2m!BhQ7?uw;1{n zL%(3?R}B4kL%(n6e;T>~7sR6V{dZ3|qGjxriryF{ap${~4gP~U&`b0zX?Ih9i zJ#Oe%3~hDG_wQ=xX@)+=(9amUgcps}-0Z#MJ?hTaiZ2&3ukXXxdI&KY`* zq1PFDy`e8M^woyG%h2j7bfmsd8uoV#{fVK!H+0wFvZOw~+Q!gB4P9mE$%d{obj;8z z486+G#~AuFLtkL%YYcstp&v8!bB2E1(El*>XNLaD(9Tx*{iV>*y$rpLp|>;iP(u$l z^hiUGGxTIb&oK0!hThxI2N^nP=(M3b41Ktvk2UluhTdT4iwu34p>HtsgNFXIp`SDK ztA>8Z(4QIlCqwt>k-xsTH}r0X9&hL=hMsNcIz#Vc=z|QMG<4d~e20iX`QzgnLmzKw zzF;Kke~zK~nvtme8bjY^=z9$PprIc#^wWlZ!O*W8`tOE**U+CD`YS_!Z|Lyj)p|Va zYh2IS*3df|dKW`i8G4+dCmDK%p0@KYo#+`x$zmp-T)s+|bpA-rdmi z4Sj&2Q-*Fc^h!hX)iBZaIKj|o82Um(UuNiQ4SkcL?=bZJhE~4_R|WFNo2L!?i-vx~ z&~F?1Q$v4g=tD!$KwEt^H#_-FtZEqc2>l#DPGIW!nTMV5s^eRLD#?VI@ z`dCAsWav{2eY&B~G4ut7zSPiH8Ttl8-(u)H4SlbnA29Tv4E=H$v-G+X^(2pAW zNkj8pO40Uv#n68<^gD+B(9oY5`Wr+4U}!6Rpu=C^1%}?*&;ty;ouP*qdYGZh4P9;M z@rIsa=vju|)6k0yy}zNC8hW{*+YPt^VlhAuYr_J$s2=yF3>8+xpv_b~J{L(ew!UWVS+&@n?N4c%hs zoS_dh^jbroV(4=W&3A11lfQla!O+(l`Zhz~ZRiIK{ivazH1zX^e#Ov#HS}ACe$UV! z8~RH_Z!+}14DImYGBx?_(aq334Bgkz0}Wkb=u$)Tg<{eCMj3i{L)RL5uA%wrv1ocr z4Bcqx7DIO!ny)L1rgwy)*Bbg{L!WKvOALLLp>HzuU55Unp&vE$(}sS@(0?=ZyN3SQ z&|ew)dqWo)=kvve-r3M23_Z!vvke_Lbeo|MGxSl0UT^5L41JZMZ!`3hhJG~i{KrkW zx8rXm>>=C9G0>Cz&VqR#xg)&y!$3!_&C^}viacE?m*nZK{ z^g!vz(|Es6WODc%WMp#uH-3d7PWZg9ALQWi?&#$BpAQLx9Mm^DITALU3RW*2i#RxF zuju6PjSP{=ky;ULgrO_*o;c=dbLX=i{>M&kz`c7uj!}-k-u70)p^tiq(p~W7 z6JJ*-Jx~g@Kf8QyyI3C5_afmYz3jpAlh*i13iOV$9EmYKUQ+LE_ml~`{eAx-vJ_2D z`x<5MBhP`<`zpPi@Hu~K-oojPr{QKJed;rncI0JUzCfQ6S--3=yJ072=CLdr*T@=vQaUbaH_$v%v~zmSY57F}{Qvtf$7a?MZ5IISKzZhVN%fjv73K zdQV%`s{-UyHc@ku=44I%081HO6U|ez!g)G;nr5x$bXz@Z9olEue9jgxl(tn*AnUa5 z&^%4^TFu8b-z8BFKJ-Qo(i}~qT==?$Vhf4#9j|$<=3|VGu3(3bJ!-FVuayk2A$i8sFOLt?XAM&f5DTz@taTSE>NSw~(WvVpu3 z-+dyl7C{nXUn7Df#YW>kN?s@O0tsVRw#NY?hS$sI*@B(FlBB?pPjBuhltb#1&T3rPt!Z)qbhNBK05A~8&z zLS86x9(j?-739Stw~}bI2gyrCo+1Ar{(8R*<=}eWi0Aw@2a`KvJR*0&??OlnYct71 zMffa_eV7QJ*|C2kk|qxqIgC6)su zERiorv@f5*VY_yB!E;bP@?4RfNUSeDQ^WN%jT|O2hs2n-g4|7{L-TO5Oawn|5PMgV z6G?Q=OGpg5S83i!V$gU{^9iy7>yw-)@-Ddq-}fO8L?^>IXvgsbBQoW`s@`6Xm(o+O zz^nPlX7qQmRb)QdCUO9Iut*b`!I!7Vl_E!xt3^&H_Yk?1tVH?9Dv=w=ks`N|)o4d@ z6v|81h&)D)7I~T+gZ@a46?u&uC-Qf4yvTdx1d&h3-9qKUd3(?Nx0+EBr#VD6%j@$?R zRP!Wqf05J3{Y3bTioF!&)4Yy62-`Oq6M2ekLOC_xChJ8$AR9zJBO67&Arm4$kV&*_ zS8y4QyvP=8?_?S;bRav>k2S}W=x;Mg^soKNc9EoJn#`iVkU5cK$W|`gnXz zQL~g>gMLUJiGD~Ph4vwjMn5Fiq92mSAYJlU^h5GEj3*@e?>po={Qgh#8}c+kNAcN} z{4KsQNuG?~0FkF)dmz_~l#r)lyC%;Q`KRWD?$8&A)N0Nr(H{;Vv7I%MXpc9^VIn`0 z_amPo@BzFlmi!~eP4YqPZ^(!7aY6D8=pNvAcF$@)3+vOnp)(n`J{awPd8 zwr}z!k;}-xh}=oOEW&$o_A96_`6|X4@-_S*t|$09UV}jX74;(jhW!_bcHswk?Z1oc zN4|;ik9-^3A^8^eqvSgx=aT;rxr=-k;{*Ag$mity*iZHXKfo6<$q&&_$d9m}AwNcZ z@)MCq$WKMyCqF|s=na03agY20?M!}&eoKBOayYn}Ywd4;Z z4hsK7ZfD7N$))6umhd+N_~wUvLE<-+{LKTt?jeIo z8^1**hgq^8xr-$SlQ=l~Es3vdT|f@E0H_{+&^OO7E&S+bF=vE*SA2gCm$#~}S}!LgQf0xL5{a% zZ*qbqhmpHmauJE2`QA?AAnzG+64nDb8S8AD>_8~u-*gZSiJOAaFES+a(lZ^_x@o|fE5;$wDCk$YM4A&GXwr7v zjMtn;9)$j?*+9lDSxYWOzait6{F$uBdLSuw)vUv?M_;v*aYQ$&&lY zlqJuR%Po0_Tw%$#WHZ`pFo=_xfn=*C6=d3y`DB|V4dlU=w38W2P9?LJTtnv2Ze%;! zjqI?bU1WH<6i zl!rXZk~DcV>PN1%T*iOg|mi(PO z+me5g=b%6A44#YiMxKWcd6VZ`(n9_o{hPeNk}JuLSnuS8SnuRTSns9a#g>$lm!Ll6 zrKk`22h@kW4D}%|M}5dEP#^M2tRL)~?5iv(C9k$*CV7n|jpVi1KFI4VIgh*^+bekk z)(?3j#%b~K*H(N4{yaoM_yw#GWEcu9h67?AlK85~9K8^lHK7(%M3l6=9EPstZ8 z*?KqdC2T+BUo4qUzHCW7`HCfnldoEG4*44Pf8^`fF3G|e=muzw}LMSmf`v*Z1{$Zj~EByo}D2C@r| zi?zOw^l)CP^;0DJ=qn_~#&>l1`{WuNr)&Kkc_jYE;1B5*kjLN}tk(TVM`SQL$(Efo ztF*m_?1S?(t!v3%A`8ipwj89x>&dM}(&S`YvYKnOeJzP}P9=+QJxGUdBoXgwa*8e2 zYu=;nehN1h z#Cw3mb>d;`461g(FrbLlqRKl# za}tU2P198Q%&|q~gK{Zw|5R`Bacd|4-M?Tvd*Dv*gNS`_He*C7V;Z#Hf~3Lnd8WHAlTSV?ldsYa&xQazUaEZ*keP ztu~WMXKL#zM=navh4a*OE2G!VX*fhWlc*f2-26C+OpU)#tGvn^6ZP%OV)6R=Orqmg z6s2ZXYe#xTqE^TKFA5)tL2oJNyG0UsbB1bzcrKSo)wkyoS-&uT@iOt&Weo9EHkXMS zQ?1Fgl((jHiSilq7w?wM#T!=qikehaPi}5bH^g&^x+3_mbT`^yhKYnvsx#S&eTlJB#=~X-TZ|yqy1~^nwI~H@>SN%NaPkaWa7Dore7#m z>Q^K?7O5^$@1jA6F#6H2Nw0Dw60GfrH~(KIS~Yq>;^6i~HoyL}S|?``t?|ve|MEIr z@c*JW{>qg7j@X=PO+V_hcEhFAY^)0J{; z2Dx}WxVlC0e>{v#t*Tuxr*e!xbSy|LL!U?QN~K%tDy#fJe;uakDyw}xt2H+{lZmfh zI3`xtv8Ar#minB_3S5|P5`|$sE8iV~J4lBdyp^HTB#c@h7S$g4nkjsII#|O~~$*Ac$ zESP?0MjQjbr?7y-=x~~QBChp9jl>_zL%**0o9n07b`+L5J%K-l2W1Y@n`xx?0@9-& z)59)3Ob>@_dF6Wn8kcgyDM*iTP>(R*P0&nFAA+g$7>RX_*5ma^zVv5$B=4g~+l2y$ zzu^?*yO-}5=34|m#t(c0KR#j*&G(&1zBp|O^S#Q*w=dGesdqR9>0M~#J5A?{QzA75 ze&-wcejLdcr%_?Pjfju`VSkwm!DG~53ewx(_Y3R0FEs1R<5*6C-`)t1*7xg3zBtVZ z^W7gE1Fm7dOCi=k2UD0H{G#do7)cL@`(b+D8tw9?E+2h31?hchw2OO^Uk~;_oPLJs zxqfMh+of1}b^75_MqWLNBKh{$=`o&qOCA_(zg>}D zbestC{l;&uMG z^Bso2Am8nb^v=WyVO@|I7^FAANN>r7B3$Q8uMB@ddW^t0LHoUn^u|C36K(vPuKj}W z?GFr=eA0(gH!PqT+I)rk;P5*j5Mbc<5S)T#nh%5D#}U7vzua%EkB=|xtj7rW2lcqw zNU!N2T=NMwQuqaV@%fi%J0EtD$V}MTF1Q34rZ))*qbr5eVU2iZ2OWUvaG$|^d*V;O z@UcCYYK~Qwr$!}Wl2dz2`7JESy53_Q&Unha`f0LKV)g)5w&xt`>)#c zv%%H%u$(I7R5kbfV}xONe=wb3omg5Ux`(Oqx_t} zuQ8QOVo9xm#&mmqb3*7EZ$?K%cw?fWIfw2yOutBV7tsr_#bU{}bT*cY;k>ZDAt$~< z@bp=8Yemg6xa!f75Y?S|E{@aRTuWOrgrNj5a6vk6Hio7=NZl1#THS|yoDC}tD6 z`u3y%9b~c%oj8{iWa}>kS~DByU?JP8Lps8xSga!+YsQ%@ido;DYR;uv!;p?-wjth{ zl#T#CW1W$s>EMc7EFR<(i&1u%x-+J-8?qzoXP~oYY@(}Xy0}&W1bZi%oztFWmQJb7@~aIanX$ta3zbqN-Bvz(c8>Io;XC{%!NHUSe z8pl!^x%r4CQ(0X9TaCQhvx!)1I+jheq?*!Mti)xp?8?*@4HD0#k^aH$=^Qd?k>=*c zR0n&unri`{r0DLC<<$RU?@hp?D$*|Cs=l{7>4YpG3P#j`f~+xN6I??e4Jex|ZlkuH zq?5E{Bb~6QGX(cta0Pc97u<2jHMq?xxv4VZSF z5KBwCVO)MoRESs^CuP_$KhY%AAzI2HS~XrbS0oqU8fUF2OQJ=}tHm5Famee08BN1t zWy$$SjoirK$occ>PEo@+dK6ApK^2ZhlZYBNv}^$u4>X;hP%?6O*#fL#(P$%P62A~U zMcI{W{mKUA!seu?#k5t2V^jUSaxsrR6b(GDys5sn46#W@C&3W_qYdaj^ixx!Hm=-c z#=(q45?8w1_@;UF(62%SuY2G+t{aaoNGGQsI#zc%fE0qDxu}0Z}Fj68+b3h0Va|jHBb(QLtW~809Gj>e7(p==u2FTZRL2@tS=Afk7558N&7Gr) zzyV%B1dcVVyK(|7rW;fQ>Zd%-npdkTSBvs8c&@y@VF5QpI)G}S3ivB${c4Lu^@0XW zO$nG+<{T>>fT>ln+S-^h94$pT56b$o8c~P4BeBXR^cfwh>E`z?0NraN-Z` z97EA{n7hjsux)jSJ;04r{=vdX-vE@4fQVLwx@EdWHaVTq0rY&=!`S-O;nxayL?od` zEejZN4dpelWHM2?0F#XlE8(a_vNC~N7V!$2S?) zzb97XS5Og3YXqk5x=N;H8!*d}iDXSYnN;cwIGGhWu^l;4)R9fmFh}k;h8li@P!#;k zqUd)Pg{sxnH=<*xNEOnhHA8~I7Ozl-Xa+f#RIK2*rrxlCpmxnzEJy)$F5>Q^LxEJT zZ6I}_&ZDtpTt{_;%ef1J_Wa7mT4m8l=1|=@ZEoUJm02|wANq)lzg z(KzkF_9U99oOs-%vZB(`Qsr@IpjvQJry6j6^aRh>oomqlj?S;=;yQlknPA_|2{0Pv zPKg@~^er7~s^z|^k{czFoadcd=umPVmI4g2xn7`B>*!FWr{e{*iWl${T;$mZ_HhcF zvl23#a?Aspm#Bzyhl(h5bk9aWsi00y)OiUayzO99z1jtG!a>bcj{j)ss(oaI1C%P|a0V!uC3$_ zattf#V7WV#9SvuQGZBY1Pz`J5<|b1k7V#W^0FE;NM-!De%ADs%gnE7iJ;`{WWcY;G z-1rQfu+ONDHN=y=`9IRR9@TO4e#WqrN?;2FX*r~he#aH5a$Z_WiDZOI(AaFfx|O1 zGjUUJ4>55!D;o+Rp>#pbp1a`&-)L#!MpioE0@(#uU6m}8vW(r3{7}SY9)bXFXca(- zIZWK`&@M+H9^dAh2)*na1v&i`pl*{U|$jy}Ux{zr772kD&sI+V0y_Afvib(6&zUUEq2u)aY&73X;e z-?H_Y4)YGsrUz+y{~jF`gLHsY#t-Zb=kH8D7+YOI_ikT7KInX40X&@$1bYJ;v2+4-nif= zz`N||Wio`X_MC%I@Gf$E0;82Ah)06E%bO4pd_l!Sa}@ zlfx;|6&WAGmy4z_O4ndQ2;Vb`G3o{8hfiQ)2wypBVwAS|$Pm7LbRMI$v6DmiBGR>t z(#B2+;X6rq%HL<@)DXU&w3<=cylEkPQwh(u`%0V@!k3otSh+9im=M0dgeSUvQOAbx zRVF-4?X&B+5Wdy4FQc?y{t&{0!+3<)7jt?oS*jmo!3tN9?lZCBY*-T;UHa1Pzx}D7twpOqS z!q%O1d)T^*t`1vw)4gHqUb-}F-A6Zut^4V^u(guz3R@4-MPch9x+QEqOjm@hM_B!^ z^%$!hwpOv4Ve1K2Eo?o>>Vz|fo`bO)&KNcXBQTs<;XwQ*%x2-t%2f)gPgQX0Mg_BT zaKkE`Su;>U-BcCXP^#FRQx!BWQILE7fdEv~n4pMOTGzI4-6r6XCf(w=_xbSlY7acl;2`--A zop9-83KkDhu%u4G6?ZGR>d%;7!drf=*?Z!cvkwlc>~tAQd%%*Qj_#K}T_-^(?Llh@ z)a$JCQObC`wF%A)OAYy_x2VGY%)$rM$Z*c}>AS|@3Z3p>?#%37#3F84IN zA?87B2UMtcmgsOK-K_*BWr+PA?T>oS{9p_bx zzXai^{c#61$3LO8*R0uEYr3b^dAVz>C0g~No!4Zo^^{gC@N!fh@w?@9>wmP?TV7_m z4cJ@Wu)>%$9Q(I*s_~{ZNNcFC|Favg5GH@inyiHxelsY1+d5SXyZVJX`8(EmT4SG1 zHQu%E)Ea|44P67zzyGxUp|u8kT7E~oXYu6;PBn+5DEPJBx4K~xcC-ppwA|kMfyF(z zqcEy7g>@Exh{I7h+*8=W+z+kOv{v;_wLY?L)>;!hEj`q|s;{^HqP1c>)%w`_T5Db4 zX>oEyGks!p!|d&djs*x7WgfYx9%gzSr7RE7~yM$0$ zyVa&u$9Ssrf7Wm)sWr~o6$I^2+GcAHL^{??_mow>C#rm7%(oJU94GTF)>y3{wU{C7 za2xkqD+%r_zqM9J{8sBS9Y5C>|DAP*&g)NJ*=}CnTdi7lmLdDWdSB;vKJ#;1ber{q zPIHx!=0}TfAyE$qg4y7Mz@f^ibdyV_w6tz(LVHQtb z9Qm8B89E!MXNJ;`uy|_YD1G~_QI@a!;%q*>*y4$g>b~i_Nw>{*$Z?Ftvm{5Wm*hFD z-!8A*5{qX~YHmvJ>n@R@^syFCrc|d+KahJ$wPO#ZkF$7o<+W(3bp{yzqva0vme(7} zvndFrN308hPBw=y8w$O=##?uTd3jB+UIN2^L_56#dAd`kLmtAAe(IQ1k#Zm z=gFAP$v>1n#p0=DujM%KlRj5w-;VI!?2xJeHC(Z8NS|(91%XriJQmM1o((gsRxqcW zb3HF;1+UF!S|31bA63vYWP!mo%i=k$lkiqA;Q*GBU4Y}hq4Z-cp6=$WL{Bi0m)o%x zPkJ5r4G7Tvi=4& zk^L%;j-Rv+-1G;Fr`}W$>D}=D9>jYz0Be@0!Mag zXC;?gyk5}jT^#sHKa<~>MiHU(xW$)r_uAq~&eD=f>vKxF@B%JA>E~!kmBnu&IK`b8 zV0zf9df;8u45e3Fd0OF;0JDJthjx~_Ko?3+SchnZD+0{T%Ry-|FJyD7b)wd~f$t8| z*|^ihZ0k&|(CY0n*gL%8Qe*J~iDT)jo&w(z?aZ%iX3>priO%M$q18-_3!Le-7B8qc z$v*ayv14YbH%N!l>nvVsaTIv|}Cp7jM{L+SIC*;oaT<{~x=lPs`;`1Xi0F+2t%ITT)K=OISb zG~7qJ>zumW5elDW57x4NhU{#6f|eEfWm#_GbL#FV+gpeg!06Y(Jo7^@ePT{fd??@XNCJ z{#21oi$med?XR@f!W1pntykDNPjv%ATZU=NhuB?P@JsYRIm! z&(^X#rMqn+puDB_&01D!q+4b`rDew&vTJR=R?MlxXMxl_ud}ym*;j__20IrwhMaU= zEO&3FE>VWUH`;@>Y=e>RCVPUGWf|#iwkx#kYk#^dx01{47OjxuPn_kJe2cwYE42A@ zfQSBUKc{8c{=|^oYJaF@KN#t5vwzaETqE7>_8!<`J6`z0NOy-lRLeFQvK96eE$e3F zd8d7OT!lyNZ?wV|e-7v|kJ-6&8|famCurH8 zM!F~L3N8D|pDv59vJ=@H1)=bhHeYb(wDVs69I{%K7KcJ8{FHsW*7`OjFLx|GZNID) zdZlFJj-_YpjauPze-6mK)y~Ey*|A}xAzN(^)Utj286(}Zc0|keHe}D)Wm>k?$n$yo zPg=IGk?sZiS}pt1NcW=ssFruiB?+8Qu!kk4&SGQ7{LqhzFe!_Lk3ynuIOb;vxc-n0j6gj!t>@~}W_7tsfn?HB2h>z@gt#DUL z5v~pE?ZsN*{*)qIg^%qAw8F!k74eDvx>k5Rr3kmF{>T1SD?II2fa^ZByZ7;2@T_0v zp23AbvkSGtiz)Uw=YZkQ?W48A-%{*z6~3?=wZbbYMYwbHm-ZD}VQoqguEJOL!&>33 zlp`;GV z$V70OmL29#=anpjHCo|te`2rXK#(sabvoG*{v43I6}(T&iv5Wpvx9$!te5J>=;h%I zoXv)UpEFL4dB$ZTE-mvOjmvExEy4wZgGG6ycTAHTa^|I&Oz@yu!K#+qBjRI~3-X z*ge?w0M8jG?NA~-zDMvNt#I-Vg+ZZ5@Hnjy-Ju*P^b9W03a4~d#Gb)xwL+}3BJzSy zYK5}Sir6dofmSH@7lGn?1^=yO75>~I+dH^tf3Nm&f5wpQ6C9ysmEPSQw+rnXJX*`D zJefPU<_BxFEaA!AC9O~J0xhetK16Tr=$88jZ_~0`Pv+*?H~6fU)q65G&jW(%w5-u9 z&$V+v@JB66dNMc9fx+Decy({~WNw~=gGE|4-z(3}vmiKG%NBStH_rou2`xL_leu{o z1<%p4KY4BBTpJD#3oh5PgbnQGiI7G`X^XI9CUzU4`b(T@61^>(F4m*1FtZjv9WR*5Sdc zwANMr6448bgHLMN)&6oI8xwp-%dYX~4p~X?TP<5^mb7}&H03H_wH4?tvD(8Sc?1(>l<)y)YwcF zz?B!GE#QSNk5@F+Ob|HZ%aNKiv6+k$$G}$Ow80%d`BLbqWG%oMS^>;Fza1; z9CVx#-*Zd!`{tjL&zyD?_L)BqXDZKnPhOv*v(>LdgHW^g&lzjfxDP~VkLDg54#iszE^@%)6YmM>lXR2QA zci;a=K1A!}HQvk1tL4c(M)~-0uImd`)Yex>Kz$J)0o8*2&JwIHu3*B$zRIPjQE_B=F>00-aUFdF>cWB*9ccHsQzM*w5 z+lB78@)zjp;h0n2`PlDJnBpHrs`GZpX8C1mgmuVH^vjHNr}||oonB{h_YdXHl}`=B zV?inrhFk6-q1<`$HAZd3fuG#-GYB%2J70c+IFBum+riXilzTZdL5ElOdKu1Aw{iy! zN5XD}IA)K)A%_V?Tr{@W5REByZ3Pe>N4I3`4mK=|e-dH_k!mz%ZdIX*AowIs92qRXI!FZqr1YX7{Op7->*asw|ctYti3b5y7j<68SGJf5ny4VkEs>_BzO`<*TWpE9F62^qO12IAZYp z1CBWybD`X;Kf4~IPfQCKMVI(d>-|G4ua{OZ@si?#Z<>=x**EH~>7M2l>8;85;z`J`6b%G1~srBLoI za=n&+$5UBDj^E@N?N#A>UZD2Ny*_)Z%-2fW+{X>IC7#l4vQ#T=cdub^z-OI@Xh*3V zEf3}1A^Eclj@$n2K5A%ahH_WPE1}dCH5Iu*=^w3BMJ{*A$F)M*4hpK3p>?->PiuvD zs&x;3Nz5xObEjJO%6?iaYX>b9cAuQ26>@e^@Jza2)@rS;-qUcZ{%*}y$}6;j{z8ye z@UnS8KCHEN?<|`K<$GG8#|{c!HV?_|T5Hc8v{0#sW$!~g-|VH9Uvv?*aw?P9W1;nk zEYVtf?~sjG*rT#qYwhdhrE7+4o{^Voh2EVhw95On!hSotn0*b|td?uERzH6>kUcBE z*Rlgra!^xmafqoc^7zA=k0GALH%ueDz4 zlVpFD+LlL3rE@tG;7gr~TthO|CA`Zn@vx4PTu;f-F5zQAa=J^@u4{%%I3dcJE_sM) z@C!I9gHOOku-&{K!+B2gq$XYcF!O za2?}3K;DlYKG_xn7&&mLN`Z3muv}WNenfoKSE9%MzBiMOISLu57q$yI2EnmI3kpYz zU^!mp7N0+)cEkt~+C6P@I=&N|k)AE^#d!Qe)9#{&>?!$8>|Syoe7|{r*-sY8LjJ~# zz*`Q5OhX`--^~}l;A07SMs}AhY#KX0?5!o)>6gm$0^%f_-)HCd&ZXR*orR-BBj9VA zLKd88zB#p=uSXSTta?SofzEqWlLD`f!YecC3aXjMvGt9!@#3i&^_5L{(^dS$qe>@E z8gU}bD}>Pd|9eL;m;b5~|D7S~y**AXjJG9Qm@4e9B8b6?X{3h?_RA;=4i6OsGYW#% zjRE{{E+-T7v& z@KpwX(crHee7(WHHu#SQ&(Mx>?BB!S>JfOA#*y>=49>^l5rbpBPLX4gP2o|4R~dY^ z!IK7GWbg|NzQo`+8~jd#;|c2&`&teDw!!hBSc?AF2LH+6{M`cQ5K2G~(8GLtx?`!aZ26x_9 z#2lUcCK~eN4PI^Vxd#8E!Ot=HMFzjz;L8lY+~9W^{6T|1Y4GO_{<6W}GWbUZ|I*-F z48G0aKO5Xu=Xo9e%`kY5!Fw3Im%)1*e1O3V3_il(e0`epaoT&T!H+Tc$p)`5c&)*k z4bIka;?!M`^67K8KmVf^;}Z15mX z#r^UOgXb804}owA!4EO` z5e6S;@QDVWYVcVGFEe<(!Ot-G#Rk9L;P)7OmBIN2Am`%*UNrbC27lAw>kR(6!GAJ% zxAfHV1{!>n!6zHM+Tdpy{Az|^4F0acKQQ>m2LHm~UmKk7 z81lEzHiQ3caQ>FIUq8*@nFh}>cz1*I#YO)7_BD7vgAX+Lfd(IG@Iwt=V(6UU z{B47;Gx(h*v%5Pu2!J7?!y1^G2+h^ z*5Dr){0oC`H2Aj$-)?YQ-8Jv%A7O*%7<_kw=NUZT;Qb6f(BKCee7M0!8=Nn7c0SH{ zEj9R&2A^i|V+{TWgU1YBW$;>qHyQkNgP&>e3k`m`!Iv3)xxw!=_yY!i!r;#v{I3Ro z+2Csp{=UIKH~40QZ!@^aN^P%ngX7j=N_*~Z@LmSr&)|a$KFr{w4PI>U@diKM;1vc> z8vG1{^BHyLzK6m0F?gZDM;UyA!KWGgSc6v^yx!n*4c=n#^9;V&;MW+OFX8jo_YQ+U zZ186d{;I*>H~5zZ|IXl+dK!`zIR5Wy@O=$F#NdY*e4@c;8~kE}uQd4U2LI0B|1x;G zdVsCN{%!`}-QfEe`~ZU&8GN+COALOL!Dku#B!gEPyw2eB4E`sBpKI_-41T4-uQT{9 z247+D`wae=!JjtxUkv`L!QV9adj|i+;9nVhv%!BfxW$KX)W_++Sq9(J;C&4~*xjgkw-+LeTdNS<6p*(alSZ#h<*JOBKDIriP+biK!n++5Mf{? z5%X0I5rsDr;lKGr_-!E()7FJV7`23mht6*$_7vi7VhaFzfe?HqByb>}MIyqPM-q#K;Ikfq zp+YnehY4{Oakvmy6Y&j>JBe`mQ$#$N^bg`FA=VH_!%nna;0PgjPcv{V{7A&J)fW=+ z$no_=Jd^roA{y-hA|5t5F3eOh1g0g!5{iUU>sl13M>_(fEYnL z6UPg|dustS{`o|7##@O;3bC4aln|d2C&3SB)4*gQh7r+8P9{zjqJ=n3h+Bw93(-oP zF2o1K8SohDh2R<-cnITw_%Oy3 z@ev`uAU=u*)4Ky7!+cL%g>g)L9QF{Oz`RF%6755L3hhmN8ucPRBg9%_EBx+a8*w$p zmy5yO!Joxz4Nb{vD64 z6aRsEjrcO=HR3Cn*NCqQaUbzD_=~tkh}Vg0h4_;AI>ti};2Zb_I^vr`3?aTH#6;rT zXiwrh@Eh@6_>K5atS`j(gm{nmz7XFNKY;&w0@uNR#1Ao#6F)-#BCf}JMf@23iuj2T zuM+=9hz-O~(LeVDekMc_@pB<26Tc85LHtsPbBJGIejskZyhLn+--%xf@f~p^=F>dj zCe(-c4eCQ|M}3H!g;+$~g8C4@72xKE$7d zIFGm;>j&{)n4gLN#(F{gS%@EqzhK_#1r$;oNW_!5M-c;3)DSHxE+OJ~@a`jGQGSgW zlA@iMCPml1f$35VA%>-xNW_DzaUx#*yoiWJ{0?H46t57orPxHorYC0~V6GH{h+U-^ zPwXZ|IdL~B781KlaUF4YDIO!@!Pqy5J*4=C*i(wkeSrb|>>n{tim}AKq=*uGNpU)H zZz--J?jyx2A~qHOB<4%;9kDm+lMlrEjE4~SlVS>Se<@BS_LbsXA~qqn5D$>z8Df7a z-Xji>;(OviDZ2Fr4w9mPI9Q6Q#352N5DTPOLOf842Z@EK53xv!t;C^H?A`}BOo}2R z9`v0~93e%LI8ur$i3dsX2yv7YZxgX8`hj>b%HI!&ck&hx50&Cb;$c!$5)YT+OyUtz z+(;~z;tApyDc&cRARppbDR$c*I1c@TSc?8Zj7U*M952OLL~NFCB2JXzN#c=GyhA)n zif@UNr0CukI9ZAjM11+^XyQ~UYKi#D(WS(rrMRCsU5bAYXGqaT#Mg^{A>x}w_+3ow zBhX)n_&(8iBECvgPQ(MwXA|)SqT7gnkm4^ye23_3;z{t!0l<@`7)6XqaXj%9DNZBC z(9ei?BlA?I$}bK3yG&naXWFg6weWBr1+3n zE5%R5Iw|%T0IZi{D6s+kj5r7VjM#{NMoglg5u4D@h|TC{#JT8a#CfRCK;V3|GZCBK zBZ;S>pAk=&;%edL^@2-qUUVB#VvCJ@h*qJnsq6fMNFrMRAW z4#o}fT;xYQ5BU+#m*NBB1(+9z7oxq07fE3a23{=1{=`e9=uf;9^91oSDJByaOOYTh zL4P1#j{ZQrLW;|YS4!~^@hXge;?*dZcn!)WE|p>%ahVkVB3>&+&mq9;r07MwUW&tr zH%KvtxC-kx@nGzOi8o@NBi@AZNW58!*NMw94v4o%(W3zPXDJRP-YP|mcpK(7;_YZ} z;vML3#1-hb#5*xB9SFQjibCSuQVb{FgMLT6SBjH}_et?b;{8(GKwK%sa^eG0JWG5~ ziWi9wN%0x+VJSj|z(*v`5rL0lJP;p~ViIwc6ph5krC3UQLW+lpPfD?d_!RmN@oD&{ z2>1-zo!BY`ehC=+11WAMJ}bq`#OL5&;`3<7p}-gLle)wgr8tB57b#W{|0>0s#Fr!% zCg9)DuZVv~{fVgeWa2+C{)wn}g7`AporwCLLwrSw3y7%ia^kBP&qUPoSt8o)P2y`( zd_i1`^@O+v?N59iei;sY1M2|sO_W1?ONz^g#|m*H@ogzuiSJ19De+y*FC&2eL^~1R zlVTR}easKU4=|pH>!f&;_#yfU@gpg=5Z6nQH4^wS#x?O1%n!u>L3{!n#1*j&*_fFQkL- z1OLVsG>Jc>J&C_y{v+bwl|&g3j}WmSzfZIR;$K7?*Ch@C;=4g(iJ^c<5YqzUG9td9 zv62`Lh_%FwfcSx!84$Z23dC=SjwWUW#Notjuj`1!|Cgudh(ZpPQmytL)AYw$E z)YrJYfjA%_E+$$+T;<}8#BKp`HxVcQtBCyr;_t-$0^$u9KOpWF5ML3y2gLV8ya(7i z47dkg)Jp6b5PK8%42Xfmynr}}xK}`oBld!w#JvOJWa2&nF`Jkl5c7$B0^%GZ?75xT zBOvZ`@ns@@O!W;HKOy!Ghz&0OOgsSBjShD(o7flEiHOK=7_lGxNZb?avj7$ZL{B39 zX*(ziD&l3$Rnb^kSz~;zD8QFcn?wP>&l$&;DGTtG&4O4HzS36K+!RlG%J^!TC}@n= zxM>r0mG#Dtc$dy;j@5{Qy85Pg!T2e&hTv!H%V+!3)FkTSeqPy#A2#>$uc8<{*OMkSoA6mhwR}s!te7rd~Inrl%K#QrH*Y|Bv`)Gx%=!qdn9ke+qw4Z8#Ii z&jkE2-m}@uZx!PF`4#%|3qt1Qhvib)=Q(K__+IRk?uWMX?@|}tXfYc)*xKn2b@=i0 z9ftEe=%L%|kEe%WqI5mMpZCDE2aE~t>ai64 zDi?9A2m6v&k2wf?c_S!pMSd|a6Q8UWVSoFsKz{58%&#l{y!=)o>~p_JKS7B6{ajx` zKt0+~GqkS0v9_T8z}`IU#Oy-V^Lw@$dM!S^M@9W9zApv1*c>z zES(f_zN(Il@WE~~r4B0ws@@qKuB82OEga{0U$u`pdu4VcTx~}(tL2~pYa6O9;1O%z z{>nZtKT;GCeSZ1j=U;-6j_{q;;p*Uk3Gd1Ip-6Z@;$4|vyd|U0`Ng><D4HLPq(>MEMTXp5 zw4A!Hd?j*=mMcpFhwc}+%DVahXnQ#UL(I*QAF?09p|`&f`7dn~;*j~GuNZXOngKUM zD==tzRf2gTtjcy$1+IuF8)aXwW>cDLC)PDIHzoVm)mOv^2=J-RO}+@U58}opu*M`4 z^>xYq391jsKlHGCwq3na9&&iof`&M#P*RunO&;90BEN4kzxQE0_V+?KT@tfrR!&MZ z#mAI4O{vG~A{t^?RFXpukCiti=Ej;(5_5C<D65#Yq#aLoK`!gdQ@cb_*iu)a$4=E$i(W!_0E zZT3a0HivRv*;d?A_J05N;^LOl=!TpnQ#YJ1{+8CWb!z)Bg>0Fwi)XFJ(z<3|^|9OR zKZJ(lUX^&iFSO4oq4o+x_oVf=Kh&X_{1wfr^=GI)5QyY#>2ma_$j#$r{vIoz{yKD# zWRJUSYP(3MZ6m9{ejM-S=$mm(!+Oy-_o^$Oge3gRw*HGRTQBl+7mutKgD0#N2V`7x z$NJnAb|LH!3{ZWFl8@KKS<}-)2WDI|@%;l}_j$_hRVj97EV?e36V_+I<|l+>ao_57+r}-< z+Faaa)#hN%3hbOGM&51hve}laHcPZrZp$lQ1+EFbziP9UGqqjX*=ts`S!uHEtiX8WBM{-<)1C#YB?Z1lD=g1mN#0`m&)EZ zZM^kb(Qc)U+b6%>N)K&L&u9_sRiVWzHrqnBEfzOzyx}gyWCj<9*NfKBvdqmgGi~XG zyEy7bcCFB?7A_K(RHKD%ikn2dT)|>qku~` zih+fjWJaG&fxIOf@j^~FY!@PQVQx`Q``)Y5mt}63n_qh%eO!obdf?)XB7=D#{e{_U z7H^apfdf4r0uN}ZXkEE!LPmHA+vVX+#TlD7<^FW^+ty&zLA3mwk+JU^6C# z7Rj64Gq-5bCXv@tdKTE_u$1g9;N=?wZa9Fj<%X@ikJpL=kJx(p{o!TuKxLgoee#0v zF;gx=_=v4F_mAlnI55<}?Bx3cg{YH63c-|+WVE1mM}I-PX?2IKcfS78 z7naf20!!^>qW?*2LIYN)zIWXEzU@|*dp6saY`Y?R@N)Jw!2pUX*pB8g>VaDHQaPIIC$ zp3JYTsgE@kIJ*A*5M#Xcz`p3>mDoG%fAluHKDtkEkZe0I_)=>KN9*z-82LpJIVkeJ zJxIPT`V_9;uiXmlf$@5EHfG^Udhu$X7qgWYMQi!bf6aOHH~8_268Q0S`0@0PF?(H} zY&%nq#i$Uia!~iyjB43u=2&@%jUFFF<Yn4E@m`PIw&{Vfn}s!f z!$-+3ZLiM>YzT{zpR%`{Uow5e>x=8#7s}ktEjjPDrbia`Uf6#HFmG8)dy6=KR%jWn z_!ZeVEGkJ~de^xA<3dZ)7mM~;XWBz7%n+i_9%_CN>!(FpzL_RCJ7BE-%RX?wO%smj z^Ud@DeZDD9&uPzG{o~IfC+*tM`n+wp12J@YTRL8MgexB<->+r8GVjW`+nIyK{^4b- zH;Zh<7Earc^>OC4^&3Q3E}gm|(Z%Y2?CU|y#t*Ntmxh*27;BHSmWq>ZZc7&rwyoZ` zm>Y)83#S&hPgzvoE+UN|KQBL`@8nzb-AHSDuq$xbUU_NT16{+{T{LC~&-L?rZqAs0 zz;83en9V{?+wjqxE^TX)VnbNk!;62)ZeLb1ZNr*QJ(s3Dx4h({ZI-xWO&-2T?pYXG zOZ(E+(z?O$)ARDf9s%InJ$8%0&Y*7N8CiLu?SWz8Wwd)vn-zqmL9}sS^rS5^h&HCB zK(ujb@t(;s>tN}u5L@^d)xvKlLuld1PubrsEt$39txoMsS9Ye)%4oBL)$@O&jcHRi zd~!OhLQl+0$^&R+Hu@o~NrRms*cpPI{X_vRr=7~i@vC9uhp_RO&TRaCX~{7g-u@LE zWt*LO5w4f5&{hVOCqwjP@j#4`kCY$Zar`LX?qO{YskWvS|80Bkq_z7`#i-#(;W)Wy zTR?oNty{SDx%=4C0cGDOpVO`)-CtBXY;~fTen6QQG$4u>Ut&JE&S) z4#-=UKI@3B-S4xO+F0{*w`JG(9LdMACl4z|AKcr>JYW;s2I*#|ar_W9rGnU1Xi z*eYS)5nG?W*IIgeuNFPh7jA93SNpf*>d$Cp&1aeSW!x)TMLv7y(8wUQCdos;U)u${ zZrj~;L+<^4Pg-Pu%+APpm|SAFTQURlwvG9l zb9b+6*KJF05ty~RT#>dobY=J&?3Q51o{?^Mbyc%k8prXl(Dgygq}kVoZ@PKhqLM!2 z(w2z!9%swJ*_VI$zC9TC;d_hx9_!a_6YGopbLrQdOUI|or5VdOn=UU2uMw?1f0X&M z=;D%F+R_4n?YK6&wxe9x59J;%u}fOm1tTj*?Bkoo)ZE2WH=H7J7H3{j+}?YU zTq^cow{8EGR{x`3w=pjtvGv0Ht)<~*_BcF6a%^#)wOwp^5UGmW*Pn@zTJpmuqV>$} zVTqha(z3!l%x0l3OKIErn2moa!u%mHf8>k)g%Qjiz18ed{2bE!ookq$i*v5EhvzN} zw5@5B#iPb7QFF1gf=!EX{W>L*vFyu+G>n)-%R1zqQ+!N-g?*(e5MW0ye(ZZ zW<;c;T-Lgm>P0Q3D0kX(J$A?1S-e>Uv354+EW;~o+g@+ZEk1b63bl5ox7mTzlCv?w zF2_}Ux76<*fd?!#6YPb4aSrO@l)Gb%QEqR{=*2HW=T**@9re8~_a>`t&D^XT#D+B4 zf6N1&)Hr)t)}GZ3m;V?LnafzV+%Eq0lrB3TWnb+2zA&%LQnPflgrLXK7C>6@@(xz8 zZ1yE($xRQG6#tag?yiCvsXkZ%J1miTo!|2dx61ovKhD@}d$##rU$6&_jl8lgzs2gm zx;?l^w5F>yFMJbphNU07ZrkA1tM}@%U9?Xqg>{jZ?cu)bwiUKKm^Z&I7~oonmJ1*+ zu8w`gK%^Q9y*|#$xO#hd`Wm#~G*N=~Tet1do3V~JuiI9|ws*8(TEkUnSEKwrj_3HX=C_5=DynSm1KqOs=@>r| zlpcGj#~!Jr&q3*-OVNheUK@7o0d>t6qg)H+qBaMmw89<>&;lX34@ZvdDAn!3|9Oe- zt}|oV8jRY7TmN;Ry%crJUWcB6vJXW+Sc#sOA^O9^+3-)=5nE?sRR}NZ(=)KN<(T5U zOn)Dl*=5;NZNcCi>};B7p}TiNP9tDpU-a&AIm_Uc(l2{-hgV9`JJ>TMdPVLsu|e8d z%kF_^r1Ff@vq!0UWm?2uCI|FdcK%GPq4x%s&gvCjR*ac0rSv_XLXYUO?13?JcjBGg z>vwFC9F%K^V8NVAOR|>jtn2{Fo`CiH?Rx@C14F~hcBuKT%f7C&vaMp4e9=xze&%=1 zm+QXDDa=}CsTniFoiS5q3VT`Rb@V8AC9_d0>`Jd&7RJjz3+O?ooK_M zxoZAG|6sot=n?FJSTi6i#F)!hqkjx$(cI^HbaiHLiP?J&tjU#qvu?r+J_mg$o3l95 z9JKSZAe%eeAiXZ}g-rCoE=O$b2`g_wyVLhrRla`|bF8v3vgi79Vc{rc-GI*5lrevS zRnNn!86m7G61(*|&YJS}oUH2#iz7c--=1GGW5XMZ9WOPws~LOTFF(Bhbd!jQ}ULFbb zPk*l-^Y`CzbpT#IC7`TXxmiS4w6>(L{Hf&!c=OOZHp{fB?U|u2ZO5h^v*FRJ(N3A) z?{z_BA^az%tSa8;l-1uBr@^n8kF~8?ICaC#V%mnqOIN{*(Y4QPZkYzH(la)5AAoT> z3+0WQ+FsniRTSY!-kNi^r&m4I77CrwmKI{`LEk;+I5~pReE?ELUWCrSG2_h&jmOxA zmz!Jmda*|+a?FO;f(Px@yjj3Pk%nG#fWURO10($+&$NYt$T7I0b#7$k<`&ebUqtj> zxw&B~*TQ#Ui-`PXdnm}(=3J593Tuj2mXxh!OkAz+e_TIx!#(dFR(NFWjJi!pEkGbSu^G{p2vxC?tFw2#;x95 zJomdEzt!&K)OTIGmquwfYtxz48OrM7_9t78jIbWBuW#8NDz??}LG`&js9(MXiao(DH;uAd+EJRFSD!@(ojBX(S) z#(%nJ>6p|N>P5%LyCbjh54WX-(UX1c)4g>-1vxX%+iH%8Z;78SKs$X}*3uxRZXo>)GP}`tbkF#~x*i&#X!99g@{Wfp?@7+cQ=F`)llrB z`d}9|ZXNcwx9)lLn7`vJdU}8}JI}IO@|<1DYeDp_$Q_;RwuifW6z;aU6Xb4tIIv;r z`0uaHeewG<^PL^x+1o|c*(Cw)4v(F>I2av#B&l8v(| zJ6~N*2IKh?pZ5{HBRB@0{xY{1_pMqx((Ld|Ooe(nreeUa|7^#B?z33s<)TRFJm$rc z`FLzIzp1e~UXb!APX1ws<-3pAM0nS9*wFkl&dB#atmD&|HL2BssC8a`^p{S;=@~^27-XCMB9r92ZZ{ZmMrMadtdWBk*GpA{s5iAD&QcY{Ibu ze~ocGHzX4E$!J+D85a}l5>4Vy>WD{7XEY5%ib+MIJ4sV2nksAX2$HC8NDB2EDeePr zVzzoBY9=0ds&B*tO-*99b647pnLRx|7beDMR3|E%L{+@Dwx)hwgE%eTSTAOj$7*7Y zGjaF2B+--o>G-udQNSpCAR!0)Isi)5No~tTtY=rG@^tgCUyeifdcOsn!uVysG znwnvN!=}{JWRJN$#-lJ|*ietCzTy!`Mh^GL4E19g9xJJ@ukpfA!%y$IMX>|b#OHUU zgLIT9R3&%lD%zpxCM_DO^(V(`)#GDs-ji!%4b$tr%*MdqvFY;+It@*iNTNT&!%pSL zEvSp3{XN>DfUMl7)N1gQvwA4a@1`mBM>ognni8iukE^-4jj61}!gnrs?sTX3sE4Nv9OetS>U+Os-oTX=cXis(tD+&~-6BQe$fC6BVK& z&PPr$Mk?Ykyf#sXZtF$H%93m~SET_@gpgKpdW*V|$)*JuBaQXVbrnV)PFzzxe&(nm zs)ni;6RnHmr;m~tqAHoIg6HHDm`WC;#@5BFkgqFoN_J8?1^XUeblN=9oQzkX{@x>v zPVA(iQ&7oi>WN3^fk|aiw4pwM3OUkPjoYtWwPuJoE9h}gRYt1WVD`-VrdW+L!#_nj5p@C~xj6DvTuN$1A3>{E3N4iD9LsMMIsb4ChEY+w(@m)Pu96Qe>`30>d4_3T));;3OgAS|AD^hVY|@p z=(@i}@wepY>#V!Ta>q`(iv+*YEq9U9>ukGFbNksYw2VFm?Va~1G@;v1c9E&8W%irG z!=2SeZOvxX#%gM2BuVsRichXI0dRB`);Bs z!PNqp*I;9#2GtB~xJ<#sMCov*!GI$Cn%)Ri6ciQyn&vR`$Qkh_D3m4= z!U^qEa}@I#7i)?+HmKmv3-@d9)ICMYMCLiGVP^e^alV|Lh@BcUa(Y}fbwW6SohlX; zO^-L!#LDBxCYq{C6Vr}j3LUZYWW%_F#3rpm_1)5h({)oKcba%~Npqs6f=ff`PWq|P z8qB2gzB4LP6Kk5`^k*-)b8ReHsiUj+VIq-?CL7}A&fuv~RGm^`C|B|1&4HpqQ5%~d z)g&6lu2eMfbO}N17my9s51!I77@v;~7gnr_#C)7o)`7bxfPUiU*&#y#9)YYn#w^`k zCJCN@jyFZ8#HJ__Py8_8>#B5&v-?#-cOzU=pTtQqvWb_E7%`fmGVX5Us+zU+70osE zqNy>4Q_!YF-2&|8pb)RDZ}c|L&VClocg~=P;xwAS``FNc-_5LzHzvwKYvCm97R!n- zt)h15o%GCqkVdUwbm4DKGZJUo*s7x_C-B=-9u#j#Ca~ZmsT=z3X^V=SO@5pw)yTld zetRaPycR_UUhuc49<93olI!qqPhT`FrPm;n6#gG%ROt3Fr^P#nh|X-li0HJJINL5> zr8@k#lys`UPyL3z;puxjqFwb_N57*l{pKQko#;2GF+0z1PU!D2zd2D#Kl#n6cI+L$ zJ!xux*jWegpSBKG*DHNJp=h`v_4jR@Br~B<4cPIqH*DHx?->1r7-wcyYY3slLL2N(X9O>I$1{ zoEA=L0+kFUD{MxfF@~*tQXQi_@>)AC!8zeZ5mlln0%NAkn3$r`5#dQaU0k^4TOukO z<8kbzR2Wz76-J}g@mNCx`j8W1Y1oac*tzI{6(Ux~9tIocsK}?7vfrbEiQx9;fO1Ybjn~#UE^y=P>iwx*=4wJ^ zEZ6MDSmS~y?`kkLIs<>ux-$``k}_;`qtRGAR+flPE{TqvH9b0c%yDj6vGVd}oV~*E zSX~v(uV_}+A4ROZJ}F{JY!GoeQ#Vu{MLBQlP=LQ`G;V{aWQ*X!DsEm>Vw=i7gV>r1 zb*!(#=D4Q5Nq?n-q;nC62Jz?88(BFx%ALcnNbttuVh*hKBX z2#Tq2jjC&e2IPkEX(uU1vA7UgB| zTzP%N0&WO(0M$Yj@K?_I)fS2B1r3;%u!F8DbB>h`z|^W(ZEZ{$j+UaF2W5R(ji`&y zZ;DmoT7E~UvLoooolEX2)(JWqP8d^Cyf(%g0*wOQ5=#!Ild>ALyMw5&6F~JDa0PUa zqVOPo>^_RUdo`vro;Ep7aQXuLqMYIM1~NL!=>cG#Ul4+u(Dpc@*&8dBZ&aww9mxuZ4p!j@7VCe9`2#y0-I#eB$(a5nzd0QP3<=9ca8}Mk@bcQKWAG%11y%vlQou zNTOg1{KgrgEkbq=mhnw^k} zADu{6VO~a`uHfmk8+P&=t~tK69INpws0gJs0<(5qCDYRVT%JZIk~KI7SLzHnnH4#) z9XV0dkxkJsNA5R<8h(RN6kN=r=yDc?TJaVeY-6Mf>C&3PG0x%@$`H*U=W2?@J6>Df zuz*loKNlB1n;J<0buQv2sY8KOu5D0C4%B%R_vzhWU3o{ioI4=oHNUd4R#`NXIaD`J zo0~XQWmb)KhrVL5h%Qg4yb;TYWP?+^gFqU}8fQ-{pLSF^B_t{xCBB3VQtl;Ww)n5p zAxv>oJyJV}T@Nfu##I&7wE!w`O((b>sG$qE{+1=05QQ1gN6LHzvrC7h+Ao>sm(0@= zy1XMh#ZqJ)8B*4fBUwk5iXq(zu6Jj}M&m9yb|%q8<;3IEiFc{;I5bc#IH^+&I6r!V z=j+Zj=zmA&*K=_lzw=DyVP?RTryk+pR@B*&axcbR6E_>^Y&z6b8%6gL0M2lL>iXtJ zMJr+p6k@}K=mnTxi1Xa&1uiC%6}*U!>v6a~rk*x&LM+dXi*hfn>CjYK6fMVo-zQC> zMbWvbQbn6;x$mpwMo%Q?H8?Z>Tphx0iNV&J|ZK_whUEZBQtEu4w;N}-T06Lpt6`^*+Dhd-KTDZ=Qjlx+BbDOO8%M}h( zI)Ir?#nw20^B#w4t^ypd%ts+-8gd{92n8I+O70*hEJYpk<}F9Vna`Mra~M#~Va&}< zrlu#vbFu+&QUP%4pc1E)=n2lM!22@Jq|MN9ZXV;)*y$@9@Q4#1dTPXu8Vx`uRO4b@ zq|JQV1^uU~wxKeChaiC9qOu&9g5#pHvZfhZ>`L5R!m{5OSBP@Unz2ucH_athx*ZQi zIX%$hE+#$h1(J1c%-oJprPmYP4(ZUSR)}`!@?P2GXw1vap>s{%ky5D}bZ*k^@NPM7 z@m{IQ2v;TQ;apb=mq9_o`~wuTy3rnacDRL#2FvX@JMn*s9~Yb>Oqnm z8s+NXj+3M_I*ShD0a4(@6$jkD)528Ft#8wNZ4e0o|#{_I{ zfJMOhP6oJgp%OIJ|3B=#34B(?)jxjk^CTgJ5W`}Kh$K)%WHUQkf=M7iSVIy*P$WPI z5(oj=-4Ll;-Ad8A*HWd{rB$m|tyRm9+Sa;nwbrd@t+lo;ZP8lmYk%MGnVCEHxzF>2 zm?!rC{(tX#Kbf2}bIzPO=ggV8bLZaYUPZvwFgBVH*g$Xv$q;YdxYZ~DL}{_rG`rR4 zv(+e|W--<>O>Z@AZ#BwoHCk*nW^DEJ(M*_+{2Ec7sAd#%IAMv37^Ni`%kfT>Teotg zbFG1MAuujSVxH=@*31%Cy~=O z8u(sz9&mNYEcQ-Tsx#EuHFBbof6F%F@*cAehOr=6BdLOu*Gf5`o0AO;2WLr*f(QC2 zS!N>vVT#yWwqgZnEt`ZDLOm2!+M3s4yGKz3ZNiXfQl&;pAjbw$YOMvHfIqIVrb-Vim*FUr;EX%WYb> zQtg@G){GJAFGgVu?MiVr;60Tl*>J_}$cYH}?C9=nc?Lllm%ClJ2bL*NWc!kx? zRaI5vbr$zW>k67yJ0@!oP9B~)5p~D0w{W>pRom=n6dM#+tMNkJJneeu%2*|$i#Bdj zPrsqA%0);}JrvQp)q8c#EcHY~liZZ`%q!i32MT?686v9ZV~5z^2 z>)2m5=QLGvZHebBou+DBjMlHh0s&pH0#B9jvBA=n%i1=!jLyZw))ObV)}eG_)9@IVgtkC;UWsC`gAg#g)|;{Ag9=VOjC zF{}nN!U6+6e;mgo&W~+M6Fjn9ylk`VjJ%3PQUfiqy7`0&kw4%{lut1;0Y048J(LqI#*92-ub8_ zKScU=c56O-n(z0iH$x{RC1xP`JQ1*GbZ)+xy*(@P$3^)w;TWnbZmKF?*@~T5gpWX9 z_Iu-< z0P@^+lnmb~a$FQK_8eZdOrAC`#2LsM*6GUL*>)d-W%m(q^!CeoVA*l>r?Dc1eZSZB?ti%c>Jk z>XM9tWt$*`7xP^i*DE*R$`v*U?2?G0<@hBkBoK5>0H-<#P&1xcv*vfYAMy*;?T{v{ zl2?jHBl6TqU)6tcksCMTx4rBnEmGyXBGQ~GyEp+CabJPkR;w|c;J#H?I=f`!X52H~ zPz4zZ>ynglydJ@AhpIZ5qVdE8tzJ!0U9rg1MMS`^goLQu*WOvb)6wG7qI*Pi&5j~G zu(E=^vKq_iE}kBg47HK=g(pN+87}BzN7(vZ>c`>@)&YVhBBhHi&^mP82R;E^Qa`_t zPQcASTuhBuWE7AP-WyN6Tw~iK)nL|%oy)YYB?po=z_LQWNDLibL`f= z^EwQd(`tM@_4NoCqMxak-2av3l%4y>SdX zJV%1xM{A7tbPnO@{DMvEn$#{Sp5j1Ne>T3}`T5{8(yQ?3p3QYsspS+~2|v&FW#iW> zq)E6&!viu(PkRp&JNNaHi`X5KO`1dR1k1iZ?q{qNeqZ}t+D})TGsXU>=&GD~*ih{T zbz=TbyIJn8>Cw_v1tSMZSEcwPxl1yXJvzUR|Og z)LnAy=4rwj=^fNW<@h!u6BXrcNG2*M#85pO)=xehx4-0_XbC#q<%Jc`Vq;v>nFme^U-Y^^6MNcL_aB$0EPk&%!^ zYL`AiO}a(M`q_LG2x~<1IM=AMM0+11yJ1lWDG4v?Amd9~xR&5I>%8}-e5W#r`Yl4H z+B8ihP>s02)nJ$A3!kj+vNGc0vr9^G_Enybo_%AKcbDQ{QbbKykKgCu5pUc*<4;61 zo~Y8}*RNZzgl@spxC%{FX0f?TnCNuu7nDe(n|qFl>f@7>h&pD2Ma>NfPVz=rcU;FC zS)y2XOfYIYu6rgJPgbJgX{=0qf-#c5q!Eu7G-4Hs+x03?R4!rbBZPKCCmVU)(#t+! z-DYSv^s`n=9(MI@M^wXRJRII#n#LCYWvl-s1#dAP`Pzs}snvKHhCErD*s5BKi|wLB zJD@}1brTZaAH{WL$+x#qv~~xC>)RP1u(~q21xs$j6Vm z%cqf2yUC@|LKF9Bq|EMcXpHBPy34CEM0b;G<48{2zcB=Nhm)h9S?VqyM@#M|7snQy zxQC}CAA9G_C)54@EL3Qtsj{Ek+Z$Rbm) zgcbFROwhR{{MA2RJjOSDtM{KE90ElN>x*}9%lmwMtuRJ-wP1@9^>aRcm`+pV2m0zM z1#O8}lDHx2$M3#2j2#heBoyv=(TDViJZEA0LVwaHA;CpH|KNcTd62<#7zz^i4q9NJ ziZ9qggmZKY37LSYz|&a2e}-@2i7rhzn9!1EifJjr99@{W)8e$0;JC(IW`|eM05#~k z&4PGsC1?V^N<$NZ%6FUE(ee{h7?T`7JttF6?JF!bt0uiT?4Ut)9ItnTRjR*8*Qem6Rfo$(vy>w^-u z7&8xl?19%Rs-L{z5v@bD=&$gfZ6B|vN!((%+Gnu|Df#(AG$CR8;IN?eg=~H=5_J!<(%=0)7OAY->AS z;A=jiUERK^V#5Z!QXFsTlw!U=Zo}G^6|L|vKC6d^R@dRHDy_irA(sv66)xt*-ST#W z=FR-ni=0{U4MN2bqfEW^WrhBRyZ(T;`J}tfinh3lHs7$!gXZd+^|5Ty6!xvDP>2fn zfF(Y8kGDQbodV?t{muIbva?AyThFf`w&Jrmt@ubg-Z_j<=jiWV^P}9ztwcHAUWQ2& zzj2W-AdPqM{SZ)^K~cO@ybr=R^ULlLg)D$yO(|X~xu6{i;$5`(W+&b|unYk2ZpQ1b zxt!7;&{h)spIg`8(3VSU`B=O9A)CBs*}RC8V&w(ecojBYp4=o~3u)2nR7%+len14D zBj>BzunmBB&m#v!wl(kyeSDbD_dWP%H5|N&7+=`IYnTyfw``iTc@y8+UxlF~k;}j>RMn=aFUdzna;p=gl5U4WbX({q`3gP0 ztc33)Y@>ae3Zf3#e^D&~K`ecTQKVSfNTc zQUoKkqJ2dzzE6Y!D4ig0UUKlB4!D7XYs&xY>)M}iXA=AtesE3F2lm1$f zwjx3>)ZjNw*=8Nya)DQG^Yf-=%*<-p(B9Iv5x)Y^Yh}DkuYL1czTg*c;TCPH@O9G- zc>Ae#rtwsuw2q#MWMqhK#S7F63$PS#<43;mg#CKNyRr+fx7CvxUh0lez_+W~H>u$A z2r4^`uNTILTWayW54=IPt{FaSUZrT&?G=34JKY*l9?=(7_{2~ve%#^I;I~wGibEwJK*!7dYynxXYr#lYCKs+Av!HIpVLIedZG!Pg`3vDgki zDLkb>eP`DW?8py6gTBR)pF!)%S$mewQ2jC$6HxWaD)^(msbd?+S&9!)E!!kNU^}Eh z$cy0;t7&XiR&`nx@7r_y^{ro}{9^MB-?}xe>!;$2%eAw(B#QV%HhxhY;KJ`#@ab%4 zBkIuUs+&|lti*m6#J$doDcc_SsjG(C; zTllO7Kaqx)UE}rf_@Z%)Su8NtmUTM7c@l3~A;0GJhj(oKDK@tLSX}ah(z3pS7sj8A z?~>revc9mej!OhYPW#EV{NfehRDKf-a7OFNtLAKO!)M;B>YM8F`R5#xTYaE?8NQR) zw5_0N6+~b)*S>kh$t?~pKR00N*y=26!dh)P|A7ntZMPJaputV8>)TGPJXNo^T2|4Mw{|i-dwwYBG0&uOW3ekAg+e+RVXk96BiB@VR-fP*qvCl3)E`EBeVUT+;DtU)8Ox zRn2XfDO&m7Eb}w25yvvRL1yLAx%h{0WTZFYZDCw-V?a}u+H2?MyQ^C<-}+?AOQI1- z#r&(!YvRYfl`#Krw9D*!UBak1v zYFg$9kTAoC0VC|_WKWi`Be9!g`mr;eRigU}T~&wc-DMl9?HK|S3oeG&;li>NJBBhd zwYQv%bA-uZhQh=dscR>E4m~^F#Y#W)u-1z@O~oa@KVP>&9&_;GY#c5fdF_tiE~HB) z#Oqyl?p#cv)mS~~zUHM4>y{R3$4rRq&xjCFvhxd+=W3U2ozvPb>i|0n55aG~H16ph zgTJJ+f`zd&630#3ux>4+Vyye)EJoY;g=F>YJ9LGDJX^sIrYfGN4$)K*=eH4w0YxhL44B~?{lC{_dfhm0)ncP>^9V`n6GGFGYU7m8I> z=whs*W@lm*Y@LWz>iq>`l|m04tClMmt0j@MSs`|@yz`Q*>o+e~=cI_3ZDq_tX!JP} z)276xUU`|29HT-q*jgvgV=`%f!Sk4zuDh`0Ky#fw9jRs_oftgb#B>xF6R`$y@N^S! z8Q1%b>o!F6kt&Mrru^bM`H0E_eEs+2Ik=AS*OJbSBr6H6E7h5O6TZ*HPkT7n!E6yE zA_QdGD)|zoEu7#3)0Ukgd50=$S(exonTNh>YTmZ3>EyO`%W-oATkPH=2vMu~lC}cw zON_%#C$DR&YJz*=5jS--7pMDpl8UP3(TAWIzJjl#THHlEMB`-f$@nsMhgNZS2%o+8 z%qz&ZTToar%XJ8@grc{iaCKfYYgr90;Jmu_lBuBBcX8CjYo?0X)hATcSI?V^Q*vCI zUl#XaR~17Iv(;ixXK z)ZUh}TyEQ7R}h(mfza*5U(ik~Z0xaJd-3)-*}V7EfA0eDNH_%Da4OR;^CT&F=19ItT}4~$J3 ziQ-ZrEx>;{j6jmuwCgN*3gDnZv!QvVXdhK!A~?#0tA;?;ZD8FuRq49`p9$JPF~dbn z!+3yI3I$CLqXIJ-NbnlL20<5I1#q20_XE7IQ0n)oLX#jZLnJQj4=`4tpvmDEt{gU> zU^G&UF3Cc10aD26ga7I<5=c8lHP=}ft5)|*oQh^#r?Cw{1xOTaaP|5sQ_qg;qe+D6(8pUiOi!fDX7i*G%WQ7Idn`j<{(0e(_8L=P^Bo zE(NLw4rp>1S8^)cgA~J+ELO4>QotVRizruGt|%w@NLD}xT%BvCb6g8L)nZ3n@4$RL zs)xdKJqMvs4&y&^aJIq}LJoEyP)?UGDpaxC)9DNGNuPk1y#@h`0cZhGPIbeOfCgoy zfkCj;nJmcEq(C<};{cIPC@$-z20ccd%Fm_(B`t9dJbjp%t*e3h02VbIo*)t8*=O z#PtNs=L8eOX`GH21~|!H0q}Z~puw22Tnj8$l=+6stgFa63<6C)5BM{_e6W?*p$k`8 zSUa+6Uo6aGEF(L|^|mLg#>$GCoI1~yA$p0d(V|zBtoL<`T-38k2W+tx_&z?@$LEq? znH)8tn<}m|-_!sabRS)()ufy_YIY}AU$mHoL^Fq>$<^9qLKR6T29+ELc6Hi{a^P@~ zMj*vlbFg@3mq-n|7MA-fkYdO#1&88Vz;*q0;fjiF%e9bP|4~`BY;m{fRU7nYxu<;% zxmF2RlxwGHE{R95v?0ZcO&_02ahlI1RE~*?x)UIpD}xww3!`uZ5>^-l49Jjk=AfVn z+fja<(E2!!0lt6)X|DpjuF!ZjTqlne??ehayDkV3c}it=gosd-P(&D}9?1m7y#ubl zm}(yb`OIWeP$f-O+W{NZVb*vVAaHt%DU*Z(Bzl=}CK8O=0&s>xITLb_#OjAql&?pE z=pCVRfb2J!pc3pA6&g`JvlFDNka#g1Q2iW_6gAh7^HC%yJ2VCRDM&H8mR$XXE2>$N zh6$;bpcDeo>**}!VZ29NZNt!SN|8GLdf_7s?!>C0{*GU(~7C0Qm*9a-9BS`A@TD+XW_MZ)|sJWJXbG>jy^$&aW zK_Nv2t|2in*v598j}ds;gcl;=j7h+DSqu(2OkA-Fc<@&<7(<=&JR1Eiu!C^?#% z+%L`7Qj>vFxpt5zrcU5j1fq zL=xv&{}GM<0&o>v%yOxA?zEt6*@Y*!-;AKgh zpzCQ!A?LCr!tEL#48?h_W%+)xC7O$r;w+Hb#JRZC zY_mikK}vBJ3ODg*kiwFOl}nLyRiZ1Aj2^@{Sn}sUQ(?d6CYpg{^dR2Xl5Yii zkIfQ&0LgF@f7p_P{-m=SkX)yhp4f$iS%E7g#y!s1w1JBjpj2@?5*P+TVhs{XIru(T zXe{9zYOb?{!qo(_#0pBNnA;zmAk(*SYP0&&v>@n9Q9uInr^Vu2c|K#fqKMkY`r z5@=8&wbmP!6n+g7TuzN|FhFZU`Pzv6q zgj4JBN?mIGmO_J?a}!A|*!npAAvsH=*Ix{9f{3gy!P-Qv()yUn-o?%?)K*)Qd3F!G zhASk>rG>gOE_O|2vt~7Q(fuOhMXBLi6h=4q99R@v)Y_WTxhzJT1k(hKy8b|^zHXb( z%Qs$f;Uq?|Czb1nGkFOmhtZN5kjO@$Fv^$;Q07r*KS<-@ zUCGP_@{IJxqL%>LB@Px5Y)2B7%Yj@V5w(abFDeyd%=wylM4I4T1Jr-SX#{e>WZneQ zfPhmJAkUf13qTl#Lg7&2wZCN8_^=e684YBQ$=nR&@*bLU1&|UbCw0aHp{A12-ta>C zIqd~L}`)f7UHHWh_f$vMMIo00|~7VoTrNkFI2?@4je>o!fYgP6I=l|NwHSY z1dUMwoo#dgYE%G94OlrwG_dXp@oEk0{zaj4;oQaI;F=`>D-`+|z)K3{mCXT#*23$& zlEolrlUFHpFr2S0bZV{#dV};u4KECMvIH-6dQhQeGDGQIu>M|gL=7z-B*xcV46sL` zV_`<6m=ZO1{vR@h_b_jgu2}RcfFA60tsdX>++6XoT%8nZ-vP?qcg(4^0DA;o@Dua7H~6`5OTjYy5q{Pc;4+ATIobXEop^jc)@yP2+C^eyH(-fFEnT9KM{1 zMEQga6XH(+zNB$N#th3>z_sm2#0eQd#Dl)R6u!M2i5Ii;FH0gy_op~DlIMCQ9f@R= z5M?jO)hqHlfS;qus7;ieVQORgchZowaH8xJL;eNuCp5YCvLvGH8WE0s4U}y_(zS`Q zS5h3%(AZPJU$A7N?3@$_I|m?F!r9Z1bZw&SBSYpI?Hx_V{sB>TRf>aM3*?u=?JJOU zZKCWkQ~Oom2P~N=JI;{DqZ3MzSQ}m<%KkH6dj$AnmQ0l0nBqWfurEeeEk)9`iLy5h zIoN}oQSL$F0EO>IB4M<1`FfL}HG|+&UhIH@5zZSIKpE7Vkbp9d4=R+QyAlbdj8=70 zt6_ku6Il&oG6~9pp%!4VptT18K2#_JO`VmZuEVG)7dt%LQB|IVh*Q@+8YfhGFCgF< zi7d2%(-d(U!3mQ%l}z|7OhdLKQ6McD1`~+WlruC=xDyG>&R8AreVB!{&OV38T}U{& z6VO~Kr@cdwBtv8b5}ZgtKS((pL5n40OqPtXSu!*_gnp0=krX5}NU+kB6Jft$fkg18 zDJQ~CgdqexAB!C01j!gLNQQ3Mf+QIt+r;Xz^s0C1? z15l#@P#aNsv0P6VyH37sGT%0tZ=1}wP3GGs^KFy)w#j_kWPYqB|Nk@G{x>eMdO?8P zDM3<8z<9yvF3rV28;*p5L%>1E;;R7nN^u>5o`6bo?F3Y6B8lwpB6=B4kV2qN<7bu< z?vznBpFo|(&nzYUOckGikk^w=>HBulDcyv@b(##Y`5b4QO4&{@41Jaq`P47E9y;$q zLY*Q)PNKMrMquVr?)#g$l*=76m*NbQ_*~j(%_@4wnpH%TIx&~hEIqntl|Gr#C}l_u zmH#qMX4G4s%&4|LnNjOFCo|IlIM-5BuCC!{YDzz2O$9?hj2aYn$rz& z8{U0f8{U0f8{U0fGgFe^Mr=U%%699E8tfPv{rE6=b;HL_ut1m#p!XcSk1iVzCTmq&l zoj7VZkzpWk)Nt_xlxrn5a-!Bt)N;SllslQ6k6{m8t8b=P0-dRprtbGB^Z|fJ6iPG7 zl_}EzW-IhF0Bu!&n87>lkjo8bZQvC^uT!P8Gf5i=&|jf6S>3U%*$!0oRSm5lsLaj< z7^_e^;tGXc2XL!G>61)xMokug>dYE;4OQH1N^$HF4 zHuITCFmN!yY=zDRSgKI`m&5EPF*6MbaY}HFxNOmbaKm8Hd=Zs;QyN<|75k$TdyzM4 zYoB7k1X3+Qx%Ax$Zvnik&<_E)cjP)JSm7sF;U`$(Cr}s)HgINM&pyBmav_u6{|7sKgUzV z&|*BqxKvk*;gA&|rNSt*CUB&}UBZWTIiY%N0H+f4GJ6{QA;R5=C2C4|5Tl3Xgp4oX zVZsIk8OsUpM*y*$kbwt0iEtpIkL85p5rr%#WJCf_Cd^A$<%EwZ94)ECbceAAPZjUL z;nFtRg4x%YWJomYJegYLto^>kZvzdfg;-Re9rwsMX`t#^P!pxpd|OXJsqD*0D5ZYS zAOYP5)%GD_mM3^h(3%$kURG!KJfKjX8uuxbHe|_YuE_=%q)<-3LlsKPwjn{nX#i^RR>L#u zIjWTQzKjHhR{;(vl#}z@3Z)lHk-#t+pi-ec5zkO4C&9@w3C4Akf1=X!GGld%orhl+ zgJmA(ZZ4)IM(JKLLgrz$dXjl~m7Rwl6BT40-lyi_c!B!AJ>}GNy{CBDi$39;a-r?1 zzex~EPu1I=x>o{AdMexY)M>V-)_2@fI#`m%B0@NTO`f;9IHXM8j46}n%?dtiq4)8L zW+9n-2*k53nWJnIlBrF68xm{drU211gp6khkta^ea6KRon;4c z$DFsX*h8lwX%c(jJS39nU0!Sxr~hh@h|@QBArYtb{gH^%vMor&se2m|@lL4Di1X>n z*;{8hCN?2qVx+2!4oxBYG7=~pBIPon)v%LqKtd^pNRpaf*+DCjP|6|lC=yUQ_hBTU zozRh^BwDHekQRM*?AYP!WXbwm^FK(7Uh3-O6JC|LChQ{$=@*{#A`0mtp8g^V88rG$6}=8&C8hDe;}Eg^2eT(S+x z5Q+0lCd8l{R_l<8n0$E*gO0%5;W84ZA<4rs zT&)71Ve$w@;_XOWDC*d}U1C)|TSNRVBu!>?^7k@E8u9)nkLtuHB58KU>n0?_PJD~W zV_i<1y-Idu8Nn|~M5A%&O8h00hjikfBWdZ3>G4QLI`N4n4{^j930gX%{2C;~PW(EP zhjilmk+gKi{VpWKPJFk?LppIrkCqc^=3(ga zelpNcphXEp1O0+x)pntXRXZahR&5M+B=#J%!&3v6t47;CDuB+}v16Yrp_Fa7 zThuXD?CeY5c5T#!?WNj&xwiZSqlI_3By)ncPcjd}s(nb38Lah}%noRL4w7Wv)cQ&0 zC1^*jBm*_%;1Z5VKre5}YR3Lb=yjgz7e242x5^8klin)79NOH21Xp~FaizD)8==WI z@nORQ(B)+$Fx&}EoAJM}_gUOFT}p6yQK*Bl3ZUxtKByp1w zr5r?`Dm0c2>TD5pZsSmAXF&jUWIq9=Vro}d6l3q8l-j6WVbO+tf>Nr$?f^;^*b_iI zrGoUY%Xpz0sKrpB8bBE(R0Ajjg#H1_*q|Cf85VR3P(}pR0LoyX8bE_8m=5nB83*bD zdti{;&XIjMoP1Z{DqpW1ho}?!1KN8gpQ~MH@;hOGj&k9DOFPrhr@<5*j>fPrfYJ{31yGv6z5q(?*%v^mIQs%9b!J}xrMm13 zpg~QIXCqcxRs|i6#-9*iTnW^85vXw>P~$tG#%(~2$AAV^*nxsakZ`Nl_zmbD7_ZiO zja&+;`?rmD$=Aqb4$pJowX45IE@60fL#bT|HpXgF-7*d~sn&qOCe?B<*rZw+cCyKH zphIAhs4joAeG5R}qR+RuqosO5=UceZQoUI7Ey_Arh}qYHT$c2p_Bq#Xt1)Y?M=7MIbngubFpw4i6rHKT*wd)2EgqoxC=>Ne-Nd6 z(j3jSo zfGFbX)-;;E241=zNsA&%M;cLlXznv4EsAIe{xhP8b3n*ycL^N097&5JN*^0h55kZ8 zkhCbGzd$mgh;tN)s9gAV7?Ku6l$89RfJP|C}`El4P3gd9LZ>F3a%t6G$f zMeFL?Bd{fHaoh#Sp_8?}fVoroKSh#PH)8&!zM(*su? z?7kjG7n3*on7q-+-Y zL=+lBA_|Q)5rxL2h(cpmM4>S*qA-?)|KEFxm}LnO{AP>5V^W+NFQ@fsu{Zo`zg z9mx=hbD9()7oM*o86t5`oI)(XTsa;|h|r!m=T9L9Ban7;1~p^w4B&eIOy&rh%JYe# zbMd41`-Dz|cwRAdE`xY(F?p)Z^NY!ILBw;6$(ylb@@CkWd^~+4hLuq|qR?m_QE1eU zC^R-i6dFS!3XL@pg~p_aLSt7%p)oF^FqVaHqR<2%@wZGK%W~rCoF_M07^m0xVwL!H zCJ%Pv>YOO-^h%QSr~0`z@l+(eoM!O0AxY!7ejwg%@`xqk?0&K%OV2%nWY~$nfTX1{ zpz|acRAa;oOdi#VGg!1VdiQdP6~#{cDkLq9L4HtzUXh7^Z1RvsoS~(qG3;w(7~sMN zWa70Z562Kc1BvX&!mDyHs)>Avqy~oC#JO4f(QLA0!f9$?DEevIGlu>u+@J=AqEFVg z8u}g>rUr(hhoHF{7%Fc9$ncxkF?mrI|NQ!Xf;^V}RP|0IpwyDDUjRx4cOn6$Zu}uW zP^vWz2`DwX83`zrNkam<1TI>M6l1HzxCmUvJ3x(NfEu3wHSPdvJOR`=0jRMbD4XPZ zGe(oNQ1^;#0Mkr0UCA!dHrlFtMd&nGO;?Iet97pkou;elO3`V*?iHca3A$G#@9P!G z`+7z4!Cs-hsj4fe>ca}9mVA5@wo<{}s#mDnLDef%t3mY&HR7Y-;H5GHRj;r|w#9Z4 zo1=?Rfz8o7K+O~AK-nC90+h|s9YEO}Jpt4_c@C7#(SD$8E>5p(&?HRS*Zlo!oB-5e zVzV=J{=6by{SKP$fV3A9Z$=6`Ct};jQxTcP(Zl^t(Cuv{H~# zLT*W~a7M3QB;tpsV^L1DH2wH=ZYrfFJJtP)z}Pd%t?s88QJyveA_w)x9)nK+%F}zB zrg|NpUJ4O|4#P7;QH7|Okp;=p7^)pM)`4CsSKZGvo_UH(>^@|@HwyC0@5L6eCd5h;z$541&8;>dmx&VxIYlSw;j zfD7N3^fI0u9O>C+xHN~pbsRjSW^DH zj@KHCkaE^qkYegoBs;88Nzp{66iI%n$CXUURlQ^&PXm`v?sT65!Zu?peuYP)D5=`| z6Adfh%{&Uy{VLCjas!<(TlwnvbXx8>b9#xdu$#^5qPsLV&+qMmUJPM8@ZmYs^!t2Y znNg%x`&Bxzt{3{J-p8es#qGezF2cyhNy+OVsk_kY6UjCXmmXg<4Ba*vV+}73;ysiT zeFkBCFZPX7u$*Lrh;s*Lu_ZE{VJI|lnloc|sc+7Mm}MRfLY7meFe1~ODQc{6QQ2`? zh9Ebz*EkSXQn6mWCIdZr5>VV$Gfp%ExOJS=U9HPumKw%u#;Q>C3fiEav-WUlqCFe< zI>W&V80ENaa5#!jF_OIE4Z~5q(a(*ig>+UAO~={n_ZcUMExsNyN^R9soQ%G0{wWR? zp4!hhF`rGPV(R~+Ze0THw2_QTO(XN`5I_si|I0^Zxo|&e?dn0`X-? zJCP;sIA3**HO!rZaxZjvvO3rG2R@8%!QBlke{dwBHB99E7jcvy!P74eVRNxs!9YNA zA9s^gO=J)RC`l2b>+W;0dO`kYE{@bD{FvC~{T+Zud?h$_et#uPQQq?ctZZPd{CDKP z>nAHh1X-B4RHbIUlmb0}1sgGyw?g()t{Y<4>+CbkBA{W+37|fUY>v%7hip%qeI8jn z(2HXfMZJKmtSK{kpe~P|Pgv@&LFMwQhi&X-6#3eIg;^{8Rb)dpdjMJ0m}vG!WcJO- z?C+Vi4gDc9`*vjZk6zt8n(-J|}`skO;=Gy$D%=fhUUor2i|5zaZIPSK6?z%>vGB zY$wb1(*&HgTfmOn1)N>Fj0CKyc+G0aq;+aP>}t{#Sno3x@&yuh~WS^uP9g z$z8V&<8VO#>k9;Yd%w{3lu7P8Z%OXP&jsx5vznaW9VXzWaRP3hDd3iq1l+n_z-?a@ z@PjJ^+)g(D+D}HFW@I96J%9g@HK*I z*9w^an1C4{2&g{nLegdy37AzcVD_m3=3Fme?!yA+jkt)MH8TXvZ~Z!RwHFGgdq4{7 zZ<5@C{Q??>UQCvSuS;&xD#@LAhk(Vu7I4yE0kV&*aDRF=VWs;UfwSEqJDH#377MI# z*`?V>*1HR~5H`4%2yAqFY-Rog_veyd>>e-qCGJ*%OWn%^HoJcmxYEtpM*daqLV;`C zuM2E??RP5a8{JC;ZgCd~-0FTHdTn!mF8R~l^wY?<-JL6Nhr3$fSKWsNp6h-r z@B+8*>Eye}oqZPJCGI%_zwSOL@Eh*oJ6L|X`w!u}(w!sutKD-2UhB4q{oisQlKi*b zhb6zq9sX6;yV1Q&;CJ1R1%A&Rb2iIwac{vxb=gPW=B|_c58ThrVg3$x@419ObUzY# zcf0jc{v)^eOqSp0-YoeayEVf16Zcht54xWS{HZ(pJo5b?_fp~infq6PKX<<;?flZc zRp`HR|0Max-M;6O|4H{7+XEMFL$o^@pJd*(x3l! zFOs|)%9j2Jh4u+d3iXllM#A15n3hiu+SaCml^6S z{n97&sL1ITdPeAnhmu9Vtk78Lrvah6gfBaExY&0@Xs47947~_A;Hb9o*AT4D5zwA4 zVEs=7obnq18;-x0EE^XK*mS;t%|~C)!Y$R;5o}Esu}JMR+kRp&coIcJf8b59d+-s1w!|5(5ULvA3;*QN`& zaI1ieE)#I^Z2~U&nSe`wC*bS<60rO4V%TN<#gxluN$#5~1zd5SfGhV1xb`X0c*eOW;JM*`Mm z?q!AbqXe8XO~8g_0ydr@VAGWXHs3`sb#g#qR`EhQCYNl%oVp9Veh_zJO^x zZX#{^8p+LgUO@G^0%m?&z^oq&nEjrBIYXqv+^-3kw@yIKBmwgm2&mmJpzdaZp__7d z5p0$q8oFhHVpEV8F&?0uDw~nb&~{q>sJDc`Fv^UmLCYX^=hHrwq5-4{Ts!iA3QAJ_TLJ)<8uLb zj`=1<|8SvzyUq}B_niXnEfkjf8pTWZmkM}rl@vZSNOBK51j8n7pq|4f{rhHu(sLzO zCjB?8;%3QJJ|tkuYXYYJmw;(UNrmZ+0%n{kp!zBSvtA=O=D0I&A;=#upztDsV@H1u zkg=+-Bgb*itF58*k=KR#K0E?tN3eY0t=K~UONiHbrN;`RGxDa8CA~+|KoT;?fU|Gd zIWn2K^pUCILHi+lWLnrc%1urO6t=&yEIq7tvGV#M(_3fGVkRSu%0|Q+A*pgctNcEs zsz~OoP?AuFvC1DpsZQ1~qui|_Q~U3sK~qToC`1KZK&kWQN|gOWOWR0>PeOWAt&PTh ziU(V=u3SSSkh{?n7gqY8N*?a2p{90ERv13u_R?WJq)s;Tsn3GZbp}hxku1?gIWL0X zWZf{56v*1kXMX{Q+FCgW$fAnB5-3*H73~-w?Oj{txInSLN`;Sh35?94KXp@6V$pJL zw}PvD46K(UZc@6;^3kZi2v+}m66VI_@-dw3V`!Y{sn!}O_G{H4A%obt}6nvazzkjT^*=zDc=g8AKCt6 zM)HF`$$P>-h;08E!}XAl>&AdA+saLW`j&EQT+MzEmvU!ZX?Mq^+#6;nGX#_etp@kU zrTjQ9<$(ZYh@+2@58E(R!$SJo(tjGDJC^i+;*<8rC;i-#e6oHSv-DTKQtN=n!?Nod z!!=KaZ^`yKP0b=%^BCYbM&9D<`=`P$XjYjKHEX?Lz1he5Of0FnB9c;{jU~yFpAU?u zz*v4gKn{$?-v!8l(fCGy92n|<2#^D9e-MMLf-8=f7|X3N*|IGIU|apHWY^?*~u~>bhst?)Hx<8qWgW65lIm-c7H^Kn6Vt9O zvAAOyw>2K4&%$l7cw(7(YEr~GE{Er`oWRICJr++aVY^~61{`;JJk5OCUlBu&k9<`O zvMBE3xi(%iYGr5p`MVu5#_Xxv<5r2)U3YZI?Nj;AxQwxUeOG{6I!^utqVVCkjIp%c z*CDr0+x>AFV`=+jT<$=4Je$Po-dZ4Mk(qvjv*hzhyl%3L(klP?&a^Mu`7nobs!#pj zCDD4Xx{vZkT*^C1zs3SFR-HcwwDu-1pWKfEJf8Q1mi;3hqfgi;0UnOnpqzgNcw#A) zoE+)yxJvbi$LLckHNX=~sa^q|SV|op;EAi$fOw2PrH%;j#8PTdfG3tx!vj2Vl^PL` z(WlhN08cEX#sqj`DK##@6IZDT@fdwdO$zYDQfhL5Czet(0z7e*ni-GLr_}5KPb{V8 zCG!~tZ(Igv_!R-NH&X-|TRLQnc`8^Js6tzP+OH3gZPNk9Q#xb}j_ga4Bd-dEpiwzS zem$9PP#Yh)y3iT9JHS8GqwGmuBGaI*VhJ}UbCblo?)ZvV<0oiAaVxECm7nRZ(pPb| z%9C-cJQJ_V^MNW>*lz+9+y2Y(guQO7aJ$N}Ro+NuficKOcq`c*?lV8@njLS4O1js z$e+MX<4|fQ$GBsQPxKe-$1T)mt~;t%iWkSD#-wn!*L8EILO_meOJ}{NhsdbR6mM&F zRPU6m+efKZM`ig0rSgTa=c zoRa4&&!tozqh8Z(hpqO~xayZ&VItof@%W^JEMKo4s{ODCP+C}OhDT+!Ahll)rDN>6 z13ap&>-B3^f8$uZB2+(>H)=!=*$W;up$E?cInupWm*ab|lSmmxO3t5yfK4lvng%Q?^LyI~1UhO?57zRU_SL*NP}A{-Ko*}F;W27d56>~b2p!F$tT3LQ;W6s5kiN;` zj(R+7gXWd+KgHIZYMNwy^JEz3189!1tb@dP%eWxq8b@*iN=(}LF>*+Q6UUxV6(Q}RThm&QR8GW~#X>hM?&>uF^e-&4{ z9V(Fip_0D56VmasA9aIi)NfMzK8SlxPTw=e;(xA~jenz@o=2d7z4nmEvy|kXlQm_3 zfRfhp_i^eR)-x414k%64vC-4Nr`JZ#6OiX*-oXn%BHrw$??sKeB$ap695Rf$Gt~)W zY5;awD#V^gRdQC*237h^Te^XzUN?-oEmc{j>Nr^!u~i(SzMg8Cevqn+Oua^I%-Us` zcBOg>jx>+eI$p0qiulzXb$+VBE=V=g?>(ub#U`!z15|OZ$X7Z)=oR=adDxZ)EO|Cn z`CALgy2U7Yug{X_Q*{R z&fB(B?zgcCEe?-!Yxy}comp`QLwQQvQPO%wZ)AClc{0OHd}AK7?Ei>lw}emQ5&kQZ zkSo&Jfa9JS*|ek2=wqI?OyK~NrKH5A^o&dC?b0Xog|gO4%Zy9u7nhRdnyZtbw1MtP z`M!2?q$e`W$z#kDw%wy*aa!`xkz_mdj2RV|lJBw)t&!d|GNu@XCJaO+ODc;`n(8Al z_Iygzxbq5pP37>MA;xNp`Ctf-G0)}-Bzl6&+oM!Oyyj!KJj+~jp{sc0hN>m636N=v zk`rJ&r9;M;O>YZSkwIXa-X0*^rUQ)UbjYauW5r$+a3t*r@>~|+;e-<8xhB9vrDB?S zLp(-b@7@;RiKW!t0iIY&JrLlDtJMB@j6S6v5AeiN>iGaqETw)E;EAi$@8U7~lzJz? z6HBQN13a;mIvC)ItJG)l7=215hav}OETwt}cw#BlKfn`LsX_4=eM%i2;EAQwm;g^K zrHTSPag{2K$7t8l-le1?&uy4>Z8<_ON8 zgY=q=w-(^&Rf!X7CJNjf2mfx7O{FP!byP|r+5yyLSzm6E0L8Se@ut18;j#gR@}>vmboXf z9*@wm*W8Kx1eIg{fgj=*>T=mCAsnGlLLw}kV5(4vgLr!qRc6M4gdQB!A)Z)R1hx1BiYXTLirT`*#lHGG%j3r6=1Jf z_@`7)0pe4A7G2^_c5BEGnnlHrS12bijq<5XRr@pay|4CsWq1iZDwXDo;g@+?8b0YH z@hzm+O+>6t;v3k6xuF5ZPZ}TA*;U`BKN?N8F?@&Pl+P2zQFmdFGJbS=De`5<09iw% z7mzJL$_L?JF60y(n^yKAS|3B|uYrsw@?#)VfPir)Ksk`mq8??BqxNOUS6ok~JCM7D zOyxhq|3>nx9$9ud)cFPSl|KjaERnTIc%c@N9|QR#kn)FM#y0R5RHs!u0lbXw|M(4& z=|J8DQhpx(?E*{M4apU|NErgkwL}g;?oB`{FGN585J>4#{F@41tX!S6_meADla0@( zZU*9%_Jj|!U{E$v+6PBe^h2KI?}Pdlkav&@rlwc?7rCACze7XzUTDp*vd!3`>OGsK zG;tqG+lG~0i&8Q1yU;*PoYPaAcr_53D8fGk|3M^AxEL`~SH-^6rHf#7}AU#2{HQXsb0w&QLp|!)xo`5lhV&X*@+IcKp zom_Dh@QNGpuWTwByPdfoGq)PKM~LhK@-&djRlV`)10YlWz}%ipyxj>%Ip>KP5LP&> zN5ypDWtF`hrw&L(6aH0xjOuHEOnqrKUKBw6z8OlZco&&6zNFw|AeGO6Cq(9ZQIbLA zPe29&nVN$xynwaN2@R<@mi<|^2ieL?!Eg*1aFh?P#mjxD!SEgxkct}S ziji9kWa{y#{t{*V*zHqMjZE2zAk|Z-Q?&~*UU@e1pFwKXQs({%6I15`dAScB>jhH9 zuNqbU62&>peL_WMfHn#_M8fHil!0Izh*UV{@UpW&x`fiJ_)VG0>yVuwoZwxG^4G!l zJ`%fO9r>h`A86u_^1afkn=uZig}<>6HNw1si zsgh0VtEs0ms{$Mfg|-YX`yCpS0MA5=65#g(kujWv+0Yxq2f*)*;n%?;p}ZT27s`BE z+8e`sr?-SMw~Qo|e~RGt#_$#>#JSfC<@sQ zZOtkBqZzF)qb)IJXPP$VDInfx{Tw3r$^=i0jMh9z@l51f&c(#VKs*y?fW^?}s2eE_Wm6jmvE`%o~?{DTj>9X+UILCL!cG94l*q zaDYzdxTKopw84(eT@X|`5=?q*mR^MMy%U{#4pQi>o@F_R#qXlbDg7b-v-Dz8cJwTp z2+HH6sA0g^;)}9FXNP@*gC%$QOC_3LqM4^0RyGnLE75!+5D9=VLPDZ>9uO~@KLNkj z)yIM&UHuv=d0m}}f#G%aeV|BJ^Ycv7)d$g;UNrB4&ij$PuD%XzwySp`3U)IRY*$M( zr=X0l8S}!>DL)?ekKl~3p=TN1+T<*vKg7gxmTv4>HW{U2;$gkCiT42!6T|7g7|(>@ z{(j*S<4YmMGyFAF6vMv(#4~)G-|#h{h~XoFh~ej=Z#~0rLIaN?d4|`3%^Kc_*f@dl zVGVamTVT?16s|xDZR%OJ4hEe?GiCDIfYP0$toKieEV;s8iZc#sIHQr=lhUj3q9A5@ zgf9LYBGYxpGo$Flc!aJL(oFL67>N|Rk}Feh5gQ)Dy<3;5(D@f=Lws0C1DatAP8)W_f`LcU~ z+z+JUXZTl{kK9v0ru-KF%9k#|D8Oh6-L>rf&mk9M4I z6L}fPZA2F2JI;MXc&+s_Ak*C@taM$BAf%+VZm+V_3-FsE6qfxPyu*PwQ;!4V{b&yK z9%cU?i^xGiMLqsGQ=h^ArHJ69HSUnIIb-m$codZV1IR~0r+mJ^C8^!bD7!6B%YNZF zzih6SKu;_C1GKWTo$|YJNi@DU?HpY8^3m`B@?{qQc^OFMox|~Rd?JHJIL_aIz%xw< z&38~EWn8bRS-@9eZZ8U_rO*8-BK#d@KJAIt)S)lt(srp|Be5^ic876wgW-%NVA^>Q zgm6dHq+N&$#^iy_3fE}Y8B{j|N@=J7~-)RQF?Ws6nfIXci|@k#wPEsNFM zZzBn|CA^U+!k3ovUL++)oR%y4QN<+p=o!+M(oo!_X9rMu)6&QlzuJn2dAsAvCzg`! z-Bj^87lRn`23v7-mBfc~nlm78z)5`_XFmCO=Gy=*vC>bh3=m~rGBuCm zHi0AawpYDiFt3$0N5SA}$Vf8+f+HmRvBTdjF9fPt&H)vGR9UJ zYpaY6RH@|3-Lz84CMVMVf@%MRVhWwX9#rUb4qcy)rPoO9%)J0SlqIDUU-QjIT>WTHr1%P{OTV zMB-oJQMyM9kK%@oSYJ4pdMh-C-KNl7TRMc@q)LadL#4|Lhte#C9&ORD5Uo?i$IuBH zA7LwwA*zdy^|6fPE|N!)p~L(v{#%-YV3hL?bA`q3gav(x5vL^+PB+;S>OJ8KlN~pc z3zmmWcDztuGT8}7-i{^1sQy~iL@Gb&E|Z-k*}t1?nYHqGuA)k>LBl-5Wm1iaBg%f- z4~sFBsZ0J{IJFg)_9)wnQn~EUgdlsR^bv}^%YMG8msd$;Uqh)}`o9cBT`84v2V*#- z!Vsr$a*wihkYp$0N(i)9OlKg+E2in($uRu9YAUNk1=-P91{S$;>Vp#5$e4x_xrBNN z2rr@J%89kP{N$BW*?92E&c+-TQHjcr;6Hr@HHQTgQ{c7?{BD&;p-h)m2U1b?xG9^? zv(qI0=2BQ@u-hm7JV$3MNv%2nCrom4b=efMRPAF~ktv%>K9*AU`KIH}&od_0L9DRTiSsbm&R*R!4pCeMIq+wAuC5!)ta(N~z$?Oye`9@mVPma(l$?So8 zCAk@htR$ZUA}h(`j?^nj=P13BTt8T?BxRMj1EOS=coN8VB`2%IeWY=fcrj$iD)CQ1 ze5*uUQ_3pw#zA_OI1PwhftD+JTG^9m(aM$;tb-XPiHR%N!Jx|u_5mm%^E3>|cne_?1RynFR&ynwxycCX8kYH;?j!te8y-zPQfnIe1%J5B{ z83{?(y6F{i$#p->kxQ->>Y=DcE5}LFL|hj8Py{&&0o7RA^7AZ`rD;*k5Al0QlqpOW~lh z_fa|+1(lnyNidQ~!!&$)nn=oY{3CKHkhw&PW?+AV$caE!5-C{dI2(XWJplLT^?}fD zxC6_s2KiGIl;u=oXO}8{4@f4F+h<~Y6WN8c@NgpKIJx8lai-qaf?-Y>yK%XBK?AmX zP*C>L0&MpXxdSDC1X6w;{yj>*E7Hnt1$7Vd6}RD^mXX;Pw96pl2DnRP{0)&LGL8Ye zC!>*kkikoMpA3rGu^dGphgXEAm5o4$-+_WMZi4>=NabB8I?gYFOqGjVoX(PRLcPm= z1ZT)Z{wPj+GLavJu^nDtGFo=;mio1)|56Ph%F0;kTT znIX4q+DVSHmE`Av>;wXa$uM*W7*M}w+2CfpO&A50TM#3s0-2hQf6uT!`+N^{%xCEj z(MP$5qm+F<6s7m0V9F!>_YD43E=O;@N+fkDF13m50&1)2E zSo-=c1ike2Vj$Aj*FmRD)UMnMg@+TVhYHf^B`f`Xy^k``*A>!751p+0Xf4|D`Y1CC zJXfSu`1(iUWGTzh$Et1}*1gidVYtDoduMcAm?C}a41fchL%C&tz{DhddlKej>Dv!W zeSJFveA2hS23h)c&LrKpKL^6oa^(RaJT+IYLQU`VJcZpog`JNk{|*Q2QcVskJGl%` zCcqJ8mrlln2c&W`M(#u)5>5w9lYNfYO^z?uP5uN3#a4c`QpJ@l1k{p176;TvTbP$E zAu_V;FY~p9D}acF*CL+1=)E6&V&OeCy1CInBzm_X+$DN1$F7EoUd*P`p(tl5e#RiY z3Ng3>bNLq9(-X)}+H(NNr9h^0co<%3q#6`)){E0pz$7L)YDPz34v4zsAZOSj32 z>LKf-r2Y1lx=HfNT>DDhBza|S7=unVo+Pi#9W;>n2cbg}o)GXJIZ1lNz8p5`S$7_S z9UBK(gH4ma^pSsU$QUTnDjYJ6*TXnp&70 zQOCkZC-s z)2IzQ?YyW?+oe10n{hhLxBHM(?W%RL*IxzFt}0geOku&v82Z%s@OeIbmTbT&p4l$n zqN?yYK76j=c1fPJM6aX?cwk~h6H@9!?N&)ri@tIQD65KoBdA8ajpGWrS zT9)YXD}N{kUybARG!UbPR}@xt^MuuB-kCAYlTu}#pcBQO?R|fwFQ$@qc>5_yXIu0v zGI*}o;d8~=v0ahkndT|#`V5P5h2@XqitB=|z_(O&D0(gQRCT`<`o~feO5av)>GWh~ zU+S(Vv#f!1(Bx(4^bXEIXTdud-ti_gO}3NAZ{4V(*Gy3^8{~n>jCOD`WBU=4nIW7M zNqEnz@g50TWaAN-%yez5&u6AyuCTL4Se(elqb4(I!^!L%TJ2M-cj!{(ht$i25~G8B zA#h~qh2@kJ%@y`KRLAxp=|t7JM+sg_J(C8Dh|Zs>Qu?!+oc3gSafEd4kyvYY)VWtF zqvCb0CLd1GJg~foDtgTnRg;gPzG#>kHyTn@ zzbghm{zayv7?VYZ(~;#@Ek@1Eotcib=HC+2RK)7(2v-s6NUDwLC@EEr64d9}%VSoM zQdPl+ep6=1e6O)1^_Y&)chN(Raiolo9C9+J_+_e`&eM>~z* z!Rj-^+yqJK!PWw7B6KzMnf~NQHqIWoQ5(U$&=J2XKEwY-^CY^l@ZX) zm2ok#V%}(K+#QNrAJzC1X|4B zm=@D3+36F*XCtHPJhc}P;%uGl^wKatd7|h~bKC{!Wnq2`MbTf->Uj0l)mwJ@@nL=` zMKS$-+}cPXib;(lc%?kd@2DVv;JJRT?#w8O72#$pB8=!P>GpDF(evU z)59MiXJpL?r?(rM%8abBC~}HP$WE^g4+K=QCQ}xPM%K*mB;=Gwrn>U$7gv6qq<*2) zmYqH;%N8oLOb|Oe%n#0}nzjC#pv?*MD>RDMXlSgbq-Lkj4fFdnS+C$9kMu2W z@d4m#8IIC`L}WWe)rOx2K{daX&9jctp)UMS!5fM>QP%$Ei5yXHZ!3-iIA}ZYX?XK?WUW~_c^!&f? z-uvABQ2Xs)uT@p6s;jHJH+yzzu9Ud>tvv?XH zlRHx+QhIAHw&U4$`}G;yC7LVnc(xz>&eEgNO81R_2<9D;qS&Xhir_sjs|4P?-U>X? zS(j?A;^TEz8T^Ef*Oj7#L`omcRepjGL{f&t%&9;@F_-C15&Og#XDAd$yZZ*G%Qcq+ z^1?nhX3kCuY<)Es4)SarVw{PPnKt(g4*fJ25%L`RiP{HfE;r=ah80%xK+UCxDkR)v zfWea=^UsCBIt4o`H1aJ|151vsNlQoHGCi;i(XFu4t8QkD`4Ou-4&7^OB4wz)BygA) zV=-{xX`Sv~%M&TN`s%=8VT`5uCAePhRVa}%Oy3=NEsoLR7h|S~EA+;|;RW+eC3pPz zC(UrpwU)d{xB3p%@(_qSg}HxHn0p#Ht1jOB+l!PD+6H>rzVNfTzXU)x9E_2gt2TKK zzr?&hJWLnmCQ?ReF6!iY71hRTDR!kl$TzQc7MuGBIO}n|^ZTarcbTyMjIG?w+ywP_QS%-E)<;QLHxySJOP7So%0!A=q18 zdsnzb%6MHDdlM-W+}Ovu(cIu0C+ch%@ehkMpUWAd^c1@<&~0w%YL>a+xgVw^N>8<~ z3~V)pZJIqVur&zVyiZ~hrKj5u2M%?^4k}T4hW%z>!@@$|7%`R3w7(2&O@(ci9Yce> zU^@ugY`aQeyHwcb*ewFvT4B4vzBsV06Slc_USQi0w)u^mXU`8D21FeAB@30seovI1 zZ$BP*4U2er=S=Av?QMa>RbdBYUSJ;yY@>wjCcDg4et%31+tS-&zsh2lCQ9FIX9iwV zB3`D;7uwwehcm+t$b5@^RbcBXY`5As1-2Q&cANcJU|S??x7(Wn+ryT*VWObEMfSeH zcD~4Whi#4Xo7+>^?zAfhwtcZ^nRnUE1KT&kw%F!6Vcw8R(dOpNeKtyzUSe~tDbMz; z$ajy;b;UeeaglGS&9$jK+xOvo>86qQ+FXRpb0`_koNj8q&;BxS_%2)mdgy+eE17wj zON2AS_JGaRusqu@BHx2HS3L7{&vCXrU6Zux!T=mPd9ToW= zx4FWbXDcuAt+KgFm}mPnoXt_)i&1`^Bj&uN^ob0MCm7OE-2?Y zRE(5h9M;%enap$eIZ}d|J)W|;6rJagh?HO)*4kXt%yT#tE&(IvX`AcTdA3U7%&JkQrN3ZvK|as6U)Wx>xk#U9s}e34 z`ChVT1h&e;w$Z*XupJgBKd;Pmk?$4zW%KM31vHWv-_Y*j^> zuiIRJ&a-6*+Z#3)sq<{_i-~lzofFtT6t*pPeqj4V*xs_21h&tGZL7U5uzoRtQ%x(6(z?R|L%(&ccb4^7r*c!gg49O2|uFvP$W`rw6Lw49-1hyN5?IZh- zz;>gseQc-V13<6Lg<^<&VspJl&vtu^LEv`W#PX@lwf{WZUEwnQ4%lgr2ppD%3-%Ao zXEs-N^h$UzT)JPy=l0`)!y}O@Obom1cLImUBUKoOFKjLx=~c0&uqt-jWhVO$&qk^+ zhiZ@AIB-}Wc0iZ!wYvwlm%=vl1Xp^WJvwlBH4>lq3|RV0n+sNY@okF4XB@t=R|gJn zMXE5<^VjzKfy29zDvZN7_Tj)`Tcir(@U6{77IEL?{lB4Ax)N{gzq6ZSuNPS@9la&` z-sUo+p6zroJM6c)WTj`TE%F_(xh$z?t0VILU~`E}&sJCDJ7{wmQ_ogUt*(IJ~_WO@$uMZrJW<*)N?4Z@jma1YxJ16xCp?`OMHU~44u9kFu*TVs*$7kheO zYa;R;weJmVSt8%B_WHoqROCBme-zlx5cz(ye-3QTM84l`uI1_VOY?9(|MdLB<|412 zLyK@`zh{rzTs72lI5S)VdhdkI6=6MF%W!7cl*83UJ=2OtEuY^wF z(*15J<#3r-&!Oi@RrvLkcGOhgtJg{O_?4A$Y6f1HoK%@#V>yQl%6c_kc2bS#tqM+F z;Bfg#mBFE+!=;7268fH04;&KCn!ur7VO69$+X9FFg;i0>;i|=66$1*Z;uMF=;Cc=N z!&RXAG^bf$8x$@bw#p8dHTLoi4i^kt6^BdYdbS+R*<nb4^Ki<_5MQzRg_zGaN3B z?B&b#ZRToL&3PrT4cF%5NKpYl$q(w3TzX7n<=xt^FUy`+P9f98#*rr zw#oi6@;)3c-Pqys(O!L1{9|NnO`M~F?Rx(h8Cz4Q+zdb8T)#{cXEUckV4LTcY2s|| zaCvI4zWIKcCe9WPmpt}tH-^h}4}Q9NEIZSg7I-ZPm+qc^zE?|!%UpY9-5jpRJ^g&I zvmGv??0MZ9t`VcKm2)Jp-4?C~wsRdWn(gJgJzP3$tsO4J?AaEHGS73e1KS;<%r*`e z-1hR_Dat(G;UdnS?JiN~1a{4zKVW+auj{t)I zMlN4BQGS!f-+3R(qg1|y`5&}ruqS;z-`wAT&*ko1{!dM!{F~NYfqQG??*7-9`yV;3 zd!qbi>&?KalliYC_p^3>(vL#6SU&{z?$YknnJE93RdS9W*k#fQg>1E&1olDF?icd5 z)je>!inrC6>x2Jt@}1tXCI(LCo2%acTzIol`FE`)fqj}OgeK3)wD~=2L*O(|Iw9Qm ztv!L={caQ@IjN8jEPaFDX7`T_!%iqRRht_+FUlA5|Bup**3`7qIuA}>DGA>p=pa<{nKd+UNcA0p64Ln< z0C?@TW(Qv9`v0ftj`DE#?XeyYyxRI@nda=Zwgt8>;pU+9eb$eG?PA|n5Q7;{Us}cI z`Ar%2r(R!Kjp22=+ilbM-@FCqq8n;B-mk6Rf$#Lc@cqV`9{A4q3*T?8Cj#G@f8qO` zwKMRY^%uV1TSe#lZJYfUzWc4Lz?VN4^RN2hfYm?nz2Pr>f3W5SzH|S=_n`G`;5+Xx ze1Ej|1-|_CnST}UA*=L_em~s!7rsAPXTdi(_bU!8{M;{a=*)qK`rYy84&DM=kFd=> z!wPJD!Zwj_SlH&~3$8ec8i~X>>lk7TzTT8LGm#i?6<>f|b@0YlVwU-?P+~@7GXIM? zG1L35khg8CL}G%K0e{c4Zt5kjCnHI{)bn(=FS85wUtXkOyKhRtcE3^u+x^QGY!65j zY!6H;*dCNI{yo&3I=IFJ%PEpNc>FF>j+#iyDexN-ierea#wXnbw_MLH*LCC5N9r)o z&D(}sCf$a6Zo^$S_Gjt{&&}J0TMxR8^4vzbZamhhqdhlo+h%7bCR#lZpnHi=+|0hm z@pk`%oZH_2e=kL0D)&LWXFYu>m0;lE1 z>00b@8#q$s=3_f+Cf;hYYE*ljH7LmNsLbG(dcAdP;IvXYF}8ebUEuJ9bnr`=YJCzo ztu;=5ff&Gj zuSMgVXC-b?3jarrI9~TmiNt)XF?MXkdENm?(ZzZnCBZ z_P30k5hLr(*8PELYt(d$wIMLQZ5sGJ_Nc5M@!pFQR3dS!^-yB;4)4khqkC9t&BC*Ko8903yE^Y~Sr-wqg zpCNF%P9*NIt_kvd94`1hk>^9^;WuUyi94-TL7tt3*HchgB5{|sH*o)=@G8RYcUxs| z^PBn;KMBBaWxeT_V7JQR08S+CwOR*Ghxw5}#3_-u&l(cgf9A&m!hXLsGq4{qp9}?+ z_+$0~>!HBusQJd`Nlp)1TLP!w%;!No;nPdpjyHE)Z)1zwd;D#ovDt@T6TmF|}nZu$nR z{2hMNs}|<)g4Hx|sD5%6bF3kn7p-$rRJIsC2Hf1ueAQ=5}o$APN#ua zZPze7k+w=V!!CEuOWS2;T<_^G?Fro>Fnt{|xzE`uk+xdrz&_S3>8FL*w5%)^mPmV2 z&j@lJ3*EiKv_>z5$vySbiu%WrnPGcMKNr}7v1x2;^@oA2vgOt0ebdqV5G3ts{Zru3 z{v?O=Mt7l#T;@xpJ)_Hk+^4*>i}?gVqx;|w?i09< ziMTQ*+)$)Fr)LHpa|-o%UOyao-0XY!+1KmMfid_yW#70#e;pX_^>YRf=dAq&?cD7* z<2`#ds&YTa-HVqa(j~H zdKnUFujplgS1sQw?C`4I5;&Y5aR__8ruPS4Z~b{o-q2+i`&}~1FRZYZB+@qN7J=(E zzAHb`aEBfHcdH&8cwBpuhu^@r^~}KQLf@%zeKk)!aeey zJ`s3r^9u{QpYgx1PhH}7#?eAOKG1Cg4;8M7*|+K3z?dwJ+x3jVSUPMBdhbJhf8bH2 zP>&t@)xe{U?-8`X@86H~SAkbu-z(e^AM4`x_|2>raR_^TqB8@p1`#iJWGB)-)!hS! zW`#NI)K>)#XZsE(h5MPlE$|xpr(U1y=L4^HzE^N^`%T}acL!em|J3UXU1X`>{@K2l znO1k}%)quVW~OSl9!~h)teHsLqq76Ad;Jnz2UE;mJvwlB)OT=um+i+`*{5#`99H`d zCi9niHEg(1#-(b#u_e;J(p!TZoBYTaAWHjM?+t9*{L;ele52L9ev>~7J0SD7x@uti z+P9fY-go+}z;@8Lg$w>(_YNGA-ODU4AMWS-?o8;unI`YolLFUDC%YQ21NyQV;32fq!5Bze3GH{7H|8&AXj!)8 zboczG&&3}1KB$WMLjd!HQbk!81*V1UI@Id*Ab#U`WMH~0YKmF21Ji?1leQiROe>-$ z+j=1|t&W-;>*K)We{ew$m8cT8ehy3K~ZCikga9*94}6QB#U_dtf>oH5Ip3!xVgenNhi7M)q6W!_VCK%BWs3qr>NsJvAz3 zbo|jTFvIlNG)nj$F4+bvik{fBDI*S?h{h#6nbOsNlmeqW6PasQfHcv zUYISNZ^&HSS|8ZwavwVFAWd2Br^u-#tet`VZeuUCoOVJYwWRe&U|(jg==>xarczdA zIC@n-6f&7-pVZP;v%tRE*spMl9*y^2Uisy%UV+oI3=HwPPKneC*0q7@g{Y~bwJ0#X zXiS^2C;c6~sazJ2%iW38g!N?LxtXi0p?vp_gxlUDpZoE8LC-f%q^4OrVNIk~w&>;d z_^BDEJ{DI4ho7rxLb@qC!>kT+==p%tfSTj@2x%_cwNm_tfWIX=)C!dcmnC z3$YS4hg#Qy+zM+RUW83l$UTXgxz-KP)7{Fj-nErZEA|hw9>j*9{|ak8$i4Zg+1>gG z+bDp$5;ccgo1v$>1@vG6v||4V>q~3|AOF{?Rk7BM$FV1?{3AF>8*1TgW*Ojpwefa3 z_i<|={|b8`|4Kc)68*piD1Ttvx_G;Yp2V!nxW$Fwvxabsi?$CMQ`Y}=hGJ?Ei}!x2 zL8~mTwLb81>=}3~y}6Zj54UK@;u`D&-TE0x)-yD4UsfqvUng>Fpo>FU$|u~n4b=_Y z$1U!=ns2?hdT$Bd74cQ?-7Nc2?7Xx-is8DX1IrTKExu(D2XcwZfpux%Ru;Fi+$|P8 zkfmm2)5_Kjy;aTyew`xepvB*<#>OQ`KU&^zC!VnaaKy?`S;tXhiK0Nh zlKOf7XJ;q%XzVicTsm6hSP z)otDytA-1Auz+W+S}yPxJd$3t>K4GuRy`LUq}yv&0~dA^He1bH_?7Uk)lyaXCdag_ zl2zesgzvWUGV5B08+KB**Gm5Ub5dv1$`fp57X$ojoTRP>Y!=(i0RMb232T+P6>^?P zy2yarFsxwaTKE(ANj(f?5H2=wDxs%=+Js&PS`m61=t;Q5fID*fSQwl9wZE*QuvI9J zH@=dJTIRs=*G00}Z(02Pk*xY~DAB_AI$@m7XWnl9Ufa*h-!iE%)Zg90jE5pgXLvou z{|HEGW}@K_v?MjRY*pdhAtr{=R`BDVNn@=FPxuAZ4+=WnD`-0`Np-@_%49)f{DNv) zSzp1W!cTq)^Zf{qV^1%h1X)EMheJ8M@s)H*%v%O0C8=}F?Rs~(c8i5h%^orD)O1I6 z?^qF))d9JCb!9ny{BkO2ubf^5OHUCcWnQdh&WA?BSBT?jA7 zLMOzgn0F4i5p0Pyaa%u_Ztusu6JiqKlUPgFatC2gtd$E-626JGap4WZ53zPGd__po z9bKsQB%p-u>cY8%a=N?9nuGX9aH-Su2l@60-c*T~F)a8>YMjMR&Egc9#d#*{*{D0a zFP&DE^*%Nydxh}y8L6`NMSa~Xwf7gpCknBoqVLkH<4t98Y1J&w+F7-@RS$380nJEC zc`LR0M>(0#O=rM&~{4*c`AcR=0Ky@L+T*0DLDUA0DK zod`VLPGlIOyD&ev9kQmSim{#OxioXQHL?kgBY=qVDdPa1S=uZ&6v_ zN6l_K;~0P5_ky#EVKb`~-YTTwjjyEZ&F?v6orXOl-15%AmiN@2)e@V%++leE&0Gv8 zJ!HO=X3i^9_P58~7?+s64%4kt*JI0DqbS*ZCiZ@mYD!Wzb}uN*Yd;%t4znijuZLN) zg}eC!FE#3Vx5(}7katUAdG9UAdoS~v3=5gzk7x!p3pkYUq6HS5m(iV zm&AOlZNI?a{iNxI%wtcpSgp4`BeXp$v^~e-@1%J?b3^;*hqiBWKPp$f_=BBUv!6nn zenEu;`BR!%-0H<2d(66z2LABgK>iG47Ps=P?Sl%9EL?iH)^If8D8tc*TV*1f>W(c7 zzl(`4!{AjL$y*r1nr@}8#h<^Kos|$6e@-r|3wHK$?-{tNVJ|+@_Ts`7y$<8eU17Tn zv;tBUqzt5LNdBt?HvW}8oTsjz3Ci;UcTK_4%v`#;nj5j_)W+EV-Thy~|63%MQ6p3i z_kE9a5a}=yZMdORTrv5BkRN{}?myXoz?8`{wuj2$b_Mh?m#pL(zy6E+cO!j?6gT!V z+P8XT{JZu8D8qkoyRh<-QAZgj)KLSeE>dQwzQ3~H4c|AA-bC7p^eNJAq`gQ-kd7j8 zy<`8?3fu$b{~Cu4+W+1CEWBr0qy&<6IboG#Y6V63?S#jPVLc zRgk73Ek|05^cqrK9H+~Xh9Tu4?LaCLhd+}4Vtm<%r?5DA%}id- ziOf40iFs?9yzhnbGcWszc{wham+klGQ|4v+nV0Qn-f;VwcPJ9`-iO4zoL|{@2auST zi{UYEGn02O)PMc|ouBjN1jNtlUSa1?Ikd?iACF*r1=1>{)ktfRo=@`;+r0{vND^x$vSJoG{`{%#!$9bS>=scT`{7aEmBCSDs2I)m4 z|CPW-2GVGxjY$6MOKkY}B)nHRg!DU&D8B?!8Kg=`8Ax2S7$2&rR!AL@mLolav<_(p zQUk=?8Hs)K3esyxZz6FlU5Io!(k!I8NVg#Uj>LI|V{-`-7vQUae&Kxb3{n}ik8PZf zv>K^M60T!N1CZt-9Y@M6f-;f(R}sWfSlpby!|`%HWW0AGG2S%9!Z^P)aSb(beQDzA zW#al8`YqD$CcZ(4D+g%;664&3v>WL#665WT#CZ22G2T28uOHV6#J38Gab+M?L#m0y z_?95?KBBgXkLMHP8;->IzC~hu{ERgmpF#|bYZB6Aq=vUEyTAJ=>a76BV%QZhmaWKXcOZBC}Zr0#Mt6Ue*gI~`u*p} z$k;AHVr&PH{MfERY?DLrF{U+0jHNab`^=AN8MgiTm@)CbkTH!#I*4=_X#ir%L1Ik2 zh9x7FK$?a$2kAJHZDQ$TVmSS)rI0i37 z;#|HJiO2L}r11H>2+VV(8e-&Fybp@Y3k-ScEOg@hk9+O-p)Ia7Nn`@E$W6rV3 z^Sd+B0;Ero8X;buGyaQxx)G@f;^Mt0`*aNw`;zzQ$B}r?at+dTNWAXMMPgsth=qMP z4vBqN35k7n8xs4f6cYPt7!v!ci0P{Z|F3?(`_*o2$?JhXufBof@+Q(2q<4_~@!}tc z$>{g%kn)jMAZ4K6Yarc?v=nJH`g|PHB&5kmCD88`kTQ^JAT2@iUm4h_iNt&2@P1zB zxW6S*cO+i#!uDR^K1ltL1|j*cVc3|4#5p$yX%5EG7NkQMH;oW$cf@xK(ptoI1SwGz z;~QyGGR||P(Zw)-Bl)lYlgjIE+PluQH^a1-a|_$cYZu#lfobn@)7~Ya_OgsVNGxL` z63eKC#4LgM{UHqvOs$`t@MAl4U=wjzCov>T}e z;%1FOk?c9g)~KtC83joVWe^0=E4FB(}K)65HA!)ZYK8av3Y{JsIl;B*u#W zyK!T^8Sye!-upAwi;;ML^$ZeYt%PI57`g1C|N1|nyn_gq?dAN>_Leg3<$Vm>`>AQ~ z*`~cqO?zXey_bjD%d+@c0n6gO9LuVN#Ikq|XIWn&v8;ATEb9>@mX(6UvU2_h%VTUj zzKo5>m$C8qGBzGx#>V5z*m!&y8;>tzNzTE%R&WmHwW6>&_y}U=9L#G+VRP_0v>`kP^O_Q#gZ*~> z?-B>&DTV&v3r%)kzoY$p^)ovjKzsSB>q($o)SR!{o_O!)jT$j})X2dj$F|5g_rgvY z#N6S7^D>%dHf)m7eblJoEi(G&jTkt*|HvU3mu3wb(4gtS1`RG#=XOB${)77u$W_+4 z*gUUMW`pL+88|9$?BEIYMr38Fc=@DGMO0CpT%?35ZIy|YizWcN#Z?B_f3fjxO5o3pXT@gf8TNE%TD*0M zT3#OChyBpZ2PiwJO^F)wts7!<^lW>UGc!ITX?l@qMUk^jiB`^>Sc)?{R>GMTE7iKh zB1<(1gSFe3!nbO)!3oAd4u|n?w>byV*Me5M~py8qx=*&VbH|KjgZ}fv&>e`*>yE#bd(hyVznj~1OW(dDuNppl^w_+=*8)=t8uHIW z8R(Vr_W~Kwf9%kI*cGfF?fHB4n~wM|g~8eAZ;q%uocjN~BUsAciy#;g|0Iy{1Bdp{ z`@5|en>%8#mp3w#{pTl`Y05wz)W6pm7*V;S{%$+`>fJ*AUi||(*ZtG_-9r9e{p0^D z0eGeSy$JkHbVt-bD&ilFNk0sZ&A%7L;Jmz%e}5>A8rXmMKOP9f-BSKu_!z|f^ZpAH z6HEDf5tu_TX6!$n+eQo?F)DB3KZ=6qW#6%R{mm`O-=3Si*7O~hJ9zv*il=Yi|3bgu z{xN6#AjVhSF#9&!J6zw{qIWK>@6*r6jB zjk06PaUVW)Ez54`oRzE-`EmWiluYM*{gTSGV~&pN(U~xvtxIP+ZR5c%N5ysLY$rXg zn`Aqco?~V`X^C^5@o0+wgOBUBnU2=YGj-eSxNf;Fp6S$xcXaALhn;!Zj-?Z^x)!!` z^RZpg+a8JkqloMFMaHt?mf5k)k|?Ff-nf1Z|J$3L?I^u&3Z66_E3P*wl=}3P{Mg+V z9*7EB@}{z!vdQI~qm$R6_HuDO-(oWw=~Yt@ zUgNl4kE53y*JotXtUpwlaeZiVrg1||PffudI0dc3S8y zZbzo*HE5dFt29o4W0NodQ!wbzwT-d!i^0T5V=Nwo#s0Z=!I!DqbwFD!sRJ=3CnNu`A*`;AF;e6Pn zmpIkqMOHXE)2S8jfU%bEl*x8VW@GR5IAM5t9GeuYWjSTydZv>Nr%b104*cr5Rc%~P$qJ`I?SIG>N}p4s~JBE6hc)Lvz( zQxO5A#@jm;L8v{nnGtX2RBYfl?RYx(%yCe7ZTfQHw0BbLJ5_MD#Itn|=F&LFoc2zY z2GL!fi(S^aG_L0s$w8PXYt#58?6LYw2;Fipqv!@poQ!%-jrvYC#NeQ~85<|-+19$a-Y_}SI|00NPj)>sZE>`qSQwj4#Z52H++a1C=9@chZ!_0ViwEwc56 z*>)4>JiXuM$SJ0$UyV6?n$sLdx>~k=43iwrC|u)kEHd3Io_5KJALi_s?Nr6&z0PrR zoC@(FxG-d6gm=I;3>ey&{jfdNsoLIYP~WN00R!F5Gr@> zr*b{FAD%b;kX_IZsGw?RRF|SRVp=MsLmWLR-)Y_yaZSK!Vzfeiw%3c&jba3&;533` zu_Uh7T#K492glrNb-^)V2bowJI91v?wF`;pFOLlRfaAGAJm)_RAm1Alb==PA7zA+0 zX&CB}f3N<0)Svk$_2WuVcn9ECAwHee{`v9vv)Y?4b>}WNJzG@mjsVm5heB23J5%BF z;h*$<;e((924$vG0rC9VPzd*g2&a(K^WQiKg#?0g!UTdb5k4edzwngeIaegZDX%AN z$9-gZOeT*^Dbg!eij!O1pWG6-(d60GFH>jmGTCnlCb5j|+`{DyWz@x_*L@x5gbZA& zF(vflH4wf|{Dru_bcxdhKZwQYpjdn;CXsC1d3C^cHm>e%VTYeSH4{6QI!!n|WWuL` zQw$SB+bk4}v!=e=Mcod;v3?A5EoKE=zw9`fGaaUcyJLsIwe^=c zLS`^U#xX^HhsgjlL5|Z@<7U{=<4}J`Hr5Zo9SME_IbHxc?)f&&sZ!UeE$Y=nMP;ny z!W_5GyPRx<<<;4AC^j$w{Y6dreodHKSkpSRP(Oa{cFuR7W5UnO#=}9TcaELhFt3sv zHU(YD%A4zXn3R1Eb**U`#&^)Q*-q`DLD%wX;|}K|*KWt9ehQ8U>W}Mtr(|OT7uQTq zwl1@+m^M#pES&JzfkzNG03O^(-{vDc-c#U=?}i&S+ZTN!h#-A3TB7B+IT^`91vQzSohiqwwPE{8t)7pJS=S#CWkyhm|r z=|gysYl!(HeAAMHGqTY36r7hBR&DXP8OOt``_#&VghLbzqv#RxPsM@M);2$&#n%KK*&PU)W}8=i6Fcpk{t@8e-0Ij&Dw+gS$6Oz!60__}4g51dcoEUJWxc)=aUt5A6E@CU}X ziZgq;Y`2O|g;%jIQUz}9-TP^G@ZqAKS#aUOqYj22&H&y_yVvyQh!%~gTR*O^pMs9% zXF_P2*N}X6#8C_P8&6%k1fw38fF(|4JYMih<{~=maooVyf+Z((onXF6c;fi)_n&DT z>J6@@L8Es3b)#xn_>keGMy-oB3S+9EQMhfYg=r2SOQK0joGKffh6RrU{%uic92C}% z|7t+|s|NjFd6fP~8ukB<(%+bi{y!gj{}&!5Gc7diiYa(fHYZB+aYpbYbMhr4u5ZH! zM(#saFn9froE7*KE10#siN9e-&TZxi4|BMSyqCkx{mIv~!sfDkGnu&);!z9DEYiyR z*bEoNd|XfQp9qU$hn%DixQQ(t@50OXO}Ijv%Xg*z?&nga@x-D2);q&_j|+t zsw;k%&%C_ji63=|@YOz=uf$FfJXP@Rf|m+@Q1GLIw+Mb;@P~qT3f?RDN5MY});uZP zm)HK%g8Aj_usvOHreOZjVc4I4{2pff++2hQ3LYkSjNt18&k}r_;H82e6U;w2^j=>3 z-xj=6@b`j$6&!c}ubU-$<&_m&Rd7AQEd+NE+*2^WWbVDZ`mPc@Q!xMVGwjbV%7^($ z!CM4>BKQZvHomJGE{}gq5oZ2)L6|!T?kjkl;JJby6#Sy#j|JnW*(3EI6`X?a)_O0m zKhp%)6?~@PPJ;Ui<{txx%g+~llVJW)McDrt!EXxwMDUM-iv`y>uYHvT^N;Dm^_?xa z;2P=W=N~YK{U->%PVhXzw+X&i@JhiO1ivJBli*(k^N&-)@fH`%KO7F*&k%gR;Hw1l zk0QhQ9~I0WI|$o95zIdV4BJ!q2M+Gb>+f=c&lh}=;CX`Y6a2K`&jjxgTom6Q3dd7i z@R@=y5Zp;H|F|z)-UPt~f8gu2{~=*tBlvZ}+XU|vTpVA23fF&@;2gm>3Vv4bw}NZn zn^fWQI|#l~@I8WG6a2m46M~)K539WXDl0fuaJt~eg3lE^K=5$E69wlBo+J1s!S@M% zRq&gF4+uUixI#*_|0@ZuBDjg*iv{-=T=0j9b=``_3j4i+pAh_>;12~K6KoZaw&zsA znSw78JVo$)!K(y6EqJ%!1A;4;h{jh(aE{>7f^QYPMDUA(Hw*q)@Ls{+2|g^?;)A67 zs_VWd2~H7QMsQ`pH3iod++1)w!94^I5`3lLDS~eje7E2gg4YUuN$_UD?+X4x@P5IS z`H=3uy#B2!xSQY}f@cZ7QSi%xHw(7;0YRw#Qi9JH+*$B6!Se-g68xdylKgNYRDUJG zRRo_a_)5X|3jRQFk+RYH&J{dP@Cw0S2~H3GfY3XB9R!aQe3Rg(1%D2rii#J-+FJ>kB?p@VSE93GOPmr{I2qa|K^3_*TJ>34TuSJA%Ix9Iq5@f2v?_ zwFCNi*RQjLy|rL(rGoY_BKEV$QeoXLc!OseQLGY`BHw%7O@D9PB3*IOAJHbB+{zdTbf@7yd$6FD>#RZoU zTv2dk!PN!V7Ti$q8G_Fe+(vK*!50edEx4cHA%ceszEbdb!Pg4T7d%t&T){UBUL<(2 z;QIwXEO@2hHGz^99Kj0(-!1rl!H)`lQt&H+Hw%7G@JE7o3I0m( z0l`NF9~W#_jvnu#f=dW4C%BT}s)B0?t}nQ$;Ijm`5!_L5cfoxH4--6E@HoMf1b zSMbe(7YSZ0_)aH;g@@vbDeq2N}6I|{x~a6iFA1Ya$9rr^bb9~Jzx z;PryH2;L_68^J#d{zI^x5$&%O!DR)XBDk91+JYMjZYH>u;0}U&3hpa-h~V*pCkvh@ z_!hx;3tlOBt>D)LZxy^v@Rx%33qCCPxL~KMGB0mFDOBGy8@EL+H5Zps>FTwo<4--6A@I=8=1>Y)ovEXHb z9~Zn<@QZ@q5d5y-j|A@){Egrr1s@fBLU6oB^!OAPTvl+Z;A(I^2p%MOq~HmHrwLvl_;$fd1TPc(nBb=buNVB9;I{;C6TDOKmxA{T{#o$vg6&hI z$G@cDQv_ERTt{$Y!Dk9?Ex5hlu7Z0B9w2zQ;PHZI3Z5@`q2N0O-z)fG!K(y6EqH_A zR|Ibn{J!8%1n&|2z2Kh&|0Y=1j2`b4!Q};~3qDP7rr@T6TM6zU_!7ax1Wyt?Tk!3I zmk3@ac!l661+NplQSfHL?+gA^@Ls|D1s@TtPKzF&qJql`P8FOk_*B7l1UC@eOz>HP zTMNz>+(q!kg8K*_EqJ`(DT1d9o+o&r;5!B1FL=4&#|5ty{DR;eg7*vlS@0i%om$c3 zU0iT^!IcG{D!AdD(eko{{Vc)f3+^oVV!@XS9wPWk!IK0}6+Bn)t%8>ben{{t!Osfb zD0s8r4+MWE_$$E&1^*&gogVG~B7(~ZZY;Qk;L8Q)2%aT)f#4?vuM@me@IJx&1s@iC zOt7vUZGW=hl7cG=t|qva;QE4_3%)>b7r_Gr4;MU9@D#yw1m7z7e!*)6zb^P~!6oZN z`>%%JL4qd=zE$vjf_Dl2M(|I9D|jCZASiF6ir|`p8wl<$c!1zM!M6*(SMU>pcL?4i zI9@N>pCtu16x>{Jd%?W~-y!%l!S4#*CioMTpa|N#u{H@>% z>PPDvE_kcpj|6`%xM+iDc@+g$6I@ep8^N6guM+&R;9mvX4Wsc46g*P!TY}p+isrvk z@P5IE1y^kx&0kM&Bf)11K1c8cf;$WDA-K2T%LV5M9wsY)ox!`97*J~2( zpT>fh3w})SdciHTqUBvL_;tatrcwXlg7XCL6x{BNX#OsOpA&pqv#5Vv!3_jA5&WXy zR|UT(_#45$2=3iH8qZk4R}0P;e2d_B1Q%}+Ek8|gPrAQ;H$N|0-bBG01-~P>Vw-6G{(>J7d`R#K!RMbJEpNWy z?SiXc5cSUze4XH}f=_81%|Ar&1i>2xmuwf!f2rUBf@cd}Aoxzf>jbYCyi@Ql!O88T z@zodHQ}DHd^93&#yjAca!N&ya>}Wjo1h)`8Q1B?hcL;t^@T-D13I0Uz9>J*{qVb+8 zc!c0Jf=hIa=I<_ek>Fi|4-5W7@CBWs<@Xc3Oz?ieO*=>P4-q^;@J7ME3U1XUTHY+d z?+LEdHR?ZD@Jhi)1h?uI%|BQ04#8gtu5)2Defc*% zKf$X6{~@^j<VK!;^ z32rI4wcs{_+X?O{xR2oeg7XBA7d%7o4T5hLyh!lMeuuqcM9Gu_@H2Yy)v)5 zu9g;DS#WK^X9>PQa1X(Q1Yarm8Npiw?-aaG@FBrEKia-xf=dgoBDl8TEWsTGcN5%O za6iFU3Z5)@j^LXGKPY&!;5~wm2u_(A?VohP%>Qb0Cknn!@I8Vb5&WFs7X-g7c#Gg;f-~ku+h0R)Ey48#cM#lNaK7NBf|m(iE%-CR zhXhxg7mfc6!RHIULGS{>cL-i4_(Q?v=11#4OK@Ak_XyrB_369+ut*@luiv;Hj zUL<&#;5CAu6a0(d^aas)>I*(c@GQZ13EnLDH^DV-iq_Xj@OZ(?1@9JI^yX-J^#xxh zc$(lx1g{soMerwr8!e31-&XK=!4C<3NARzLtKSkWzq{c1f}axniQuBQM$2m;_+r7i zf@cW6QShsRKNNh*ZPEI(1hIzZX|(tmU&-{O#x$9iNlcEO1vO z?^RNLA8d1vR$oTAs(LxXHPnU(C#h8tPFC|GTvAPna5+`*Ti2{Fp+-mSY3d#mdnH&c zeDQu0?A)$p_$hE}Y{v}W3~qz%iiW3vFU9udhFhcUEV4FIOw~|bVCRebEVon_-8YT) zhhJJHg%Q?d!6gNk6Pys7Cb+8L8iLvCf|pkH3IJPL)fe1I@EL-et9wFCECp*an0?U? z{ZcJfQoU;W>wzNVa;iM`(|#a@TvZ*yHn}cRnOH)Ni*TAc#rEvKqnt9aWc3A{>CbL2 z6H8L-jJ*^NV40X!7xF-w7vrfcxCJwt7wuI9r~5`I?G;7-yUg*X8|{Nd{wKoyfxM%_ z41XSxH0JxT;Az z_SdCieg{!GddsRF1b@&VI4eo z|4O3>Pt`s)SKb3s3skf(BZ~Z=|UT_uI8-Qy< zt6XZzY2#_l7GC@@97lH^gyz7He7(`TjXrJkYok2>V(7QqjjlKPk20Q#M3w1d$rjoxl_z0o~J%i;JlUwxxJ zjE*+SwIgVM-soL1({V{-y)BIPGdjcQ3Zw5C zJ!+I|0x(~u(e6e^8NJo$b4I@~nuLMOeD#dBGdj}fEk-{u%HOW1e@1anFEBdX=*>pg z8QpKRYzfc5xzWBxryG67==(+w7%hrRI_s-pG~4KCqqiA--so5#t{V$|?npVlviAJ{@ZG4Kie}Pf{Mj`WM0;OQE@$)X!KE|?;1U7l)ueGzwSn-8~xho zE!8~xPev2XFaPj{bg{AznTu#Tr!)b;c;quuIx z{F_l--{T!dA8+7s?}nc0MxIVF%D-)5`@S){u!+YXWCO9xNebo6vfCr_()_H>fbMO{2@(ACptj1KMQ@j;_Y zFZB3`(PbBTyw~XR?jG0a;ps}FpBkNevA6$8qfL8y{H)Qsy*$3hXw}{x*So~iwU>I@ zq>raB8O^@T;}4DYyWHcijpp?AIHjMbw-{~H-{YDCJbl1uwSgWlHM)F|$Grx7+9Jo( zmxg$HErK?iXX2i^`BQ zy!9(%*?2x6V=lq;pth!P-O;rqY28OAMVWFz?sI`>BFj6th9T)~G zhPeaX?<&GovD1|M+!I5a=8)0$1yr>CHY(bDFLjhs4^xrpaVlbdiaK1W=cpr;dWkwx zsZG?PmU@@^sZzVBJC*u@`k7M4sh=xV+=9ZGM*Tvm#?;+Px%aJmli0^0K;5s@9_j(54p9+|6@wncvnBOM zrP8T~l**+3q|{l|!%B6e{*2Eis7I9QOZ`Qu5!9nfT}k~_sVUTBN=>EyrqoT;-<7(R z`iD~YQ_=W`s3*{WR6GPeOT{{-uTx`|+Dz4!`iN> z)XJ8sOhtd!qoSYBqN1NWQPIzrQE?nbP|>f~QqiyTsOZeHX(+ zc1bGww+i(XOI4$ye;ZOU7_+G8-*!~=Zx?D=OZB9pe{-nl$E&F5=V?^*^Fk{6`9A6w zIKEW0!+k#4qtx5vy-IyX-G_dpqTl&>3;VrT9EyIgL`A=!PDQ`t(ckTNObu?o<5AM> z_rX;3`&cUaeJU0G&d=4@@Ap#C@BEyP{r&a!I8^j^St?H2id6LXsninqq>qaJK7(4)QfE@p-|eZTEY*pM{=Sro1xEW)(cdGe zWh`|i75zPxivAu@1{!zNFskFIiPRje=2G*tx`leLR`*ly)9MN8O0C|cKA_cy)a6?3 zr9P_FVd_I#{XxZok;!GDYw>v#b(vPDQ-^ESi28_D9gMvf^g&EeoVbutKEj(`*7IHm-GDU8f|BEkkRQz?=||m(XWl3FnUUP zl!J%udek?yYDnFT_^B;zbrBUOVNdFlO65_{w$(VpH&M^A)vbnCQCr!HYv|D5y{|vl zR__}=Ky7WSL)7P$N~r*CW2x zR@JB%+Nvh?Gp$-uFS1oD>MpG=rgpd0CDe6Fji&an)mZ8t9B=Bywwg~Juhj$8p0-*} z?S;6gy=}FTdWo$*qh4yO-G+aq_OaC;R7{5D641-hZ&WN4TA$j_R*k8!pHJ;?tM=3Z zwz`x$&{ln^gKWjMOk#s=brtnXt!|*^*y={=*IKQlj@D`|b%?Fjnf)J8M`-m0b*Qbl z21x8%Oy;T3TwB>xFxU2o4YO5s>J>PS)Zw;jZTK=OCiDJ=uc3~#)pdsNqK>lFJ=D>t zpNbECHW=PR&9l{4hLdoE6B}czVpRCoq>i;!ZNu5rt8CSoI?h&uspD;xYwXjg6Kpk$ zIuZ3!C)w(L>eaS-ih7N$xF$sGd#&E4;v)3E;cuvuZMC0z0RN+K3UrFClBi&=oe;au zR#mB0ZPk)`J;smWOQ~4UwXfl6)TxNa@N()jTdgqsI(53O_#6H#?>p)YTm4`-ISoA1 zRwbyjY?Vo!ZL3Cx`%vfDs-NNM)EjIy+wjBGxwd-DFn=39hKucX!$+v|ZFS6WdS&p9 zINns$cOG?tt=dv?aUMdw*;ZE=oEOk-DoI88&8bUlb(Y}) z)O&1|L;VHk3w0^Vr~azdH57{b>8pHUYF30#VJec}0#;f7k)JJSJ&+uc^M{V^4HOW@*QgIWs&G0emW41bO zxJp&sEY_)*;4CZsg&r+YY)q2A_sq1X@g<-2Y z_&HlS)KhGAD)o6=oo=`@b-k@FG@M7>fa{sz+o&(t>Q3r!T0KR55$C(%&!{h9J~mvs z26&^b%2VOrfQp;TCWd=cU$NC?hG$Y=wbc#O*KBn!^>tf4NPPqSNZn+s=csSu_)$0G z_))jm>RaktwmM)~p9V=T*s42q8^#fJ zyRAl0KeW|U>JD4Yq<&G>R_{KC>uL)~pF{^n$CkFDw$ZbjW|t2Weqw(3p&68&a4kNOpk6ZLDvNBsuUwl~v2*H0tlRazB6j1ILMc9LI?Y z?m<0)elR?isvI?eYB_2)HRh;!RP8AKhF&b)R{ZU}SPP6-s_m#3se`rJMD4HDThsws z?V=9E{VjEnRwt-Saldmqbcj|d)St-jiS!fYCLt8 zR##K6(&|>~Y_0B~;(q5b>Kxo}Q*Y4fRq9;CN1dk?f156Lt5!c6E?*mbhgPZ7JGE*| zy-TYz40og6tyK>y9zI7=muNM{@J&?wr}v#yjKc@0lMn|rSF0DO!?b#tdIj#Ysc7#3 zD(-KNP)BNY%-B=wfKkq=RNNQUqh5*oW-9uj8+9z=p`!g)Qpag^6&3BjfjU8}8>thu zdW4GSl_#m_*Y(sfTD@lWzfDDbA5o_xKI*mjo(6R?t{+sy8?Ot!PODPXY3MKN46UkD zr(#~BPQm>&^?I$&qvmVXk-A%{-qc&P;%~Xd7HZ{w?mJ(rN#q-~noM1w)$LR~zuZqn z+$*RzYxOi0|9ST!^>!RjD)RHU++w$B^(htkf2Jb8RS$~%$yDSoLw!}N)2PpBRfqaK z#v66LR_7bOl)6EyzSI}cuhbW{nrQe&>PuQJq~iL!lKL{@qrQUYD(cf(y-vMfEB~XEWGiqgmS8L@^pVX=f72}{Lb&XcF&3^tS8;^e%D%#PD`V{()x>l=U)KyxIr9OfF zqps6xJ{9%dWArJbo2k#>ev*oMzow$zgVbm7{AuY2E2 zpyGM53w4WD{ix{oA=I}J7j>&v(~aImeH(F6@!a;T+5dsjZ>jI#yr4d>R8j-zyEtyt zQHY279`0|c8}R%_eP64l)DQ4HN!^BcsN1y~MEy{!q0}8(%xlc-~r1{amY;sJrl-PW?iwPpIpZ`jNUDW^A| zOg)78jQSJeq8`Tl+6ekH&Q~hN>1os>828j)wCYaH)9O;{QH*yg?l0Z{M>(d|RPt|H zEusF7cnrTz{X?tGhL2H?W1cXa+8BHS$BBykt*Hw4dxl3-Ej+JMasPP>RpU9@@H14~ zR?i#$g6iP;&#==39Jf_bD()vwrxvjlfAfvpiCWZF-3*VTCfjO~;XA3tY_)`n`_B#3 z;&>i5yqj7A*KxzevcM&AzfOgJeQGH@|59;(c@eb?KEE(Lo?6ycR~ueREr;v4;a8~T zZS@8f_n%)=E86ON!zoR{30sw-!k$G<#dCt;-qcFCZ=vG;^IB?}t*$qGFSRo6_YA*D zt%BzR!-uH2j{io*b=*1w`Vp?n)aJG-P0hglCbcS_=cv_i|3Iyd`v+W=(+fQP1ED;a+-njAv81ID(O(1uc28uuA;+mTt$cD_>GxuuJIXfK8*n2-s};%Yc>8Uj=MF#d7?uJf^>cBK`MhquFEh z$7avamvKFTZZP9-<w#D57~zz{}UBHMGjK@ zc?w@3$0~j@#rQ5@r6OHto>^fhlc6@;_Gi6^iz5R(K0Vdw-|!`?SB=pB4Ta{TiP~3jdR${qdt9uDc~slyi(cNuI6w zLlqt+$H@ZCpQZ4%vQF{!3g0R3mygIb6y^U|;n(F`ir=pApX6uqONxH`N+w?D*Z)|G z_!Hz1nJLFnlsAc@y;mt*tZ-P)lQ+q`De}EnK0%Ss^P2w?xmoe=DEy)Pi)^9DXTNkV z^6SxuBK~NZMv;HI=3k_6zQWhYIkH;bB=4qJeuct6kUvuV8w$TEeQLB6DayGO%7B1ScNAmJWb(Q3KuGTt*ljiox+P1zFlGdmLmJ*A^C*jpQWhZI)&fR z{9nlTC4Xy?%YRCdejmLfV3rN<3|Mc9cJ!fl2kZoePom2LHb~)f=yw7(iXxvJ#ZQu# z%b*NXq+6))E%IK)uT=Oc`Mi9UqQ0BtR>gm)@E_zp`7haXv|nCdiuRl!Pm_b?NQ(R~ zlv60`IZN|HvPSVYE4)F9*tVNM z*ddDh!^&k9Jw3r{>1_eKf#TTs4vJ%?2Plp$9;c}P_i3%!^9sL2u^)L&;WsGuGg}pI zqDuqzk-~qZcLnS-ih6t@|DpL`(w_Ls#UIvB4~lYo(?r~7qwopzXk6b`co6MtmPN7L zNX1`Bdzg(^{3OL+M*HJA7R47Uehx+Y8pSVA{0$W8Z&&y(nqc-2MR`vs{u#MJzNz`| zD*Tb$DL#;f~+Ss8uNY(9Mn z$ItXfX3Hs-drEGU@5_BMae|-jB>D#KyP`ic8$~zcz83lmv&-l&abF1i6^>u&7PBSv z*JexUn`YmqZ<+m&ZpD2e^lh_7g?~?fWA*|4EuPz=c?Eupt!3<0C2Z&7ma$%cr4$70}Xv z6;h-NQ>0r!k?vMH2jA0ZS-`ye9+B>GrF%x{UZ&*%`zgIPV85bs(H=TDU?0bQJiicrd*8E>-{#MQZfG$M4==A~HO>YR;mvm9U;wHfx z1J;M$gzwE1?N6gO2W&X457_y1alpn?EMGveJb$a!y#?!oBA#_Rl}1cVc`|?4O(H*JdA497q0*E(_RRiv9i96y@}s4DnD<3cWXA zsk9+rgXw*!x55)B?&F>$r_q54b_GSff)x9^Vv71zDqKTR&l?q9Oi|xu3O7*H`w@j7 zr>Ork3O`R#|5p@#jiMb}6y8eFp7$yCSAV0Z=Vx*sMZI`qCii!V6yd(|WI0&#hberK zoJ5h|W%5eJ7s+aQqvkJ`cPah>xl%qQpO>#vaf-iG@ssH>*#9ejw&F`D z(pM=yqWC(B^taMvvwIYOKRpunL((J6)>4$eUh`j*zg7JE3OCD7P5~m1olX1IFKEc5$=gNV**Bfqpk&mr*>Fbv1nu`#t(Jwm13=j{oSh0lS^94cLA3 zxqv-Nw_yKAe;u&rDbl?{k!~}6Ghn}^Zw2f_isk-Be}m&aikmCHqS$}iG}wgCB{~+* z-N|F=8F6+3J<;qmivB#4;`nQ*!sk(BGgjeCXgso2_zD_lR!q|ptV;2<^dz&J6~2|8 zV0JI@9_VOOwq0NYS3Z$UU0>ABDe>$pwD86nTa` zOOBG+axz6fTp?%6a=Ab*p(uZ;{GQ@hQ;e7A6mHb~&GKEvH!HkTeyaG-DfSQlR{Yn} zo$l8wf%d`iIYl`qD?UvQQ~X5=PgJ--;j3k-tdezdvAjz@AXib8_q4(<$yeoO`L=vd z?xa}mbA|sUzm-Xs`}0#M`aMnI4292^V`aYP&rrBZ;W~vE%e&-*n!ifnr{zoXRrw}G zJ%6Y04*99#_bL39>~)2o{%DGN50HZtpQ-T03XfO#Dp?{c!OM_%?Zud{C~E zuT$jrD}|fn2l8*4|96F3rE{fUzh3ejihPDEe6buar)&N-3eS<%a-qD7V!ORZKB)Lr z@@e_9=JPk!nV!F`&i>jee=q+aKc~l<{hRhOOPmRZnDwC>}Tmve1E35;CmX) z!uKaROY0v$yF@X3Z4k?4q}t?V(G| zzM{98eM@gQJMt=c2cEN`OU+K9cj9|Ly$jcC=-sFq3&2FLSukTXi^C(?~=LRVH zYaM;UY&}JP{hU5&_A841dXIkJ>_dwF`a4~1_795wO1v6Ah3~5r{dGD;f1N{rfa5xf z{>r95G|QpruW57*`kA7?!t`nMH${KlPM1r==THm54sx1r}QbD=e`F1AYjMQ9|r6+x+Y-h^!b2g(HC&sL$Mw%rO0nZv{z@DZb2JBV39pC#X*3WM!*3UMI`uvH0gzLR@ z2iieV->)=3VK&03Z(sUxzy{DSao&Ue8~3SDJWO*jZN~Rk`p1CfQM9LoqMnr$^;|&F zo}1`j19l7j8`c9wy2mKeeV?K|>*%KeTTed=*e~fP`2I@Ko)74*fc=po{cgGw$1(Iv ztdBy7?eQpz?eSE4J?c%dJ&vV|%qG&^0h>Z^GAp9k9)q;`vUe2#rAka5&Q@Gonm`T zrTYUmkYalrN&kuQL$N(hqyGxn6$)QR(LdKytnbD2KLNXqeig6>HGdUt#rJ9YZ}d0C zxY$TBp0`kZZ+nj>;=DXXfBv1KKfk5u&pyQv{h3P9pK0^}&J$4d=f(6EvrFjL0h>tC zpEKz<0lS8xKP%|B0lSW(KkKO_*b<8Ve26*;_9#VvzC>}N_GOCx{4GU)zE9)u{feSL zKcn$DA5GDpU(-N>IVBMNc`Qx9btsDdOs72(EKA|Z6#aPxMSosHdnQ;B?S=E}v>u;B z6#aKAMgQGP@le?VG%3NJqR8iYihR~nq;I51{~LN_g1t|VK>aDUqkm9rA74{!9|<9d z?dS;F2j?qjGLEY#(w#$*E|X%rxS00E^QiQw1e;E=9R(@sQ%12JRZ^tCo?<(?gC33N z^Jz+gt)yt@6BPAcOHuC)^cegO2t78z-lj+6jK>ox#^Y%e<(x}V&IJ_XaXcN6V0rXJ{O%3K@^dJbzm8)01r*EQO0oRC6wCjB zj=<*?J1Z5x(J|N#=vcGB9GHXW2aRbFU#b?{E zC_WS3rnAj{N3pN^fMOr;M~ZFguM}f+H^sXBiq_zM$1+%r>jv~Xv-9XYvoUmm*#tTt z?W5nr{WkP5vm5B6xK2RVVm;7x_${Au_!G1K^yfHkQTTF-A5ki!sg70AlO4N}p5oYd z=|IO;($ny~FFnJt-_XG_Ub zNiT3LOh@7VDSDw}E9gazJxfR9erWkBy%_DJ*^V{SF(_C5o95s-=CE&1iuA`&q(7C8 z#dEoIoMU-3*ReVD631?#;~jgMPQY`(^is$EMJGDezXIktHiAxa>=HT|&z;gKjy*v0 z9ebKyhW?>b9s4bvhV?)T&@Yv6I`X5JqyOm@=npyr{Xnloesrc|FVL&d&lC@@|A$_U z=Vq(mHI7|KgO26X*^brFLdWi=MUJhe#f~-7632GXkYi_J47;U{O{Q}kn@YvoV_S0UPD-s;$Fx&-Z|w>fqXz1^{A=pA@|o-V~WqjzFEiom-ZJDJ{%=acC&JkL$P z<5(@d$FY0qy?EZ7Hefu_`yBg{-tXAa*k`y8ICd^w?$~ttUB~9r?>TlqeGuClUE$c9 z^dZOoMjv*(eT@4Eo;%0B#$D;y`Sel8E~k&7J@j$3hps|<=o60pl0J#{(C<5zh<%p3 z+OdK3DaW$u4;-6Cf9O~pUE|nt`ZU@@pK)v}eb%vEbgg6YIF@psb1aoUkM%`g!2R%a zonsODqGJv8CC6T*KXU9{x*qF`{@Ae;9E-Uxw5UQV?*dB?AK_cV{_>nj@?0j=Ggb?&mG%DH#_zb{RP$!{Uz4V4e(c3KXePm z3;i|r7xYbxKl+wqkJGJ=y-MG9?0xzh$6D!cv0dO8(rrR}=sS*GM&HGLgZ>Wfq1(_N z`g^p8zUSDV>HCg-L$^D2!j13)+@DH6#P&)*!uCpcV7$?fv3}?u@I8;#e zMn8A#3Hk-LOZs>G?gVW?K6EegsfYU<%cTFn{)g^&>{|Ly$8M+pa_mX^rDLztR>wZ1 z|Hl59{>QPS7Q?Twp6LOsXZp2c)$|+3meFq=TSM{Ruc_nOXVk@!IF8}nIM>dg@vfau z1Fl_46I?5$JzTqmCc5?*?djSk+RL?O+8e*PaVt!6?M!-vYm?}auGLcf7~XP<9|id_ z?d#fm^eET9q({5fZwX9sZ6rO$wdwR&*RG@Z5zFt;ey%-Dk9X}C^aR)bMEkq;H67sE z@wY+zXy!0_l53Yy{0K<}O?B-~dWvgL(NkS}gP!Kv$8?};|E8zAcFgVY4A(N~nP?A9 zbFG{Xa_u&HmTS+_vt4_K4n}+EIj$Xj2gHw_oJ-HeeaST4wK+7ywOeVXYmd{RuDwdL zTzj7mbL}5=IP#)b1msknCn_Hy~MS_bi8Znbb@Pn^itRI=|rq2iXU~E zN6Q@h4*iMQN;=84x9DWoTIdwydl$^ddZL$MebcF~T~DW>UuXfw8J+IhPI@_>%(xp~ z;o2ZN!?g+YO4lmsOxJ4YRjxfqXSwzWy&C;XuW{`o8g%WCbhc~X(n8nbmcb&|PNT)H z<#?uhiJ1uqXE;`4xb+ioQn3lV?k6!EAk>7!HUCW|j*JjcR*KVhkuDwL7T>As9 zcCFVv@H*Fq(;C-`Xsv7a(1>e4rSn|-8=ddkQTM_Hu3bdyT)UPoMEfb)eK)<{wRK#wkU6e@+*<_A83^{*m73+FvNz`7OnIJE{TR-j4dvJFq_JQq+sy>DrIzU0BcbZj3{^4C9}E2mN^;yvMZ@ z=)EYPHlTcZAI3Yq-?cLOfNM9?@4B{ueh>XjAH=x1A3o$-ANsIsC(}n<%cd(`3(-ei zTS^~u?R)fbj2pVjwH@>c?B^bUPr7y@{l04#($#q0fIj8gLiz*j@8}O*dxfrX?F0HW z_Am4q?5CE)XE9FbT8v}*9L5=a-nAw41=m*7b?6`ZqH7=0m$07bk6at_UAP|GKm9Sb zd-}3#FVdg5_E);WwUqC{S6mxQe~SL1ucEzlqibvEYp%UbU&nZ+n_L_4AZ$c`(>E|a z>Cdnn{kdz;)6K4JqrY(NpY)fm^zx%MXAiv0q8+qGjK zg1^Cjjs6zxqD`*dMBj1kVfwCXjr4b}ZKfByww-RndZL#gKl*#u_S5A!K7Sbg#B3ma z-?g*pdsu&TJN9Sv1MHvahpyd0Kf?Z!?r?1*{TSuYKOkTFM|@5^0-G_8=$~A>n*JI6 zL;vF1GjykGTj^h2`;`6-pSvsJC$6Q@UHH7EpJG2sKXYvb#d!T8-Hr7^_qg^2{T%D_ zQTT;x7tp`sbDFlGT)G$Qh3><+qyKPm!36Hd=REx<_G|QC*niM3(O%k$@kalR&jtD) z*LKmbupK@Q58(5RevSP#{l>NV^jqw2so{A<>crV!C@$#tTm|Fs%iJ^`&ppxro&%-{ zcy!xrG4Y< zOL`QRdlDWUXX9xKes72#gWo%%$Kv;e=y7qjnfAkT;Pm)7J3vo}vy|_{{&-%P4#4w) z^h7+5NKeA^)%0ZijtxzXv#01Oan?vr#dDbSG(0y=2jaP_)$nvYpGsYvKc#2lIZK)r zXE)M8`28b#7W##r9cS;-oA5bE2O~dvPMpO*1&83dTzYPtjiBlH9dViwXJMKdXSdU# zakh$P;dg)NF#O&R9ggQ%>3Mjr?gwxL`i+jn@A=U4@jE{Bf;g+DqtIS@VVpfpFT(TU z^kO`ZO|$VlHXV)UEa{jy?^={Q7Waw#5aArumyW~purwFXVbe=cZ#o|3(Fu5do?eRb z=tPu9^YGjm~FE+{Z$X#CcfS2iJROGVZ&ieQ|w+9u=@X^l03dxEA)tbvAi4 z{i)f>v<3B`DY&1AUKFsIvY7rE*8wTg-AD%q>@Io^t}DLUK&%p}O>_>7VMSuUAqJKZ4SD5Xg zqj3MMJmLj}N26ZyWQzI@rdU5CDe{?4i*db0&Y@!i7NI$~u0_WM>>iqn`!4Av0b4`I z<9R+hAz(kFm*RRZoffbiv>;%g(&@O4NUy*+TL)(ZESX-3^ZImVz|NvqVSUnBxPO;k zjqygWLH%ejU~_39ez$`b;eKP9jq~L%!l?lpK_}umFufAr?`a;cYtTu!eo80fzF9g2 z_r1}4TsNhcVfmNf<+wf~C(x_Sj`H60Hu{CVCyN z=TI!SonpDaP^4?2H5l)jf6RJ6-Pv-YoK9~JSP^{)*EJNsh(3&QL~)+$9{LEbYiRyk z^7r(0T<4{ma9=V-za{(_J{z!;<=OO0oR_EnHXBR-gzKU7#{s*F{yAWC=wEO>n(oB? zffV`tLh7PA-y50Xl?SB7X?@6K ziLVCUdcs!#PaNudrb-;Td*O76LufCILuF4K5_{s%)f0!Pp7|1ooL(4*gq|g`OonBh zTqNt|64@Y^%N25^TqD=Yb#lGjAUDcJxmj+JTjh4SLpIBua+lmATjc@C9lN)Gm&r0k z_LKNY5HB5mg2NL(t>Kw2vt+i+k>h2a%$Egnwk(llGA!%lB3Un&$Oel0`j^WUa;01& z*UEKry=;`5Uv=u>U-jl-V=wap4l=-;*ipd&yzSb^TIfk^u(c~Ck_!kaY*J_BFiKW zsl0d`dU-}IZ&p_!7^QD$!wV;$ICpK zFAL-hIZMu#C9+J0WwngRdbva{mCIy_CqC0ENea;;n^*ULt^S#FVAWs}?{o8?Zq zOYV^^a=)~mSby1Ae=<=f$z+)#Q{_OJCI`zAa+J)LIdZ(rllihh&XBX@Y*`}9WLQ?q zh^&)~WW8J>m&#?bK`xgo=?v%Ua z9@!%I%T{?nT5oN?GEpYUWSJuS$pJD|4wPwfuuPX(a)cZuvt^DPFY{!+EReHhi7b<0 zSuG>7PA-!5a*13jm&pdXT&|ES0Xk^7}3Y5mGXnIw~CitHx`$W%E{rpduFU1rG8{~4iLavmn;+mpf#$+$nd- zJ+ejam#y-Ev?H{>Wui=y$udRulLKU`94OP|U^zmLlG!pxj+c2dUlzz2a+aJeOJtc0 z%W4^sb#jrcmrLYQxlA_5<#L5wDObtWa*bRo*U9yAgWM<^Zk0`Po7^sU$X#-e zY?1qAt2`j>NUdL)D3fHeOp*QM0GTQW$}~AxrpqijLXMKzGDnV=c`{!X$Qg2$ER$hb zEhDl{E|T?fiCij|$p*Pxu8=F`D!E#&k!$5Txn6FN8)c*1EVsz5vPo`}+vN_qOYV^^ za=&bq2c-4U`jv??NhZq_*-s9TsnYxRWpP}drtn~yF0;+mpf#$ z+$me+e%UGyNbleA#d=9f_SbW=Op*QM0GUSdocmyzF0*8|%#q_|p3Ij8a)z8GXUh^< zCd0B?Mr55_B_CqC0ENea;;n^*UJrZqimF$=p(94tpj@831YemGm<964U*$$VKLXUJJ{wk(llGAyfQMApeg zvR*EcOXV`zAeYM(a;01)SIaeWtz0M9%MEg)Y?Pa2liVh^%N?>=?v%Ua9@!%I%T{?n zT8h@MOq5A7S*FN-a)3;egJrtRk|X3OnJshVc$p{jWr3U_XUW;JM3%|0td7_Cp4 zD3fHeOp&Q_piGm4WxC9gBjhNVEpy~}nJ4pQft(>{$=R|*R?CR2lZ#}%Tq2jsWwJpo zmn-B-xk|2UPvWV75Ucga1nMedia@_@8swLWFCOp*QM z0GTQW$}~AxrpqijLXMKzGDnV=c`{!X$l0<)mdUWJmJwMe7s-0LL@t%fWP@BTSICue zm0T^?$@OxB+$bC6X1PUfl}&P++%9*>X1P=Dl6z!}+%N4otv~7gd$jnR^Zq?rn5_5| z*-s9TsdAu9lY?ct%#tId_wU*w|M3dv$$VKLXUJJ{wk(llGAyfQMApegvR*Ec4RX0$ zAy>*(adFH9YT*dZh9EEXp54QSNMhKS6mHa=S!1 zvrdA@zm6i`2PyJfa|T2{Hl!vL9#URe9tjrK)D$kXAtj-rd2@n=MMX8C`4*g6QkXyA zPc(Y!q#>cY@{+nCkx*S^NO0!l;gQmCc_cKns=9VqMR{>eRpzj%p*iKXkx)%AFEcoK z%G61t^Crw3T`*zFCjWm}TrgNx zSW{A39jv{sCQ=%^Lc`^iq1bRK>K-z`V+$5mhtQXk850ba)K(#v%960sAGF)rx69}X zA2+`++;s)Uu8M9u`+U`8A>H!Wyia&O_zDuik%?m%purtBU=Wcdqayc~i!W z&I<->=M@Df1pV!1NU;+80EP5AAlW zmzS64Pb|zY>~>B4Kjw1KS`E$gw&D5HFkCO2SBNd>`cTQFdErQTb+|lKGp??B9I8`3 zEj?&MifU{5q2TW@^D;)F(;|g65xke+uO`H8(FR6_jO5!0zMZH28zu&p3>nU-VbQ2z z80m$f!lLqEMW~{tVm}7@Xnu_qNx1Jpa2FADPh?K9arH<(S}fbXJz)qu>^A@5Ot`JEu#=^9<2fG#&3f z$8At;ueJC+1TJ_1Vpt!h!)Ot*9-(pP>U{>&JU2Sq{_i6|LXvNEh4B5&Yf+(=k6BUbW?i zpN}$}#&3HqKL^k4BgAxh=pg3j{rTlu0_x9KH8PtW(}B@;a0PkgD%~QK%X!QXm+RWf z#m{K??NB;i^JV>*hOcNl?!f%m{FcSEgY{-QF4wsoYhv0lDW)BG9MNANDwo%mdEaOB z6)pEwq>C+gc}zRlKhbjWcx8un@H;WHV;a7q`OWQ=-|Col;Iu(oetR&DRnj&#`JH+& z!qHbWzg>ukUB7FQA9n!kXCB8#>$euuvEzl`tyw>&;VYWo8cfILwKdB{r*$B9RvOPozf|tgLJXuWk5{*PDNVg z$NG+njz2BG6Zx?ZqOWMVBckI)GX^5RY)rGgSfnk#KGE@qIKGlk_sd}#zM}c{?v!6i zO#RMKI@a$}w1Z+Z_FnyvAJ=#E6`g+H?-$F|45oV}ng}u-|4^)96Kl(F8`4GVgy^{;h6fdf4B_m#b+p)mSdf-?Z~h1N`IQ~oX0;F?8#}oK79kf3p&@I=6iG=pHYe} zH-d6`KQH_F9Q;Mg<-R7m3?^;oIgXtX{ZNRRho8;skgnG-{O;PzT*7}v^LP#uvE|Of zLx}u$Cs;1q7A^PoPWjd1cibBAy*>Jh=7*n2?2zAqf8uw~uwgPkuA^vvvy@-7|Kb9! z_kBM$Kjw*_=j+gp3y?1M#WZ}?U;<;M+7F>Tq`N8_fYEgK>+>TzYX#C}M`t3E_2cWF z=;wzYv>o_;k_Jq(9p~XM+KyW~<+mLlOs{ev>lMxVrcU{Vahx+AX_((g{6+J_&l6Z| z3%6pw(H!#YKM`Y{>5}mmu9{O`To@iwb#AKn${3zLV)%%W!!k2dQ`5Z||2-o;efaR< zsi~MX4B$1p*UjVdavdjHGv=Mv)<4MFMostT1^i>IG_=>T?0u-#DUEn<{M7n3e(E08 z_-Q;$=v#dWm*EoiKV~YX`S#0izO~f)*Eq+Y_rG2KoKIV(Jh(0)H?i!9+}euKW$C&1 z=dQS9P+5=Mnu_$?JIfj_DKA^>O;5mdeeQ_d3AwCAJS+9@Q+wV$F8zz-v!BEtL&;wxUz*+WO#S+1OYPg> z*JkKDmfE`^T9fM#3N*aX%ren#caYaZe#-AReb5@8kA6a%doLgS(ZO1r)R5{e|D?q( z{Z@yiGY_%!8O^;>I+u=L&i;$iz1IB)MqNo`@K+Vjy-ZDBvXGw`@pr}wd~ zPXDG$oKXQx|LYz0Si*<#NZ~&l69M&+PGe{K*M> zlN0Xv+)lm&(>?ZP_t^W+Mr=7LP5qzQi0#DPeY?x_w|wrL+^dOG8~3_>ZuvZLa-0{s z<@25=SC8x6)c=JecROy6-S_l}Ki@ec{yZo1lGgaSU;XZgz2RQdTI0{{wKqN?FeqVn zy=~cabnabtyf^-jex~=c<8w!Q(;t7@KiTdJ400N_Y)Z(@D8sMn4r<(YYrU=LwKp-Y z*WM)eEI zF->5Fm3{na!kInyIz1O7&CU;()p^Vo$!$RRib_TX`j=auki2hes$!&v{`Xq^*r^cN8-Oq zJhj)#xUUjUDV&v;yEnJ_lHRTOmjQ;ejNjxwk-IVX_A&3FUOmfx{fV<8?M1^_!f(i~ z;J7)(8^4@tA3Gc`_pZA?*DZS_HxA<^a8}QT`hDNI>U_yr*nPVrg)B(^Wrf+0(+AKOE6ZJ zU^;$pc6@ZK^n8J1rN{2udT@z5I*gS&+Q!Nq7%NN1^ls|;+`at*yB7yWo_y|!&gr(v z$-r2-ieqJ9BF4(ei5Mk;v$kyNog1HizeY+%nWe^gqyO|1In%+`&Mgw_FJtfsr}0WgSKo6<-HujE{X?szKRl+U$vJE8J9aACkd8K_UfUcP zH27n;?4>bN-|79ZpC-HI%lf2;u}4RGYw5MvIVrk5%asrsd33Dzo`wTiak(RbpTS$@1BpJZ(J4_VpLF)3)- z5njs@(XxJ)6qAel@KI$8yk!!xOuu9oZQ(N3atm4$@Rmx#QUh$EmnsRV1|-*FI@*7J zk6gTe!3$1WubBSx`{&~Q)h}Sb*jA@#YzV27V(R4g;m!N6dBN`~F5%b6pYxBV{7>vO zl!^6|oF47Bi}&|@!8xmU%$SI-`FZ7D()Asm(J%7Z*&LjQNyGiI>v=HNI0CG)A zN8e!`3`pk)PZ+eu`+T<{FE??-{^+B0Z;SM6*Kz-unBD%_JGQE#x~dWvx6V(+$>UT8 z%fq3X)Zs%ivQi7Gs>0`|7S>c0hjB$K^{QbdMd`zf)6=iENT{;5s-`qtwcuP{IXu_9 zYIyG4P)%hhTstfJ#i6*^#-2ZGdTpqtcGmcXdFAtF<%DYIMyjf3%?*`@&A;ksI6H3M z^3g9GHrKn_RN$47VK|H4Atux2`j@c$1U9d-wtP-ys3f%**JNz2f2n24-00M}nwqM% z=$ueEGzS;({766Pv`ArOUTrk_NMHk~yJ*>Uo`F$5zi9gA1sk z%92hqCKc9=tHb5&%EGYb)T%+9qP^;rb2SGeR^+WYEISR?D8tim&BSW)7POM`3jBj% z!QkkrQ%7GJoHk+RxM0DR`Qw6`Q(c7|aNQ^78fwSumW9)BHIo-xs;WaZg^{Y73oZ7t zCjPaC669WlYw(pU#xJyOoFj9;9uaIC<&kn;KSgO_tV@;0=NS{q$7L}aT+}9q zN;k|a7YRKNm2xOL8tL$E!Ex1HDl-Zdy~tZ$HyCv6gwS=JJK;jRsY5rgG2JejF)Rm{ zfU(_IRo0HJ!UbW}qEpPl%gsW{+HvJvpq8n+En)byPy`8ZRm}XUgQgt8d~$G+%CCbr zdGNwxQy;u}UKN?=^y-4DVL355`w<7N%ZZDN3p%VZ4d$~W1J47CI;gMtJm4{1mYpN>79b|}FTMA~<{kk8K8!n7Y z^M`VD^5Cf}L!AcMDHmFGq^6|2v=ke7xC$R@B~|l^a1Fkqur7!#X-*~LOG3rr2tEeV zD(8j6NIu9kfqAhXHW=U|7*$qP!)+1UT{KfKXKtwY8=i&Oc}m;175fV@+FObf-cH9` z(tB%5ido+BUPcH6!=b`jujICXmq%O3%cw2XR(|_(EX@zK748SUCEMq=l~@{6Ag9~P zW1y`#2HH!DF5_j_woqHBy{NXuP%HGdddr_e6xWR30sa*3<1y?s!(sD2@voa#6|tI7 zg@wZ<<@1r!e{Wj@ip3J8rge?!axV+)X=@@?B|fEw1DZmtPR4~58TNzo!v0|CuulAh zZ7ITr8-K8v_a5XsubfA)v-PHHEa=S&Vq)~zR z-V=ABgbJ&xG4}i^mWExL7mGVY%1f-Uh$B;XEP1yr1;_E`r8yyN#rP;#h>!mYE2<3@ z))bf7bvUNuM+h$c7Z%mlVQKCl5kimF)v;eK%sBQadfS`yrtuMlsG*rf3vt8}49<%U zaL(|oqJ=n$3I=%_LF`O~J0#Zpw)DKi#y>o(z&2WG6-AM%1;w_2D;{flL2;z2q6o3I zjIKo(69};mwV@#UiT4V59nv`t)hOo&h~gs)s*rvTB6y=h75-fxKaWb>q=QcG7*a|^ zj>X4rQB7gZ!r*)!O<`#a3LgA*H>+}9MNtUrS2sjV8WS8leQI#h=o!kru()_04hK+i z-av*zO6C>wz9=g!uBx@d+Hy=q3M(_ccPr*GG-u$i%tCe5R?0PkF^uEg(h7`fj2Xm+ zOT720IkA!msVb-{mZ(*hG0oOs4#C#Q zR+aj2+eGUSB3{Uw4ts4a_1?p5ve#~Guej^ZYq|gKMc~c5m5cBAYEp<4>;V7Wi$MFl zo@UF-ye5}faS?j1xT<;~KNZ?0&@40of5mKHMTV6vtj0d79MvoG-%EW^)j5R~6@^~K zv8FhmZ(i+-!uZ!B>mr4vIFxLkDs7+i=VRpKRx~fxpY&7s)7T}2DhkW-fn8%5me{vp zcTyC_diO;K_!DS8Cp3fI;|0-!g^{vgsHVodQ;h@L>jZx+l=*`Jo#ge2KL8kF&v7mL z{emfU6V^T6vD#}&y}t3Liv4c#217*#0_-k-b#mombz)U}y;tfJ?J>;sdM>7crR{A+ zEElJDav?Z{~>dT73J%xq%XkPI>Vo%WLOgzl-TgMR=)(VXs|T%4OO8{CFB(UK*FUPanMn9omBe0Y2JzmbZn`S>Oosln}Vq*CI0 zwI75`Tv6>M@~Mmlar3e!D~sEwi+MPNyy{A8D!dvEXAWgG`SZ)K^)f5N=MMXd#Ui@6 z+{+uWjHs>ln|B@p)kQUP^NVr!Fy}DfEyp=A3v!b4qYE-y{NJ`5ra3!Og{6IQ)Pow; zhP)+mYb>GonAN+CsuG|5-cyBFe9%hW8AoLUXLRMnuSj4HU&CAI5XPU z-KSvx`)LlHi#q<`nJmDb0lU0lkOxUTw!qkGn~GHMkg1f%NLIU`+TUr;Z<`7R=NIa< zLa+$m-6A+05sj%`fKLc)fJp66ltz~i26HFmjkEb}5v9?j(TQlv`O%4Jf@oGaJjGF7 zDZv2^?mTCRAhe*oB*f!aM0xK#>F1~L-Wi;SqbJUf9xO(xykkV}j?j2-&;cGYqWRE2 zg!Cf3V@NLwyAgC$rDB8VCr6esF&0aQl*8@=n3|wHoj$N5w}=^(vtx!Km|<2vzasLw{m^w1Lry z`O%&TwoT1%t8UvAHw}LS@wX3u^Qh$(;cXV)7h?o!xoH%8Z`w|3{jCEF;8U1q89jqV z3-Js~uyB4MzEhMgsKMv9xA|d}TWM`5G?(uYFBA!3yw!xTUn#L-oQSBw&fH2vIJCf{ z9o((slqLz5me=C(n3(TTwV{ggvZ`9_Mdk!+7hoUgeM!R?te6=XfYB3j{-a14d}L+P zJluF6#>vaV@L@iP(#=A~JISpa-$ToBA|2JmcUAvZE8G&7HG&Vm{Grf{u;c!?PJ>@*1GBVnGMvJGIw6u5L+0Tfr z)TIqng3l)Ca!ajuBG}Nhadn~MdHiOWj|(%=xrWCsaBseMW-nsTm3!_gfdLGZ5@_)ErC&uY<>+H#B?f8Mlcke!H5m{W->HZ^Ts=UpeV za$HOa>a?f24`(!SLSvja97mUw__4L@KtAF$y0XN7#tdJ%xrWO5h*Paqd5=fcawUdp zDncdY_|U9HALBY1zUP-?8mAU&g5F??ekgi@;(0vz5Y(A>KS4Kf{z~*4#%iD-d@NP_ zPt71OziMs>!7A)gy$!`boe(Xlm`f;EZ|&%`gLJ+^=dE}c|W@++;sGGb`qw@E*7^!iezzXowK zqU)ZE&)ocXyR5d&$}e0i$3~{=_Ws9*G+Ck{yxvUgckdVWXAAG9GDnP(MuBD zKCU<|GiaR?;_3mOWW=fLQ1RTLHyup(``GWqn7%peLRe00h8ft(V;;P;saB9-1vnww z_F>!kS;?$1<&`+AnTs#`+)5@C6`_;od(UTfT!rlU^x(8C^nO8xCweY-+L++9VZmu5 zg5#`XM&242oXYj!zhC6JM{GDt} z^Ex~>nv;nuY6qLiG3i~^D#uxr1zIEC3a>6K!ADqlo~{CyR~BPWi345kpxSdAKBbh$ zO5Lu1Jo8s>{(LJ>$5Dlq<7i}P%+eXdxvMU&DX)$cR87EnyEHkKPY*=cWQ$pRR95UJkdZYO=jn3r$y!hqlX>^+8jt5@ zbg0RUf*@*Q9kXBo-pbP|VwHkePhQ=;6Xf_1Ywxl4$5LaT-=1>Ggt2&HbIMe#tM+HX z+hV(2{ydzA<1OnMnZfAOoRd-Ep?QAv6z{|2e|R#rL)vaj$xQE3pV5%5@qbfJhRT_ML#9I)lAp^B-(u4L7v+p>@5-X0XdY8|9x8f>-)XOt zIdV)*RbdIf=tes3HL`N1;eg_QvlBX0zTNDT+N(HpSj?7F%j1!7h(89fpu9HJR$Fb5 z-EK3}h6eKwvf1F#_1Nw5V7YhPUfZ{pgN&l|m{HW;?-(Z9x%y=4K-cPQp|@RTc<-6` zdg$#ucsS^7!_hr+=lJN3IVQftez_RsWCZau6Q0~hmRDvfoXPztE8vAYmY1%bM#tD_ zExam4lW@P1-nL`O@TUAdU%K{y8TKt+{;k9Q!yM}u8w;VxkR)pgc?yA&VbLRo~5 zL^*ajfBGXEf0)bz{1@ynnSv*A2I3Ese$m#U%6v@EvCGIs-sJQ!sPQN9Z(iFo{vFG|aU??>l#GYUBCXZUmMN*1}t%lt|Xn*wjxT*-ghZ<{}fe<SuJG#Y%Bhp-~S5wJ)YoofqIp9OEs}Wq>f+&ucm}DDrB1h*WLQ&qeFmp21b^85|E;!HGM+n1Wyw&5_v>-fXg!4xbNlWzk4i=de7yueHC z3v54ls+WS3DLA1E;cIRAK>}2j-tJ@d%_J-_c#z$Y#?PCWbcHys^LjwLh zmv-(eFnN%Tmnm}bhhfGP9CeuFU^xqa-3-1_?F*zHJXJPQ<#~C{;E@4G9R?rA&02r5 zb3^!#xE^FyKJww_(@h&o5q+&UtIPOcw7)4$Z{L&-k*dp1r9FcJX0XjGrhs_=P_NyX z+_??yOB`O2hnLDL-QN@ZPjx&+zWJbyw{$p%f3Bk z7Bld7)rUxRc*PuEsw)qx#6zX(hbnWg&`qZeL3E}!tIHT-G>b-0weKMgk*doWYR{mc zJ%dA}I=o^IFV*3dc&Jn}&~$$GcGGG6)bKxSyR;@ctGiEyRalHW)NXR*fW@4H&Eju= zU@7ANl+=}{BJ~+wUR_2Z5_vylgfDl!FzKi2vfh{~6@U2dMpC>DXGVLrQxWOCqMvCD zB;wDpY2+jn?%IuM(Iq&|Bz#2|Nx(GI#o3K(oM=KX;3exm<=WVkYf&x#)lHu3VpFc` zl9Jy!Prx54tUTH(##sqifS>o#dU5&?>EdJ3#s6>8ZNKVVvpXcdk*X5fllkrz_ke&Mj$brb|&e<{kC4Zi0f>+Tl$I(p2S;zv1jQ%UyY%bn? zKlzz;=_fAm1^&ABjlV#bzTpD?tS;^3tX40tE_LRtecr5YYv5P;|EMe;za69+oOO`O zbJjts!C42XJZF7~zixKJpCNjWH|tR6>$n@GyU9MSfeAxGr+r7NH^ej{PyV9v- zxc4hdUA`GH6?ar9hWM$vd>!K9?k@as+-D*qCgU`syjOITG2KBb9g{_TOcq`Ca{mWe zq@Wi4@YhY(4M6nE_(SFK?!Tgy=RALpnBRF87iq*_H~X_~h~DAN>ass;M)V?od+gFv zoOh5F7qeKG-uZuA?9V8T>#v*hb9)dyAJyxwM>voBsBQ)^7peDVb=kvniTk}-UB=|Y zh<+D;C@hY0Gr+VYIK*ADP8^^kAI$JP{ zXII!5y5FC6>9Jbv^k9wQyfJ>dI6Bjxb}5hj*%|cz56e5z@^NN|#rrMp(izd#;M_^) zH8TQB<@uG4qecF-ORx8*9eS|FaNaF`I(rO0<4-%AVUwom4u9JH1}6F^Mx4QLxTa~g zKkd>>{pq;t;qCsk(*Rfc)9%mUZxp{B{#o${C^kQ?+$7jf(-*<<{i{6PyK0!vY!~=xxe=K z@h)YbF%9kKx6`5QKgJ)bAFuV(#8LJo(^K{(roBGh;7_}h{mL|SyFcwvuV1mn$M!G# znSG4(F3nQ=Df^rGQ1&;=itTsyKl`5Xlzq>9V%NcP#Bn_^o<`RP;*GUPlUQDDe$fFUO_0Fn_!P(VdRKvcwx5kyqPEar%K z!JH8lMS`e^2^273!2GRMRo&BPGhXk#@Bci1L!DKt_O4yIy1Kfj+xk6X*stfoANK3z z@UL__F9XAV{So}TUASUdY&Mgkg5RI z7IX>6*--XX)(=7n?5emBWi73?-unP+t(U+$gI&Tl;~m19+he`o1AaH&VPPG@SlD%O zhGcCX0S9j*06Q_0XvY)a};U%zI5smPo@eX6rKX5lmVhBP zlr=lcc!w9#KM*EgYgb$9R{XUL(2o2SZ{H~ z4e5c9NjCIU0J|V8u(qzZ-qiqGaYKtMZrECc?lcO+zXI5b8~zi#*`~G*Td%S9P!}*B zEdX@|UB7I_gkQFNvU=GHdL%X*ybjvO;@t0m(|piI`DOc6?3mRls|H?&oG5^Pj_y|a zqHbmVvJCB45!V$7hGNS;uCL!bi(9seB}2p;c>?p$D&nC1f)i zJ!Key$%IkLMivsZP%g`4vpfuyE>5*V0S2eYT34+2b3ENH%P*Ui#oQ`Yu}oB;uGxjz zt+Hz1gC3Qlz{F9|$t|NykqxO_MPID5+hrL8sMab4I#&3??5?nZ&XhouHb^dy9_*MD zpbnX0s8BsUU?NmLqsHH*U%{VIl`N5n$Iuv*Swf&oh97ptI6x@PAiQ?(N)YuHG2 z*peZs+XA^{BiAdAhV*Q-`Ysv*uvU)Y2}eOkhKK#3Q%niDEG%cNbgpbNYx`Um z4Sl7$)<#&JtoE?njfrGsb%D2gc@qKOl?ewLyI{|FcflLyIV8~ymFk_LXtXNqrHnU0 zZ=Z^YT?ldCPVgwzFN|*c5YDEtx`g@u?MrgD zpTy!L1J%blRQ~vwc5zd#GG^BrJbyZWOPqyl}%sr;6iE;900Ry?hgIdKfR?#CtTNjFXTeR7mR?s$idoZZH5FV;NP^N`}@gm3a{=u`zh&cz8HHmR1~>8K0vP*?}rI zE}fZz=qK>Ze0bQ0N~>)AI!i6#(e+DZHbt7oQh9i2DU(;BkujdnXl#3EY=bkFxf&j4 zuRo%lN_!1UW%4p(GSB1xbi_{&WgpQA4kWUAfoEP0wL$QxGJVFwhXM_O3%<$A8Vb(v7sufO0G`!wm3w7p zZ3aim|3VJ8!K0gHW+-uBIe+>2a9NoKLGtl z;3DIu;N_8xsNnk$(G+|YJW;_LF{fd{XFy^K-W(oN@Kez6QNg+Sd>Qq_f)9sUalto2 zw29*4g4-f?L!d6m%*?Xy{ z5*6`i=$j&zh9@fGa^@*4;%7+26!A8AOcA%@gcTK$`#_b@*`gx82DRcM9t{!in57kQ zH*?9tw9L#r0fqS;TxHx2v)rJ;D+jYS!k>9IL`*AdH`yAn{bYy8c7pM|kXfb_E-B#2 z{vN@3@MH{vXAkUD>0c^q93xEU&s_XucY*Q+@RZHO59hn!7hO85I^_*1p9y(u%6}e* z;cQB!%V+8F5UqkJi=K+;*;U{v`yq5%Qm2CMko6^qD%Te@`(tRGPl1s0+XJ`O5T!5@Ug6nq9err@hl-4~;1X7ail3A_#$75rML z6&IWvY^JBkF+7)rX_uLKVOkNFGPHeW=9;jG>yefz;$-wYQ^beiiHg`4DGxZTh!4e! zcq#Nv5xc?@6_M9)Q4#YXF-6>l)Jzc@qdP`L3~$IsMf?+LgQB+OnPnBbO00-wIEL9t z?}O7vWoGU~f$TVD7vIHVwu*Q0Lx+X%$}!Th3j&11PwZVD#&<)Ky^vKN+R*aatOzVA zF;*`VYf>#2%g`{EArMrckarLC82WhVfzu}7w_u-NDs|pcAV%|A-cL)bVsr1tK!f##i1rAl$axUgmp`4O;m4M zKG#NZV#Ru%xro$bf)~;Rd8Qm}4x7rWku4*!Whu_YW>#RN60^F6B`Ybp?dgKzls<^e z$UN*%m*kmBs~Kf6&;!uS(6Ko*)xh+w>2cVTIv`Yh{xxekvcq6|2^@8BqC%KXDt@dTYIoMY#3mo7&E&29L@Ox#kU{ zG%SwNs5nX^5v6%NmFC4!3W}o?h$uZiH*I6H(1S_VF{!5>LmsWSFYDNP`|z?uy8!oSkYLqkix zHc{e6zDqOmor!3Td>`{4j2ZkfZty2(&@^8oCdi{ouUPJ*VniNO>MFgMN9*m)YO&r_ zacH07(7wf?eOWnHw;!*8Ohs2IGKIAM0j9}RW9Fm*GFCh{R;jI%C%9?2N*&rvE{!Nt zOFj|Ox<>kCM2)l>FS>D5sb{3UBFa1^XN0sq^VP(^YM)hZ%q|1E(b8r^aGlx2yQ-P7 z)SN8iQ$%QlS-DD+Qki~ve254@^=;}k(iOsMA=Uf< zLb5$vr)Hb86N-Bzn<}F@5;z1yRgSEe)t;$-24mfsYPl1!J}%WSRBsijV~IzNTdzuQ) z*O#LXi|4(nmwK#8t&It=ffL-k=Oke`wGQ`RW@4)r2^!C@dah^IGNWLl>O%WfLuJSX zUip@^z#}Mrn5^pip4PRd>&PI8*8nzO~#6OtB`+cQfPflI&b4$#nGv%e(CX)4w`M~9z&aQhQZR-JTL;4 z{LBCwf@Yf83p<=8*omeZM#tDyW~ylh ziJfY;VVq_60ga}br3evI&3wpXQ%xP1VS%El=37SLRC5Cq%~S)aDc4ST__RdTJt$Wl zw3#VaDR`oCg(}76`WjYDx!#7ylSrXUC1ab*BU6Aa+xWVkLWCcOPfN=F2I;xiwIS}_WZ169O-k> z^KOGDI|a{!@RU0Wt&p7r`xjVQPOjS+V~6MFzn77Ynb3@^DzvNa^z!XwcMYN$8DcW6 zV<_Dhrgb5<22EPS;W24_%d{$jMQJT$j3}*lLwhEzx6{&Eg=j9Va=UOb+BT?$dcjfk zJ2OVwCX{_Z5hzvA#Y*Juq(7{WZzPDFqGYgiw~D(Q%-NZ zdszdn>R+Cl-%K!rnxzF74|zQC!Fi!QbD9W_dJ=vf+H29lc+9Uhzn;~~&>g9zy=)t7 zzA2}iic$2z*=o0i~c%la`LMoc;II84PX0I3%LwUVn zL<$mnBt}w!f~v%r;8;d4NiZf|P&X{D>U;vz!jaLT7eV(f-Kq_OdY5iphmbvqY4y&Y ze5f{IN`*Rv6JIdwq=AN=Jk!AROAO3dW@M+{Vc2Qg4a`z?8E2d>CZ8vaD<%U$bu52U1^(_o6n_^)3MFwuTpHTLOlUXli zS6pb|Ms|hXWmn#1*v-!wxaB^!e35-&)-m*srUBqDcn&UtnOsJq8ADGBD_Xfx*XgXM`bh4Gg`ZH`%at28MrS z0!O@W*vRh<96hWDRYsLf5sqDM*zq457@g?Jz%jJ}sY>1T+Cjt~`fY;)^w6Wo2kOZN zhiEows?rF(uo>}az1H9{x>a-XfOZB|AznXL^#vy0<9c#y z%AeHR41Y>5G_UeBOE)t3jGkxkIlaN?zo2Wkq5LJi)!2JQ?=bS$be_rQ8@fkl z%HPz_8NIhOzF!9Zj=tW6zpKA8xJ9ot?f1TZ&)`-)$h6xwUBTdXz1ZLm{gc5D^bUhN zb%ANO5A_s-AL*M7eyl$*xJ%bG?e&R1!QgKFp21J`N`s&2%BHg#7+&a~ezdY-}G^k)Wt*L_So{GsO?y+8Gjrak}CPaCd1+@wc6dfvAN1FyRYPk5_L zyrg%YX`c-52g5VHl}0by>t))fthd}?IqzemSKjMk+NXkd$k?gqDbp^wUR#sj%HCMR zt9ZMOURAHRDR-XthzYOeCA%m*LI8*JROjqk^kAQ%8?51SGbrSVvXJ|7g*zY7;+-D}H9A?1jFewlb7JotE>-+4DZh&5B;WbtP`Rs7 zE(LQ{HRt`PEPl6?pQm{a=$xI;JmPj4TLtBZZt1~FdXy24yLl-b8 zJZt;?QhrU{ok3A%i&Fj(dIW=_Tn&s0Let7sp zQhpu1Dj!-=iX&5gUCmQaanR8zznD*=E6&78DZjbq zsjt}9$tk};^EB8`;YdEr3}X-ZUWBN^2l3nPG5nZz%FwA~E1%1n&YLL4k(^wVAeK)~ z#%T-puMs;r*{nUxBx9BY#*qsboi=t2`TL(|7Q~TyY$mA!NDG=PJ;uy~XjH zrj|-}_PIQ?^7mY>A~SY(J(cY0bMa`E4o-kKZp13tQH2D%`CM8KFqK|WyQV$NVt1eG zP^(o#b8sGRGL`J%bA39{*sAZggi^_#K9{Q~3Ro0% zWselX9x}r34y|D(p&MWV!*-<4YXuwe_AufV2vUXD;CFZ`d9=^Vh!G~zIz|eujq-V6 zVFj^ww&2*oapEjqPLWO|{vU4jtit0ZMyl@nL?4;+VlBf8*T(!|Y38S%l z=1~oeF~jGDtX25gqZuSD?52`4eO~8UtxVr(y@8;-xA|jJr`i5nzzcWaryUbWB~SHv zX*|lbRSloR?==6*D5RzdndScyg&bi*X8T!5oEaDmmBW{TP#*OGDvV{^_CVtnL`psjLOTB?vLa&8nl_d5@q{ zS?32UBUu9>yC7H_$y&x`c`ovW!F!QHv$z5bFAjc;WRD8jML~roVTRfX*^;1nB3m*)z3YruUOt57Z;InSlMI^YGqRroq?0X1}6z|9>iD;tjt z+3f*02(0X95$}$Gn?P1pUc|dI;6{R#eJSGI6>!tY$_@zG-2pd}tSm>^yeHshgq2kg zvU>w=SXkM&!seQQn^IO*QN+71;KqiPeJ0}FA8-@P$|{L?4+Pu@v9d!V-h%-*y{s%( z#Cs^<#)*~v5|0mLl{5=Z;jw_5 zHCExrGz)I_cs$_loK>irX2B^u5pbKwDtsTefFAQ?z^yzhs}_$8+1h~HL00yii1$>$ ztw1Zw6YN63ONc=Sx*PtG_+dP;}-H-7%dKkRMx)&ZbezGgK4(h zSXv)&&(SK>NHgQc(uRPWSXSYSxCK~$Cg4V;mF*X@X9I3tTGz>P2~t0`p9 z2iz>PvLA%a7XogCT3Ia-@5O+dYF4&K#Cs{=#;KKkBV;cJ+)TBy+QQ~50XOEXEMLf8 z4Y+w{W$%jF^o`*9NVZkTHU^JGvJZsp&0td``&h^}1z$z7Pvf%iWcpT+#BQF=(AV+P zLO9so4!9j`6%NKNpheyZ`bM&!g=}*$DU$srWbXzGBU!G;6CxIcgfLg{1uG+k8sW0i zojA7y>mylyD0BVt{eXMTHna6Ynd_2U1MXW|+2VMjD9E;;0`?xQ>{21y9yE_+R|?sV zpkE}rMs$%60`6m5o69_A0)=#W*%@$8)XHv*+YBqmvLF22dg55m(ucQF9fr`2)L1NlYcEOe@@}cfIGxi;mx!p+#J0p z@UeAl72Zip!YS+xc#ps;Y)MPPDSQ=h^Z8h=WO#E|XJKzOmGyNnC5qO_XWvBAyDqvf z;O!S{vay&Q_6OX`x3VT8-hqI(YpkrPi1$svt$!DuD{C*}{TA@Pl$9MN;{6_QH{HrQ#N&mn z{71l>Usj=GJaSmGe+ImpVih{YEui-P3V5f?$_nF=AyWz7b+NL}@pxg%I>FmtR-sEg za+tE0;C&UV&^2xW*8K$Um04N0cx1?e1n<8LHr<#D_tNO-$pr6>4mQJ`VOa<(mEe6+ zYoo7Ek(=CMBP(%MB zYhhsAdRQ&x6TJOp6-FJFM3_#6M9WC)n8VTu6U#~PmZ-IL++m4@DOO7GMw`_db6AR~ zt;&hjk;2%+5`#jO1aG-o3nv_w4iu^;cn{Aij4LULyhH*w<*dT^l9H&F;N4uSFrlO* zswa4R&?-!fCxPT^Bu)8(^6g17B$yemSRE}tC}ycKL^SH^9c;g{#G%{nC>i?o);t()N&Y857U z``_BSI-ZUhexX*E1aB@|t?S|`q8D~cG>Bx^$J2qVdx8%W*m%q0)*my z@-=aJn9|V1#x$k-N>Un@_%2Q9{*si2Cn|T1SIh%(C1htrqEnjuK_MTRI6h7OP+T5n z_vpkqaiucp`vB3M<#NqZ7h4K+nZqrPadsBCfl*ULU7}=yJ zMe<2f9vXQ|Ul1vs&Sf=vSajbhRC-(A6DghRlsFN&dtl|>(VHUq1yUXw*{lylN|#F| zWcOWNv3pqN>!dt1@}6!TDcvlUU}THtqiMEc?_p)5I8nuhM&8$aaP2tdj&d8~%|xT2 z;#PfAn&Ku`iv)Mmu-rENa+Kl@mtwqbwrf5RSDe`AaT|6vFSkRN?h)7dA+Ey=p=2NE z0_d2zq?|Tg5=DzAv{Mg*LNuY^y*6k?w{6pu1N;9_cRr2i>pqCz0+& z|DgM|F4HT_?~;Ge-KY5kuPxif|Dd~HPmXl?ceDSl9uDZMBHc^>LH8TIKGMDHA9TOf zdn4V;|3UXVo!dJs8~+UV-{tpv-96I1@*i{$>QkT_4aW)-OCI~h3WMUK$aLOf*~qxe zjId(a=(tS8J1H(R@uD+MPQ6sl8M;Xd&kC7H=(jnYQaNYp&I~#pKRj}l^daa}&RjhN zVIez9PXja4U(VGuf{HV@d+E1#b8mo8^}iXvg}33S9V4W2&emrFZNwE!_^^n0Vk2js zekjtqsYI>3Lr}o;PbNdi=cvKI9>JXARaw=L+jI5%k%3jtfVs!aAEq#0S3y*pkK3ez zHJ-{@ppS}_?siINAjA}KsOoPm4s)^C5z;ZD}Tt6$hn@^<|OL3obtI@rOn((GN%R7vt%>_?PN;BKb>B z&h*`BGUqb=T_k@wJ%5+$3TT>R*j72OSWznH3f&BWw#i;CAwO5@?vebpm>fk}s>es7 z*PVzE7Ue2EFOt9Mk&k=%$S@GMBqcD|oo!%TNz3s-I zc?ivnze+_=@1KX?LaTng{y9?L93QSCPAX@aZh&Y^PUUQIn&z}^+Q=AA)bE&zz@n?$TdHntx>Hn>-24 zRLDy-bAJ46bl4pT6#46QZ#xJWDWZ?*2z3nQ(pzty^5-x+C@ zIZO+QJ)k#63gr${2($E{-XCdI2p^O)<##1}NLL&f7QNzO3Za>Yb(=^l_b@Hw<`I2d zq)_EBh0x5S`kY8B?=UTxc}(9LDO5Kno63E_PYlNTpe}xR_amz#0TVkwpTu-_{Z?TLxp1!?Xh{t1wqQ%df^%iz_zkj7HE zkNOLun7_uBVGup$-vAM7QsribZOO=xJ?=ji$)djLWKZ~SN3xpQre>epvsd%EPx|{J zg?@)AFR6DtE142Fxt!bC2dymO^s{3*l4#QD8QMW5Wza3TCd!WA#FHoj)>C zot>u2JYhkR`?S9>(zv8Vjeq&8BaN#=jWGIp|HVkSLJBwdpG3l2Lt%84$<&|m|BN)& zl&JBnpFcD#?AkO97SYr%4L$Goh}1@g_nb{qky_qm&?sJ$=JrbEzTi)bVl@n7nVK|b zUK1ge`=WnKq}3?YiYvV2zZ5AnPE&|$z3hJxX}$UPC3)4)9u^jOW@xOWlB9B9^IJ!% z^Fmc#nn%^L$sZeOoO_stt&vpjTmHgGYgnjNa*}WRcSfp@{(T|d@!yHm3POvfGU7F| z**_F%Z3&G<)z4;q*FR!-SQ&>()OgSD7HOz>N{qh6pAZR4OX2(ef=E~)E{tk#tG_bR zIHE+2ZT^NxqiLuSl_0F&?f$Mvt68WOuZSIfazt3n=4lFXtq=T$kygtzE!R%kD@1m66tof2;Me|9GU;H`Iy-cUbgY{s)oP_`lWq#MdLk@?RWk zxoLH`-!PJ0e)~%rhqu|VZ=1+?h)`SYCc3FP(mCyZ4B85jn z1sC}Xe+^_fcjJ_>-pNwAU;3{^FNut=e_InCnqVK%DGOlW>wk@x$vBh_k$t2(U%{>_nA zlTgcSdLL%+8~?>fwOx24!}PC=QK**wW$;_b6MQQ7TmPF#wR@<_>b8GHz!E|0JHHyD z*qRs?Y8iva8iQkLa3X%%S*zds-6H)H!h3qI5fA#OLT1mYr{Ll8JQx0he_0fMMlAeC z|Mtk%{4i}7=O_PPk?edS``Oa43ETkHHTQeD$P7f}U(|kbN1%7q#^})Z-ESv(_;92FVRWOoH9hJKFx8 z-WSmE#s;bj14o+|MX13W*ne?&)pVhc-N1Gk_!(Tu?F)L9ecNouc<0+@kGQM zDeelYy{v5=ZzXv{+iE>P@{TT4gNMOqO4iYpEW>MWOU9iK@2GHSu(>+u0B=}_&qO#? z7cN0$+v^9LxfS8w96k8X&}NIsW@Bsf4W`>Pw8`OCK%0F-n+-d{uaex%vY?wiD)iRejUYr*fF#CA)@PNz&A}op2RNE8liPL)!Va6FyE! zXW!+7&D-0zJ<{~M{=V&zCMQGu8mjPgL>R&>=UoDyy*p=kl10s9U(I73p!^hPU_{$SJ_0^f zSO&kHtI~_Z8*KYy=Lun#>RMO;nd=sekw*inuor%9aZFOSB*!wacv@g!-VCG8G8N7( zL2MpfDZH8zQ#r<(84ZPZrK_8sYPuj_pQ8$2P8XYU?n0RBp`XKB_!WKz|AZeN-g)lN z4-54;BxmeZfY0s(7FLG0ote1uDdyWT^J3z*6!Szswo(>0EqZ|(yT`$!(IR-W)(1A< zeCg2G0xC@_L1{mgtp5J!#h$@8Jj*MnEA)YU!=5H;Id8>KtDs=FMF{*D)Q&(em zmqy^1Vc_@hX!}x!v5T26zPa02Hxf*m$b5NoDQEo^%q#NTJ3e!a0F~Juv4(KE%!_{1 z*w>g6-%ekgTU(3?6!2BvF~Qi`4CK4cic`1R&oEnj6=kt@eUq&tOzNS37g7)XtPPjN zdhu6?+CK|Nihh+Zp-^Klqbgq|S)6aH z`T|u|_hAsVj^m8*cr3Kunll8!o3PdStSpQqc&D`q zTZ!;&A79LZ3y-+``oD?ypN78;qfGnMm>q^OeTK#D&|gx1m^Xg=suf&eET0T(;==gt zi|}9=bs5I5ii8LI#0t0qq|MjYUjerqECbrDOG69vS!ot`5Q*z=g-(h4b`24sHV66u6V%X2D$mw-oMbxa;BAHXQS-;O>Uw zn0X#9JnFzx4~}yT`+az@KW~I%zuOG=KHLtt@L;}j;JAV+Dc=XEhIio>+(NkUi0jlr_zb6$MBQY=g$HHz;2Obke6Veq=CyFE;10ogG5xr1 z8_2@r5%`~ldme5h+}m*P!G%XjGR{dm;J%9KN&B?>Q%uhMGF_R^`w+&mg-14cB{j5OZ--k4$G#ID z`S8?%W8ZleEaO5$YxIv)-6etZ z8L&SK?(A4PCFvDF&Uvm4+);4d;8JjX;Re8sfIAxQ7`RDr)8WE{x;@}RoeA($Cp=0@ zucUm3ni@w1ri;Esap2G;|Q-*24<$Ipmd4R<}< za=7Q=!jE9?fPW_(zl8ZaoEM-y;mX4Cn;ZO!MHjeka7V)(12-LR2HXX3i{WmDTLs5& z!SHLA8{zmV%g^AxfcqBid${megnVBB$1>dsw*l^1IF^kctYq2Vhhy0SIF_v?9Lv@b zj%Diw$FePi3(Lkb@k=IQnZhzK?>*p{_v7H0_fz4R_a$)5`)WAmeJvdGz8Q{r=a(g! z_n+XxBWxFzV;vmxKMCoc1a}4Wu7|6X2(^(Og5r!MmbLJ_h&YUrM#+;7%-G>d#C!IEZ@~r%J1xL2YA2D<0^p5%CXPq)}`uG`B z^N(*kX+q0(6I-?%qq_G;?D3PwPnf23cX)fYD!`vHB___CHD~hN=BKo6tCG2;24<*C zzjQ`fes5VT=$2kN#7Ejnmx8A}zi+1av2S1Ld1bT9 zm`~Fq$Q&%H*=%r}RnVhs#ufS^??2XS;UE*IHEJ<9HTwLnHj0-Y* zlr^&-^AaAcws>4t>)*t^n=??oFd~pu|2MkhWEzJm;N5jlUtlJZQ`t%El!?1YsTd1vsJ-pDW9l%b{t(oxQo$Z+Kf4fJAQfz zD*t3!nrJa=@|4N5CeN5S8H0c3)M*pPPcN7_k-45Y^ORF&&L}uhp}t1VoOSZF8B>SP zoHFOk@v|n6?%%uLfVQL2_;fu7bRX1bbdPB>Mi&%}o;G9R^wTFz9zA=`B;*pY(Nc5H zI(71Fc+nF7y`kyTCQO_=7j~!3nKpj>*>h<3zc+?l!Jf_4{}g-DPy*bc<;-ZD#Cr zb;9X$rcFlx=GF<*W{jV8)(KNipD}UHG&4OVV^ftmMJCL7)8D9cqIBupgrB_G%fW1{ zTzFRow?ObZEQpGOxBrd$OD6nq{d|1bE77v_1&NBuqC}H|MCpP=%PIV=X#6e&ACCt0 zXCc`5k_A>b(1}t>e{NB7QBXPQS1U-=IWkeJMGz!1{hM@ABCB5_vwxz>phRvmW2wJ< zegV>g{tF6<1Je|nCo)?&#W_?=R7(0+=qb=|~G3iJJ~OhNESit)x(#~ zm>jdmD$gu$x1|5dd{#@ge+z1&UUCsC z!Y@Sq95{C!s-N|~)zo_;**vI{@cni3i<16hrb$f|6ol2stXOkNzh4o07!0*y(`Nb? z>5TkjK@t8TwW36MG`&V8qc>(I=i|40a?s(-e_{U3NU?g-e^X6KG(|VBT!iXxo~VS; z(9hW2uL_b=rXc#_FnXf=Ny1ArX(O$(PBbm86LpdWo`(S#R0&6BJq@F+OJf9lk34^f z?wB|-QE+0?-+3r}?0R~Xge;@6r zlK#D@=xjr3B>l~1Y(0R~YWweUgf&n4+s>WB22J_}Y@~$0OfO1gPc?1)_55{7fAAFl zNZ#*6-$?q`=^`g7Kmg1S&d6u@%X*y)p8}f&37<7Jm2v!Qby4zt2vKwUke3!HW&#s} zlU{>KqDrEazkmL^#F2~Ov=$NY!uKh)(lPCO7^%T>Af~sLp*`07*<>PbEARACR6mm7XM`lyg zX9oOJpDALWDJ10r5Gw%`9p1EL^4APN#C4ha9I1yhp#(;PMI)&=NR)%@)qWntxqjC(EzVxfW3+2^|iJY`<8=a;nfug`|Idur5)p8P6u!ep;~Ycwe1^n!U*+ zcwJzFN-!2?XwKiJ_8(+uQIw;Cl5?~OQ+zID{Vo!`TiPL)-9$wGW`bv zjHAoW#=MyHf5b_;R*R_vZ86_K={YnpydDT3@1OK9gbf)(H zo#n_JPwNy#nG<*ls)~X< zA57uYg|ehAVP3#RK{Kpj>bf-yH+rhWai6Ou+!1gL%ZIBCR|l>xoIJW?7b83Z_1$0e zPvX5Lb2K!+(;GOdET1GeUvX^@D<3WRaf0^{{2jrY2%aPOD}rYW&Ub^y^TT&^$9W+5 zLxOvPuMqsV`swyA5b_^{e4dc+7xK^=93fmUnlr&g5M?h zU2xv6it88O zuCn>NRmdL_oVPIJ@!t{rW5EvyUdn7A(1J~`__mkjO@zFw;3EZ}DfnW+R|x*F;I9b2 zOYq+W&yD63o8Ov(*AbkzU+iJ^d8;YT3k4q{_*lUg2!65Pyj2yqze4ca1YaZgTEU+Y z{B6Mx3VulN8fMdoIkM%iBX}>t`wBil@CkzRR+>GmeY|Zvjo&2r>w@nP{5Qe5D`pRC zzpmg-1Ro^$D8c6m&M)T1?LR5_cENWEo|R0GUq$eg;3EXTQt%rD-yrxag6|dl2f_ao zymYDb{8kpck>ITa?;?0_!TSq7T=4ONPZRt!!50dCvEWw=evjaf2>y)VZwmf_;CluC zS@0yEeK1Eu^P4MpJ;7TF-dXS>!AA)`N$^>M^ZTmyu=%+{@MVJED)_yEKPLEE!8Zv0 zg5a+TzESY^1m7X}r-FYa_&0+8B=~QFD?DEtub)zamleE{;57uVD|l1EI}6@h@IitP z7yMYkCkuXx;AaSak>J+~zFP2m1b;yA#|2+6_$z|HEBMEPe=hhw!M_vyXTkpzJb_1h z-{Lcw50c3f@idl;Fb!A1C-Jf}bn+<$~WN_&tI@DEJeCZxH+? z!8ZxMRq(F`_wmqnygjN5-dON1f*&jR9KkOV{7%8w2>y`ZPYC|B;Li&FqTsIy{-)rY z1>Yw4hk}19_+G)k5&WRwhXns!@Ztwj?D-)PJ?LS1X~D}2UPbWgg69j~Q1Ir0w-&sE z;9Uhz2|iHp;esD4_z8kf7W^c^PZj(O!OszVq2Lz^eyQMB3BFwLTLiyD@HK)zBKT8+ zKP&hvf^QOhi{Lv1|5)(P1^-&`Zw3ER@LvU2Wzy%5q~KYCR}j34;57uVBX}dhn+x7r z@D74^6}*?=0|g%?`0;{|6MTx`(*>U;_*sH46#OE=FBkl3!Iukuv*33N{;1#^1b1>Y$6R>5}*zE|+?1ph_wzXVT;`yXWluOxU4!Rra$ zMDQa8KT7Z-!AA@u;V#T z@cM!`6}+S1Jp~^n_(Z`^7JQcAXA6Fw;1>(NRPg13-y-;(fF_XPh$@NWeFL-4GM>Ghu{ctgS43O-8kxq`10e1qVh2);+~9|ZqXaQkuzmcd=0 zMt^8wc}2l%3f@rg4uW?Vyh!ljf*&XNB*CW(e!Af23cgtI%LTtq@Rfq!CiuOAKP>o@ zg0C0+Wx+QJzD4j41^-m=y@G!y_#wenZhC*s5Ijfl8iF?xyp7EoGKUVPZ zf}bS#X@Z|6_<4d~BKTE;-yrxZ!S5FQQNf=P{1w695`3%R9}E74;QIytLGa%NPgYKE z@A86I7rd$9tpsl`co)HY3qDZr5rQ8t_yoaE6#P`d&lG%t;1>zLRPbej-y-;3f2ZLR~Njl;Ee@8Qt_p;5`LDTJV{I&lUVC!S53M1;O7Fe6QdMJ}?|>-)e%_ z6TFq+-30F~cz?k!6@0ni+Xeqp@S1$MIhNmMg0~jDv*3LMA0YS`!KVnmSn%5fzeDg( z1piU+7PZpL(@F5og3l8Ce8Ddke3{^@1>Yg~9>ISS{E*VU@IH0Y>*rX(CksA9@UsQKQ}A_y=hRJ4FJJJ1g7f1v_OR{uwBWA` z-k@H(ek;LG5`2!}UkYAD?9ZPk_}zlfX;7Sg>r$bg=&OP>UP?7i<5{X+8ZW16rSXcY z_*qig!yme)$#Eh}#_NEo)r%@;}=&L4z zHy6B>;BC|r)SpHu-|h_PmpWd)8V5f)Pr*5!uePS~EVYLf?GD~HiEd57 zPkss`yTiz1?MGhxw-i>Nsx9jKip|;*$fF5fyo>Cq77blEkdK6wuIJ>9Ew*Uj#)ejI)1xDz80x8{!m~Sv6HX9b;vG7&eu5+`#LI@SRq~=Dzv}$aKCUw)a(4 zXQvLai_^n9qP97`>s>ypqCIK9k;7KRP``zXhd*pE;|BG~Q=$j#NJKr2ba*Ne`FYae zpAPv-Hij2Dob2#Yhj%(;{Za2jhldK%cC68X0Z#FHG}=cyJG|ZDrw*&&8DwME;V}*`cKD#fT@LxoGW9Ft*;e9_ z4o5kh)6E!^8N^9rh(+ z{7occd|m61&z_Kf?eGXpfaHB0&T_cY;gb$Oc329NAoW`~5=WwUPpB?7l)W!JC9rkrN(cyfDH#mIE z;ad*BB4VE5+t7*a9FBIl$RY1FQT~#{{SJB0hT$z8_IEhd;Ub4OIb7@TJ%`^o%)(wW z?KE)M!{Hc*XF0sq;e!recUT&yY{uuFF>#*5We&GGtb#o^%11f8*x~ICKXaIYy$k9+ zgi}9p7f!Uqj=1I`o`{Lq!@P{?fv=fY=-$f1ei52Qd5DW_DX*<>UKNegxB0tSueEQk z?0KEvjB;F$9!Z4Fc0|}LBI~6JtMKMQsao2_a`|#iHP^k&LC#_>MY`szB-qP z$$5$6ml0p`)N&%u7b_jECYHrGC6@Em!$ib?oQU|(I{qRN@!uw5+`Z>;2eG_8?|Bt` zwU-?6_Y)ESkmJ7-5x*4ACy-|m4|uAw_&kSKx$qktU+r*>!?jNStmCgaT?R)@PB?sdplaWZ}xt~ZdcYDDnnj(2pt zuj4}l^5mb6A6j z@Wzgt^%3Nq9Pdj+{S9zm9!A@GXZsiAXP8 zhkZ{DJAXNO2G?D%mrF!=9mktGY~!#y5q9`DjKpCse4OKx9G*plo%5XhO2?NuzRDs0 z_K@lFZw`t4TSMA?!QmDn?Cf^(uN@w8;R&w$5U;F5vu*_E-w@JHBZqCByr<)R9FBH4 z&f$qf#6N?GbeA|>;qV?J)=Bp}e3Y1j>jh#(Up-Gm{FhC*QtuM6mid^7^Bn&+kGPkJ zNn<~8rB;WCi1#}YC%;UtOA)UM5!Z*+9o8mh_^LiJ)2(xH9oUu}*om0!tFFW{zT)4? zd4usfUt(XS__uIgKcyBCiSvD>aumK`H+2l{XQesv=HOY7KF+Qv4e$Zwg)sOq`0>@)A!} z>Qmx0rM`6hcj8Gn8FKx6GQLYjoR0huPeFc&IGML5&crLTiKi+xjCh(-(}}b2N?_t_ zrTDi{-W;VaC7zD*6VFiU4&s?g@o$+}&QFL~UwlD4#ZzAqankvji1W0U4aE7m4Dn@8 zqdm$0OD(&8bW;CQ)7tGJCO*z*+l3qAim+L^NAZhwUqd# zr*0&k=h^FoO`dv~{4GzdC*r-z=DK04r#6#s@zho#;(bco=BY1UwP^P@oP{0 zLfq%6fY&SgJyni~by79rH=b%hM7phsI7zp6*qK<#SKWztVM0G5#^XRD+V~j9`L_m4 zcdFwj6VWHnaQti{@^PW#7ZWk2&Gi)QEhk65ZgcXxh{)d)MCAJ=BHX(~lw~&&^UzmB z#6Rdzm9ybxi3sO2^~8LKjh(!}aXtgj@^*D-uHT@~XWMCil+&B!_?eC`CL$i6K_@PA z@>Nd$fD3=b;foGmb@(O`>AXWc%Tv3ENN>Lj|Jm{19p|PR=e=@7==9w;II_0PoYF3 z_q(T(#6R!_K;oaC$|oXzGa}+2MMQjay^Z+8$WdW@hS>WH^B57EfM*f4uND%0>^l;% z$#u00UrtQ;>ULrh*NenbsBa?1>l;K|FTUk)3$ZflpI8O!10w483nI$!z2iR-F<*GR zK8HL>L|-%4`{0$yG3V7M;u^XQ5v~^z>6v{1;81etALnqYlb`JHEEm4W;iV3*C8Ax; zz5(LjNe+AWI(*dWt#^9QJ8t$B5O25R-w_e-M~A$Yquneb?DB(ul=EAE#KtbXmBX$s zyr;vVE}YNiGX6w|d={5>Pjh@e5%$9Ui%VTNpRuLh3diqqe4XR35fSfAhdZ2{&$==_ zKGRD1j}EiAe*t@WM9AwnZ0f?zz6ioQJ8t$z!1-(`)2)BtADmY=ut@aKEQD_R@)Ma1Vpn7VkDA zVw0sFu^smAiS2PugLoA7VTc{D4@1NzJD*API^k=@#I9J65OSHk zr5+`or_{^D^Of38yb$e5yg;dg#Krh@PCjr6@X~>oJ|RN9Myc5br|06Ys|QpLh>GQ9`^IId&Kp~7jXl=t3iAQ=Pk?y-m@5A#OIVck@!5u4e~iF^<@As@uI(C>+F zqum<<-@$k%ZpQi3;nBo*F`gWrN_-F3gANxHwHODXRt^79Q~2_ z1^NN;OO%(mN2#ZXdzIQk{0j35@oTIfngI9Vb2Y^MN)-_g;PX+$Z*YB0{1%_fA%2HX z#}L0)>I33I^rxo4AF!WI{1NL|;!l`=h(9Z}ka!653-K4F))Rllcqjg*)Q`m9m8#GT z_=i%>iGSkyoA?*5^NC8U^N3ojn~0uPPZ52swh#lYz9S~I%4rTvYSo&EP3FPG46RNk zW@>d25jV4MBVzOU86v*P^#QSrRzDNVYE`iSSWc@J#PVA8CsxpEDltc^^NAI;x`kLt ztEY*%TJ0oaGy4x>6|IhF0j#Q3S7M%4uPl)5jS<8B-YpJU19^Rz9BZ$D(gsKBdr<|8*9~**hH%nh)uOR zhuBQ3WyI!MJxVOl>Mddmt-dC<)T&e~;E`H2BDT`1AF;JolZn`zKabcJlQDY2hcL0cehe%B}V*D6KCH`S&R2WoXL5ifeY zfry(6j}wPz^$u~UR{M#=w90G;91c6g5wJrXsnrDH(OS(Xj?!uc5jQ8EARepLX5w*L z9UvaB@oWHav{ns>W3=i)9E)})o`7~Hj?-!talBUlB2Lh18*!pmzYr&BRqZI?WUbl} zr)YIFajI4)5l__WY~nPnt|y+P)g#1{wc13Sj{ZW#Lm=fl0B2}*Bypxzqll-XUWlh* z+z@AJ^&$~BSw1Ju!Fr)15HGxJNIXNUzQi-Nnns+9b|IdHb|Idv)q3JNT5TuJ)9Od! zxms1|1e~u`bK(N@GvY$@GvayZXT(M5XTCsxFIgqs!Sp9BCQ$|muS_S zc(GRFiI<=}#7oi6#LLjm#LF=c5U)T#>kPaSZ*h~J)D1uH=!RAZ`NuF@fNKvBd*fwe&VfK zJxpA!)tkiI&@YL%YxOYgd1;mH6`i=OoR{7n4kH9YRQM42BF|;@FajotpK7o26 zK8b!tT#HYIcLzSDRU6_ut&Sx=t<_n?e_{L+*K4(!xIwE|h|g&C2Juxi#oej&bre%uqd5%UZ2O|7~R zH(`DuzNOVA#J4e?iSKB&o48r4vb})sYSoeW9_BOR7Ok!(zK{8kxK*pKh}*QP+#9$Z ziyKSR9`KS%!}et~p|U*bGQ+@n=SAK+fCsuI7_ssr(B%u~dD z7?;HTT3tyzpw(l4I}=b)hyzVT3t^33G);2XUvzx zL+IbcUvU2D2mBTD1MxT1AMtn0yTm^*u8DtQejxs()mkF{y-U>CA0}eJH7o-9o*GIF zJaq;!;i-FxNl$%5EQNjW{=f`R6%sSCA51Lmsq=_gp1PHo?WvcEWjysYv8<w0@n0YOX3kI7qOP7&Lrl0>KbBg?4J?qU|*exdE^~pT~BQxVqVxwtmmoy z#Gi4!IT(okQ@5Kb0zSipqWoB4VvqTvx4R>BHHVA;%w9l@nXCmAkIO3t^i(wb${ZeK@%fhhJ1;0 zQ7^=Kc+WsA!#X^1e$bp-30#2p1jO>7sU=2HUgE-_`66)<*7=ExgXR_D<=E!{-vyW8 zeFJf6&@3Zf5i~8tWqAKVT#j{fVnxurM7$C$_A1~Cq$5^hU6P3Z&3QfXs-XE4ab?gv zM7$dB6^N_QZi&|f&AY^FgXWx-!0UqMBI0Vi*C2iZz$H)6a{{2}oc zv^T|{6XA;&h|u>J;%4~eTHrqHcTqf-cpKKCiMOLa5I-3-QR0_SU&IH{zlhuM9*X#2 z(0qjW<)FEZ_$d5E{5On8#P0;nw}`ug=KI9&p?we^Lq8{eAN`5=c+k8}{6Wy1B>pgH z&bSV^2lf&72F*C)6Bt*BPX^7^#7V}iCw>ujD1MxXdfQ4wdA~?ReSU*@N6>ticxTY; zBYpA>M=fBYqa`p7@2J*{S$25%&L(2z&PvF~@m@_)i#T6&pW<@Hf$3 z6>lVd1^tn@1N*9oUq$~Qel2JoA^tPQ1>(-2d4~9P^cUhcg65Azl>0s6w}WQDhk*~_ z{y}^k&(*|#37TodZ{a>f{MVpaOx%V3M0^A|45vFKGBH#G^s;uf&(pzKMTA`zF4F_DzJ| zgG9(3BSP-X8X)Y>BZ5Dc_-DNL(fBfrZziH1cyQlESaE>jAjN#ek%|S1;}r`POB72L z=P1rq#B@;d!EH?t!@nSgFTvG{YZU7gTNRUvor*Uo-mbVsajW7s#d{U+SKO)ikm4@I zM-}%f?o)h9@fpSE6<<<3p!lj{x8ggB#}!X1nt&~DSTRR2S2164q~avS$%=)FC5m$u z7bq@LT&lQAakb(a#X7|X#YV+e#iU}F;%3F$6}Kqft9ZZScEufvyA&T)+^zVy;!}#x zDDGE$PVsrgmlR)Dd{ePo@f}5jCN1q*ae(3=#eBt)iUo?}6$=$h6iXH7C@xZ5s#u{| zrMO11PO(9;QL$6;2E{JL&5BzUw<+RQAmza=KoCQ#AcjuCU5bw??p55U_>|%^iu)Cx zQ#_#fs^aU4Zz>*FJgI0xHeb97mi)05RuEe;1XK4_Vk?xyV~7#NRw}^~#ZtvNii;GN zDpn{~DXvkhQ*2OdRP0o|L9t75v*K38ZHo6Q-mkb_afjkA#YYu)D?YCHl;Sgr`xT#4 zJfQfh;_HfUDjrunsmOs?+OH!2%{#-niusECpBIduM8y7r$%=)FvL6)jb2TjAl_1Rj zeL;Et&kN!z#np;y6lI?%_zfCvROG*AXS$?fr{WEYU5c9(Z&%!+xK(kR;&#OyiaQk_ zQrxZhxZ+;LeTq*hKBM@&;!BDL6kk<*UGYuDP ziUo?}75P0A`I8k(73V0l7Ol8x>m>lZu^+Hz;-~ZdTl? zxJ~h1#rqX^Dn6vROYu>~-HMMZKBf4K;(o>F6rWdoN%4T^}|1@E}u2NjB*r3>`*s7RR z>{Pr#u}g8Y;#MN|6KqqwSMh$u?TR}TcPh$0Vx-%p;YSsBD?YBcS8<=>Q;N?hKCk$a z;sM216}uJRQ9Q1AQc?CH!;V2&wj4Q%xrzmf;}!Y8S6JT3iiL`@Um5YG8lIy#S8;*j zBE_YO6^d1gs}xr&HYheKwkjqSyA(Go-mbVsajW7s#qEka6n82`*s7RR>{8sUc)Q{j#jT3l6z^5MUvazQ z4#k~{4=L_ad{l9_;^T^Y756FbSA0(KdBv9$4=BE>*sb`E;&H{3iu~U!Qa_3V6bC8h zEAoG^P_966yy7Iq$%=)FC5okra}?()E>K*gxKy!1u}X23;%db;igk(&ij9h`ib=&z z#Tyj66gMm0uDC^UtKv4rdlm0j+^)Doai`)#in|maRot!kxZ+;LeTq*hKBKr_@j1ok z6<<<3p!lj{x8ggB#}!X1@`G-vU&R56gA{WVa~1OyM=BO5j#r$d$p6toz5L%S#1h3) zMfnaE@pCo2Kyi`cQpF0zD#cZbs}hVm=Yyb&OOjAmaPO@rsj(n72<>EF|LlloG{KBIX%$6z3A*-vx?` zh=rJ+DCTlqp#<|%BJ3Kk;Ymc;HAlm9iLh&_hAW7$t4_lWMA#+kC(tMBC$MX~@^=tn zm#l+;zn@{)CF>jr%Q^?_`V{AFu;VL4lyLQ>kWPM{I z8K2(L+CHNxQQOv1G;2kCZK6FHZ;LHmzHssUc}ru@!T{WdWSzWsh-fgbF-Y?adXpZ~C^=;Kn8qp6wT-4aIHc?yMSX3Na zxO90LoF7{jD=M14)J89FE8kGvSYA;yy{djGs%?HtGYeW#RA|G?TIw{fK5Odlmcs`x zO^KFfUUS_)syH7Y3tRP#Ewx7LU}|lxt;i2t(pg@$)ztirx{3;YUZXZN(quJpQ5X1Ga+NHq-Vm=ucN3G_ z%PW=?&9wc3&8#Zk+}_fLa{R3oQKS{IxT*CtU9losQ&Ur(-Z}1o+ee4|V7c_!REws! z#p~m3@#fli3|SY?a%;UT(OliODcaFon@qGcmn^7kY}vS&cBgL$6-%lLW0fT_V3A-| ztRh-j7OR{Qt1OMBFYNzX=Hru7OARg;@iLQ_873C1j#t+tVomX;+SW}ajFiiCQpLO! z@luGpa{rD$;uecP_XsZw$g{T-f#q~L!XQZFabJ!SMF+5KCI?=t_L3W^Jc1*K*X{`u6$!hbfe+Z>!bk`j27SM;RWDeOo~L^*!ga?@X0rI=m9?Vc)%oOXt5| zr1b)u@C;{F&U8) zlxCPRJor0NlCSa}LcRrvr@nJ=QjYnaaQvroRY=Ep%J6XX{l)R0%01&N$0(IcSB~3# z<-pI5i9YJ=#Km8Z)yS8>9p@ZQzI=b-FUNDpcM^nHjsl#NW4`Y?^`Z7{LkD7f0Ztx{ zzGF^(sN6|kImW6S(|yhAbH~&Bq0iCb*T?r!D2Lk)wrjrQDTKpG!}nMIb`T!ywZHRJ zj`>~;W%x6NIC<=ZzE>t#npg68vP}@3llC!R zM=wY@24J7r5MO;bd0h#@p(&V$Jw+R8Y#Lr2-W4GH<=qhp$Tuj=_d=XbzEe{4efoR& zb_8X14oBblDf$}WsJ-Yg)HemEqc2DGIsW^vefSp0Q3j+wo*z;xJ z!+Qt*cf)OO1+&TRTw@9{c6I+?ZGxeq&Wz{)$ul#WyFKs0xks_-`VEtl|6oCMFX+N? z!Osppur|T?5!=T;*wTGdCixSUAG~M!xX|ZzFARuITdM8zEFPHG(vfWKNKUylxv4eI zxJ0uTJg=&?T9+F_}yx0(!y5z-;qcgih8KG&*y8{Eex}WSa6U>yk-GA*G_)15@)(z6< zgteYf6M+!xCQuk18{N4ua9-vs8xw(ozQ9Tilm+V2Bik40ww>{?jxB)es;W|Yw(McQ2MTNmVWuc+k2G%jIDtK z1CSo^K}Um`n>j7>#Ub~GS?0{_Uz#!J9|%m_d-UsF%*n>S^PdyDLxJpbGY{Q8xa;jJ zvDbH5ci@28^T?aw%f`N4amJADti8Jq&%3buaPLPX(rSyg2Oj#|;Gew_s{Gj-8Dq=@`ox?^omIyN-4LGn%@bLB|2uEsiGZm(K44_V zi7fNbiNMuQ=M6d$Y^ypRzQLRb6nynW*02+K87D$x$2H`Xm=jqA51t4;^1HmiiL5c^ zL}>Vs?uk#m4DBx?m#lj`9v*P$*37_^jSbNK-K_oJZ3s>w72N-qhO83=w zhv&*TPS&%R}{cO70d;?cv4vyU9kdH1cC z9zA@yPzPRM4!aJ|9r1_Pe(|Tx($Af~^od=AA7CB6+x79NDKHn_9sOkV#lbVj{Pc(!&~gypXzuyaT=b>o!L7>=t}*a%O<-&Gvn!)5sOPSNz-8g% zfq@xE0vV?J7hRwIZ)3I}8ffO0A9;CE`Bg83z5tEW7tOCI&);LBT_>`KT{EKnP%tp} zXdt+}+XSA$h_!o9V2nAR7C>eU`(#(y-V@nlp2{0`sKU%UVgeNhf44qxANHXh+TRxb zr@-9&d3Tjn9Nho8z|@rozq5;_<+=RWdu@TKE!}3`?mYuW>^*u}&`cdbZF7Tv?g}t% zVD8@GOu6;02QfaI^B3*GNNH}Gv~$l*1^2ynQ^CEj`OC9*zgL>0D9r$rX3_jz@I=P5 z$Yt(Wl>erJKfcCNv6O$ulHK>%k-(5^4?fnTY>e}lj^mqGzDJ^`E8$(QWk_3d##W9| zI71wz%-FyhhDqZLm95$PMliDXjqupLZ)A>bl{=x+h5}>ggDVdXeR%o718uQ`=YC~w zKI~eII?XOS6bir>7v~&0!z}MMOIdq4hn{UCEo9m`qslVeK@&?2%QKJwmWS4W>>-7SnA{KePyo*g|D$olWRoI_Wdg-1*l z+QY_2V1qewZOPp3EnPcK1VjHXZ)G%mB5V5h51Fiw9tve4_bjxmi3X$Bdl!w|V$6C@Zvc&zk6Wj+ofaJ&U4&iQhT0 zX8H4odHSfy3Y~2xd>iE|jhgP)3~qe7tOK_pz>zp9n?YIdIE~;OqPIu8P7x8@83rkLK zqun4c7H%sG@0lBIM>#^s+w_t5i)Xja`$=Bp(8?ZVuyx#ZB0LkRkyB%yVySFc5m)N>iI1gg&sW6g}R15e6xnqu-Emj(ef$ci{Xb> zYFl}`gK7UOZvyKgqi942`X^EbU<=0L+&$+n z(3W%eqg;94haB2A(`#G0(rKsj&`xun$Qx=)6F_O!qcm54zbyDHT4_z-z-_pGAC`ag z5cb*kuwL#3m*cKbFyc^VplsfLXsIw|u$6a&@duvB3mkYMFCRTNl=s^_{CIwA5I=Yc zTj*EuujgA=*Vv(lvU}N+@w~j!3CPsh^{`BaPY!S{yjdFM41lAu zH|L$(ed98;gewDw1`m^wYrzvIf(tK>VvIdw2P}Pi<7)ItjFo3ZqBZ3M_Kb^u1>_^^BKLYgJ*4k^$&lA3iiFaQU%q zg96=wQ1DQ7@Y{!;z3JbN{&~=fgLiMMD&Hibw6Of> z%-SCv{Z#uK=XA&&&FLA)xd^><402j<+1cvBFg>^&weq|5>ruAGd8_v1MxQu#*80sS z0>xXPb-}T%mH%<<;o9<}SFYH5?CZfdMs#2fgjS;c&8KzYi)UXs?`e!$D}vO@-ckge zJI1WqGdB98qbr6kjXJi@KbDjC)UlsWoOkrP%DqP?N8YckM@-qV??P`bo>Nwhaco_5 z?Ah9VN4rA{j}2(sdo-hewhp4LXp!q5Hp`CHki_eCa%MS%ZFUUB-w!)IHH>>v4M6sz1^E6YIlhRKX^Enky zrIQQnQzjo!@n*W9y`!}i@4Vx6Q%zFdch%!<&NRN^pC)hjr>%>(HOCv9yP&$QskRaC$P2EUQCCwqv$nACL#NJQ zb&m{YufD21-qyZ)(Wa$|j@5Vvxh~n#x_Vta(P-@c1A})`Ml3Ydcn`Iqn(w08%{nQk zeRGFr^Q2j~Tprjp#mEKN&ub))6<$hop1QJz?T9PW8h~dMhjZ}&~2FpsF9E%F0 ziOzVPn6Wq^FKmm7tpN~6VX$YyA2jQhRySj3LsGLAg`Nt{qN=T0S1>O1QorB4t2=w- zUEO&)!)Lk{TcTg`k_+Weum7TGTT2r}%M(Va)8$Y!or13aG@%nqPU(;63q$)U(nJ~(-<$W6Kie2)JYuEFF92s zoZbdMZ!ox?E-RHxqGF`HPRo=Y;`xHhX_E^|E;Vj%I$bv?!fqIB%4tqkEU&^=hUQ}K zO(=?O!1(6I&zVwuDF%`H`u2G8l!g|Tm-p&dr!pW#URvpCR}-kxFT&knX!xqDr)_okpojrMA7oOHbQEQk&fLv`udMrKY3V ze}7qLccm;}hXG&qah12VwX`{b1@XrC+UjK7Mp}W&WOcFw_d^?6)*?MeL(#^TYTVx( zCI)&ha1}zOKF-V%Cs2uPaLsF-P#Ny>4vi#5Go1h@1C8-cFP&eZGZsIn6C8nKH@ zW)OZiEo-^51A{~2Bf@c#&#SM;hP@sftHdAWS5ux?8*kQqcaD;Um<}w(bRZ?Vyl!p0 zsE&35L3eHWK1L5lbagj23sAQ>r!;sxMa)5>bAO=%yXQWSaZA@ zx{{hqMX)_G(VR$b>KWS{Ukkm;u{m2cHe-3;BHH!Uh>ei#n6b9%x&#`%jcV#>OeR_z z6LC(@F!_x&#_N-@cFv*9^40~_$?8+~R@@BU*La>Hf7;O(^8Fjn9l`!+?B{q+TYF7h zPBrEs!3P}Ak+MJIImG%gp40B0^Nv%F=TvHE8K)^*ALBXh{EaPmgpo@E{Q~FA63p|Z zS(-$9ti3f}o2YI~d?a3HYB(Y?PM!-)U1BYtFDw)lnx^W`m>Y=2(Cu78-$+l`dFC`ProAA&8fp~pOn=?Gv z9t+=BCZ}WMDaNHSQB&L68teHYbaD04nj+K{N{1OCJ@Y=&NVlL1`<-Sc9>g#hAuCJt zKjlU7*7gKi1ClD$|FlI#b{LEE&drIhjGz+gzmig?MxnqV`=5H2+XRr@rTd@0XnK!U z10_Ae??X|cwlG`cUckhvT5*#~+e+rxjwKJ=lM9k<9dS&|aSN<$s%~toL>GiLABo4% z}Dih0+>Di>c{9;>>hqCBP?d7+NSd|IpDGW6WJTwPhdVo7CT3@Z%rw(4X{ z+a<=ou^F0c@V!Gbv#=SuQ#B3|62*}sk+cIt8%l#aA97n#iD^q2CGpw}E~q>M{EFJ5}#7zyC>lj`DpC z>lloj;k-53R+p%+#|%rRT)L9PnG>ceYnu^|@wl(uPohWV#11nn76EQaSsVE!r?lySS;p8M)hs+IA)PTx5X{SVh!=?)>eG8W+~=| zu~TC41xun%zi5LEor$E8ORSvaT0HzU;|9J7kIGF3kA2l`wGC!HK6v513f%;cf}Kds zkr*NPwzHESHjRvqLNR5WW)su8A zOonSP?{_{sxuPsK|Ed+SE9R}zysB$!J1`M};r!+hnbdX2I|97;XlXaq?U*m)j?`Q% zS5wP(BxK-hK#jMWdR7x2S+HPKk6Ak#5@H+c@gIstvm>6}UTOkj7Z4^5|BPD2>!(IolAsc{Uu&!RNVkAgdX|EE|NQ>)vX%xHb zJ;JMnC)=iwUx&(@aBH*lL`I?GM!=_dYVR)ce zTVt>F7GUby>ZYb@F&s5TJ}+W@O`~a!cP6Xrv3TQA^&V;Yc8x`1Eomhz-Njc{t8f;^Llf);s0Wd_* zv6ii0K*3F@dt6cNZS~?Cp=zz0q%kxVAwYN8>SX1jI#Jc)y?P6d$G{ZN`3hL?l@+ll zEFy4~CWTck+&1KW1qkF)EEmZT4Y$57(Igi%FOY0^)jSczILu3@TqNAd2y`7@7{Pu3 zON-?qMnhwxcw4TBvUW6Tq!a5z%L5{W_?$>#A~aaSK` zu?1+P_y;#o`UW6A0wS8Z*efD!mPy+fEuiJAhw%i~T#M&_ToFlVlzRnwTr1vAwznth zH({`GXNh$AFt1172=U8p+H}?fH9 z(A2U45B$kCe4$BbR>Ug44FW0L)G9(2nw?;EdtAw8e8%k1wK~D;tZ!?Q>YGUo4Q&-0 z64#5e2Hd3Cu$V2PYZIayv5aVMwQb=d1X^p_)>YJ2EU6`j0ZB)WFCj_torF}2KQ|p{ zvXd=HZ4vWESi~2R2-}q-5S#!J)B}xl0VgXpi6o+MyYK~Sd;tu_9;d<2+34qNbUAdn zr%pmWc%DM?JdF%_DkX$;*Q$4~s-A_{IGD!867`E$$>UwQcpMTa7Mzq;0?v-ajo z1pRMiPOU{9-?x&D>_D7ib4JOD7}}OgC7U?EtmlN%v~O&+cbE+>6^m`C))k;w4IZ<{lh7$P9F zF@axwumW=B78WZZR|Y#U)npQ9W}R%22{o6mP zz6}|vT-#>K5h_I=z#o~M1)Ymt5U>0AGrAW*y+Tw!9x26MAv3PO= zv0mF8va*fO2`jccVTWjM)|d?*RqwP!ZICt?a|L3aELT>qh*dkZ2z#`qn-VtRxa!Y z2(+_n)XGKsNxSVGNPsB|U#bemYBu3FVq(=Bs__6;zp)Kl=%o9h0T}EaiLc`|DWPN> z?X4}2aitC$x%h6h4bNtA%){`D3w*JUm1jb%KGBY!pYc6(w#Su;I}`f$7ZUe=~D@w2IL26bZ;Qvo?#JuVLVyh8L#c&PPhu}A~bb) zcFPDM%$9=pJ) z1;@&IdlzcC386eIsy*L`#*z&jPsB?p z8#pwN)YwY)lO7vDqzP@rtpHPO{JsyT&n*a{mD_URfq$Oe?1I~qvr)!29hYH){K+3I zA);E>ci?SlWi9Hew!!iiH_zj3i`Cg9zDFA<$9hbn7Sn|a{HRzWzR@W?dO#BO)Y8ml z16vtB7CwBXT5U!g2;5)dah#AE;p~cOW(7%8(w1Zc@I!TD%(ok4y{YmIgGEKwh829+ zU0hdQUKQi^OJC$1yFzfOk$24cV#xXJGgx><2YyZoyC7lLVs13y&j_Xb+}0BR?`yEKDhbwU3%yLR+eHeHq3J<s& zC9U*b9au2xCmRynFX6mD#7NDJ&UNkBdUUEcg7b^*YclW7hToj(Xwu)Sk{@*{v9;;m zI(%&0fS3!PCepufgnIrYp2O5?p(kz87htGeTwM-l;&+YG{C#I0sQUy&re+CS% zYT~u)u#j~!k8`(CMZPJNEyiTLAw+%1C6Xui>&MhA|8Q&mi_rdwL#I+^X zHaOek&{4P*N#<0j8E+f+EEy%y92Vd;NnN~b6L(H0bj-w?YL1~jxpuDs3Mb!-7;ffl zs%~G0&JK?@wBVtyM+SxRjl&As;?wIzT6NV1b%wiYkF?XLS8{HG8AbD2*ATAlBD@F+ z;UrfjNBGl9+q{}PuqhKS!eX7pu?DEY6cdkaZRl_tO?3=Y#~NP1$JJky>6rHP$PZz6 z;D!JotaRSxr(~WvvfmE|tupxu6&Nymc4`&{ z%mmwcV^~+jv;k{9DOspa+Xhvk+ z{E8oA?A?XD9wl72dM{8jCKq5&ELT;%+*&2KK629TZ%gL1l?$yhX!7f^Ru}&RtS%O- z{dvuj8_H7b2X|{3+sU{yoN=~xxkd^<3$&AkS5|%<(`WGKJbT|nynC_zstB{wr3vhA zEs0|g!0tAJ`-xH|n@>OV%t0Ass4Th^FY)Y9WQS^Zh>?N260c{g+q9+d_RZGP)9j*t znT%UHezY^~U9v|3)v%t;a{(4u{Oz-{t!IDi2?<9XYyR4G75jjd3BATPwz(?Kz99Z12&tU_28@HLbd$;*KuKb`+H0>Z0~wspK72t z`sJOyf!@8qKZ&vW`}e5^6pLVgH1_jT4chv?KGi^i5BRADQugOl4T$yQQw`evK0ei; z($jyc;Yp=_dWUh*-@XpGsJ1m|BLP^}$?WGNiW z!LgzkA8BIKO_b~LSTyGQPAtKi&SKM9VmhbeYDExGs<{tX4&siRdd3vwcL4n z_Peyd`SmgD%qC_P2Mf^2X(dFyxzB~o!i$3a`pSUflWzw2kV!ErC@2> z^!szLQ`8g(7nfkwz?-lw#%nFi=-5s%f2l#f)A3yfzl8vp#qGj1eI>ConEGlw)At-L ziwn~xan^M>i%KWZdoI(LqCVPS%23=_9+L~KS9E2w&-a$j8sK8Q2I~ECa!Kv=?kXWA zI6j?5;|xb5-eB;-wYO6Lvc9WbrTdXVv6BH;+54%TqCVBdMczUxZ!Y=^Cf>3s)&~># zjHJ3kK6mY1VocP0|GlNMYVmxmclV0xF`7>==FLiO86@m&AchbBVx73b;m%dWN${y| zTc=B(rfC)HtN>sDFi2UoS5fVaI0NRY z?SLOz5?47KwY1zOSjhyp;tZIT+X3IQB(8Ee2^Ju<3@83~Q&-TkjO#r7+P2}pW=P8< zEs901J-FAY3lw)l9p^l1%$^OTGgb zEo!c&w#k-6q#TY$nqW0vO$Qa?3>f@GxIO$*metFozgdBkZP52~`cA$MFO5katCvY+ z&6S^9XGO^2C}g{`HD9S5w?-!;!lt?=mBs({MJET$wIkt1TRGR#qov~2UfHlxZRPYb zj?q@vN>9Nlq1QaH`Kq9WX^sVvy9a3}>df?w;^f_k>BWmhfr`lV0P5EA9!CZj&&C5hlG^!dFU| z^qmrhKJZE3=Y)}j^lqFX=GV80tGsTviq`%FXTYrDKMeo5B~#OS39fzIO>nK3pjSJ) z0L{;K>}&SAYI`-`Lbst-q~^%>yDWVho`dKG!s^vJ=OX$RVfD(3DJ-j3DzX|S)v8o8 zyi})PrB!%}ye#V!3VX3yVckc>!d{MIbRR{&5v*>UXvX;IM*L?BoM^`Uhwle*GCH-q zOk%~ZcEr*Qag_Qi&PY9BQT|7IkbO&4 zc~VuWQk!9?I>As(OYVrdqwIZ<`!Y`4{T!atx#jusBjUhm(wEpTsG5;?Z!= zY@BIt%aj5qJ#zpUBP{dg;H4nuI)T&-`QI1%%!9%?I8i=A5LpJi|3Bf_OsRa4x{_d} zdi5nroh4E$2;;>!y~Y4aaW)b#y>4llhz`Sop!rxS#dtU-_;|d%$&tznnUC#NmY0zK zd}K9F)A`KBa z91Ce3(;#ma$CvlL65A_pCb$JBoWukbB2~dGwpdcs?%rN(aapxkr3umTT zA>l5hx)rCgN#23eVM9_5M;ntqhBF9lKLkFZG}G{(Z808EayV%yXI)gW9U@=DnWke? zYA;TBDNOtc&VX4#C=kUT3v*c5E~!@#Y&-f`+Wc&ip@AK)T<`JKv;SiQSdOP9$14do z`Nsx$$v?&xEr-8Yw)lM}XC2;83(Us`5UCEc^3!QmXEF6DoJAWkuc4G}r$y;3v{Hqh zRAD-)e@r<}(?@92muWrv1<{tZlAu-FtGoD`(kZ;dHglT1x4-|qsr4nCXp~I78z;zA zZ?g4RDXC^Fb!Dm)YxsGb=m#wBqoS)KRqB_BC=k}lhX4nJ>@~FiJ*8-qwZ4KjS?hb* zbwKTsDMnXU_;HA`#+)$NayUKZ078dxqO=r!M#_;^>)%U?dg!@KGqejwm|0p2Z5V7h z91A^pOrmYYcBIks9Z8UVOBH%j zg?&k7n4F$DORz6#+{W`9rKHozWm<<&>~%|~lk!R(a1`27BZ)nn`eCX2r}OV66@(46 zk0pGSh$=}}T1O5;fg_e?R0u=EAeLMdkBOj9Kv zD8U-2Mk_ExW&=7v?6R#xa1OF&JaL<)gGAcGc;XgI2Z?uDIz)V4<5Rt}01=JI2j%dU z?t@FIduUc4?pdTc4m3IYZu`uaPO{RZsJ9?ZkH}Oj{n+?mZxDcH>7ehN~7RzNU(L{|8x;-m#Aa{wnxMg zSciCEVM|z(~|8>lo%*_ju#PK16W#M86XEEBzdh zvlqq_Ur>50viuTG#uMof(r*Gez>+4ut27aj62A-hn9{@_Dox~i8`EA7t2=R$CepQ} zOHq8_7p-I{k)pHcBR)ss=CQ6}0>*OVaYYr4SXK)*h_E2sp*;DVDb7&r`KX_$LXkP zrUie;1RT(i1M77wPLOv4wpsFTHk6aaY@F;_7#v7)?&u5_q;qlNzm(k*o(vBZ;?&+v zawblvcavU*Q+hYoW#7a}S@?CrT5aR+_k9=^J6(?Kqhi(a!HMD1&AZ8P7sIr!kLD9fK(?rzXTYiZJ#&deTgQsD@_fgGRtH#R)rFoUo(H38yp57AvQ~(G@f~1&$ul zjtgkBpvDf= z(!S`Pp6!d>_kM|8nd&BXMqg9QVwbZwH~WnHb8Y!fRXVaF3^Nx%OEFHwQlUv-_q3(KOMADMcCMF}#z13gzRXk0!7kj%jI|sRW|mqG z3H!=n`KpkGBuRbOT3e{ zY39~{M>XnITBBa|tf`p&5O!E(MDZe)2>m2IAtF&)!cank?@k zy{d|FaT_$s!0!4ks;HNu12%4j|Vv z(>(*-hRSiLqVF~!#Oss3-U=#DgR`e?jmvDwPuINM`Q?~BD} zvQ!@H<&QYiH1mH5%Ua)SlEl1D!Rn(fnTpTMm~|BZ##$1QayXtjg>JU`&*4ln$6;gL zF05W}?mifcZz5Pk^vG}i>Kni6RTIo?XZj3J!PAd43&1G};Pu$}` z$>BJLtQT;yPZEEtH1YRJ1LSbhkk?0hISuPwq)gL`nd<$sXda!JZpd(WY2La1Z?X=; z#6Cvu)3Aclj(ct0JEmpETXT%)IS9$&)QrdGh@Y0td%Au7KO|jhWv5Hc8X_BwciXeS zzOB~_UGhhW*;VX`6D*mUN&ln@k$5&vHcR5AN|ymIS2|TQGpxdCm%Nngc!mk>p21#o z;{Q!n6lSOo;o{!6WFP;;$sc|(GqsH5v;1h+eEMm%QSyF*GtCX*gR!WrKw4g}KK>73X$8Fb{0rP{ZVzX?c^bC-E&O+p z{;xQ-0!Rjti8JdaJszh_$y4(ta}Z8eKn`%2(y4Of*-qQ5w|y`cm3;(fnjY|XXN^Wa z>fjx}dioCd#~w}vRDfTFQyoZh6;7uGlm0Nyv@Mv-8k}@s1MqsKQ}ZCt4t2d6+y`S( z84H!BOZ>xFm<)XPR|kfrmW}I*H06V_zlPM`z^UFR`7NAI^CkU9oN1dcnY(ey_yPQ( z(y11D-$Jea`>=SAvfl5d@M&d*P0n2>FHFs@8{Btrvb0#mCTW}IH4;u0=LaWTH)jEf z*-8@!DV>^zJbVA_)mJ|li^}qGrs=C`Sb?E|^9DyULW6TM&lx;4a1|yd!C8UOU{v8O zbiHti2@PHxnLY60fg>@k%$SO}OfSxutVm$yz|i1<11Vz6fHPhBQUuSK8n|ul;Lu<) z7e@*Zlbrzp8^rD~YH|XD2156lQ(@4sz}#$KvdaeH#eaqgW_z+j5X|&~IVC-ULq`RQ zB3EUu8hFjXtC8if3{w;_Cc-o%aw$z>_&_P|SrlikPJ+A)GxAId_S5>2)?=3qvQ8RRA_k3i%@p0|jzX+hEy03d566!29DCWIIfIG^jyx03 z#BO8;y*=(sBUL4V@p*wy1_sR>C^duC!1H=k#hgKxK?mmY8AwtB6DN`|X3|vDJ*{*E z&hHsf3(*UFnjEnUy||3U5hr%CFV=~hq6#w@Va!xd1TEyUL2M(_rok3A!9tG-t(IA& z4G0l$1;R)=OI7?L9dbr3}E$~pO%R^vRYDJ0xcy@7{ zn&f$Li5WSBO=S++j1ZR~MjFqhWQj9H@-ntyO3p156Ig%qe07XG%e?CJ>UjQCS!AG%;hAi#SZE=xG%iDRf-v6#zBt6kr8SA-i&bVQu8YGgU%nki5#@?C^jW zfkAVS)ztwQgd6@Cq#ir)BGl+LtlWVEF9mt6lgMUc%ykz@=~g>U&WZofRHQ+!u46t7 zLriSA=w6c#y4sPTy|=NDHNz2I>u7SL>n0#N?w7`nIt^-Zjaln&Xe>s9S2?aw;$j$u zDTytbG3)ZY0RZl99FF0!X=-30hS55>pqc%^_T3iI<}g~V49t4xHr|MNgpn457B4-H zZg>s%tX`LpJa@EXogpxWZyb#gdaTKi2UiKqFj+8*D>dT>5I0l$Jmb+5!X7l6&t`|5`kfnbPqooAvp(TO&moBe zjggZQr1=mj9)alUg}4q5$U|`;>SY#Pzre{X`lEJ;N@_mZ`BEz$?OniozE|26*4~W};}KXP_I}$9ioL&)$_KY{ z5d4R!Frl986bWIBF`Ma6;kIybPb5W%B%<{frSW1z5?Q661Rbff-pl@;MzsG508ml z0Ap$q&br)jAadWxK#vA-)>*h*4%tS^AI=z7fN{}8qh1m~&V9l7wY&1Fh2qzh4~8z7UnD#W&u=u zgle1uy#%fl=xZQYptD#YN6anMr@)m$aXu%78irLpw@{R4^L7i>3Nf!x&0ula#aAeE z)^}hNca+S<8HkOEgpp)F;>=ku;YuTKB&T{zWD2r6M$XWk=q|6b$R9pq*uQ~}1TYHh z1u^VD7@COCuR-KKh!n4ocoxK)B({R}7Z7K0WTs+1Hjf;4_OMojhuuJtk3#l#5c#je z1CB`6;Xux?qlm~|1olZ19Z)skR>=KaDslu8%cwv&Gtp4y;v6|WCsK+e z!Xa}UME(kmgVE0EnIcKTSjLR>#|}Lo1!VgQw4NE^JKfnV`M1%k%RvmUpj{mZU5OC< zy%k<(#Rb-%8MzzM-;nwVg1Hx3pP}ZqGb2xe!#ghyxg$&l;Tt$^|9`h3tha=7C^diy z-H|1f9~jBlo8W>#Xq1m0E%aw3{#+kj;FB3M&4Iy@`Ht>KVXLQmjpb)YR>CSzw;B2_5_f_*>MNroTT%Go z)Exsc21M?UKujSq1Zrn7H#77z=RpHfgr*G~_9*C4dwF>Vm)yfp{yd3XxbRg*cQdpV zp_3p+m*cWiED4=8?0N(uUq*@zAcoyS{u#Ki?T6O~vxbc$pJT^V@@L^P^m$nDJo%r? z9(EM;u>TR0%;<3w>}Kh3OQ>MjA_UCnt8nG7Mud~05yL)$K;(LuaVv;ncjF>?6_D@d zwE+B{d6kl%nimyUkkKB>wu=9#iX(G|V(XNnyrGBk@2K*~S&(rH)0HLz+xG4SCsZ;p z@(`M}w7qN)()PAOfwaBvfRMKL5(sH~1!(lr_M#xz_N49XVkT@mw?c)qof;&tZHMjd zdGgurR)O!ejnQmZ-Q=-d6@w>j_BaTyT@45eKReQh9KEz==-M)43cw7_$QwNxbSdc3 zq3l8Dw%iK$G4SpgXj5`f4*ewS)-gm*SF`R21Ogdj8D#g(njA3WCZR26O$mg@2QqSj z!u;uc#Nn_nQQtOrwA*Ld2$>amV_vETG!#S+iXN4`z_kbmBS6gzjjX?(?cf>yZVKE{(h7!#!& z7qECdvYv8v3CEVjGvb$Ypey3j`YVbtHcE5)KK-(~9Fl<8kr>X`DMn95UKd$JEk3tifiglj+&x*Ug|s z(+E6ZA8uFU<osjDMGPXuHfHJ9g)Wx(g8@2WkPRG?Bs$5OE^2TYiRL3&j~q=MO419K zJlBgom!%fxjvRBROBQ(KILXaQOrgcr`jJ!VO&dMUaje^TM%{0_yJTkrmi!{)E%_xX z69uCl^vEw;r<4$+S!aYxm}aJpM@eUwY-8A|@?fcmWd@|hXUG(hCI`Y_G#MAsBR2F% zuym#j#<(p!9PGjRQm^1FrjwO^ce)xr7<}(ssP(Bl9P|a=_6LF?A1CAwg#CdGe<0Hz z$npmUg`^dP4+STW#so3z0$PV+91TVoeo?pxAF<(gop5*XElg);pIf5xe+r&U`OiDy zKL_d5{9};keU3Lh=)7pyIcQsv#}PXbME*s%3%TsegMndJA|moduvg3dDZdR;Ov^n1 z;Xeg)hkY6m7t8jgFOZVGAYTQQ`xGpHn8dsbjrjqI%J=#C#CBt6|A<5ToB6hZP6Pof|wevJq^VZ>|P01}byMg7^@L%RpQS;$l;d>!<|d z{(v~nK`&v(VNOe-kQuL`!k3|N0en6BXM!!NkAf|#{{?x7{ZE6C$@D=G%wrUbI*P?a zL4J;c6nZ(%QU{>U8#Qun}cca10W$c52?8skX@x6!`eGPoO zin0F`7!>&fVrAa=Yb26+h)p=*3t8^brtJlZQdr)*^j~`u}M2D2}v4q1bu} z2-j9ugto2%M{FGnLT$YP;|6scrk+<&>qQs?zKO{E%l#a-hqJ(GA?K^8em4!<#0lv8 zCL;6MCR`5N#Q|{GF7g6w6qf|p5H68ca7lnoV3ahGTcBCm0qdFR57HXe^N*39^&I&+ z2wT-`E98sC&4Fwg9qh9!Vr?yw_b$%xe+5TG)RpS(e)3( zY@5eY#6~7U?J5xYe}b!BnNJ6^^2Cn8lo5tP{tr@J!e2C}Wp4-p$Vg4~{FozP#d zOe8SR%1Ar-HDqi%KzWC6M`ym&-G3GihK?e+3`?!xARLN3iHxNoiaLvo0R1}H ze1MKTLX9BK;sd)Ym+~NOZ;4zK@lZ)_*s0meNHbC#Aa;gp}?H5WdoJscAG$s<)-ffJQ0Zub{*& zoh#>-?jRIN=^lfeTRK;+SLwLkbg8>*D4gLHZw<}PK=HO9YiZviCgrQfw9#$folg1I zLr}{1&mg3H{|-XR7eWGG`M4#ByK1Q4mM;ncDc?#Yam(k*x#hbMa#FsFA?KFQmFrc$ z=V9FJ*O5rtW~NuXowPa=#rqkUQhO6-Ywi6Ggj>43PU#+joRlsLY$;ti2r1poAbh2J z93|r}8LGFX+Xn$D-RGgiEuAapmhS72lhWM)Ik$AKTx#jgW-d7))S&Lf31>+GWw<7f z`(Y3lx-76-Y7k;lf6rWOODIFNE66tbE-a8z4u^=8aykepWeo^lDV@DG)Nf1qFa%gi zzUpZ_q#cz5?z3fC?XthG` zD*+Ya)BJtv(gFOQHs)iHBf$MG10g0u#V z32iL3&#W_pH&{PRxLG)9D#%lF)XCDVy&JK*Ak`EIPhUVMNG;7kPOhSveCFnXJ6^x5 zRNf_6Wm2W*N|i0==SMcA~sezY>tAb$FHe`+WDB%ZT@6yyY_f zOorF0dseBc_3Sz6r1LTl*`o8q;vZUoUHbmQMKS1|Qw%qt^-TtxtxxaD4Uk zcT6>*R$_gm&%nh2jtIUK)+ifo>B~jL8nxUQqfuz-qFzFZDTnHp5_Vi#YtHvq+|aQ|VA1;g6;577}YKKuGKL8y`edv*gX3fLOB2 zBX6RBDc6}wS0E~RFq@low6t%;JZpP9H{dJqc1@K=-WJUY_)^@j4o;K8jnY2*Me(Ms zs0VCCd2UIhb&JGWw+QLW`0~@$tQD|kTiVwRzLz#TiM81Y`F=d>O$^;~pVG6Qe4n1R zBbTerq^Ucb_KU&0E^x-A2c&ECe*)us2$31-Xifyo^U!yy2}}};S*Mu5D4U~$9O2&t zdPTkLL|y1gy%JzKpm!qk_stYua~Xf>$#~0U+(tE}OwS`_0;6g@drms(yv#%5L}uP= z0z+#!f!V}T`^-8s_;Krp3AYO;O$8Y|k7HjTdZ@RpD}1@V0ocl0B7xbz98N)4zAW@I z7_%GC(r{Jibts>GmlIxL!!{bhmDzt#k|{d@eB?k|A8KC zyaoCmA|ef7?*lRF7r5m9Jc94oNn|7Xzep?s(G3ENO0%J5e;D?y3>8Hlg0TteFNRee zAad`>Gv;Ox@{*{Va$FR+6>_pDa2$jz3OtMivM6v8gk2OEz8l-eW@kI)zglj*!?`VS z_V3SO-cWXp6ms^MQ5s$)VKFKPz74Mml|+66W5uYyz!ov80phMv4V0r%J0T}V?Sh;b zwH3akExCR;d`p(Q0U^F=g37m{m)k^<^_h{6BcsvhL*S37 zhYLWA{sGwA$=)6u7MTO~?`g-^Zbkhtmah>0jC;{Th#0k-mwmY8K3o7ki2!&nk(dYK zbrN@hc!xy(dC2}YC@X+QlLcjW1x7@!N6OiVh+F`o97Jv#<`fkqMvlYIe-e!#>PhSe zu^xooqg6;9cLxUB{a{;AJXunC2?Uo^WKY-{%Jf`Lk^Nm;8GnzHwhH2sb_WPI?cUyL znf09$(QL`OE;KMQae^`5MnvQrAohTe{dxrhz~&2!1JEbS_swAI3(*F+xq<@Mh9Z%h z@V@-hh=_E9_yQ|{uX|g`#;SJYGQ`Td_8t&+T^rqv7TgI_?#788GkT8v>b98Cf>uW} z_egK$S)>g!yh7Y--HR9L5$ABg?s#^F+2+P9LAn` z8}u`ljo}N3jUZywxx8G6OYZ+n#L^{+QQ*xdF$=_U64!vZj>LD6#aa;gUjwlvjPl?N ze>!kRMP%gViP%vO!sN5T@Mov^6H3x(o&ZZ4&DTIkqd5o>X*79AA&rK9ltx3h zNu!Z>6V5L*xedp+823+*bQj}X!Je&0lq`cG+{Np*AbI26DNX2EzYJSOGiYTiQ35S$w*AvlXzZE$vJFY-(yN_e+Vk)2&|zKaHBS z^m9J?#o!4<+W41z^lyFi%Rc&dKKg*rc;JyI47T(C^gphjlWLVWkMSsLY0ud_)me*1 ziwbuV_66Vc_P+Gf+Z)|FbMv^#=c!)PTTk9v(rbDpv`bVU@4^n8G~$e4-pXz$u%t347p~?HA}7oGr26=#j$sN-|5-_i3gHvYg9!30&@M6boeDzML^P$<@d;V0>)L=)o4Dpj<6cUxQL zGal<#V7+JmF@$9E0>Zvrv8C0Y>q`jwvN?dD&4y3bnXmK={{H`C@6F?FD&PPA``-6j z$2pu#hhxZa5)KE)(4iA5v+WpT8!`_$9CIikLu5$ONTHN85~Wb7R5WXn(kL_+Qm9m_ z-}SohYpt{QMc>}o;4{N^H+G{7u&mjw&_hq8|Dp7tN=6x0o z_$JZ%ZK6DqD1RUs*MuJvt-mD7Um~>CbDCPr z?Qe1QWft?7SS(m;am`B>i%NAshHDFk0*hx@wPdTs4Sg(bTyAmm9*d=)O5BbS-5w=YJ!BK_eAeQwcPv(aX|d*n z#XZG_!SmiK7WXx@c%Y5NgS{=*jSbiM?rPJ+@i;QHZgXSRXsOY^eR3AF1=r~>f)GH{Z?A^f8JuiUP7#FOFelK z*h(+9?4&F9gYK-eExTzf(pcG;?m~yqSlM2BzGWZ#4%%4RzIvP0{dF$wmttiH>Is&E z^Ao6SlN-fo8@S|&~lu9&2oZH?GF1SJ>T+j-NkZ>zQ@+<3cbzh>DuoB zznQwdda-Ke7xlk92!S7n#whwrno?&^t-fVfJE`Bl6Z_z(kzgu-XtC#DU zmMir@+x|QB7OU^nk6V40uG$~@*678S_v#~-_v@N{k^Z2*yC=9#kF|RKJT(7qJN!`KvJ*D5Xd|Ll#`K)d`2!7A&1=fFu{?776eU~lg zWxdAQU)7&ky;Bz(4F5OuqTb+J`mp6LJ;fLF(+^ti*9R>R=z4a!eWvfW{9KQ+{6g=u{8HDn z%j+w>((-FP%kmq&+wxo8+Ag1iI@9uy9%7f@VZGe)d%er@h|aS8`lCK<^)Wrv>f?Ha zS=aHFAbsKE)$LEK5Wluzn>Y#q4q^6?xvqNsGK{ z?PVi>TAd!rw9BbnWS#XZA1Q9zS0OUprdN!-MdTYSRbGwIuH8*lUXR#w7F~1jd^#*< zj-pTdQ8;W69+(O*d#apBfn(f#*ZQBfbO9RzY(L$1>({{flA|sv0=YacIsUuiv#R9e zX35AMYfV3`Jm0-L0!PN=3p`o^#8x!GeMTF!1umJex!=kqU!((*ssUF_$vxo!LuurR zGhB@9r!x#lG!%9ZEh);;BzXo%PdA^ZqJxQ1oQ+5EgWw!Iwh$djadU8&tpgq?h~it5 zIjAK~k!EypMi+L;(IxP@nLccS=SA^7dJj@@nG?lF4i=rYM|2L(MRT5MLLZ;dM{gVl z`|KgR@)fPh)Y2kRq;EiCy5dA7 z^eUR&qv&XynS^JdMQipbItHgKO}cTUqJv!JlY0~$*Ot;~Ri*G7(O9}YaVfl_m(yp? zbo#Ka$vT$O$l%1K$x@hUN*T^C4M`bp7d&#O40j9OeNR@glyeNugqpk-WE$)iMl7YV z!3k57&jZ6y7cDtusEy{grD#K4H22+eHSxVzN)v;#ELZDQxSJBxI+k*-!6}zB-Q$K0 zT!UgMxdx|U&a@UW3v-=kaBAjEPjbK+l#)4zK2$&SNWTU2HM$rd=#^MXQ!|`|%kw5y z0t#1{CzjIO;LOh1-$Ks|`}qc^e9rzZS0~KxhDBm27aE)pI;Uf2(%vCHh;!nVB9_v^ z;B=98gVb|rniu9N5nCFZTRN{wdffjZWO6K}mBFbe?FlJl4IYJwrL;CU6Q!SpP-=bJ z5;N@@8cS(oaB3PX;I?KRDOXU_V94hUN>Wi6Vkzy+lSCJ$8N$FA#AAM%(?5+X)SfrF1knn|9grkR47G zwv)l>waeK(J}22a8=P}HTc5y&d@gD%rHjGYcG6OS#zK(!$w33(8|# zUxVunXFC#f*7uZ@X+N;9cT40rrK#vK`n)9iD}B1&3O%W_`WalaxXvma;bm30I5Ta8 zSW16`YZ_WP+>|mR!dnDDVFsAo1pCwoc2pD&cKbn20}U>IT(w(9cq0YKHpt*I$=Nza zutTEEu-OlC7;JFKC+&}smpdC$cB|Q6K+(qaRyhc&f%AcJJZM%abqdt4K8S% zSBhb;<&>1U3Lma?gzdM6bo2rG$Uy!UO*&Ga0GHl9a<_}77d*o^ceTC?kn-ZOZ)U)mVZKO^yH7GTfa)qsXzOBu* z?wA-$nQB^-(N;0FCH5Dov%Ef(Vw;;4!|VQ7NG^OUZl==WIa67PY~YgB@l+h$U)_udR0E{k`d%r|&P zLfd#@yU{B~gY9nNO^vr@w!k2K6w5J|dXtwKdd*7k;^lm^*Ew`(7VkirZ}G;3wr;|< z)LRtV<_p_0@4nD>o3P#LZ4Ye^YCekssJz>}PeWT zeI7;(ob79o?|u)XL(cZSusz^m#K_r7i@!^niQ{UBnl^Dz44Y-u9j zLmoyjob3ydZ@q`nDrYMr@@?=i;^Ay3M81bTjBYtwS&{D%4iU zM*ftCfkEeRW_;$%6O^u^*a~8)PkR_{a$d(0!tiGFjE8YW=TIpj3~xr;JPcGhhp*xz zQ1oX#3`RQJVPSjD!vLkTRf!Kw`JVSM*yU`Mg>Acs0WoJgE@JNRFxcsARYkrRJPe#U z+czTLiyj6?o$ZLQz2srQ)Y;AwF<fEq0_ky+NVvePMgun;zOe z7PdFMTSMDEVSCeiEVO+dZwrp2Z+UNp4hQ3p2*Gytwud2KSL0*x5on3*@=Em#Y`+NG zJ6^re_Pem{_Bw>NvXQt`pP*Lndc#A9O2HW=A2Z+c=7+Y7z{cz49uMQmuCmnw8?Tb@ zdl;K^w)ydeQbRuQJ_>Eu3fqU?&!O#lVf)A{P1gx7=FMUi`Pjo)wX@wCK_%#Ho9pt4 zhjCA5TNxiS=zzUme&}#leBfZQeClCj+eNrHK6+5ZJ`Y2t&S7mr5nPA;-m9U*!wE&O z!vPP2<}Sjf(-rZVhtXK)@MJ;}yr@3+>V^)_#5+)zf8liwZO_Ns_cgyw^jAT?s|7!?zyp1Got9B^1F9-+35d z9znZK`zt`5S`nxA2fg}~>ax``iKj$|JltY&w%TIvaM;6ey|ZPBeBXPxCF5*$M7|>) zhWDMVuE_U;hg&$#R!`*n(ZlTkXUmSa1uM}}5BCS0LwynWn1_2p&ekA4GcDZX9_}wV zTSJlWClB|IoUM___p^ul5YBdv$oGqfdri)kBl4Z_aNok&8jF0tdblU$Y)wSI-#pyk zaJF+rzTZ9Edvdm1k?*93`xwr4UVOe_^ZdiZ4KC->Ejlla~Kw11QlP&Zy4GxiH}aU%06!Cx_raq z1Cyyy&LfeSI#)tn5AGd{FzJkEUN3&`^ZZSIB7{h~;9J9Lr zVQ3p0*f?elAGf4kzVU&LV`loez3FTdgYr0LZNFYGW- z*{%r6uigIm|V|XzjkQ5E{MtXJkQ6id6#cV5R>cK)W_{!XS+T=rd{}% zd|B4apAmZ95Fg!cet}nWAGi2jtefJ?v72Aub%Bo?$j)nNe2KIcw(yUHwq^0&i&WNlWUTPceO@e5MdR_Y!g_U%MXG8%N>*5} zF0n|4#$#oL_39dnoTc%ISz*1p#Uj--9ycp2v1crDw#K7pg-N|)k?ML)LQ?Noq=v>L zX@&Lb6N}W;cs#AJ#D1|zrpBXcg-QKmky;v$traE>h(&5^Ji=C3uYs{hmd4|3g_Rf{ zi`3D0w5>2>ek@W~<1x3wN{os{>S;XkRv2q^ERwD9_*rGR> zg?bOAWIl)w*i=6x_rtBaSjpG)g3!GcyW4xC_D-I4kCoi1@j#u6*_rPp+S@C*X-z?1 z*Lc#-*<;e~%8ZqKL*qF-=QKb%QIIz^9?*04OQbyr@|MQqd(P=HTuISRCA{YtIK8d$ zaG!JHUs=1GRqg;(a+k(af6jh22Z6~sahu=KcqY&}T_>HWy1VsTq20c0@hAv+eWou9y;=r0 zwe4CS-+iBJJhD+_=sWKpe81I~hQ9Ov!S_3TN9eoYAAAq$S3}>0|KNK_ z{}lRO^AEm<^;rc$Kj1C$|EGTVUUv?Cul)z#BYJA+yZ9e`f6(`azSsSO?~i&{=)2?} ze2?lsLf`BE!S|T1Jt}T+dlQHn@V>%Wm_z?^^CXKEv(SiKi+0n`a;{Nc$>`^ z9&ysD$I>p>Ur`;y16o?MSlSf*E0W5McC|`dNW+1&bBm>2p;IX>P*ZgcQg-*3b`yfo zg0?sJ@!j3K?}-ro`qF1~5PjqzLo98YK8NTsu0U;1$vBw2uGC{fuRBibmAQ!=RFh}% zNmE+y-1A$zuVpGyZD;74!T@)10Q*D%K2X9;y*qSRBOP4uSlTRoJal@1of?hd1`eh_ zOr!77=JXMC%WPeNlxy8OnIVXJmCg&DHb^JbZH^uvI&726~bA4A*Iake1u0)58Vpo!08U7-btexR%ib-mEE9gmCz%NAiW z(Q)K-jgE#+J2*d{=m>%=(qlvW3-RT1{%iGhq5Va+qkKM0rY+X%L;FjK^}9~LK_)u5 z(fabTGsV)D=x;**S58x(>-8U@{na=-HRT3fd0fyHudxXTnsTGg4ef8R9W|z`H|aj1 z>CHsbEqYRDdW##lno?BsKKjhTRv1fLs+WXLZ}awNpF_0U-`jBS_a1#lo%=HVSm^#v z{N^h1#L{lnpM{?9v8O$3+ht?}$I@=ospEr&zaJm22PJ35RiO{*DE2$CwB@>CnCGMT zzzam4#mIxFePU@V^zbmx-qV*;SXeA=rCuJoA2@vx@$R?lS3>t=7{#E~73F4@n1J5K z3LHyYt$zufj$=3@!6}w@x2{CqZj1j3LmI-qMmG=bKl7+oSV*wW-lO}6PAB*g)Ki@9 z)mMd1zw=m@-KFiIWEZI)Y933wU*8vc{=tu*3eQ;D1Nv=pvgbuYqY~ zBBwamrA%Jybo!-1n3TWudPp}9y^8&<*LpoP^g81dFDh(eg` znf8Dj>^5zcu*QR zJl@y<_aH-fYLnhLmcGF}Pw|`VqYq5!L--J#{;+u$1{}4mVN5Lj5p$T5>^7XfpZB=# zGA4baQIiAHH*qF=!Kh;CkD4>dZVxHx$D;IA>nMW7(jPO;!koXworaNVlj%t&yXmE; z1j`bc$+p={2yNlI$+j(KacHZoU1{zqO?Ne){LuQE~kvu11PvF@}U&zVm`k0%m5&_vt62(;b& z8M^fh9y72-g>ISA%c)PobJFxSvGg6L2Bo>4%nWkbo-_jSqsIt|hVbSIv>o^~%5%m*!!&ylE;<2^u)#6px^R zZ<*$ySNFi{^hLgHhK8<>{e2^Lnd?Hg>>#4;jQAdT$7~9{-V1_--H*k(+k6yyoH(t= zyXIu*q2fzI_V-McD}v@1mBu}$S!gU3Zw!0yebXoOsB&7556raCqfX!vwjk)=56$hN zSKYuXz9T*|+e3$X2@dgIADhoZuLcQTcFm5Ze_~Rm2F=Yqox@&}6*^oHIGj@5Pff?r zYvkX0?K78#UeUlS+_;0L?>D!GUPJ!Y>wtMC^tvYS;@#?J=JU{YbA)%*wjAv6-Ci@6 z{<--p^jaN6unrvN3sYlS&^PM>2iv=7KdmcYns%YXqk#iw{>qFX8{KrIL)9~Ei=}^U z=7u?54Qhr8QnYW(^3e8P5G}qw-92Ml=(ZeC$xPN*!Yll&>RhIKLob;z=urn z=|Mw_+QTdzKI}lX-4ogmZt`JMKXk2lsw;baZ~BH_S%H@w^gbov5i>h4tVJ@B#t%U+3q73nitl|FJ@)T8EP z=szg9jmr!1n5j#S?wC53eoBzZ>BmhpOusxX{Uth1>2(t`(m`d>q01_~`GSAU=<@u%g`6B)*Nb zv7#=-kx0~vju1smCoASd&{N`8+zV00#8h-3b-*C}!Fc94`j$C~K2#Jv8O7iKMQ6}Q zlZ8m6$sb(A2R*-MGH6@a%l$}mE&2EZJ=GhDqxQ6hJ^BPh|CVzk)&7G9zT8V$o^t*5?$IT|ul?9%G_US)tY=M(txrhaRwBdJWft{+~gN1Dv z{V9&kvj};5vbY|i7mHgUdb3y#L9cwUc^-zin8iyFeOcI*ufL|{hPQM?uOM6Q)%1bM zPtmFgi`z!9&&b3Ys-m}(WsKW$uwVwO=!QgJ zYz^+&j_50=v3y2pnODp~sITd3^bmdIo}dp*{x95^>i+w#F?O@~kQ-ygC-EE1e%@fL z{9(kyZx9Ihj{C;8_W;9_1JCsN8Wnu2J^GdpzWXP7M(*MZqv>1%bRMb+fS6_ z*D`LEDlr#*Y}}@s0nx~~P1lMh#%;QdVL9Kpn%KqL*0}B1uGAfk+m3Bbx|vG!Yj`ST z5UQM66+0++xl6lf845MVrNU0X|Dy!Ah^#9*Q$?F1(dNP*p=QSDLq)sNXAX`R(Tnj7 zJsurK-{KZ9+M9{ZJQE#3?T7g$`fyA70s5w*x6)^myYZDKzpGm*n=A;{s|%w~kd4<3 z3I4YolGCOv*`nqe-;0bGbJl5ct}e{E8abW&NVsoEa93lep!6Lg@dhM*5F~z1U$lFd!`PfN==;$G zOCwaJNJ)GB=f0QHSd#qzv!$(pt56bw8_tjKkixfv6b~L6Ylw)fR8D$L>eJzrC+E|a z^!5q76=Uo-^i59<;@nPOw9Q1XCBb_^;=glV95N;>s1-PR?gjC-zTT3!|G`)s_kEF` zMTI$^g>mWgQvGdX^v0-?Qi^NQdV>+t)uE5nlmWg(=-Ru zKiSd7x-=utb8-1fQ-B6E)6%qk(u#<-W4XLTb1Ta85Y538MLE!S^?s;ro$D|A5ms{SVR+;|rP*UYarn>npbTV132zOb0d+D zF462?1Fs<7PV=K=k6&N@$-a#81bJVe?^w^V&J3kESicbqee@m8=#SY{=WR4Mr~Stj zG#B@1yQO&r&9~DWO#ipyzCZ;8b*x17K^-^H9Mlo}yjE1d?KJ;M^OaP`H)%#4gLk3_ zb^Rc&zW=x4qK*T(PBXbqO}S1*seII-q961c9cTU@_(!=u zW(D8NX@+kjn&GS1xAgzOAFiY1Z1fLeqkj-PzJLB(f5gVRjM!Lr5gY3+Vq@J! zY`h0QnEqRTY!iRdyp3XGox?VPbuO6x$sWI*U_Hk67Obc7^;$#$m(Y9@&B6BifAWuy zf!FE>(|?A&?qUCfyjY!1zc z9ZdhJUyv7dS`}m_{%@t{(ems@GYuoz|7H$~_)pR&Q=VXoaSWtwq4^1#pQbsO{*C>$ zxcos(q~Sk=gXup>uM+2v??Y+6gl7C#Z!rBQ>DUJZQxF4b@#mZWN&0JXaS$(wgO1_$ zw&CqFnf>ar9e?_RsY=}Tt6GmAJ7N5|;o~MZ&1l)Za|UF=nBfyMnq)W3$%u^~Kc;EM zkcnf5jTtg-L`J{Hmke#tWLSd+160e76llosAwvt4Zb@HTH_C2sp7Mu{pE!B=74^n8 zZmg2Z7U`UG`13d2hiwN#mg+w3nKH)Jnw41RqdWsNXb^kZ_uiGTwZkG-{j3j9fJuS9G?#z zecF7&4-4Y&{H~;nJEJyIbG81x_!;!6v3P0LlZTI+G=5_KnDJBUk13cuy#CmNVH3yK zA3c2HxZz_asn$*VtL*;LhpqJs#!V)_A!F)K9G*XX;_z|9hTEhO!zT_JKVg!ZJhEWo zC4(jmnK*fB{Sm{*j-@gt^v^H2V)!K!##7eQ1Ri#pG+EebToUX2xAi?uP8qzgCA2b( zA5k!Aa>20dVZ+cB_9SGNee<1b^=-Hz&dRF*s*`P7YrFwFpU=G80rVa{qKWO7f|h77yPT- zmkiJUx4F4nhEW|T%D=1s*ddcg{x6hIRrz=2a~uAbs)3E}UoOUpwCexQI|5PuT@AP+ zCQbgIRAkDqkwYfBR)pK*zumZlwF`^p-!%!lhw=ZzJ{>e@++}0NOqe|J-&G;(Rcs-y zD#IpB;I)nR9&YzI=(5QLW5`NJ)Wn43g#B7d+ECJ6ik9(5*sZW&0JAM)>CGq&&Y!Qb*tKn3V0; zNgC}}PMYJ_P3r77s^eGc>|fZxPfyA-ZSwq-B=elg^INv}D)`!r$n&&c$yCVm&+Y72 zs^h10_N#PAGA*-xlVsjf*=9(d??>vE@l}%PlKhHG%}+8LXXQm`46LwXyOj1S`VESj zi}v_wRF|x5zi77KAjuTZ^NX5^*?yWSPDxZbYoSt$Cz-5l%2U+zLM4ij^2^Tk{iHlf zERsZ3^Q#s3RXch`{1kJC&hv}a^Hb{k{VV*~sE6vvgLTpOIvK zpoFxjccx$2^g-M-Q#+43B%4yGNxiApw$4g!ZeCK9opPGoITU^b{qQqVvn*ASK9kIX zS=m%-nIyABqlS&lBeU|7OshGRn3H67Q(ewAl~FFN)soDfnfc^&MIJ4dl)S?FcJNa= za(!<=eMM%pvqh45d1gLkNi}y;*y_|0s#9~S<@Yn@n42Pb#C*^{E4h#FXVX#~Vf**2 zqz<;-=}D2gX*R`As^?YmjafO;gKGMkq9Ouu9od^I~}&Y^bGO7IzV0CkDE zB-<|@sh;Ma-N7$bpB4)BGo{dHo?m>-)v1 zP(wAOug1FD7T;xae37&&$$WRkoJbO_ zqn-&ipNiTyMHeNR0r}=^`sJqB)yN$n&dEY4xaA zQmCMkoxI9^b#s!2j6A=hxnIxmtK98pjr6NT{j5&>Su5$N-!RWlrL||~9y2oAl+QNV zdDKbSSm{jnY%@8ZZs6XSluw&Op1GacM83NftzqkDt#V%`&oSlm%t&-Aa!>`&HNEn^ zDt-rZtDi@*ocVUzoFvmRpEd?tWolD=og4gpovED7GxBNwVBU;SUq3nnZ8UGuD)w(1 zGUqf6*~$%BWyA?Xj%1aNM6e{i!1h{__RAGD_fF6E z(`WhRI{OuAw{_#pY;#1}dp|43uUyBk($UX4PVRgBEDD6Z*ZZ{8X?ayiZV^~$NuNgx zZss1pZhgOK0foDWevpnuIfr^68%#3$uy9w;!mgTXk?mJrZDT*}szRGW5V&%ITOigi zAJwR6re*t8e)hAj_N&yzr>#!5Un?6mq7`R36AL>PwNuA?onWLI2 zV?%F?%aItaz*aK8+`nn83tG_}qM%i_(ZOLxo?D-iTy@>nP*~BTW0TB=8FSn!xXPA7 z8xOS(9kPcu9`o>wJ?Pdy=|EN3t<`iAN}>%rzAIfVPt%p1ZCBDtPL-l<*DgugGV`en z^DT8+S#z_d{p@2iXn9~;$j5@O+%W7z>l?RhSKDPvm7tA=`tUqcHCt59r{#Wa(j0rh zE?iT;^XZS~ikiQs(K@gU#}Qr|@=%doRBS`qyOd3u;WzA>L=C6)&#kJoI8mVw{j7Q9 z>1w`;9OhuD@1uQXLt2V?l$Yes)Z;IyJla*Db5@}Uguw#I8sippR&q`Bt}US&gb+vT(hU#-#B3O-aT>Z;{*Ow2N0 z+f6XrKg$+3XC?(+KZ|-AO{AS?@)ds82dEbIm|3fMm7X(`Dzu*Vm$XwPhCPz#PUX#+ zxhK&v3q4BycFq3Z4sI)rjla69G*#Cw3)CVX%YM7>jyD)=z`zU*L#R?T;|31W%F|qd z=8CK_7E_t#Dm2UK$+&?gPyP58?Bl8iUK#dFHa)N6rVNW0g{~uXMWIuLep2Ya+HrX0 z;vW(Eem6P)1HwLA*zvCe@%{sZ{V8GZAnYTAJ&2~bzUPJs8TQ){q3O9Ko-!=2 z4kYJaC^QDy-IQUmf>lu7{X(x3`bnX83VlH6Z-qW7w6BAN4Ev>&(70LYrVNX-gl;5s zGof1uO^;IYzTGmtR@v>OyxEx~tHa2|ZKjYlU7V^!-Bb7aD(EA79@SLf7I!{b2d`5&9~j*9!fv z(0)>4c^3+uFZ5!ew+ekg=pscD<5v{AhtR`>zEtSxLN65h4x!fy{e;jj3;nLp2Za7! z=#xSx(};_kGAzmpT~p{rLbntee*^EP3=8+~NBHXWrNTZ-=p{nmFZ33nUlV$t&_4-X zg2t5GbuDfBZ!za#X1p^pe1DVo@xbfIereV))=g)R_! zy3mV-zEkK&gnnM=SA;$xbS--3)J+){7YRL0=zD~IPv{cijW8FliO~IpUL^EJq2Cw! zJE2bqt?2nzH@WhYgf1&|MWL$;T}NmNa&x1)_79XP8s&In9!w!K1=9&LJtsnh|o6*y;SH|gnmnCgNqtF zW!TSRLbnmRo6z%wULy1hLcb|=3NEPZlwm*13EfrbzCsTa`Wm5c75WaL*9iT%&@T%8 zmC!#3{fE#=xLCAPhW#uq^qE3e6Z#yXdkNi7=vhL~6Z(Fk*9rZw&@T%8wa`a}wim{6 z?X8CkKs&|8JxCv>s2#QIbey1CG;g&rsLG@&09`f;I;3Vl-O zv&tmaFH7i7LiZMWfzXc&{hiQN$|jcATj<3?Zx{Lxp&R2#F*{}0&ptvA6?&Y|(}bQa z^gN*#3B5$+Rrtx1!Kh zg{~oVL!r+Tx|Ps9gdQyPIH4~SdYaHz34M*wHw%5I(CdWWDD)FTKO^)Gp64bX}p(6S{-YU4}OS>n+n}i=#fG%5PGrDHwt~L(6q1M&k6mK(60-SOzR>N3 z?kscf=#@gR5qg8rPYV64&@T%8hR}P2{#fV( zLVqpvA)${7eM0DyLTlW7wo``vOcJ`7(4~YfCv+vDs|j68=z2n*BlLMfUnq1tp*ss5 z6S}|9mk2#t=t)9P7kaMHi-le)^m3tB3B5+>^+G=(^bVn46Z##YKN5Ps&|eGvz0f}i z{fE$g_#lH@pNa`xTIdQw*Acpj&~1h8BJ?1k3xu96^z}lo6neGL4-36T=+}haBlIDm ze-k=MJl~Nj^qE3e7dltyHbQq2Iwo{~p@$3IvYp*c(1%;TQ-u9$p>GoUE}=IF{j|_K zh5ktBZ-xFz=!mOkSl<#tR}#9m(B}%>R_Go=_ZK=}=ql zuNQig&`%5fve3JQ{#fYGg+3rFe3Nl0ugkI!owALbnn+Pw0z;9x8N!&=Z87 zCiGQ8FB1Ajp_dE2TIdZzKPB`lLcb^UXF?wl`VXOtRZHyu3PNWJ-B{?>LJt>uzR+uh zeqHDzLjNpuTZ zO6U$kcN4mg(1U~?A@q2muMm2c&qzgPYL~^&^v|RCG`73?-lwpp}!OQh|tG{J}I=$ zOkAGHLKhdhn$Wd{ZYcD*LSHC!TcJA%-BakkLJtvoq|lcNy-4Ugh2ALiQ$jbamDpb$ zh3+BrV4*J+`f{P?34NW=w+Vf_(02)ax6t6YF0==xm|$gdQYxfzVTg zUMTc3p;rpMTIdIa-X`>OLT?xPbD@6``d6V_)JyE2n9zNNULo}TLVqLl&qCMDPAspP z(5-~-By=yK`w2Zp=*xs&D)e(gzb^DULcc5Yk3!e0pV+>r&{qq+Tc|x}ly1URf3B6M2`-Of~=x2rADf9v`DP)l|tVr^!q|5w@l36R_Jj;Um^6{LZ1}6Rjb7KlZ1Xm=nsW%*g7%)0HJRZ zdYRCxgx(?aQK3`YB$n4p=t)99A@qwvr?*XvS5xT8LSH5H<3b-0`k2t|+835L*mp1e zcPUA#GwBv4uoqQRNf%B=4NuTXs(XSis&W%_33X0_PNUbo6h_0FL~1AKO5qibi57+7Hp!SztW3;k#I>$9jpuep=*2Y9V>Y6Y&Ci|m8bLogt7gIVk-ho@1-a0jqzC+`Zy>ui^ZH3?o@#hKs9+!vr&{m@dF(-X{$zSZwZ^&vJOjXtg4+f!wriRD4EW6H{7 z@(V1oI=TE2>L+YZU^nJy=IzYw%wx>zR3G@aWa1_A(9=O`$K%WtYA1AkW*&0_^IGQp z%c`-=q(Jbb@%$>}yn0VI#{HidUF~>9Ut^wG;W|lAJ^f2Zv%omwysm|V> zIhOf2b04$H8P0Dqa|QD`=2y(-#hu?x%qN(|OStqLW?$xP=6%f9nMaxBX#+xgqReqj z{Ocgnw=%zDRxIVxTQKvPw=lOd_cM!^cK%J6{h5oHk1+QzPcp01p$X;ZF()vWG2a1c zyDm-}K8WAQf@7GAnGZ4dGK-gWev6ooF!wM|GMl73zX{Bx%*{+y&e{7gCoz{WH!*)_ zwxS&q>URrsLItPs+Z?37#jJa#)A)@8(!XN1uH^Jw<__j@W{t|uK8AS*^S&xB{c<{W zK)mb>$8pTfO#dvG-j=zP`75(UHD_PIe3O}Rwo9MD#Ir;w=Z5Nz`9Kf8zyn~5*oG52E^Lyr*wOx8M z=3wTX%&pA#m_IO!Wl=sl-qd8aW)5afXD(xIWWLV)npvWbi<8A{%N)#{&RoXa$b6Ie zJu|(oi_@Jsjfs0LsOLuJ>&&m2k$TQvnVHM%!5qiDhItS3S>{Jf+|xigrD*IQ#61nL zJ##2?2J<%NW6Tek$C)MSyZl+qw#>oI+02#9EzG0Lnhjk3mdyUlDNKy%qkij|uQI=2 z{>7}=(D^lHc4Lla&S$P>KF8e0{F7O^k&AOaa~Kn2&8WvS%#WBqF-xA~>~)y!m_wLX zF;_ERW*%lH=eYc5GiNhbGPf{yF%L0|G~qEIh;A0xsthsxr=#-S&YWAZ2g%XnDdzHnXfQEXa32oKx0?Pe=akhxq`Ww`8M+) zGpV`DmxS}%F7A3HQiiUXpv$^H|A}1Wsfy6)?hk?@^x`+#y{bq#cYQ^dNA_PWBNga> zM3GL;6jnvfq(6NG=@`@#q+`%f@K*YlYw%|JGbr#D_oqIQrS6Z9BFmIoiS$1s>Q3;l zh*}5ImFE^PX4LbbG3s@&r%~^Ny^Q)C>}}NdU>~DSf^?mQi$M^71{Y~S*C${@x=sKo z?%7}o_a}{!Gw9Ewpy|B+0%jYq5uG1_=XfdxcJ@>skn#^>Jp!cqO=OMhA=DGso9MTj zIDIAa9_D%`{)7j9PqBW1xeKKFyvM}55mEkkAf4xa&pZz1&~+Qwn67go&JWkosAn4M zav;^S8ta-M^fat9)vq6?U&5Ti>9bfbWZuE)_p;u=e4P0r+uvZl zhq;gW4f7|E%B4$v+wNk_@*t(xU~R9Hs9(-yjqw8XPn1bbwE2gz9>JW>oW;Beq_`_U zinoUO5OXtgJ4o?gV(#YjPnh3w`eEj8oNjRaMR8M^6+nuEcQArkoSw_NIg>U;YsaN6 z{OA(f#u?3eJaY=C&jYC)H?h8p`5^OA=2Og9K#Kc1^HWYg$odHL4^GD)$e|r+AmuB^ ztjWw`)(6S28A$bM!MX$MF03)m1;0x`iZ_xufzxNQrnkCV`yx(X$@)&_M&@Rwy{@Hl z--4$2A21Jql>Qa#pIHCFx)|*kQI8VLavfK5Er9i)}5FG%}Eyh}22mQoYJYV@aMU=8{MHL#{q%Rnl31xWkNds#mS(*AQ3 z>nA|kkM3aoGD!Q=cUbQMiz$V7Q6k=#;8jNb!1_2i*Qmchs<$cPm<*DCDmcNYav=3v zB~H%(Y2&KH=?yqN2P~@8g{)hHDN1!=-5sQP2uSe?IDH~>9`h!)uVB4~`4Dq6a~l)y zu0(y`X6^;4J$Pp&_#LMoW9npAeo>I}Rc4KMQbN~fp3mv+Sa)R(;Piaf(^$`8eJ#_D zS5Uk=SU<#mJ6ONY{D}EA+wFJ;>#v!|IlVY7OO%gyKcf7qOuYLMx*@YEvo*65^J0+l4`n@?IhE7ruwKe~73=$% zn>l?O>vvdx$~?$C3DTgZN9%foP7cz*4`@sf{7|X$!H<>d2!5heS8%UV1t8_ayC1i&9HjuLV!gAE1K2()JDhrqs*e?@H|j>15{s_=i#_!9VHbht6dpf6+V2 zK{^St<4g26FO8uiTAc?Pt-6AqRy{y^5%oBb+J8OR*QlGpen#P)iV+%Ye-P|%)Mk** z`?i7ujM@ecG-@YE=No%KI?p%&(%|J`aIjH7fARVk5 zg5+n%y~wXU`}F`XF{(E>+^9>ye51yL<&2sJ(m{S6IMOJ*GchvJD7-5%GRdg>Kx)rA zkn%kaPB!W(@G?5TWcx0*?*%WX_OSgZ+kas@-l<6cuBVEC6u&%3@hgKAKMNddR5m!y zsAeG5vmH3zsO})`Uk8Eo52M4tsYYE2(xC4QkWN;v0k1S_8A$&3fHP>hfHRF+57O~v z3pkt3mqFUk+i|}+biNEt`}xnnt7*A_^NczH&Ns>{Nu;u&l=_l+45aIwUzm9JBHiXux)hOSylXL1M=88xF;bWQR2i(NRAXi;o^ zW&!hZFk7j);O$0T57PeaW{|e6J6W#*Z!-$-PK5n2koMWnvfcqwzrDqJH%KS*9z@oONJvzz$| z^INtbW&JzTqrQg!8O*boO+ku>cPGN$iP@7mlF==K!`#Q|$5{WuRApT~%7GOBOlEaXug7f4=@&5Db9y)CAWk2~9K-3e zn0WUi;@`kr&gpkE*D*IScYx&oGV^Ut|B(3=r+>#h#_4vPo%*#{y31dJSstYH8mwzG z8*%!DtXnfXar(uq2Qc$FeKB)6r{BT6kJBG!KEvtHGxstNFuwz-UME@G@qcP}N;#Ka z86fem@g&?)7E2sD2^dZbq%qeW2&H5VV zP0W?dwIG#?ckh8ubNY+ScQ}0y^9xQt%>0eh|77Bwbf|9yklIxlr25w5^d_8sAv4PC z$@YP)M=&Qa@oqQ7TL@x#F!7Eyq_1H0}J_wFvoHFMCNQxzlOPt z(^oJbVQykR4N`qyXZ<$w8<5KRiS@5cjIAOa?{)&qFe@|bf>hrI%nLZZJL_IdygLc` zuV8&8a~X35^HGreo@I@979sw}oc;~#LrlCwDAJYA$G~p%q!aiAo!5g~={yp=NU3wd z`bxD2>3pp>Nat@Ozy@@E1U6I(@BE20QtE2(9Hnjr&!zJ*FjuKH;CV_t3O1!bPzReS z^&;3@saL`CmHGg@K&el_3zhm2Y@yUoU`u-DgvM?nt*G8$Yo#*5HuQ`M*jA}?z;^V1 z+hBX8+JR9T=LS2_^&Ob!{^KdqiNA?klL>^h(oE~AoXKKkoqwTq<(A)Qa^SCsULfQy{Ml->c>$a z#hD29rg3?Y`f(oEhtAtU>c`u_i-r{n!#5tW;Z&`mrB4M5#fnr-Iavb3p3H zh2SviXYdkQKS1io2f!?)9tY|A0`Fi!yWautQR-um`tKk}{r5Xa{fBp}p#Lg?)PL2% z+o+x(^#`=gVcY$z!mho7)bqB0IpPOEJ*!#C3rin*C6%ZQt%GCJ_1|P z^**?Y)@P9VZzo9ow;Q}usrNzZzpuc%l==>&{`(bNt<)bN^c76=Ek+Flml|d7>)&kDWzclJcNMtIsO!L6jam-YqH#%(u7@^)%Z+*l zr0bp6z!gTl39dA1A4u!(7a(0<9Rcq!>UVGzjX#2S8da(~k;+X6$*&q%g7zEWT}Cwp zSJU+;csE@?gKMbX;5|l-0`E0y3V5GU)4}_VS`1S8H-Z%Rc97ye06t*UL*Ro{e~|pP zgXH%HNPZuJYmM3quA}=+Ao(2w$?s2){P50;2;DR&4z4$$2Op+(fR9i+ zz>P-bfsfL4G)T*3I7rK7G)VcTfRt}8NcnC6A2aF}a1)JdfRyiHkn-VO5vbSmAlPHT|L!8;sK zPA~9T8s7$=GYaowfZt^x`Ar9@9ScBe$IT$M<1X-R8qWZC(fATb%YQ3Kaq-Rs^y}N; zJ4SsB?l$Tx@Lj4u_#V|C++&ocF@?zcbl(f4@+*N}vPr(;xKM#Ik)GY8DqZWc+(sluUMg0%b{&E9I{r@=lHI46qhm6_|9yaP-ko-Oc z$?tQpKiy9Ne=zDe_#-`$O#9l%_cWdaQadYvM`(Kh$-fRr<0QG@Q5xq1j~Ue&q;}!A z_h{DukoutjJZ{uj@F!{qNO2c})Zh3mJ^WXI1mLTOZGXT26UW-rsL9=;Gaf) z3(|4vBuK|4k9;G4(Ru{Zaj6`r==uqyh%CBu}jaqclzo7NO^l!91mQgUNKh4$^VyFqlHu zsjQ1pThTvdKw7S6g7kb=Rb~zFJWtgIvm&YqNXxSoNav~Tz$99KSoZ=AJ%_+LA1qDV z1MAB{>i_v5m9vO>8{6+?{UGykPJfa4Ci8vfS0G(i9ASNesq0ZX)vq{6_HwK+rt_r1*VV4`WW?^r@`pv%a47-OP2& zP0VMQFEMw66#o;}UoyXE{=!tWt)V_C%yJ;*tHC;(*^JYBFo$sZDCQJSzlmv|L!-F& zuze$^Z)LrM`3|Rl%=!!FkDUG+YeU;U>WSaBV|^{p#BbS=p3Ay9vn!_$1gSkESWjTi z;Pm;dZ)SZv>xY?7FrR0>#@x-^4^n;Xb8^JPoc=S@qkR?Z$;?t9)z>~pM?9N#U8a4m zj?yn+-3g@p_BlJ^NKU_u)2A|TWG-c{2Pw{0*4vmLf?bvR4D^-y9&AeY7r9jvtM|Gdy)3Slm+`LGq7*p`ker&-~I%tUa55L8#$ZC zo4{%`ZU$048iG`hW+2t04M_Fq2v+x0SFi?+(}3hR8YI67Ak||ASkqHifthrl2c&x3 z0a88g1F0SlfmDyJU>#5G0Bg~>H&~n2caY*92I(Q5<6vES9t*5T&z;dZ2ka$4igPAN z{ag#orsrY7`m~;dRBn5a%Iyr2|HUBrj{!T<`3~4qsYjUG!2+dT1M`)78yrFR&%lv% zo&XM~<19Feu2;a(biD|UQR**ntWrLWHAKcKRSX zTHs_F9|13;`)uIlO0@uI&~*VgMX9df6*Nu)PNnO3a2h@T0Zymm7I-BckHOh=+yZAR zbrm>^&NIOIbe;iTrPK;=4&6rt=hAWlucqY$&Qt0!aDh@!fD7q54qQzA171V@11_Te z0k5TT3h*YSz6GzNaTah1jSGR-(|7=Q1C6)PIaTCFrBc8>)IZ<@N@aj+sUN^~N?iax zM9U9cuM~cx9@(JO1n^;{rhtzqwE)~m&-s9l(seZW7+p7jo9KQ&xS7T&z%5iy@NuPn z0H2`c20lsSRk_5iw0yv)=sF*Knzjq@8Kv^TZ8SawKC9G7@Hwgn_`Fi{!R<5-0q&r2 z2=E0uj{{$%@gDFc8lM7RR_Yn>6&jZSUsdWY@HJY`z@1c2@OA1(@C{nuz&EM?=o~ci z7OiLC+w^<}xQo^=@ExUUfV*kE0^g#{{9%G{{9Z6{{9uD{!VU6r2Z}kQh(P3slOY8Pbk#}e3HgX zz^!yX2~vMw3Q~X12C2XC8+Y{gDv@C(|%fnU+R5AtR@CZC=3$Whe+9`usV%XBR%O96HT_1ESV^mnU}dfH!75s< z0IO=X70l4;Bk(M({sOCMRjD2EY^~~m)v5kq4Xwt5HMN=vW@>c{SWByiz}gfK%+l&( zu#Q$Iz`9hg_QZNxWrEpSwE^o>eZU434{S*F0vl=dEO-vJ6U?FYK1yt?RV}cIR?Wb3 zwHg5CYIQky9`z^Kl==^Brq#<}bFE5uAf8XpJAw32_xa$3T3rmbpg17?sBAcGPMC*h#BpU}vqK z2D@mr7woFlpI|rIo;wmRqUW{1?ppN%d(ip=#yu(wu+z&;cQyjZJ} zorrxY9@vliAM8)<2M1_18XQRV0tace1{_T5A2>v-{oqh)KR8UQ@|}s7Xq5vFr~NUQ zuhkfEgjNf|ky!r~muj^G zoT$}4aFSNPgOjx?*OhpgR_B11({pU#6lxE61+@p9O6>us(Ru|=r}ltXYNfjoXJ}O! zoJs2kI7_RZ;B2if1+UWTI&coP2b`1)% zh!0{sBz_hBp12+Q5Wfa}hz~&@;=>p}h&wFxXX4i_HR@8}BbJ&>{07D|;-i*YL;NQE zjrbVahxnh^Zy-KysRP7sL7!#7Z(HhY;&@!Pl-RUR5@|CrB)Mvh;f7XB*qQmkI*lPdo1-V@yC!udO5kr{7vk?Q4iH~KzahSAsfUQKVH_YHfS(axx73Ia1K+Sz zG4c0k7vdk#F2r6--9$WSsr!jee8*DH5&zFpZxY|N)UXinZ_9|eyt@4R@>1G}g9|KrL%*4Ecm}RRjVz#XwB@VS!H*uJ)UMCKRJYo*y zg@Ge%l|vk9t4Tz>#8XJjwbdoW(Y9Jj9Am3>#N%vrEfF7I_zdxQTWukpV5{#CPqfue z;y7FN5XalIC8pTb)fj*H*KLGi_B# zJkM6O#Pe-+4e=$VHW4qd)qfIa*=j#=wyoYF&au_W5#U@~%_h!6eqx!eK1nRcduzn` zXkX$2v@3C;twz@ZKV++^#0zb;g1E?5R}e3<)yIg7ZFMv8Vq1NgSYfLl5ihaTe-oG3 z>HrZhW&MFzWvk(9fJ@;Y#7k{eLR<#_ATEc05HGXUy~Gu^`abb;Tm6!_(pG;Ze%MyQ zI^Y%Xe`3g1t;AKf`YbUFzbCG?)my}BTb)u5tg+Q%Vg&w2thLpbh-+;1EV0g3?-J{6 zb>@}8D{XZt@ha#~gx>3k4Yv9S5qfVXHrnbgBJ_Qj*kr435TWmX6Ps=IKSbzxfQWW` zm)K&f5my0QZ8es7wXIGkw!tpMsI3}_Yf%nyovpq_To1n`w%cki@futGiFhsirvdm8 zTb)O|&Q=!^ueVhT@djJnM*OI)9wT-@Z{h}9y-B>$R>K;BAG1{faU=Yk_;K_f;!U>t z6!B(TJw)6DekzQirI`Y`bx^h4sk@Jr%- zwt9y6S@;9-bGAC}YT#DnBYxgi)x`U4^$Fq^Z1o`V0rU&v7j1Qr_$B0P1%BC9rNnLM z55%w7>Z8O5ZS_UsSJCdo?HDhKUxQw4z=v!#h4`?oE++1<)mq}$(VvN9ZS^0-N6=2h zAmkChVXLnY8!h!D5&rWF;x{oq5+6nT5g)@F6j9)R+G-r}aa+wKehYp~{I;#GCVmIy z5TAft;(wvP5WfpQBJQ-+$hE*-un+Njwh9ryZ>tT&AE2KRcVk>5{?Jx05}&ly--thg zAFl)MvDHOH`0GmIkI^o~r)>2F;(wz(iBDtPA^yZxC$0zn6y*~C2kk=ahTjpNvDG(; z&)Vt*;?HdLf5g4En$QmXIrJqy2Y(~}KlD@LK3m;K{DrN4Kztt86XFZD%De`+-&SW4 zU$oUC;x93t5Pya1AhE|*-zEMU`G_ysN?i;54fG_wY^(Xi|Fu;e@wc|xNcW{<&7!N-Jd>!K<@eNyDPW(OWO#FkbwiA1ik9ZLJ65qu2;X2?S(LafY zY!xQ{34TO;3)dgwpK+Zd_QB4?zu4-3iGQ`#pNVhdI(j|u9a|kw#Mn2HSc&y^!E=dL zidsO##^h3BYKmG-oP_sSh-as$>xcz-?}IoQ>+HnB6!it-oD{W#I2X^W5a*?+r-{zCANg8xTc zkN4bAcjg;I#QuFA@e}B8M94pn_{kJCn;60UKk-()$0q3;iBIBrFXE5zo)>XtiuxAu zRrodWH9S{Dyc^G_5f5PfmiVMnewU z65K7gNAPLEZo$2R`vmt3z9RU#V6WgI!9Kxv1eI;{2?*v0<_cmes`VWw7!=GC%om&_ zSSmPEaF*aa!3Bbg1S{diA%ReT$(lF(y9@cB#oFlXv`O!B#29w zj-M%rOOFm?Dy0!qAdOXm%LOs?>G(Q9Tq<-JL%YVPV29vFK@6Qb9YeduEd|B3LRoQ*f5xJi!Hmiv%kKs|1$|t`w{jY!GY_ zj0(03UMJWgxKVJE;H`q4f_DgZ3EnHXRqz49ZGzhccL+WzxJz)i;2y!J1-k|J3hoo! zFW4javfwL%uM74H9un*md`D2FNqY)r2xbe86&xoR6wDLM7n~$mC|Dv`DmYVcmf$?W z1%itND+H?qmkX{GTqRf|*diDeY!|#vutRX8;3mOa1v>@r5Zo&GfZ#U4?SeZ59~FFD z@Cm_Pg1ZH~1@{W>6WlM@Blxo5D}t{J_6i;nRO!-Qg8F+n=-=5A&JoNN94n~5j|0A- zg!2Ro1@-rFkX|a`nS!$f=Ls$lTqIZ_SS7ehutu;>utBgzFe=zCc%5K};6}kt!8-)I z1n(8xD)@llHo@(JI|LsU+$FeMaF5{Ag58391@{T=7wi#yS+G~|kYJzSJAx`h+DkA) zFk3K3Fjp`rm?xMoI7zTjutcy_aHila!Fhref>nac1y>5L608wy5sV793tlJKA-GYn zQ}7PKF2Q>Rw+cQWxJ^)hZwUVOxP+e&+$FeMaF3w=9ufGvCA?Q~pWuGMR|H=d>=isD zsD?;;2xbUo3yu{WCm0mW6D%Yy!u_9Msi6L@GvXIWc#&X*V3pu1!5YCj!3Mz=!Kh%n z;B|r>f*S=p1@92-61-P%tKb8I+XS}@?ht%baF^h2!99Xc3w8_c72GGdU+@*d*9Ch8 z4+-`Oz9XnIjXeW`IfA)@V+F?v>hC+j&XXiuC|DvmOK_gx0>MRs%LP{ot`e*fY!QqK zwhLY-xJmFMeudOKEZbc zRhHOSFhej~P=7BR_8ceSpkSV${!SJBUBab;GX)n2E)uK|tP)%$SR+^`*dW+0c%5K} z;6}kt!8-)I1n(8xCb(U2hv1`vy99R&?h$-iaG&6Q!5+bv1$&9*cz#;2kBIf7cLe!| z6Sy7}5X>Orz9L&Nhlua;H-P2lNjRT~a_32S0TJbP zNO&U=phUC*LzTIkEFj$M7iJPyaMGsM}+)lUbi53H2nwien34T=T}7J z|HLpL@~MKF$m+FgLgCe`TO;dKXhlu9Vx1~zjWiU@UUE@Eq`khTy&xKCj~0YhES?sv zZK#h%rZl&-O>L~NZf!1_z9h1yzAYMQ4K2EO{=&+tg>%a!_u=LtzbdG1ZfuM+fned` zXtcF{_1b8p%~Z(Lv^CtchA}487Hw4piwX##P+hpSrnV(i+Zt(aQ3Y#So7V!Uis7wq z!tP{2Q*$&@Fn{sVv)iKK>Z=B?YEig4TE8wFt#58>D=J>pOug%?7dF*L%PNYdRMjqm zW#%?FQICoXtFMG9o5K8ctX5n&H{4LYwjmsiENp678(k8vsbAYxR$pK5V>)MkBzp1M zD3X&1Eh;pnEN-re_%oFvlNMQ4abZGD;xailf`w}RwrQwuiul8|t>MOqGUZiW(-J`u ziy1R$&q!{rvUTBxM9utlG$r)!J?~HMV0=2JgsDzLSF}c2!mW{`SotFnZ5+9wxmq=d z0~Sfx_z(0kFNOC3$=lJ)f!7ltdsNgLy^ z^Cud;bWNnOv7vc=%ar2grbwuH9jgGMrD1Jbs6ABM+=}1&rchz1XkmR>+2YDjQDJ#~ zd!(kK88u#56sJ<<%76Ct5H?hNOaG zM&Tz~P=ty$*My^Cwp9^=h%3a{J=o)iSU1Ce_jm#e$ozJ#b6}ZRADi$?8kYfmln6S2 z5nms}!4%Ku?-*t<0KDHhOt#0Q|=;G85Tlg{Z_WSBben%c2S&6A1 z*Zb!=$_gJq;n9~Ec`rlWHpH`jxa7L>O5*CL&}J-;JUpEG6~@WC^=8k0m{Pd%o(DaG z8RaOPg?BbUv)n2OqdcB?rOoI8xjZshuFwpVhX-CsGkQqc9Vj=5c*+}&lYFf2FHF0& z+$elGm|rlSJUkqEKX=+q_#XA?!FoILmV<_A-F6xad6N)!4o6-UBK&^!1mv;buzsU( zI`U2c4SB8~%#-?&hle9?3~0Z+*M0RHEqv4~-p=!2=N!bd+?5bUc|05OqxBGdxt_wm zf#e+I;Zbe)T>EW9qq3Z_I@POR2zNg&|l*fEm!Uin27$=W?kcY<~+=FR6 zza{95g{Q&D&&+q(G!OY6GXCc#ytNGPq|J1LnvbCe9siT0z$UaC=DcjTlW{urbIKPs zHR=wfxEAXiOy}{xI31edKisWU-_4}V;iUZazle{QL*BaOV%k><$z6lmsg>~~xN-W5UEIhe-tpr8|fG5Gw46S@nL zFky?6M!w6P0MOwZ0snMpCT|B{z!$;#@fZp|zaF``Zc#Yf<1Czx9#)*Z9h32H0erzZ z9MO2RI!4|`$fLfLcQ#H(-cO(eM7l@KER1XArp`;iL_Uh2TvS{X^c_Xh3QMPzo-?(0 zdN5e1C0bVs?mcJ@gb6RY?A>J_Uub$rQ%t8w5V#sby5p<{jBvcABDX_Ip9 z*!AX<9eKU8W^J4kdTsb^Th))#$L_qi_iu%N`}4bh8`1f#9#zoZ?dSf<0NlI4-4esS zcL44mfx9k-`-K6xf7)|hJ?qrfmr)2?S#~*WWtEn1oo@xl?D(%&dN-(oiWq4>8$jBV zJt~;fIjv5eeep9YnAv%D-Qx$<@L9dT=}^Hy=Z0T9saM3L{z<1k(tbj9LckK{{zyzlF!uXMK9%S3l!e3&MBv^tlz`k&C*txXsb>A>Xg;_k)HUx zTVwKma)7)yB;>s&H-|NEJ^ORnB2Dyko)63nLc}&R=nWQ z_=orP1zL=U2Vk}SC8TyHmyi`F;cNZYA+>XB(mMR*q1Zb7Z~zI9CzbHKI0-!iNcdS& z3D3nzczXZ|zwZh7EV-`_BjH!j&(hUxnGd3;r5BZ3ojKdiD!1>VX9l{`@`pU1iQi$* z=iqnL^GbSQYM06%yOTUj?R_E34U_M{3nSdHljCs9P1EIO>2iPY!tkEh68{)i;v>4m zhr3y$BP}sqmzb?f{M%c%Je(6(=9_V4{_U;yhpFcUhoTQ3y>b^1qTHEMZs}1hcjO?- z#b?R2zVAHb*B6&8#p@RQ=-9Qb-@Z4Z^VqfR*tIQw?v>TgmFd{EjWe|i4jsF;rR5*H zw)Ji}+}T6ywfy~G+i*{I@mF?iDDUo5J96qe%cp$yV`alOXWlmAnMLLE%d7eV4`Uu0 zy7;wE+TS^tIy_i@PWkSg73CB4{67C16CND>)dl6Vb?C*uJ-bwJc<25;6-+y`Ztn}WLloOv-XB6~MeqjH1 z4qC(S$GuVWhM{*}+-qf=1^yTNx;rx`WZw6kgMr~4y?^Z(cCQMuv@yRP{?Lmj=1o&) zbo}8G{3(&NH!>y!rl!3Sn2>%jC;g^3)P$QrryZP?cJP_aUmyOEbynJeo72gA^BdNL zA>E|xvu=JPbwY}!Z+>IQgiUi!FVE~A{_rQqrXSdle%XX`$6IGuMRWTCA9?#{!@rh& zFknp@f4d4C=un&~y!h(yoYaH4cIv^Ll+=lPcB+Fp_Q<-d+eu}ooKTl~Faz<~x2GP= zwi%a!)O4h#j7QqU0H{FuDRtKEW51p@ahslXT3uHDt~V<-q;I*nS7imdvhS{#n|05E zxtGmdKKDa&JCy3|R4JXC)Qf%jooSt2YDi~BkJXiR(8{vWa;htBp6V^y5a_};4)Wi8 z0bgFuO9hA88R)V~Qt#e4C#B1pmwMa(cBiA9LocLup_GgaaHMx-9JDer?(Qf{14qVf zzwOQj2WO)eX2CD^1-Gg*vhGu-|D>;E>x-}ES*LGNZ)f$6yT^JPe_QKr`|S*6y`8RJ zeD#Ep*4tSJ?Y9FX#&1b^J7YxtJ@(t_BTfRHhWEVEMhx3B1h%seY_K}tP?^u*Ea~c) ze+$q$FYTa}mU%Fc`O{}m_VgD~(#>;*blo`b`_DZ5yNm<356dX8EMMGf^$fe$wD&h& z4_t7{A1a0n?@iyeivEA%-|oE454on{yyj2PnO+}U&iG8KIfLK?ynwD!!l7i zWmNP9&PDzDn3tZHqCIcuU2|Tbm%;NC{dIhgLb)uBd4_hWojdv|^OI#LF$?8oNqL!L zx`%H0>H%vQb!Bd~^OC;6Srv1K_onX2fDZI-dbSnJypJ_r*%vr5ZDRTh=s&yCdaR%c z|M_`q;)O2+CW6~WjZO{roQxhbVS;_&E?uwH+9GP_BmLCt?m4K}S*X`pQm->JyFY&* zWmxuskLg;WPUo)Bb?PWP;hD~|vClk?9yt7kJJBM0aqgLqew2y0jI@J+w7|hYAoXA% z^$*WXpoeoPEI>>=xrTu{^mxE z3|3cp>Z#Vmp_{24H9J>pW}QA^LfV15(y}L~^`>Ma{`Ap3Lm%FLAT2d-x;ovod%EuD z>AG*{q}_~uezWfLv(gVf^8~K0x!pq_egaygAGpcw?U}lVKXK3=9^2pVo|Dx*^r6p< zO*`W**T=ms6m7}b;R8>t2!r_u*GPGxnc$Ba^_w~SLm4~`p>g^_B=!9e=$D%~Bc zhCXJUN?%Vqn4{7TW~8Qd?%NqSn5(Qhv~4z1p6biVNjsQr1#Ww)FRzfPIaX$!s(Y$0 zJNQ&zPz|XgmwhKwvQy8jTQK*jzKmeF{HeZi>Xh=cbt=;`tn9ivqy=U@)i+jhS#PU9 z6_)SYnKM36_u{MRIZyTBk6TWBsxP+!qb5F#8W@&($G)9I4(0|}W zfr>qSV+%)8?#}e`nRP4Xe&=A?@I9!(p1$1RNiR%C%Cr|#>mHty*{x2oCa3R2y`Zr| zzT6=AT6k6aCGgvGuIjeVta(PA0_|F$U9h?*bz;GbcHJX$(z`9JPUdY;ry$2F<{ZAo zwx;>xjUj_U31u=2<6R42oVIk2h18Xt7a zLwPwlqjVour@}svI<^qsy}4&(-HCNu=1hi;`MS0lg=pL089g4?cYAalT383C#$S3S z(8DqU3UYF6)JN5Anlk}9Vp>Rxmh5OUi(x zaXA6#LrJ-iG*nB@H4oI61~b~l#1;Lzm{TltwjyBoV+aH#6xAv&kg&WT;!N?t>H0t8@VO*o>)0~C@ZJX@Z=T3TY}E4L=}9sn>}XR3x#?dGrkG#FS2(yuFnMZbW9{JJbG4sgTm`9e%JaX(e#y>a;^T(}dpSp_8Rcdsc?xEdmu}!3l2_Zz`-V@zmA2E& zBY)eGjd`T~>!A#alY(pIdIt9MYGDE0>k_^JlX3e09j@I?BE^@9Ag0h56xK zm>-VPv!U$wm>=r7+PR5yLwmrv;okCD33Ed;2U{g`u))s_M`A8&VGd?yhTgm|ttVU0 z3p4Mtc!$&ZV&5*A7Y@<$Ld^9M@5KEHb3@EL{w{OFT+9te>bc>N7e@D4S-E}IiF@Yj zc_Bi7dgcswKKNS9d~nm8uALd>F?)c=#tD4~%6m=BJ&%nOM`xV)3&x2{kBt-mRO7^7 zFi!ksu;awOgmL17S(kdnol_jix>S9?>r#i@b*Y?x+jXgV?`vJ^w14V#smpL*v83HDICB?We87}uFeeM`ye`fd*-j_7F_a#I1eMz_6m%OXTkrOb64F0}k zuxr~{aVy*2n$hrt`;y@a_a!6iGToK!BfT?O>W(11H_3EYws&D=yBjOpdlXisu&SM@ z?@zd{jXRVw=MH6>zC+RL+Gn`y+S60-zByrCTb;%`6txrU+*31f4`Wuff7i`BltV9M z;#c3JY~?))*V4JNUAR^4j9uGK*K6CUYUsVZU&+7Q!Ya16#+|O$xKl?24(v+dealH( zs`?7K%02S3x?%T}+?#UX`@<^xim`4KDBL>#saKWtt%KGOv&x;3`D3|z|NfVGy$(`qIL>)V2O6D-)awxy-HH5#c2uD&LCQMkRnac$$| zi|U(*1!`_{V+-C(X^PGW;w6?KgY^xO*5I^)qLN@$b92LtV7Rrhx&g1G1uvgkv$}9v zbz$L$RW#Dn*4$c)7hERueYwf{UAf6uMOvF84Q(qMO(~&9DFrX^%$>1vXXJQP9rQRQ zYf-UVfr}!Ii_x%-?28)1ElZl6&}_UL6<)GFE?9x~;j50cuhDPbHBDhOi4*h~Aj)ve zZosQr`jtVynHD!+vNqflt-n^MIN4{{*5Vz!m=q(#ALSQQR=+0FBySu#LgwSWszrFO zDlWRLW=*83Wo=yS+?KU-@Csz4sU|J~{h+KJFLgGB8ziMo6pD*B)mh@aPNpu@F0Nzi z+4!NTLN5qMmEY$Yn$cVI4|vp7D6FzE+|W>2e{BSO*G59BroOQ)gtx0^FIh7CvQXv1 z6=k8S%PPu3lG4JL!0^VH@4d;Q;w5Wg(Z)z+UAQF@t}I(}VP#lD2aLV`uyrovcJb3$+Fc9BV zT`m|k4#YVHEdxIMs!&-=LS<&6qUY=U@?LJN5h7Q|8{s^)nw{&07+X-Ir1^`c&VxNM zTHt-xxy`UHsuCB|f8izI#JjD`&_=GLB}}V~M8Saf4V9t#)|KInO6G7Q`p-6n zy{xGwQlp)@tls!?Ok}^A&zZBfzM-bPwYjmZA3s$t2ZbbW`_gi}rd(Wt z+R5jsmS}5DeQhlU0NvATn%Aywi15-CLU&rzg!oXXNTF{wG$?%~x_WJMRJBGLRYOBf z{W_$ZUw534SmdZxA`NuC7J&}k8f~sIP-~z;f(<6Pw!u^+wwE&-DxkBk1>p@%F?@LC z9Mbe}h`%AcIvzzQ*EC){*GVA|vlmw`jN$MioK%Om8bcmlfKNBL?vzdnDY_ z(n=eVVrl3_n#Rkk^))KI8gmw?j@R>}O8hITHO{2w^rAwt1%hj z&{Y|o5?r>h^J`Mm7#a~ZrFiujneTwDWIw}xA< z3E_QZibH+%)FoL`)7r+>5j48IB7D)D(A=d+ zDu%0@+f=x%9#k~kRIGnhHD`iMz*&bDZ&9^uCR|)GTdQq^@57N0+fbu_o7WT-!kO17 zq|~aG=JmKLHSw%dZCBG5yx&@dQh3&>5M|ct3YgypT@TR637XYGfM7xv7>|Rd7p8Vlc+6Za}*mguaG=`XnTQ=Fve|FdVH5MOs_y zFvj775NnJPj4#v~XMmBkO^gFDM9Z<2ja@*&OlW)jqS;$(wQV$2ZOo*dp|J=7n#(jN z8yC%qrqj`ho)jr4;KQT_7B{wx+&O|G>RK z((l4N5yUvmpLYGD!|jYf*WnK%*bh+CV*R5l4T%lf+WHq!rXCFv>BKtG_$CRiB@G(L z%pfEf!a*cBDNX2{IML2w6y1aYef2eLTbH5-NTjw8uA{UKK-&n2XkDn3DMdz&Ga7*B zi-n`DYn!T-{zW7M4fGXbFOSfwsks$Cp(8crmbMlt=x31{T@g2gbY5a3ybCXd^8t#c8Jt!E zTr2TJoj^k0CXvuAz)(XZ+~(vr0Y{1n=^QSjE7{9OX}*kJ&@IcPx+T{73MB28$ADWL z172xP9xdI?0?FLi zqL~adIl*vSM98LUkFJ*aUVCk8qi)S#9BoE!gP2C5Mr{$TBF17|-;u!i z5J4=^KofB8vbsKsC|o^!fz`eMMrJRi&Y!a0pR(Rfp~*dQIuw)U31pflks(i{4k6zP zvF_6FIapG`tS(evyKwoU)kXNCincg7pcagjlmo^Ot#E9eoP+i^JOfJ+!}l*_J-ZBN z+?-%?UIyQCsc0joo3)%@s7!4ZY|K4!?Z1WX3;)hLDt2(7QLiSUL1QTmt5eTGB- zGPo8qPo_H)?P#-}Uvnsj^4jSDoNhyXpqYN_2tEJSQ5b?@s3wUG!A_((G1oKn8UwWk zFqZ1r1_QV&GeI}333@r@Xk`Cn7)ZBb0=-|S8)P@vL4!_jHymaZU?%o_pzisUCfRhS zMm)PHfL#&54o4<-#Lx;@W?U<3Yw^{iI{f9N7L@GS26O z1>2mkL$ozX%sP*%bv#iV(gZ^;L&)Rh+S^5;up`X`*TsjuoSHo@xUNkcUdoZ;oll_6gVx41&kV~y|tLswi8m5Do{$aXD8+(NA7JBIcfi`xHYW*Yq zq|NjWWWWrD%Y_<4tFOW5=tALjVcd_^u5ZPhM|VFoxvFi8M6Tj*REMGw_*-iP<4TRH z#udF4gE{`38>VIW_!ftCtW6R^we@ZI(w*-fv@OzDU)PMU%QdYDwXMe(sBds_JL*eN zHIeFuDAwNdo3Lt>N`NL)BP1lu3`m%@9(nk!tw8<@{={%g01A0>iNrTM=zt z+QeI9OxK--=!H$u*{!YNYZPrDx%IlU5kxIz!vmGj-xkEm2-ZQ`^lGnyYGv(_>b1P% zuE6$roM}X(7^{JTaLH;hpXftiUGr5D1e-D1>P}>qX`GU(nM0)N){*5Lu~dvgvS7T93O8O&gqphmzOxnVx z*}OKfIb-5ue4q?#F!j|iFusAfu0FEf(H=b@igs#l;!=TW3||tv5yXlcvBP*gDxA;B21R1TX=gq0J^C1KA6j8_d#^-x|uQP@{QCtbqje*Tp0lxn^ z&Dhpw>{uQd>C7IR?sGCAVAqO4Gm2egtZ;D)w$MzBr^-Oqnp#!P@1S0+_ub$b3u_lw z7Kh@D=nBVOz`BHQr}{qzy5z#el_eq1>SZcU{!FYLhNF{$W|Mrz4D6E6n4!1H0kJJP zV@7_ssk!Nz#^$xy`p2M*0kS$WamEa{I_Fba=W+q7$mSQKu=}NI+M*$S0rD&nyWs|x z(0e>y`e9kB{sXoY#^R%9rz2Fc?gLiQ-D2Rh?jNme`vzk@^56-PPXOYEuFi$ST#f2B~ zJ{b3|WepMj(TO(wz!PsdaKqw%My?FEF!-;M@#Ep8NcB}xo5Gk-k*SD4u?bC4ycJ*U z8*__F=3?)B9#&9-rY@d$aZB5RNCQ|FVhKu{fS>qZL4BvhRHJyh+^@;? zYffu(xCTr9(MmjSy|A{TytcNsY#6pSCL9b$ zg9R(m7BP>B%LC$*^{N?Gf+o9)Pma5nEvTC@wRlEx$wZ8URV{czRQA?pVh18JDY&k= zzUF*|hdQd!GFVnYOMBON_>a%pwAA0*%HrBd{22XvZj9+@whzE&?y^i#Kdx8wcQ?uh z>v~217&8|Co0+lrA7jQT|7K>K@{ciN$v=Y`BUc}_>q*H6Y{qHa@u+UCZ;4hlFXVM3 z*=5gMYAf&ve;l)(P2jrYjkO=Zg?w75@|;lRG+fB1>kIkf3(cjxx}l6$67Q-v&`n?L z62H3~T-@Bkg&s^7P|7sEOp>^o)8F;u2&OJ|73Fnxb^i=g7td-(VXp8#)q1bFg0HSe z?^6Cg>wFY1(# z{`IA!IL3!7%ERICzug%BKGph%jPdWY&j0LV{J)ZVM=-|!E2(z`WBk!q@9#av4^o2< zdW^^Rmw$}+En0s-BYb^DIsSO+zugG`KGph%jPUQX&j0Kq{J)ZVM=-+wE2(z`BmB`< z@9#ar4^o2ixY(_Cad!L67Ws=*>T}yHD2mXYPlwtnWPg62GkPEwLVNrmCNNNf0kv{ruQWZ^|iFT%r=@lnb=<6vGXxVS~Xv6WO<{CgNB z`n8TliH{l=6?z{XD=Wkk9C%;A-NM0hG)2Ycg@{W1X_*1vHc%{M=KFb-;41f1Xz%lx zDChNyetg|$>V=CFOl_hDxA}E=c6IvDzpPyy11 zEf)PUOECY;iTUzci-w7lf_OH|*Gs1Q9@}c;+g;}Qwe|IF5%+1Rfu16(oD%BqK{D=h z4njH~7V|1}Sk^nT#s2}V7qfCdDHs#f){KdXV~DrzVJUNDt6T#r<6EMd6!ZnOBEE1; z;`>tK$Zq5YR6;-1j2~TTC-A;1d1P~v0W0ZFC?*A6Qdigw`4UX!*YYDx`qO-Pz7%g2 z7Rdva@$top@$$r^c~%vV^EKid5w-l*PAxvQXP#q?G!&^w1HV?}FQZUo#l|`%>uNYG zF?Hf|n1%YOPyIxu@A=O{c@DHl{S62HFp)ko@N20G!VFC=n+I5A$SB}iL*5VAX2@>9 zbB25ukcU5PXQ^e20GAr_Nr|m* zt5~NS49PleHze!yydha9WXJ!ilK}aK^r~0oRjYAX2$E;w^lZt{jx?76?xYW=U*sV~mxG6!1pLOQ zVc>JpoTPb(;2>qGOF8J!B|$n31u{OvB1D+MEkPEejjUx9@RpV}09Qf>_5@UU0tVn3 zTrq>=8eEA3aZ&aAal&X$#|7!Qa}rZt3ube1NH7wkjjUx9P>eH4<9S>OM)D=sv1;@194GxUL;{OXFLPxbowNwCPL`h684^s%Xd`PG1#C}lN{=hSNWLUbzyMr> zD`s$9Rf8&VATCbOI7q^1y8*o1fpjh)Nlcjsj(p9PU`j?CS<5KkwdAJsxDt%yOY#H^ zz%{sH2FF!3s1gU_s(|`(t?32HSwIr|k%LnrOD!b_hZT^yxKi?h3=;mR59eyO!pjis zpUatLS!%g+VF!5yuCGlvLB@-{vj3zel*l<5YCj3p<4h%qBF?N0Rd(hwAf0JM5=Gh} zk`p^5t%f3;UL@girhcfhGXVkl9BTX9gCJ{Q7>m&mZXZ0dKrETB{*G6!bOoB8&G9uLI-jeYTKP$k*E7l+5og-xu zqdkP^M~r3SjmBtB1K?>KHG7jA&Era_oG-}}FaX!!iWwYN)u2ioi0gT%&QUpu(OyS% zudz(L(HLz;=w%$Ci}k3Q-~t|3f;oIio`3Fe~RzP*m0h1W51<_GsnRriQG)D#) z&6^J<7|r8KFo!S66EFbR;EEX>SJj|O9Ej^)sLuIj5~DqW=*Ns@;*G{=jtnrGH}_01 zn#Yx34quWdU;wVc6*D-lszH@F5Z5oEI_I`YjCKgoea15JMq@Nb1{lqo=O!4<<4Q1x zFUb=y0N3D(85~#Dph_HwD+tv&k4|E=X^5U-EE8`uMw>bHGH*_uU^I^_!5qFMPrv|N zgDYlmTvdZAaUibMP@gx|NsRV9qIsK|Bxw=um3ZTqBxyIIc`KD9X(nz=cyp2@iLJst zG9(dZX!6*W;;}77cjv^}H^kru=g^0<*5o7|+fv*dz+R=ZgmY|5F~Hj*uEqFvFd5`p zqqm*stUMmuQq<3HaAhb-Cu4NfBylzBt>jBZ9#_H@(3j*17=UYVn}vhp8fdd{aP^|< z_iOc!Z7Djtpb3pPxUEi_vD=t(6TC>4y17=?&r^1mOA&@S+)d15 zTZ%B+;cj9c+fszl4tEpt*p?!UcDS3E$F>wqaE%h=CLhB80~O3G5__p z6uF3Ksms0#ctWpTU)GL0^c!&^7LodJCdv$OR|#(u61aVAtLyVifwUCq^MMP5COZ#* z_8f#QwS=%$lgnAOJdw(xZ_q_AN2EUddB-5eQk4WLy3|*6sjui#li4d8+pD^YDeC$? zmcyt6$v7z;iBDUOcpdO%dm5%Phf_ZmFxF)2wz%catT3T3Q+Gn9VaRko&LpO0lCf2S zDNg7=*EBaNAy);GZo$djK$@Iu%*l2J9X?B~B-{DgDOQ5ghoi2;1qrD>X;{2S&UbXA zErD=W1=6G(*SA(7Lex{NP@YlGVN2k{jyl<9X!WR#J{gD3c+u;tDm z9}&+ME<}NmF@>>=4045MxW~9m^D>eqh)uvd%<*cmSF)?&!T&D6{f11&btRJ6Er=#Z zLif)^(n!PRNN{@$`#ej)0J4Q_dYG@^Fh9?bP7cT5%pBaj5& z>g+&kn#0k9p{H>6^ZZk`PST$*Fngkx@5g1P2dAYjXI>tDS#)`fH3Y-8f*d^jT;mYN zWP(6>NnRM?C3rthHiJ{7ZW6@taHNs1pZfbmr20f8Tqci#h>@s;nII*&Gbap>;7rys zOxukUQ#$BIj z%;A{n1CnL2UMv?%6Q*f0;q671ZeCYQ=u*6S_$f{*Nqo)FDZ~JzQAuK+p)F#6N;0j& z@CAqshE5@FG_+0ZGPFhfJIk_IFV+Ej>`qlMnm9GV@Dty1c~Z$F15G)S_?!oAM_gy< z6ymLhwuuiI+9LL+FVnUgKD7t9*U;9xKwj2RhBXN|P3RRs?#D8o*kov%$g3mbQ;57H zWc{`SA2+nk$FW~Cw8iJI-<5b?1@g?5AjP@=p&UL`TW8_}t-u?EegOE8p{*x?dkk$q z3*0aCYrwY*ouV*8Wa6aEvA|Od9ViCQ6uKO^#LyOTrJ?P0zz##FYysYDXh@FjXtX2k zhcYz2EOsQ)mW(H!Ao>$&SH=^|C7wtdGk&nP=A{_?0V3@U+9K{Tv`ySA@kF)*@YqDQ3Fw%%VH>f17*E_{=m3#zg?No@E6_1*#%sN0XI70NV!=2war|!yEwH2P9#ICM(%CSDM&$fKEet z4N|cUF;AJ;=Ky_%48T0>1`x(pIMa~R0H#4M@fu_a-|jGv<}4#LY2M1~0Jj@*E8sCh z#@m}=b6=ug3Eif!x`mB z=ir1F5H@LYg;#XKR1OSsC!v>GrMyC4d4<063dzpHDUU0mtQXcycUcaj4rsPGPD)22 z79UuBlWn&@8X5;E})>wKI8F103@;)MQlc}uMcxfUbW zO*k<=THgkCpf;pI>cdgQ;ltMr9JVAMI&iokA=P0c{lQA(O(fTllT>IWqD4K$3Y}!s z17!|JJ% z`ML%PH?yo5n<$B@rHEdP6D0?TT#p2uLcG$@HqoqUj5uxCM>o3 zw{6-Dc@-gr}|u8#oAiT@@kG*No904ez1;ug$NqKbyO^^`jRNW0cWnPqQ<5& zg;p5ttf9sxGie>pvAz}5SPrIA-Q)f1r?D(d<}&LEF{`JsJWPKC=ZUdvr?E_A=zx!n zPGH)c3nRpvkc-`9Prk6qR0>R3SbZFkyuVISm7Dbfz+ME>7{FpE>6dZhEgOE9k>nwq z@)`~p7)nE-60>4+fT6KCu_(?ghyfcTxZLWoF*FY6Fqh3NzcP+m#Kb3AQDx_2kHQUW z9blay<84ANPTbfxi6%!vFaIUjev30%$KYj;C17y467X9?ax~A@1ABt772x2U1KU8n zO>H$~e9auOtQqBU=0TeHOPwWQRx~)lwaCo+QWsi91Uu!sLk`of#hGNcisc(Umt?ql zCRB$UywD{x8cXAqHpz&}q+@dpS^uV{;8X40K>LIyTq9#f4)cFU!Z~ z8fHT`c8YLpu5oOxacr(J*ty0wTxD^G%|~aRz>os60rMA5gp%BMgUSCi*$J2kas46) zJVof!frUbooriNpC!K>+)-|?j(*HCWi#Bt^gomNP>tEuKqDy^6m->n>B|8tNXig?r zMZE&yFzSG2i{qqpBtC69;&s56E&0=Aocw~b+sXyOtT3T3)3K+?`g=Z#_X~W03m3Kl zpH1U@n`;zF=I5&rEh3Kc(`5Hz+VQ%%5weJVIB|zXU%de*FUBZaAC9+mBD4i3Zv%XM zh6%q8UmkKEdzuW^pk=CH46f1~dz#F7H0~x?gWh)pPm?iQ@ae#$L&; zhMsvV;4_AFdYseY$i=w-WLy->nvw00(8PCfCfN}hoZwrKSp;jVh+wCDS1(#@i!O*GtUeqK zSiaG7NxrLR!rBKpcm?F3=Nyg%h7Wt~ z37xD~zWIo6pT!itB3TCW#FpM?k@8A?<(2x%OF9W*z4W}pVbp>6f@mvB*YgfXybk!X zC7*Df?kJ!}HZf{wizw}rP=h0p#oYpwp?4KT?tAXDR3Hz=QG%%=wq)gS z1}g5kFx@{1VVG*^N80mcBZd*Ha5|5)Gd}xz{9+e^@hm_;(vHOmM!ShjXu|0{(jK4A zG#bl&q&=R2iS0Q3kF>}0Fr5~Pd89p_i3}Y$V;^ac=OPEaFK!YN&lYdUTO?cZNeELp z#wP5%FtQt`ex#kmFL64Lw3F_2!r0#;{Vq=ZNISyVRADd&wRNJf+rnTTPW?zbxDW+K z#+(_;$Y23ZJ=ZXdX8(neG(l`ak_{O4N_I6&Lb?E7GGx4I$i;~VJ1x=VNSK5SL(&+- z=16e+Ec-l5z$Ap%>@j+nui!Ahz>rQ3$FDgH;IsmFPM-zvp^qdtQI1&FjB@!L4r!u! z*dyVpKRCghT(G|Ev9yW^c53PB#k2=;CaD|CH+n9a2h!-7P#tpc3dn+-!?6LwC*e%v zCM5RqlBM&qmZmB;2QI<85TM85u$;6L zhmEk7q9XP=R?0A_aSpmpphTq%TR3V)*11{ZhC}m!wQy9*u&gXbz%cnpWqkT5Yg(2U zpE1mX-_2qpCx{%YZ7x?-URGl?kbI%^59gId* zYK{edrRJWDxKpyGBW50jWo4ZYvMfhuC})p_!zeXBLowS}W%n|EGFFzg8m-$@6k-x$(L8;3n2oE$~xzdbL7i6>dP?Zm#tF^r1IIk0; zQXykO%+f}~$-=sz`J;kaH82pK%wz}Upj2I8Ik7c{R4U>)!hG=7qWyhdrnY~9Lq3lH zDof8T%&f%a?Q|^8;L!9LmPhBS)HO)wVOgi}DuE*%+F;nU&g3Hk z>a6>aR;V8rFmzEs$IrPF@x>WK$YY&lS(#JGnDy~{Fz|kO3uBEO%bE(c&0$RsSAoeI zO5l-2LjUML@~Y#k>8ui%oSJ2k&_8~rn~Wp^k1P`U$Imp|NFrz^5?MOrtJCL=B!Xrl zk!3=T3T$?BSm%cgJAp@170w@w3g-_-h4Tla!uhN%EM_V#wHFoe6ptKMxo7yH-ZV|0X z!$xmG|vv$ zsEd|#83;-meI5u`81Drr>=Z<5Vd)?!Z1e$06?x|(TMOkC3>$qehKNN7=PskH2?(tQ z0U@)IaTA#?8n;QrLyFEiyg5chQw_k(x>#Mp1ci+==SR6BmC zVwC*9PtCoNY7##wi{z6C8x{4_qZg)+{v%?wia$pUw2If~h>AZ3K^3)d-qWwZ=?d41FJO$L_!q#h z6<-FzReTj#T*Zr!q80B&X#)}r*$ zc^LXU6+0PwQTpf)Ay%vSOO&Nmya@}Hx)q-V;i^~*em)KwtKtsEI4W)jzgBS-2v@~D zU~yHPffTLcUr?G>@#zzNDi)*umr@6(Z6|==Q*jlpcdK#wRUCEYL{tosO*pN^>7zda zg*GBijVVMk_n>rZK}zoVY;qmbmk`7Ie3wU!*??d^qgD^e{Twj&LHuaXU(Q%~{^#Ml z+Gfv!&^Eg^U2OIw2-ox5nbEP%R-|a_RDp1<(+L*WIt574)_DVRwRQf0CUza*2B>g9 zPS-l4!0%ayeV&UGKI>@bbk~hM&wmz<%QvFv`JaKkUUxlz7h~c1PdILoiNR5;_y`E? z7Vm;^-GYzs(!pZgq6bo3#rJ_zMJs+92(5S@8s1gB6uc|R@3_T< zVDl7T4v$$8@A*_wzk3AFeTOC;aRH>b zD*hT7wTgFwa8+EzIys|SGg7pQ1t7GFzw>*36ueyLa8;}Vo2TMFIQR4Mp5F;Ce+iMl z70;gsg&uT0za7$CuhyR5nGmzhAEU;64>sP#sFg!s*5rZJkmO+B$h7eGaf4Uf=Ea{42ob zS?3B=a}~~b&*x&{t^Sr%WBT%ynnioT^Fy%LNNq1(*7SQu@cfTEZgBx>pgsS0Ahe28 zM)}<04ha5?U$`Fg+x?0U1;1AOdywEN&i9pE#qU9iR(u5rt@zpSJ=gPjx$mN8j^}rP z%~PC9ZTI5zDQ;BUMit@tkHx6Ci?Q(h{f>$YP?lD)7lc-E=J7ri?}vI{N>H)Kui_Z+ zYZae@1Xo4AapkJ`08+Gy)gZKrHWtTR6(2+WpQjFvik|?Rr{afjb?4hyeicVOhF0Sr z-_fsVVay+jsd2aK`TDK9m@%L4d&TyJS^gL`#zF;j8xo!v;$*7+C+ZJo>DHLi7@hu6RB z_x!Jb&9lxH_y%{meb&)q{x-DQgZ`FNV@{fgmu#pEJU<`yDn(d2H)G-XixI0;jG_iw z#c{c!VjT!~%;%dAkNSmc&(Fa%%T;_1__gA1L6oa_K3H7EyOE+5|1=1#_-go)tGM$q zQ`arN2{uph{b-+G;`AwQRGft}==mRwQE@qA;rU;5RJ{~+vjh3om77z@uo4ij#z z;#W`ut>Pt^pK2BF1L3;Gvk<)3FI;>6HoxNQ!LJoR3xuoqF2CZbNYRS#Mrm5{yWmT% z;=Rx+7meU5{uTwJ zxGHkO{BnYdIk?`sZQB8UtzroXSH*m=xNSQODO$y!pfs&wso(SYgu)em&;KLXJQZia zANiNk{3?#J&%}x*BK4nqhUb3{3XMaYnbpri>9L-_JRzpVAES;BA+J8%C4|@&l5mwI zUk`KeK!GUa@K;!lFu%LPa)kNa6_z8+@2;>6K0oeO`dMMoA77&R%nHlzxILzWdWGes zlO#C63d^bB(JL$&Alwy}O>9%Fu)Hx|)i!QRF5N2`em*QxaBK zegyG)g=ISky~5H7!d+q6C&JbuQVUxFLa(r#55l*?(non%Vfoa_{uP#1gk*)~3%H== z3;`2XSiT23_i6m-k#_-OG4g%|%z9XQ9)#|*H=ZJW_NO4+k(W~vw|8zsite2&LAbrM z11xUuoQ4$LJO2c^x_1tp5 zR)EEA+y6j{R&fyst>T1IpNa`9EUjSkR9uBY`8`)yehP)W6_z@x88heTNQmk3$EY#C zfurwW6joR)T-uf-Zw$3aN+B$RKW$vZ-26+Abe$TH3n`fQFTwy6h$@KhJVJ~lmWdUR1`NJoQ ziXTP|v|FSWh>Dkha4*QoS6J%&ik}63t@y7X%2m9>ulTo+q7`okp%uRnzUL~Qu)^|L zuz8C2yTZ~%WiaQM1!X)HcQ6*7U+bt?i?Xze!%9TO6(C#{ldrIJ`&BFfzgF=Th;mhY z#joP`k)l=H079!c!|(YCD=c3Io2TMFc>a5?u-pZOycHJiPsMuv*o2rue~cP)Dja{AkZ_XDmGb0=T#K{1y<}W@Aqio7I4D$NVnvyW_(7NYU1L6PaA=>;Q}F z`A;K7Tj!G?v~||QYg`A|4zG_{Vfi}PJnJ0h3dsSYi1Y*gVDi zU12Fi8T9-iXZlrKz*udOM@A!tyf?fGeEh|L}Xp=UdP1>t)B9`L)?*^3lyolPKI>-2!dwa#j!XzQE| zLR;t8Xkym^5>{B|gUz$fVXm8HRgmSv^lMjm(9RR~V9)Ja!j!x zH6|8VcnTfI_ZXOLVF8UH9)Vk*L>xqA{x>nJ8@~#7#Yp*-8>?_Pf{0E;IDGo?8N;_F zHa3gZ5fPt{OPb>)ebGyL-i!UJ7prR$WWhWFkDRsA)U%lAujk`#9-ms@XDyhZ*?kE= zh)FPyP~j%W9DzNqES+L>3A)M8(ts|DPwLO9S+e4O5u4zZ^nxoUz7B81retZOVK!=x zK){-bX8!-!`wlRxsjcngOT`X%`Sd5fKp) zELgChAYi$6v7utut8(okV($$bV!43*f8V`Va*{Ozi1*(A`M>`&^X$BN*IIk+l4NCP zCzAskTSL=L5QsJl3V$D&e$8Y&z~xS(+V)9CljoMwxroW=_SzYD%x(JJR@jNr01?wJ z)oPpf=v+iW#H!jqUMlm2)ee60N`Euo95tCN4Gvqy3fU|TGFcjCvNTj#nubehn#od- z$x@)Qba~b68(T^j7K!^&)Uo^RsH5FXvybg&51w41W_1{BatAN^SvMW%CT!KwTA8Au z*@M*-Yvs>u?!oFZYqb`@We-;Ktd&1YS-Ms03D#;<#8+!}VyO15FS1tA+Ly38*;++w zU&87JYZa}139Iw0RkZfj%Hd$cEb%wxkj0n^$KsnV4|co#R%rWevyEU4n|EC9KfC>I zX!||0?KGhgm%Obp*FDg0aKbo+EGQuFwb-Rsi=({PV>E1Pyym@O2ws0n&`-m>(_$vH zUJ2{G1u+|E4OtY+%@mMnR9=zy{ZJnE8D+5LRG4B4kyhq)@!o=4Te&XYC!uZbF?$9! zV>Qe_bqwbgm+A+)%@eh%7nUWt0lBIlZeM%7)ok0>Uhm{~>$1k?IkR2fY#W=_eBgm6 zZImC8n~@)pXJUT!LWYHxp>?xOO`J;C>olor%>PmYQ_S=UzzFS19{RZajsJzjI?XHtxbk zi`_8HyAD|&1uOg+tNtiz5K_F3o2WV(ngqJQX~9>D@=gPN9yYCdLAIP_)OX9|9s`nl zJXTd(qK78Y+&P@@4UWaec%*n;H&Mtg!l1xui4wyN3(#-^VN`4S<;g;rI`e~Zwm zvIw2g2~tj1Rd12Vy$U?{2CVYRqlfOsMr&W4cQ^b!21(&;)F6<)8EcrkfOVSy^-@ze zrwSk3(k0)>qg(T;T9vHsR>Ie`s<%z#HU`gajaA_D0}G*BN_}tWcSDdHTZ4nT?&zP?X<28K^vsXzeC8SdOaKYgR6Q4h88YC zC{8#gu<}K&%y>K!So^Gjqf!EEf667WPBz;m1FMnmF|hs(xq`r2tFL1g39LhWT7!d$ zN|*W62G&hJt!1=jj*`4Ku(t4NZC=VNO$g{<6j&m#u7cVG*88v#1lIM{(dP)PuRxdy ztgjnsqpI6|sneqDfhLmvU@Pwj*5@p>fpv9%sh$n2A8_P_rF!90%_Xq%qe%>`*Y%UY zdO9|Oz?uhbCa?~M$^_OH*f4=L3mYb|UJk>&oTEd56&e#B7^|4TTDCW0MlM!)zoY;2u~B$&$ixKJ$05jl zfvY#MDr^cPzGp%gCh!fTj|p7OV*WF*;yV<9emzwWa6397BJCrSp@i+G>}k+8)OWXU@TmZ2!fc_;G{co0s{=Xv6Q!W?Z!<fO( zK{d8E6jYb^b+)6`fB3Wp@2V&rL0YOmR%~FHW>Jw0zpt=ehCa9i-4HH!7pe}jy;3F8VMuKWvXlzg&Lc@We zK~T+sLUOGr z;wp)&a$yy$B0;qa1i5{=Iu5H=m2iG6uYnpfs2&WG+XyQYRBwQ|l%Tqa;?jd^znUe3 zD!!>vT2O62T!QMg*f1m2%SMEPYCdvhg6cXPMbSvek*W%+ZIC7J16YQlV9B653dKcT z?JcM-fpy4TB&fa$oe8Qxi_5%uXhG>gwE!9wR0l$2U5A3|LlANaf~r4LQeoQ~qbLzn zo9}s~It@Frw4geRatW&Eo9&W8)yVf4R4+!ZV5ItkUuPRsn;&m0TD=A*$0|+psST<( z`?QwPe&JIaRC7m4-rAgAsMITbk1R9|PQK~QZ6 zl?kf3*f2r$tC12^hoCNb-$NV()&3}lmnSn)T@Q^7s(ha`?^)0wsP14H(UIzc(UG9a zT92ozQl|i}gmEUQ?(Y=9apRt%bf{&lK8=4uD^zhcEH0CS7aDS##z%jLG=sw-Bl)~&@TmV1gpbv;P#MyyOw zT>^0_L3KUFr3cm2K_!Fg4w{#|{eO0x1l2<9Zxd7-oDd4CIq;MTst1nNk+788|Axqt zHw2cUD7YIfpYOp{FjD;%u70CCj#S4%XM*Z7Y?zU1 zd9)x1sL3NQ|XB$)>^=XaE7#M%|sST>lC)j3GuVu8; zd}@R06+W%aIr>U31+*LrED=-_6D6qTVR6j!jK~UYqQiGuS2vjDhUV#l0RR4wzGg3{X zE_rj{BM7QEZ8Nw3heKn7YC{_K0}X=e`z#|GR1+sgg6e3vLO99<)yVCCK8!O#b?>+T z^If(!Jg@p5at9+-s`JiqGWvxg(0Xu#aOi& ztGv1B|97!bcy!3b1l0w!IhU);ss9qIm&An$sx@$p%B{~;ORNezW3?l!pGws!TrH;l zVytpdJgZ>xKTg#PT)j#CXISwcd4r%^4HFZ&b+{_Ps<72MOrk)4KJzoM7D15P3o8>? zM`9Tg>Pd1lHLoF6xRl{L)#*Rclf+ueu7>A$OctOcLfz|g`a z6j(zK;Rbl&$6)H=*MQK&uL0)a*J1ROH_+qbwLkVi%~d}4@j$H+3*fT1hjg+3f=}co{sLv6 z#qz5T>LOQ#_SoQ6p^#78e3Q(Tp$gRI%CH;dnJdFf*sxcID)4m=^ud*Z*()NM;r4uJ z?3JN84X*$Vt_<5M!zg-XcnSJRJT~nUw|s2WK?;W3Pl0TrfKS}Mgt0ldATVuXyBL|# z-u$Ywj+C|?i;bXdzDcHS9icXDtAh>Gwj?%8+a6_=p9Txs#_U^IKA$EohsL(;1{&TB z8nkUBB&uy6LLX||$8hs0UHP{Xb5L_mHk-En3ggUGkKzSZm6`Nz#ixm{v*a&ho_Um5 z^~0`?V;(22#|AHZE%Z6<|SG>zN}ct0z>MvT|r0l+_mAj1F~PQr&UdKi>m=gC*}< zb1t2{Fb&Qn?|Z{d8%EOacd=%+4QKg&t*)A}72O>@gE9;G2$jEn z`V>;$?=jatLp5TGwnoIEP@FmE_xe%-AIES(FT#H`hMu}6BR9dJ35~eqspuZ{5{>Tk z@@JxZ)aO2G_J>*HS%sdyVeVdPbvrX0Mcp?t9(SoFnE^+MX`IHY4Bro{oBn z?rD1YGkZGfGrFfs)a(!L>HoY>ufm`7xz{}%^%>pMnYQoWp60~Wp7!*rKfI@-UZQ)N zUjEFUj{1!5=@K>jgM0cv@6)UBCw=a9Pe*-5_jIQ1`?sfgH@&AlU9j$tp3_k;(LGHs ze`ZfdeMa|miJJYvJ^i2e=~eiXKKHt(qdud1I@5O9(@qD@RCVNDOvE!Ex{UFIb6CvU zHS3tQD(l)0H^$0aam2(JdS)Fr>x5Y+&ANH zn-*9k|uu zV{FA}R1+gDm?qluHp1bPjYLQL>g55$u-z%1MR@|>sx5a21a3A>vZ=Fg%qNcKiQ}axao2OH{WdF)`tz; z_OgN7KQ^#_mw`LW&0`679c19{<_7LL(!jlg4BR)-z{Yt79=L!|vD-QW-S08b<6{Hq ztkbCL*~ma~Ujx0S8t8qofj;*c==-{Xqq@vzhJK?B9DU|Ovi{c^7_h|%2R>@pF>f0f z)ZuiR4BlJa>h`3*6@oUg*~U8|9a{Wij)bu6&t0!tg8HOATJ>&Nl5|<-TC})$WUi zuW^rqYYkrKmN|+1?{23V#2ej>#^25E0>f{0E6k?+cK05GceqI-zsntG^4;Th zpGy6`?)`?}?~XEd54c|&e9+B0nfgcE;RYXbuQv8ixG_xor7J(_-e>$h?LJ`i|8##c z{8_i|9O|EU*BQGP-GpiP%kIfW{)+po!B^ddX8&z!xjPL1(H(B~~dmt&Hkwrd&Bst z68pgDtH!FC`c;c{Hv6f1>BqGAV2FRmcM z|EO`xEo!}jh}rtKPEn0vb~~Bs$c-}b6fdJG{@0Qb#M~6Guz_8ff*xf~yw-|AoF z4nT2XeMgVu0ju94)d}?Wf5_6w&K^e#*68~-7!`z_Sfh^I2W8MXDUV}`qezogT-m23 zJQjHzcv!1i?y|kOESpYt@i;E&XIvgC|7?^_9_ewIQr}3MVR)5o4%KwBtH*JRzn{B# zo4{;A?IdsZ7Z5oqD$>dB-d3P>)1Gdq^nLa4c7gf6@PDPp`@TB*zFI@%q^L+IdwO+% z)>kL`qSE(O>>UYaYtq%7i)|QiNM}cuN2im$JPx&N_F`tI5#09nIQFtR`-gKv*T>_4 z%<6{tI_9%p)5*Rbhid&l!ir0Bwwv09?EyS0O#$YF8wgkZz1N_y#h=XLna8gKrU^&- z%$3ZIAJ~1{tsQGoA>MlbVk8pmcJOHy9g(A#su$naTGy z*qa+Do(U_4co#uo8~v)wvjLe*+(;*n^==MyANu8q?l_NwQJe1@zq7J2&dfHeU}t1k zg3L+fU_B&N4Qtz5fh9U?sP_?E+0Lqr|5CGEsXU~U!#oan@s^uik|)IEj3B_xaPOFi zer}BM3ht=4pVUt$M|d0=+iDlZD z8sD1)j1#@r1A|B8shT;O{8MPM$D0sa?-zW7Hn{h&k(4{#>Dv)J)defl3|4Q7$D057um&p=MJ(-p*KqT`{^r&6MACa+=4x9cz{4iPZ*(vLE2emQJ^Q9|cc6iB$&{ zkWNnbc!P8t%5svm@DMkh{F}EqkQ`(rGrW%jNo^yU>Fo?82OG&Ouk2XgPri|yIbes-X%uXKyz*95xeVO_RlJ}dr6V9+FN0LP2t?+3cOl5_Fp{L{eTq_6?HX?eWNc)z*RlE z)gvCn;O;o@)~&(6A|51q+!N>Yj5WxMco2gPao*=!gYUu~aKzjj=Uk4})d**X?!GwZ z1FY^_mGAyI=Yp*6K$UM}obw4*_ft4uHverMjvt6~!pIub3}?>H!Nh`-;#rW+dN9su z2y69y#EqOr55+m(WDROX+{kJ4aGVnu*5K2y2Y7!Z&Pgh(`&#K9jdSA4>S~7_Bj00j zPJ&q7K}z>{oD(Hh_k;5JM4XdgR(G(<_m4OyRIF~B%J*cPlV(=;jnX|8=R}&-9in_b z9p|Ks)#WSQrZ^{VtnL*RNS}?L9OzzCy655-2fDYE?)mubf$lw}dm;X8p!+DS^Dm(< z#y<-Tz6@Ux{PXOkIHv+_jlU0jz#e%y-YC%RQo7CYZh`J+rF$hlD$rGp@mh$XAi=NI zmiTFbK`nnUDc8(b0tWV-+1O`t=>Su2Tvp$V;689*CEhp=rk@|_j zXK~IBT7%~!MM!ww7XLUfcsWvp7Y9f$W9R-5=e)DkwNUx~73VVrt81z9?TmAN z+Ui=Ve7oX&24QuDD&Oun=d-QuaFy@JIGw5NmyMQmG750 z=eMn{Z8)EQdj1;cgAZ%aE}Yr#+27)vNw)^=!yeFkzsLEM#OgYPGehSjIOA@09mDzj zlHCL!eOQA|;mm%?u>|MTtwHCo2YB}qd`@C@sc>fK;t9^Z_cxK2r(8K4=*a}1i}g3B zJ7w9Bl}Yd!ne~zOsFL6gAK8iH0$op4cKHOKE!lj$95|w88RzpgZ;}=#r!N+0N*Ks8Z^GnQ4 z@F9z}8eXDA^j5XRnSsHG5{1E_dV-JJtcT-Elmmmj1fSnngOQ~babV)pz+hBqMbt>} zNuKpEy0ju{CirN`8jJ}Sf#Pc=dIq|&Veil#l;ER2n{Qm$F?6*Pd~9TO<2^?6%pr7e zVpX6!!Pm*)$Mqe`1^ny(X| z4HA6pWpy+B^5ojrDA6s@&GdERvvGotGi|<;e4Y4glHj8;tDEDOCq4@jR|LAbzD|5L zOYl*u&3CG=6Q3;-d@N^m^Zk8fXNj{~CHP3y>Q49fk?0B&e9UTfXZZU_bgdJ7bZ2$v z`aY$eZ4yO+?mXY8)U$1Zk8Ewe^L?LE&vpqu2DG{h!amLEXFuze&T5}n5m+q`dpD<_ zZ`C2eN59tBMd5PH>E~N@O7Ov=wOSD_5l3MvQ3ekYt?trrInWg)_#oNpE(?2yu1kUs zC#~*s<@3nI&_H*E^4T@PhtM|PO69X#f)6&W?n>ped*b#$ca`$lBf$sSHs31cGo9c= z(qOhe>w1~Q^kZG`gf};=|GQ_NqS}!<+Sw;jH=@5GtoNPtO&l39y0J8)qY@J$MmL3x zP*T6dc@h21VZC3{(TQ6lMz@q^)IYH~VsvY1MgtPNB1X4`jZmF|iCTF3<5&**xMba~ z^v5JRMD**!dcV4Z62rnq+0iM0BL9Euy*6pDipzI?ip*mJl;^cgd$}&(|4DmQUGwVM zT7)w$Ui-9H&E?BLMSR7~h&rXc>MmalD!K;q`bN|_?d7?ANho-b?WNM*fi7PdD&pfw zV^x&)YPfuPC{vjpX|JZs7l|^JNvFM9E?+7tGDBkI^m?YfgIvB~R20;!IPKMT`La=_ zUVYNu!7g7s%G9fG+RJzO5>lpKN2R?(T)vQ$saLEU_Z9coK)*uk zeJ5MogXa5AR%;_TdDZ3nX||9X+1Y4L(6PRgtuEhQE6+X3rNYDE-9)Fp;cM>M5yKax z7YXtNxx(x2`k=%&rNnUGyy5b#xJ+T6gnih{dWARLA0jqCgl$+MwCpW6?{vASRB+89 ziKc}MdfVljc0quwknKOUHno+K-f@QqUh;f{po37%yY9lk;6UFX@Q}@SLtyoxdre?f z1+|HRE+;OhqYx=bD99QxF45Livx zqt$0_A6V5#t(^*s_~1WtE}E)_>$}aJ8Q7k+58Kb(s{`A``>_4OeKxQ?dmpx6y1N3~ zCHt`b%B_2b-?nr1Vf(dvRA9?5hVQK(w!5bWw#)Wm`;Ghe!1mmI*zRy&32e{XhwZoS z?}05pK)$#7e&-&x(C>!}_F?3G1H($D>jLEjSRVn%mNSZB_#jBZ$1XAb&| zZc3KcxCog{4*o^HeLCl4w*f`nu;P-lq&LA$=ge{2LFTi$?f@_o z{&Fs&6Lg$;+RttKF#k+!IenL4ojMPz4$P3wImI0Xv>8{j;1U_}`cBR~cV%F;s#L4& z4`JXGea$tNoWcEn9cni#)j(}ea~};HtPuz16$7qV!hF|VN$6-4)2`j%_7Pviv3^(fxzSlF{If2n_+K6>q=&lM3?$8Flmowdm1EURM zjl>^K;m(m zX#LJ}e}>8&COJ=ARXXQn=5f#C2%7yOuK>xhx zSz~0q$Xy($UWlqLan}Z_7o~wOLgJ*hVBLXdVLE4p`(R-7lAM3$#YA)d{YLY?-r2}w z%`bI72+TK!Pgj*EopYI+gKYNvd{r#XW!vl{<2apjx!W!brk$E1)5s}VW>0TVtr*qc2hl1Ju_<@rgIHog3>6~?LaiISfCpwh=8h28l-zjrlL4N<3z1CeC z810sKQcDb5Vc@&D!>zs4Z-3PiR;bOLZr8w|dI^oQNufx#iA89d@1 zxXf>L-I86*V-2-=)NL17)epOY?lE^{plcBEU_ywr=W%x)tb&_}>>uP8LG1K-MqV!_ z(^6&tGK(#HTk{i-0cX~acH!#=|UF9xsVvzHv&@c?D zyS+1^GN)dZEPr1zGj#WOs{>tdY>IA!w=vKi5F++3=~qh7i5{l?xG zv0xKT|I*RpUX#G=82{x1Q&eD^q=_*fn1A<%){9L9d&6U?=NLTrXcTQl{ z(6BMX}+`4T9U5vPw$`${JxpzoATB?=$03} zbYO8>2@BgJ=_)UJlLD*$zE$Z(zT_ncNTO% zck3%&+2wuavQk(X^xkXU;=rPIsTQw$Hv|@k z`4&M7{QiBzdnT}I;#-9~;!STyV9+#T5Vm^Dt8}5?8OqAZ|YP1_TB-`v#_W*?t@=pLnwZgFAf#$^5Ce0=j-C z96uzwbd}G%JAxel^lQcn!rM0Q=|K0Y?=4)P&%KWVgLlIQ$oz#Dzu0f`HeV-~yf3}{ zK)1u!g&lw8bqEZ~naeCLA7-N3L_)KYCV%Y>4@_&6G!?7u-jcwov2SH2y-PU!#=9*r zZS6nNGRN0MVV&XyK3!#p_eNk^tTi(lgRM1SAPI6M+^r*9hT zR3EH5Sg+rCjRX7R{fE1<6TkP4gU()4r{I4JvPJ%bH#?Be4$1%Joges`@0Trkc6!$b zx-*q-m-l$!ZwdX$p4;uc8{}D`^8D!Sgzh*r$*FP$@}#T$3{Tw=$?>_1(WkM*^`L3I{1v7_ZTsQBwG?F1gE+#ov$W0{23E|XTY?zDw;KR4nFzEVEz=}&O%k52cQ+x`S z;%GI+r+2A^Fep0DxB6X-E@$3reQDg!%SV8zyP4w=UpLbJ7iT)B#u-X*JL8yCJbN?Y`r=6+27zU7O26 zE|q;Znq+0Htl3GX?W z+tf671wVZU?7-A8eVHwUd^WjU8cI#;K548)+GzQpei5ai{-N zekVIz1VBEF=hw9A&oKQ?eMODUv|CGd?LHv9O>I!dwLo2l^h3V*YA+y zz??+i%5h+J{Z2RENqx^+?Z(O;g!!>N&+OF`@E0`uajaJN?icqNUNfe zlUhT2bBY;z_NbG(he8&R&EMI~<}YkIsb{e6z|Kx>3G$fJl1Mloa7Npm zd?2=*R9UQxs&Era>?nIY7FEUpYXqHBji8gmf;qD3z)5w++BU}&Wm__k!c178Fngjg zXPZ(pOHrHuHA$Tp^=8h7)Vip-Ia19b$S>(QsmG#f)6TablOyzfY^FZJs{glGafzJ~ zlWWW`kPI;X$|I!NslikwY<4h#t0uMv@CP}wL+a*K^J<@(0bd9-j&n7Vn}*!HSTYeC z?g5m$hjEw5rrmMO(`_bQaBEDw0jw7KIWG@##^16{=O>KD)TYtjOELPIM#g>o>n`Yv zhAcGx4Mz*MVqYV>`#~u=*Jg6AWln2;6U}p0OFK+$oH6%fnC2cD6`EG}r-EOuHmw%x zLJ9}?!im_hT@k;NzaQzC&qj>dOe21T)b@M1r>GMqt6wa7=H06&jW=gT9Ptep!@i#5a$i@HKRW}az zx>4MXzlxW75UT;az}Q#*xaD-??{=oPLepUi>e=mmZka5UnLYOu;ZIf8J}FfAhs$$KO+f#ug~emU$E;ocnxYX466Zr z11mdNIofjdeemr}zb33L& zhhrmJAsU7%RKZ1s-Wb6eutF>#s1Qj7uFTSn-P~<1vZv-_Wxq4PU2Y>#Hy&20%c1GO zj}CU@)+lEDCz#8hsxTFL3LDW1(J)jY{!U1xi6_`H-6L2)P$81cr^mY8zzXq$;Hd+! z8n6~L^f7{N{K@ z=n*WX()MX#T7fdNm~2UGy2BSUTSq@zrxM4Xkz|g)P!HV9oW}(@!^epE2w&zH31xbT znNA8ah4*8p=za`k`WG`T4>E=Ox>K~TO(xqPHDbv0Y>>(H$ITI%>5u-rh;xY@?U{R< zTx?fE%A-&go*AXd!?JwX)Iq9;)^_OGy6G6&rp&+`O86JAnSuPxSQnhvcxst*){CF64(Y+?qO+`Sr?2-TdX3 z{gl(!Fy?`eIw3!lvHg?{LSnloh1%P4Kjll2cR3RK?Y58~$}Sbz!y!3k>}Sft{medI zhcp>=Tf+Kb-wZ<dj6`^2}OD)#&h9e8}dUL+fA9@-Vf1cf0?zP@)-K6EK)V3{7}D9R#9Zl zLvqS!OIf&|*P#M0A@Q5?*CUNUdoM>?iTb>WR1Eu#Nd6MGKUeH0z}{bO!3O=&&mWP~ z$N5OKofPsz8E(Rj%&*V2sE@zQg6;mu>FaVN`nW#ihcdRCGQYh8L+#zLpYmDAdkWH0 zq)S46C|e-1YeRC%XiHhRpV^1MA>Dww{R3$w+Pf9$ZPce0j+@6}-;x(4S;F==iT$;q z{(KX5^hZB`L{1;KAkp^vkRQtKMxxBG&!?gOymLS0^tAzrKDLGYP{wvs=C}7bwAo*F z@2C7LNm=EBT-f>B&UqFl!g1bHtN(H=_w@s(BkW8Z!YRm8~X&adrmvp z-xTr_w%;W7ABOs~A!PJNKYv6{AI~7s_T!Kr%C;a;=GUiTD8B62PdR;UMWTM$$_63QWB{wQVvpmq{c}8G8!9Wk;WtW3(LdyZA$US_6|Wh z4rv6^XrxI<^N^MxF+bkWGr!w-DG<*voi#`skTxRu3y+I@q&i3sBKZr)sX0iMkzVkH zz+Cis9#Rb?-b>U$;(lt4)CH+4QW~iksV`DLq#;P0@0fw)FCSv#W28@!W`*P|YYP&O zm8Bs$x2vIVIWbrpDIcjGlD|-Y8`7Of_aQxq#QU|Eklsb&J;J9*+mU`k;*ZXkL#l{G zzy88Jyq9_biFv<5VxBl`n8#oCRiD!8%K3q-kgg5+Db218^c|48AazILaXS!c2omQp zI4{9tat6|Dr1?k-kQO4Hk8~-Lzc6n8EFgB7f4?rIlPZX%0sGw z)Do!>sXI~{iE}N3kmew9j$|d$RY?AF3)*{|wEZREHl#0**atj+*$14{WFL$`VjoOE zVjs*vVjs*y3irX?;Ov8sk^DXgw>=;A_S^2am2JEMiEVroiEZ49#5Qh6VjJT~Y-24X zwy`x5+t?eaKa$_pA=sXcvhcIjtzCQJZZXpt5SsR?U{<0_eQ!scAiE(E$664Oh zNM9iBMB0t?3({{$yhg>5$|EuE@fzhXeheN9fnPr7Qv9V~NFJ_NE%f79r141M`9{il z?c({LM&fzgAIV=z(+vvgyM)SPZ15Le7kIs)jB{LNajcX_@|Upw^-#WxVBqHq%ft2# z{AhoF?ccxlFORK1dj9e}@yB=JaonEd&%pjAB>&uf6WbpmZAbbEiRbQrdwl6%Qx}EK zm;dIt^Qure{`p5)66aq-q$Z`D&(!Y@Mh1 z=Q+t`ebS=le)*y{Kb}p?9H|%Y5x8jHTg z8a)xOVPNyfmIck*I*BpUX3QElr|Fc#4|kGP%k(MhWO?PvR&*-4m1DWFs!nw`&ppts z;ns3%$LhHC-1=^T+dRfMfKayMmca&ZPR%D7e#hcD?!1cSD`Y;=03CZVAIV?XyIm{h zo$oG*o$W1-pOsjY?7}xa%KHYuKboguC=d5e*NXMdcbCPMdgsKKB+gDQE^}7dMOj@c z@}W$`KYP4hDDV3isqG=}^l%y6vwN_6RF}cM_@BzlBWMrhmS~$Umq*(l&C4S#ydT(4 zVNT!s!|Cr6yh7%gU$1uEpDR|te{;I*DkOK-xT!Oz%@{v<+R4o(PnX>nkGiB7A ziBnFRa{QEuQ;7v*#<2EdrcIeLZEC>;2N7uSv>7K(oO;55Y2#;|JZi?cVZFNb?0xt! zoFhy}_Act%V_27oQ->8444XK0%;b~CjvF>})>zaQxe>c&&7D4OCN{C7_TSOuiKEBN znFGHQXH6V6dEzPKW*k3x;>=m}yZ_EmEBLdu`ct{bjvN1Hb4x?Upbqfz=juOY)T{~r zf$~w6KUcoA;XhOj93X$L8Z&3jz|r{ccLcrsxf)1E{CgESdCY`SGi)nLKLz*y5cLl- z?x8=|GM>28{>`pE{`jdUO`be`){H+_g`jhJqS&g~@OAu2vnEc409P~JVG}sY2twAs z6KNQ&j-NGS)WlgcS$+N_6W87@yc=DvT$O~ETpg>7DDTTRJ8ryMqIo&5-@-(dWO1T# zL84qiqIogbRm`?Xl3qnnZwAC>D_LM|<8C59>D4bzB$5T*ji--?w=zlZ30zX@OiUcy zEFMo}d8^#wM0V3eRIva`I)=NI^f1&KO+{%;$)iL9iz4gWUcdgaS5XHC4L z#_y{hiQJ@jzFQ3Imfrf)3le2oCB27EFGdTEf(;5Q76yu>_uc#gKWp-Tc;4|rv-aNJ zL}Ai<1^fL7@1O!68?;V(FU%j0e%ohH|38^`?}zi=+xze2Ju7i=uRWhedoTBYMc!1> zdwTx(q}Q_;!N^N`o16mEU*9@qmnRE~@drJ1Zqoa~=yJS&Iyev!!?Kd|vCc{MEy-+# zdrx1T^v*?Gi`$+q2p`e=E*Y*Tm2@2~_CHn7;=L4PD&ZHj@!xFG|APhLjeyKW4PT@D z>tYvNXaBm`{pkzzUl+U5$8LMS==^oD3y*X6-dFp5f!_Be=dX+1|B8!Uyt;o6caV$0 zN#%0h3U?vy#frV>=NBaEdw03qDh3uL$|t?L1<8Vf;zawTH=;OE-m6ob9A8ijQV_3> zyPvP-V|yeA>RvN!9lenQsHAr_K7Z26y9PHq3GaRUH%q~Ur1$n|yw~%tgDTs5*r*s64bj^eBbD$vNcPBR^|mESQ)dN<84 zP852}I6@irBE?Zs19qm|RZ_C>QBI$L&KG}YnxY}xKa)S2O#IH$H)cysxxEETT z@Sd1goTzz1;xN=U4;98fHFf`v1N-VY1iSHijT?aXJs#EAscYsH$Ks)ZVQV*09+Mzw zZY&0IJkLLcK1}c&YE{mA?^IOpVH^wStaUgRvJOimS|kd3hmL#9W$fX&?||cUygkac zhK}U$VHrBAH)f7%9Q|n19*%08#XmuUqq^8+ufDaEqdIdOm-lWv9edl`jJb|h-b!p| zdGFxXhi&>}=W?h`tM}cefAdV;OPeI3gwNFC@R^$Q9>89M)l+T(&W9S_CGoPGuusc- zU!7WP1S{e^Jj#1to?4t-NJ$bl1-!MkGG?oUlQO;lvPkta$#UrPj+V6qS@I}q`Qre$y8kkpPT|NBGIeO>5eNLsL$A!(|#At{D{u{xD8@Z1_2crM(> zSah`=i*7uDW6=f}Ldvi+GZd|!Y?c|J?rAiNM?5$f8h9&`<1zYb?|m_sM^q;>F!eZ| z4u+&MUdE0zL(+wN8IlGA!MzVju|GMY-OD&~&!bZ0{SS^xt0$W#s`W}Fdg8R$zcJ}} zJ0|^a-q!tf?%3P8zs?=rjmtgQU+2zWQzHN0Oo?DZL@q*{DB0UZ=>OY!k-x4$|LqCI z|G?;Nj}waZF?uTwkKXn;lPHsmGLu-gL&>Sc6YQK}i3vrV85KE$XwH-maDQH%^J^8o z)#g6Gy9bfsSL06FE9N|J>jF$VHcMpRpJ;Cfd3LtZOj1T>8|~1Jw=DadZTufMwEJ@t zjyafcET6a#IX#V@H6|hibZGr8O@RdWS1Cm}2#0zfz z5_i7+o!d`T@+JJ=8OQk?-!-(0gBKdN7*cyGnuHD8=$9$Vg9iuX|b zA!`=c-=g?Ss(xoG{WnKN>-UthAE)#q6z{Kik>YuZKg)k9G>fgse8pQR{-CPQ$92DhtwXfeT%6;aa4@U$7 z+rJYOU!?dl#V=5Nh2qyKewX6+D*mM6uPFY3;$JGx|CF_hZ4W>C8s_|BK$vI#JJ#AC zq4Zr9$FDa;@{dq_vf^_TKTC0b`Nl4`{B?@oq4=YUZ&v&R#lKPfH^r-)*N9mITYi1T z`5$F=vHGJFAE)@~if6t8VDsOk^p7e2n&LYY&o(bVvqsk6p^EcA-|b@c?G-;#@t%qw zqxcxb|EBoKil3(Vg^FLT_@jzHqxfrzzoj_;TR+_1uN41LasInY*uIkDg^IUTe7NFc z6hBMxa}+;M@oN-+Qt_7*e^v316wkq1_~G{DD_*2Hzqk;#pQ!kB#V=8OmE!yYW!T?# z#eY@&VEltX*uK8vM=L&D@pBblsrajkzo&Sd|4nEXd%jdqyqV(d6z{5dKgEYBK2q`V zil3WK2Pz5iZ4_ABE>ILe6`}&D1L+Dw=2Fu@rM9y;x{XPhvN4t{*dC2DgKn=&nW(a;;$(Fy5jFD{)ytBE52Rve<}X6;%;_y zf0t3bg5tS~*Hruv#TzKzRPk1dw^6*4;$0Q*sd!(-2Pl55;>RmKUhyf4&s2P_;tLc% zTk-Q1U!nL_ieIDn4T|5Y_+5(MulU1?KcV<0#a~c-i{fu6{+{BWDE@`wI~3ok_|J;F z!9V)j@mLwfD=1!B@tTSss(2&C3luL@yq)4H#d|2;SMg&MAFB9B#m6f?S@GG5pP~4< zieIMqHHzP^`2C7MtoT!kzo_`@iod7$XNrHLxKlyJE5-3C2U+a#QC0C;iq}=VvEqe_ zw^KZ&csIq174N6`AjO9(K34G)6`!H_T*VhCzC`imieIVt^@`u3_??PxRQw6WH!1#t z;#(AdL-F?%|3vZ672mG-_loaU{5Qqp6{E*fmf{B}URCiLisvg{U-2f2w^F>F;zf%0 zRQzbghbTT$@d=7gSA4GG3l(3i_%g+pE51_k>l9zF_`QlhqWIH_Kd<-}#oto=L&d*P z{5!>WEB?FU$pfOtPoCm+6>q6{d&PSzK1lH?iqBJgiQ?xgewE_aD1NWvPbmI|;-4x0 zz2ZMAUN$G%UzHR;RPh#yw^cl)cv|s(iVsnIl;V>VpQ-o)#m`s#D#dS7{658>R(z}C zpD6yV;=d`Lt)4gLDSoKptrRa({3ykTC_Y;86BR#6@p+0bQhb@>7c0I}@pX#dsQ7xt z?^C=-*XZ&1qSC*n_%PXF%czwkS6z`;Xcg6cCK0@(viceO2w&JHL zzF6_|6knnED#dS7{9eWXq4>*+zpMC{ivOs1nJUr#uc~-m#ak%eS@BVdFI4<`#WyMb zrQ+Wy{+r@ubEEaoRye}E z#k(oqTk(O44^@1O;wLITOYu_`KU48#ieIAmm5N`Z_)Uu6srW;R|5Ndo6@NqV4;24g z@g0iqQv5f?lhva8J4f*viXW=@;fi-qyh!o1;zubySn&~xk5hcI;xiOKMe#EfKS%Kk z6d>PFw_I%D$yrJSpDBex+-ii-Y z{5Zu&DLz5*>59)){0zmHDt?jTS1Nw3;{vwsisN6cBm1|U;l;zf$56+c?>L5dGoe5~SA6kn|Pm5Sf0_`Qn% zrg-H8qy1G~@tTSstoR{{AF6mO#g9PDE^V+I~3okxK}gUUk4~&L-7`hw^2N$cwfbjQ+%xAe^dM{ z#aAnSqvE$IzCrPa6n{bSw-oTdh{?AtYBE@$o{fJ;twePwBj!* z{<`AtEB=k*KP&#b;uV@k`{zK#4^_OO;)RO0Q@p$4y%is<_%OxW7ewoKjpBb-{2|33 zSNs{pXE%%be@*cX&7=C-Eu#Ea#mBXb>btgz@>>*NRv6WPuXvNgqxz1DcTxON#VfRq z=C7{!PQ}+95w$;~O_Yyp8|9tbMS1P^QGS);pDX^e;%|0{=3m?~%Extz@~)kuylyJW zV?|NEK=J1le@F2LyF~L(I5Nry56o~r3lF-(DdV^iet>fdcxLgO<08C_Gb_StIRhj7 z5a-AUKh$X%;f+GjtFn-WZrF{T}S85h(6^^jrcp#=^NqQ zosJRS)5*MBK!3fRHqdwFrdi534I=j0PWcEwz}boNGxi5KUq%1S~dBHFH@f38O zqnsglH`~QFU(t;@O`S`VmIJ`^oGpp4{!piKgdgtoi(5U1XfgE1{SklNom~-sDd%wE zw!9;qnGt_IojW4_dYfPGWBvGBKrtLI3p`t%<-vn$Sn#)FpbRY@?8A%aWQQrNb^ctX z4<}MJ4|(OBRL$~5!mFG+bmV4B5Rtjzs+$qRPmfPT& zUukZ(+;b{|HwW^6^_Y*pmRs&I&&i8f-jE2+U$3Q}zl=t{T=*K{F9?5EczINb_O*zx z?<<_YsA}>HUn6|8aQ=!a^||P0=C4NtA0&Ld@ae#27kTCvW19mPQ+}W4+(dlDb2bV- zBls>6ezpOdUE(=AfX#uwQN9uN#C~MHCW0LV`w@}vIAF7jJ!dqqIgtO`RPKKC0}=Vw z2;MEYiHLlgfz4KU&YQsIz-^R2fc{4uVZJ=UCW0v<@)ZM{;UD1o1DgX!Qhu-JEFdD^ za=~i_v3s4ytI>H_n&IbKA$FScXIrr}zWRUJadDX(7r^~GF0PQ{0=Qqt#pQBb0Qc*- zSSiN^aKDa=OXau#{-NUnCmDx^<({ySxZH!D(@xIwbBQ>f_-lpb9+%@~t>8M(d4~CL zJT4Y{{*NB*d0Z3UCi?lVDOpaT80){2x5(55e`5*g=s0`$m46;5CB(6#Pc8 zDz3w{YcDui@NB_b1vd$97tF==ocY=bjuc!h$p7V`ezV|i!73ORP~KLM{}V!fmf+2T zFAMGxY>4p%?f6bV@pQqJf{zM*D_9-l6WXN(#|WMy$akly=Qx_k@dA>3IlDad!yn17Mr)q+n7@|`Z~E8$%z;t_(w1?LD}EO@`* z7Qvqc^DzWx{_cX41uqihyF%1&65KABRn^Ly2_7TJcUNe?R`6-T4+Vb}tXs|6brKva zxKwbx;8ww31gqoOGX1v{93nVV@Cw041V0hX#;pbOwGiwrc!J=0f;R}hAozn|4LrkR z{*>T&!7~J}5`0|n9YGJzvY4-t;8B7n30^6$n4 zf=LX}X@7`d2f@KaTqnO2TzZh@>jj?`{8q3$ZZv7%K(LG82*J66mk6#Gd{*#N!P$pc zKNkt!D)_G8kAer+v3BhQM+z<$yhU)c;BLW2b#1<`f|CT#61-XPWx-v72i3Frjuf0F zc!A(Of-ec~6s&cq&DTY6g5ddrj|jdg=+w9NH3f?VPY^s$@GikO1j{wB`3@EAB{*L2 zT){g9Ul;sMuwFx(zgX~8!L@>$1-}-o(#YC(6`UlKV8{jwdS1m_8^ z6MRVUBf+c!Yu`-p7{OBoFBQB)@HN5j1oN8N{G9~H3N95~FZitBr-J31+k6cK`v}ey zyh891!A}G^#liN~6f6=PCb&@W2Ei8ue-NzE(&j&0u%F;;!3zcN6?{j~Yi08_5#S}6ntOsXTd`bxA}VrP7%CV@P5H9g5L;MZEf>4 z7aSxwPjH>!Cc*83Sx4A>^#qFr#|bVIyhHFc!CwXIwz2s;2_7prOYj20n~1ni`Bd=G zww8|)TqF35pxe&sTMHg7I9c#)!F7Vq2<{NfYj5*+5*#mhhTx5YFA7%dAms@jEjU^5 zKEa%h*6v8bb30jnli(ScGiN*hF8G4r7lJiYR$nAIOK_#&yVZ9TJV)^59#(!&Pm5W-EUxcuF~2Vm_pieQ zuM~VvF#9O0KU{FK;99{41z!{VPOw5h$tO5ekl)Hn>T`8x^@5nLd6z2GN; z6^@hg1dkNFK=3ocibJj4(ZeiG6YM_2hT!jlEk{`UA%Y78uM~Vt@Es!N zL3R@{zfpL+#hHS)3vL(88)@}N2`&=6T5zM_tAaZO^G4Zxodm}Vo-25_;ERI01P>Z* z^9>VRBzU#pM#1D5Yd1phLcur3TKR6l7spxtFTq;lEpH<@QSbu6#|5_u=A2;d4--6E za0(IgLQ9C4@A-$IH^K5k!I^@q1h)ugO|*9P1Um~JCwP+JD#0fNzZ9%A$>wh>I8bn& z;5xw%1hY<*@&r2zE))Dnu-as6cl;EKrwI<6YWXRGYXu(?+%A|q&D!-4oFceFaJ}GG z!S9HeC#yW&Vi6JZWh01~FPlrmeAy*L%$MCx#C+L{f=LJbPR}V%#I>|C5!cFU#Ctra z2C*Zaxe)Kd{TH#5{q}0Cv;FpJEaf<@DKE0$T8(vaoHRME2?%3O46z@FlM_SVqkEhf z_TeldKA1O;_;t)#Lfjs6E+KvsbJh@{e~|cd%=rg#B;povl;^xb{3+&qPMqjDUlS)` z9$Dmk&Jvq}ej(2EoVrBVw;~ogc7CuW>M8OeL^N_3G2cEfqW$UQ2YJrf#M+LtjEM5D zB0_%)u@;_F5>ftRB7d2P&U=-J@;?>%PU3-%^Ai!}oB2lgsTl*$!?$mVD8D%o@-D<* zV@`MCZ!xF8$cGYti8&*Q_)y`A#Lr{SY~t@RXCcwUJTfuvITsP(?@A)_@i`Ln-AqKj z4MgO7oS5*Or-(_+&k>RDEh6&0Pei^iiO9E;hA^0#6 z{vQ|ILWG|WME`{#-+!Q--z=m*eyfmJO|UKzei{fCioA>P?t()Fj~6_F2tOwg;s0#G zD+F&5d|c2x2Y~%6W{qurb1>Y0=iU|83 zg~zh3{Q*SCYY9J8ut2aq5%uaU*jwbs2_GRiLvXg>IYjuqkcfI+E&T7o*9-DnTGT%- z_#zSIy&}kOUD3~XqUX1(XkQis9m=Z`!D|aP5ac(d=%gr8SM|E}PdBHu0CtpGdJx16B={Hi87{52GLYvKGh66Hq; z4iFqlgrA8-lzXb+d4g*MHwZpVg#FWkFA4HnK$L$)Aw`8?wUl{a*L?oH>nn_W$4i?(-ZvpZj{fuj{&B&VBBeGm^i}!}xas);DM#=Gt=Y4&Q=WpZCu;g#wFzl|kp68cBQ-Pb*L}U$B*wr5$12i&;fD?MS1=<3_VTplNCNgR#Mbot91VM3&V>PzE0jO z?~rRK>TQ+JQIz|=(znUKDgG0Mzm$n7$dC5&w^~?FUwM?`vlPye6Xj$%gQ9#n#eAFO zRq{63D)}2J%>S(XjeJ$MQPlH+!k@_m9HTKlg`)hS@+di!qW%2M6Pl;^DGE=Ml`?vL z^CE^(?-dmF@;6Bs{)xh?;Tr?NR)G_@cz{f%0$} zy?#2FVbnKD@e>rDBugpkuTnaH%Y)&I6~0O?mAA@!DeC2KbI|n^QEoCtxtSE@_}dtP3@i_N4EF03nO@Crzp3I9*h3bp{VC@g^#4DZwN(w{0#|u zn$ioUyDpC9be_VMaslP?Q}`NrhvM&3xK%zbf2H)76n;&%$&ZxI-&A0`yWxZaO{JLM zAURC&C(C>}S)N0Ye~!ZS@*>5%>-4DiCdIFi{H+0w!$Xq4Ex`G2Qh2j$ll-j!=Kq{x ze&0~!-~SLl+?OKUUmhp33B>OEOb zrYLug(#vJN;xAJ8N_m6iGtjJOrF=;7Pb&P364|zW>d^>gq%Q8Pl?jclRs4ae1%)&)$(SFdTx{VDgNgQKQ3RQsQ-^j z-=T23!k@~oWe=SDWcyPo>Q9q{DC#*;>3n9G`6es=9EHneSVr&HxrkxZca7qgE4)HJ zDt|7YqNv~9*Ms@~iDAfRhiTwQ-!z#{k$<2ZCQp`y6y;_p`~x{x@y!ZfDzA~ZP_+9e za<$@rq3{#(CHac{8^!!SplBDLNoF_!=X@DXmVIS^c|67ZhRQJ%<)%=SJ4;q5{(OZm zkeAD)6!k2VcPjo7g&&ifDC*y$^gk>7j=~?w-O?N2x1%>j{Rhenih8n@ev+J^_!5QB zla;cOqMrG3k>aEGZQZQ+2jwI3m&*47#e83r@5(*$z@z;1!zjk@XgOGpkYg$8nX2$i z8B%$pIf5=S8%3`$n@+F7bvL@$jL*^st~R@fUSoDCy%yI= z=n}I#=yhgK(Cf{frZgcBdYoxg7 z)j~fH*tPVYfZa@Y2h82i_(i}TVtD@qdzALZc}kj$^9vN^UZs7of1)Y)9;kG8|0B}B zVEBLp`-0t@>Bt`o+EB$4q|B2$_-(M-(_leR!S9-!A#P`GT zGe!H-DEfB?(3nW6YS?S56g!R!Tx}rhUbLnDcBFwQ}MluqWm|s2%p!-!^t?mMiGA` z9fSQZorHE%T*p3%7UTLRJtM)UQ(W|%N$hV*R40C)l4U_H%F1Y_ks({+Oct9)7*?Z>H$On-ulDt@w8Nh2ndl?d(^I2jDHDGMp; zb@vM+-`R?9k_+UI<*oAP@^SeG`MUg6ej!t^4!QA^W90;jZT?J!Ybe^o-f&h0mqV*5#_*dLro(eINf{*71obc*sb6h50`>?#zlqNuM? z;rSHn;AIM5Nztww75*_ryH-*3$KBrzTb2H}{1wG^mCncdPO-h6K=W~Z ziDG*zpxBPjpx9o{qu6e%DYly?iv7S6iheJp*tUM6@EsK8A5i#Viv7Uj3O_|rpL_lQ z;Lr>+uLn)Jif0{Y%f2f*lwSu*lvD9u^;#=MLYgRu^;GAco#+aZxl`#jWG5D?)e(z zKagS6cLYUv0L6Y_u)GqF;|v z^k==&H&BejZx#MM#eU$=6!pHN_>bfs#rHe~>FCEnvY$MLqTC>bPo!x7$ueK@Qz-IH zSGZK+Mujh6aa66@Jt9!N3&0SX@@hbaC;nI|VJ{S0}I z;wu!ck~NB7pzuZVGR0p>u^+gFVn48wVn1*{#eSfbK7jiQ6a+HgrfaR<*kapo1*^J3jbW; zO$xt8QSME-Q?|=bDcYYf&d=9F9w7(F;S~8sE1V|_6hBSjGi8P1BMLXmYvlEEB}Kgt zDg3DXoqSn-AU~G-=lktFK%OA8`6tOkDC+G;QT}+v50$4VeyYOL<>C9_6J{3><na)VCN{agG=@|5rqWmQk<*%hEe+xzVRrE}(-}EdT-%*s`NKyVJ zit?{gl>ZAw`S&Tx@1`?xo`Rl@_D_H)pGHysD2npOQIsD}QT{ZF@j?D1Q@0`IU4Q`a#dbaS{Cij*FE3TY5L{vy^|JNoKFp9%gURM{yiM zkHmdi3V%kAz`sI2y*oV|&rvCSFg*~LljzYnKS2lJw;L(uS18Y*sQ(-}NAYvz0>xh@ zua(Ov*7sW#zL%oj2jpXle~KdCa|-`n;kOk2n4;XLGBD8(cb9!A+Lx|yhCD&>Bjq^7 zPmnVd{{uNk)>E{nN#V;V=6|KULGiazL*7!et8ADSU~-*C~9nyhHJ;6n<3UXB7UO!fz`4cZJ&(?x5HY z>`}Zo$!}*j+Q;kwh5OQOSidO7X}IFYC_Gi+AjLS9%X#twc^$>}w2aQic}j}w8xJUc zEyZ^BG{tuIJjHhQdy4JsO?n2dW6^TlS52oU*gq-iO)P>aw;x5hz7*vKP?Q@&D{%iJ z#r`RuqTCdU`Oc&$e;!5oYKrnr6y-0YA*??X`={j;zlNgxqZH+zqA33&MfpF{ zN?iA$*gv&Xl>dyPyiJBE-;JXD0TktrpeR3x&OtvY_D^{fM(Bit^`E zl)sqHML#IUeHlghpHh@xO;P?Kit>+Blz)Mu{3|q!eo&124vO+0Qk44#MY(S%%JrH8 zQ7(u!D9TT#C?BLKAEveV9HAKZ%P7h(p(uYdMS1tUKFZ(6 zFv>qhQGNrh!{-Raxc`x&d>cji_bAGLL{a`rit;_CLX=OX_2>u1xDTQzpF>gpREqNB zD9TTzD1RsXH%3vg`)gKit=aD?Vg=OG45fC^7AOl zw@{S7f};G56y&wnb0%MHqf*1 zJ(m8!Y%85<_69xMtc{*y_6|K4{id^U{6){hee$%-tUKxs1kI9Zso5cP4(>;xv+?;z z%gv6b6?kr)hVUFXtu#A>{?KeToojX#4Wl2l#_UOYKH5X)p*{3+vk&QfJkL#=(GK)2 zaG_bc%%%&?M$n7QPNx@}O`(_I`!sDan?o-(YoV8!T}ki4{LtsXRP6ug6g&q(?+e)1 zv}eGQFcyKO0ZXM9m>o_R;Cvjt63^o+ehR$<_ubGtF+aM}tcl)j_9ME=>>hfb*+cT@ z^d7Tk>AhGkbhX)E8B*8LaDUH*~xM;eI47oET?anEu?SacMa%vJg-ClWcC>SGrs@O zzhM2QZCJms4F&#cHjch!HjTcG`&H-;vs>xkaNihx$Lw$P?^up>r`diL@LkkH-!nUb zzK{B7JI0@Wfd11D%@)&-&@S46{RRCP>mU6D+dusW`X7S3u$|FQu|3nz%xdW8xE@4z zWBsOInEi_W)9ml`OS7a(xW_Dmer1+NzsCJI^c(CCsCjlb^*noq20VL{CV2KaP4w)b zIk1~&Luq%<-$~vnOdU&t9X+p6#aldv<6Q#E)2vpnW_$gQj>^ zLl5xmYKkAXxQ8C(*|Rj&vp>QC++9i zbMy$$-lqLMOT<1gaHMC)&~(qn(*fuYJqrDyN25P91O1`Lpg;6j^oJhjS^v2((=+$G zDFZz#Wq6Qh3+eHmEvJJ$TT4&yYzrOYSvwu-SrYcefh^B5Xtrm0beLzeD1OwVndW%5 zjE?ZEm5%gmGdoix|8{je_&jPh&{Jqi7xCwn%Vj`r+gdJ6hOPep&|Y3L8l^XwmV zjAwmn;aJa(r{g@EK=VB-rv;u}LdScyl1{+#q4=?px9CLA66)aT=ntLbSphBbtddUl z>@qq9>l>Zw*+yFI+280Ho^`K>(>yzlPWP;kmU#Z}zRd9K0*24@>}GnFXFsDeJ$s3s z?b&tv7G4~&n~4^p50EXJ$sz~(6cw_T+hCwVb2a}gf*U>NNchE&^ph~rS+c8r{{Zi z6K(M95!#6Lg+@I4m^OKKU~AL$~`KA~55)*HtNfh)0|(W|hY(ZyKL=+#)y z=rx|*Mz8hk7j%hduh8o}`;cDmSx+2W1a9!`Si01+vGhjthyDo5ncjruOqY4Kp8go? z8NC_(!7)kT7OZDmE4CYY8@3zz6Kpqh1-2V{JGLA8Q*1Z%4(taOz?Gy4tfJ(fd7nm_C5@l0N9!t8@*vGx`wr8}wn% z_RvQ>I|9cxfmY83&__Kxh5pR5G4wId&ZBERE2BTha-zTR>`J-?&!f^`diE$?hyKyW zJ^KrN0?Um)=~=f6;d;-~=u_Cf>C>K_N}s`gm~QZ_f!&fAMSyZNqrdzk2p_`j%&Zpl^HjDcyn3A^JCbo?Qap!E&U3$MT~)u^!WR zv0c#j@OeVt_iPny_v|hn^+3z>l!r(GJh1(2qTf&`+?xrT@V4rMs{m(ND3y zUJ5_+teAd|&mFqkv(@wq&$iNkdbqI-e(Bj@y2rDb^egN)=-22!MZfQ%-*|REMZce= z`0oXZ{{D%20sAXOf4`s@(61=^dFbU3%WW`C2-s<~8-C}BCI+m8b`RKW+5^AaM3Vyc zEZqh+3D|s^7O)lcQ2Z_zJuG0`>EQv}L;D5nkSpO40UJ#F2ds!58L&At z9p~lgfPmdakHUF4dUU|vq8T`^b`?A(U?|%I) zz$Veb=r271*DvUhfVI-00s8~Z!uc7;=D zkQN1O5uF^cJLr^vJxQmcURoTm-SiBsN7un=0n4M)F+Q{e=V9oKfIULb#P4R&vv7Wk z&J0+u>*3k>i&FF)tjF|RoCl#;U$3FFuw3YQ0ehML0LzmG1J?frSQ@a2v<&m5v$0%g zIo3N`5wN#u2+w&eg_ZbSF**m&Z_q0AmsVqaqdyGT{d8`?eoMmv`SVyJB^^+k6;s?yQlNePdYzfO|%)$gU|&5`x(6e>n*(y z+Z$aNux>ZOivl))UX1g5^pb%6fVKqeYI-TgnO=tHUFhW~w+t>qf9VzYoiutSwoiIh zz;2+6u^!Q@1NJ<<2G`^0wHRl*Bwz>q7+#0xVd(X^UPy1i_Db&$*bMmtdJ~ody(eJJ z^gb*{x+-8d$rW@N#+m*Yzb8j;#{B6m0oy`v4cMRPZ2^0a{sirzD*~2yGrS$!Km94z z19}JgN$0JT4M?OyP#r{*iNby9c5u zyqIFST}#p5 zH@Y6(7{^>P9Ib-=Eqo3Osp7qMN_-(Y`De;cqT=;na^n*J_eTj@*q z{HEylKj~`$OZW-g60j8dtl1ItWjwD$U%_@nUkzA3-5Rhn=pV3M(?4RoR=_uLzE1Y1 zbIjhOf5UnxPre=DkFg)5pWwO+eE{{)cLR30;;*BI>q83vOyQ^KZtQochx7R~faifI z>T9Pc_c=wrgrCA*xQ~V+{aBez({LSL;S%`+nu*^RRd^8{i0dT^ub_j_E_yu9Z_~l} zogjJwu9Hw)-+Y@Q-$xYry59jY|HI`mbSSQaP_*+@igITvy;R}3^h8`QQ2e!uf1d_% z{a5h`D-p(d@KkyiuDi&i>7%&+fF6hQjPw|sXQclO*rl{8!ET^v->nq&JV5Wk{d@9p zih7=+sOL8n^}J3|&w+Qs^AjwcqMkt%^_)!a!#K;+De9R*QO~&)_56^cp1bKtvqvfF zd6J@@&Gddew=LhKsOK*f^|Vve^Cd++Id{Pfv#}KQ6j9W39(@qMt0BV__0&_;bD_eQ zP}FxlMSaWY8eD&scT<$RkD}b;6!|w%{M3H|cMgBPy`DOe##r}aW{;pD@Op?hmP4<)N5{tl<%aS=VSB{o>GG7+U5;;@OlBKdj*2{=&mJ1~g zk6k-(80f@dk`spw&gF82Tq#${)pCt&m22e&xlwMCo8=a{Rkq0;a;I#UyX78fp5M+y znIcnVn(QYt`nzmJ4NzTqKvuWpcS(Ay>;avQ@5? z8{|g0Np6-~cDjAl|a-nRIizNT*(vQ@5?>*RX5 zL2i^=UPvWxMQUNkEVsz5vQ6%gJ7v4(o`BDcymxkK)h?XpAelGaD# zE0bihbbpTl`;&eOr^^hPC39r194!lFkt~)avQ$>cDjAl|a-nRIi{xUtL@t%fUNkEVsz5vQ6%gJ7v4v zE%!(}K;tV@=$*L!B-3O+nJzPArW`DDnl|Tq#${)pCt&m22fXxn6FN8|5asS#FctWt-d~cgl9TTker|pg;bJGDW7!G}%w4 z%M6(*2g_VJTIR`oStyHSu`H3LvO-qLuxyqKWs6)S7t1Abxm+Pv%2l#eu9fTLdbvq% zmRsajxlL}DJ1L$kZI>N#m)tG)NIS^SpD2@LvP_YwGEKU_PlEZRE1V&-WRA?0qh+Bi zlEtz_mdXlQCBw2_Mr5;GC|l$rxmYfdOXV`TT&|F-*4*UAlYqueAn%WZPIY?C|W zPT4MZ%RSOkwLD~!OqMA!Ri?>)GF@iKOgUI)N%wbHu>A5A&Xtc6BA3c#a=Ba~SISkgRj!rmRWdB=Wkfd1 zg|bC1l8faMxl}Hb%jF8WQm&G#*4*UEKrz1$!-%1v^!+#P5ma;aPM~e|aR! z6qzd1rTcqQ7{5$~-QShs@=!QO=E;0nD2wDwIZKwx3Ry2BvRN*aEpm}uO7F$>O}SjI zkSpaXxmvD~>*RX5L2i_rFAv@$Qxm)g$*3a)> zqI7?c4E;@3I7Oz)G}%w4%M6(*2g_VJTIR`oStyI-OgT%I$_iO8BeGd8l#AsOxl}Hb z%jF8WQm&G%a;;n^*UJrZqueAn%WZPIY?C`=hukH1%RSPL(DINeGF7I@elk-ImRT}K z=E;0nD2rsVbbpr(%e|Cg{H|k#tde0_FC(&9E|iPq61h|^lgs4_xl*o@t#YkgC)dkO za6R5aTq7}cjI6`#b?UFGE3&jTsc}6 z$|6}TOJu36kX14)o8>~;A{WWUa*13jm&uiKm0T^?$aQkP+#ol~O>(o`Cb!ErxkGly zU2?bFBa@Ew$3I!7$W-b64j#u_;Y@lv?x&Mk6!*d8$Xt2{?w6N&6zBKzrTcq%IDcKl zFf68cj-o`)r1)MsOO{d`XI025isvQ5vYz62AtIY8o`YB@TPU`(MRGC4^9@VnQi}d9 zlglZdTUa4iQruj+O0K4O-e8SvrFfoTtz1X(yuf<7f#RmrjS{C_@LUwuV~TOiP&iZf zpBE}zL@|yt6`n;gjtdoTp%}l_3a_CU$8`#?rx?dJg?CVlV>0i<#{5$##<8Em=@jGW z?oUU05yKeAnM$8UIgSc1rWi+epE>fo`^+(p8CpVjPY4Eh9aVVjNQxPNf*fw|QS8#_dbppXjcCW1OPbxu4;ANsP<8{ChY^P zHRUz+@g=Hj@yjMdYU?7QArq#|IH568Rz4S_TU++S_*~)Y+E9GBvY`w=;8Rjrgi$V8 zP#>BQicDe5zq~v~)RZ+>*EH1xYpQE$PQkpg@Wi4i(}xAKhXp4TO&vR?C>Wd)%+Ai5 z6l$mqg*lgktb!@ibAqEL`(>xr7Zem^5A$0wJyI5FYAntk?gz)!)pF>Hv$Op0l)4JF z?zm{+%}YD|ooB+`6ntL(0pIYkZ_^He68S{8#r9UB`Iu zRk3ru8&+38vALk2BshH}|Nq~w_FZQX9g_dp45C{OXHfm0?!kX#2Jt( z9#sCPd+;BbL3|I&{?k49AIxCHl!`G84P^`RLyhH)YC8>sxo}OOdlRBW^8s`Jrie^1d%_snRosC_;1Yf zJ3k+?hc|>OLk*$Y@=y>5JHt-YN8@CFM-uDw^l;t$iOt31o12>pzNi1ill)!UDDKsY zr=J)s$gwwMe$W4%`TpPZysCJ7RaMo0zvutXeE)BHURgZ8 zva<5O-}8TGzW+BpFDo8jR#x`k@A?07z8R4r*`o~a?kzi)lkP41L{7T5?2(pHF$8bO zJA&^cEEp^cmCddW@+(dKf*hCR-rd`<;V#0xySHJ(Tm;@LhPcUL*)GC=#}QmzMOmbb zM~>M;T->lMm+s!P@Fo9Wd<{-C!?)GgYdwDB%-Ul zz3SV6`k0UP;S@ovzCxToh;JXytMFOB=qp-ZKJvx4uO0RA8Fto(N62FJ;im`pYF`o( zIbY`CD_S3Z!f>zpb{yB)KF%lF-(O=ozI`dEXkX*^Jo4?;KGYW-zg}_mUE|jm8^6J7 zAM@}PZQqrcj<0V|T>Eg#daQjHVBq81mxKEDHGcR>`n~E)%*IMvzM}KJ4Ef@hZ%*8NaY;5d->&1A z6*qqC0{Ke1AvBjUU(RXn%Y9^~J_-Fgn0~MA!Xjecij% zR}t3_oXU>X*R>z{as7Bat{)BlaCVBvoPO%jo)nKi|_BMxbYhpH(x%lIHHeMRfb^Yg{lzdX(N z6lIL&8;uD!U&ZIg&G%HqF(2pqvH!UcTW*D@4^gpKw7$Rl`C{`e)_n7nGn(&hsmp4`L#I zy;_X=_O)K!>F0|r-_@FLk>(TJSd_>SIAy2SYu(v@e48<>DG2x8F1HFWSCn zy)47m`j7FObQsgA+k@XYZ5!&>$Ki?A7f^lC@w@m5{04nzb*?_vd7kn`lYW7G z@vms87bdXVjEyYwog0@in(r!1M5mdYir+Htr+pm5Y#(2jBUAjiY=0qOd5Gh%rAp5hq?IDo|hC9jrY80%UE~j zUSqQ7H8=NeIgU&_9H}R~+c9QIYxnUV5E zFDH)g_E>GznY$A&>^`*nEmPk-t|Kq+su-829oH7A zP8!eY<1Yw|zv|Ac@hc~I>B+56?d-VJj_ZEQkSZIT`|{KdY?SH0+ifk~hfaIL8(Q^d z_xpPukvMc}hv!Xw^|+3Ngd>jh-v4p$mXFS`1IAD3@Y)`2Pdx3YkBax})6ru?>xW~G z@A$B6Q2IyH_Pb+j)`uyF--Uk+rF@ujSk}uYw{>5gnDvBZyLNDnzuFS2nz1|a+I1gy z@58zFelrt2XenS1roOj$uReH7y|$|HiCKsb40JW5S9Kq{=FJ|r`R#k;6+1fc{^f!D z-cRVwmf17Yb|;>E_P9PB-8OjxH+*tIOX9$US9-R20}==Jc(wccmj;%OJ@*xZH;+B* z6+7m=aR+oHBzo@$k~6n-fB%YrH~2>%SWm;$qaWt=ybRL?9bVvYq+ON}7<`jUyDWie z_?`E_uPZU;-qw(*-K}zIvi?9A2}pDC%vSuE__mYSwl^E7#Ho+&mB=QJ8NWlR@QkI z3Dq{%HB{o1{ZQV;Fx1__Fm$fF4Bj}48)A96jXP=9jK)wyq;1 z)Va~Af`*2=Sag0U9GX)W3Hg!n*WaVrr_^x_qoMKPy0XadVbS2k+PJ_BgmU9jM&?8V z({Y1CE!yqZKNiCkokkIy5L5z3H5_X0EEiv)n{#Jg7wpWbqS?b@4VWCNnSv!2t$T7! zS^c!SXlM+svy@Gn-z8X#g}^&YIHG=2^B2^XVces^&J3u^&oL&9E7xU_>blzaVVY8R zMpGHCMqS`iqQ%ElR^sN1y;A&2;-liLDX5+ks@44u(Ml$SYHEt==GS+LE~uCjDyeVk z5<9NGX)Nvn3Ds6~Nx;RWf@a)9Q(G2RN~1c|CE7Konu|FYF|5dC7#kFxUQ-qhPp`fp zWQ}+WT19nDV-P2D$4r|x=Ir3~iRTmqOU^DX2r8w%4prce9o&u*y`yLE>vd(*3#Lt) zj!RT^^`VBcNL|Az7JoU<8Y2~`eKzj=spV|^nZ{OhRPMJUg3X~iQe75CqZ)!?EKJUE z(sZn3T@!H4Jcrfb?jiDh`9`?;BBS&Bat_BxBOl%^SWy41#*9WoPj%&WThrcy5IVo> zAe>^exv^Zl*I2Me`z)V5A|Ka3vGv#0Hjb;q)lf90OU!rAJO?=&3#wV5k-7Fchmq4m z5o9R9pSJR+zB6Yo>&eG?c)ty9^1EjqpZmMJ=bFemXVjO}jmVFy*^l_n#^9DQx2UVl zpZLy<+1b-V_2IJe&{@@ys)Fj`Nh}eI`0irExz*HGgev@t&(;3AyjSFR79KUWsXAOS zzM-zB;5*h+i{)S?`(F0BHhj0o&4_HwV^I++JIB6KGIN8U0I3EJY0uQv5LB; z+2IiH$q8a}np2DTU@+U=c2>WD)YQ$x)*orWB^z^}G?=bsfN|JOxFFPxYK+DGYA)6n zm+(WesLtu~x^S4;nkyS>(1Yobk*uMrp?F^P4_#$d4SqChM09zzn&gxufue8nznbuh&L!DK+5XzmS z(VbB?3LlAB;=$_5i8G64XX8c*H{!^FZefu2nFE6#JSRHV`_92}^z(dwEgJamt|b1b z20PMRtdWgXyqyw(?2*y+)~&q!K)}C|If!ji-q@#wUx?AJ6erxLn=9$wVp);o%DajX z2!=zr?}T%X1za7mkgF&bip{^X9OveTVl(%Hu4HFwY>t(2Gvst^ehkEB$3W-YqGeol zu|ly>=d5DI&?;>I8ZCbcQQY|b0r02hv+>*y)Xc`+rI8S(JEtNwHov^FlDFVs0*9VR zZJb|^Bfm(c&5KP1gY(Mt$sC-GJzoT$=+T(Q`HkgewJx_mQ5h{C433{zRABRB5tY%b z(TQlzdC`ez23a{L6q#Rcjz+7*;W9%6q50Lgr_|5j-g)5c=Wy=~HsN+$7MUHX!~6X5 zNZo99o`)6CZT>)su*N03h(->Ki^3->%G4@0h-gkDia8>66{fwe3sw4&;R@;Rmoc1v zxGC&M?6tDGg4lmLoBRpxkq~zK=K0*0G7Py3U;_74F5Q>AWEb>}?xp=4{vMl!xR-`* zFYRhocJ4!w<&7VZ$BN$mHIGe8=t^>#X_H_zZDL*qH~%Oqo7$uN<8b(bQ<( zavb*JPSwhW5I-8-bVJBD7_17F)z@Qx1@y!u+;RA4Z+3dzOdv z)bL@m7vSqsFxV6yV9Lmx*$eO$E*NZx?41+gy)r93mcO#z4Pg_$i{gW#7Voib!C%`M z)T+#N8uM-p1vx(4DY${?8i(do^LSP9k@AuLzjbTWBtaNLY(e3n4-Dl0EXQ9*GNpFmHxYn2(!hNd<(mFSGsphv-t=Rgj{3!j%oG=DFizp_Nvl{yCd`t zA>u-AI_&yd>E6TavgKE_`AvS?-p$qs|&i>V8Th)Sk>~pHoyxIPHr4O1qr>v%?%rzWKis^iFt;dm8 zZKyd?R*A2#ol}*alYTnZ{IZ4$7wb>@Is9qtib6GI)%bqUVEj15Uve%B&kkd``=Y=8 z1iH@&C2)9L5F=O?sS4syvkJR0Jisx>9|V70!110N41aB4$R9EXm$E-Dn8Gk&+2b9H zy#ar98ElGSp-vz~S;2Cl@XjCl<9Ey-J_xh#}F9TwDh$JNt@Q_u0>Pw@Q`q z;KBcd!vy9s%)Pl8V#TejsIGBuSiLaG^{$Nn5X7#QZ_Vz_h4IITEAhaIdt(H*1GIFQ zdvlFOjbS(1?j2EnJHm>L#zv#@Pz^pV!VYF;5HLe^}0Cm~}1o*|QgL z*~X^01}M^v4?giYHo%P$M6{c!=BZgm{FTuMYraM}($G{}ZtfkC4B+blJ`S+O)#JQl zV`FvY0_<#J(=IW$x)GetkKyaOnJ|vT%F`7vXY^ zz+Styl4ZFSyKiaL_>^yKblExKSC;L^cGkqC&T6uU`|0tGVUG9)VOAJo&Wc0MS)o_8 zbq!c2T%?)~t|74y()lThPyb+LeO+S^pL`g@a-7m~A#+EUSUNl;;<-T_ z!$xZAD{+pOB5alA;X0JBtPD3{M_-BaR9N{MLQWjk%x=Qg8j8%Ll{)Cfto$t?8kUXG zaCD-vRx$HBrz)}SV`%3^@eRf@1UvKcwAbz)XH4;ryYoi^U7wuPcB!cszQ}bfYjZN{`+&@D1577PN^F|&YmAf|{ha=F) zWAk$NrUUgx|M1)$nBmXcVLJ>%EnM=F5e?A z6ba#&v>}8qI2BfoFL@2v*;-`?n=0P9@T7k6CJ7^~Vq4ID9r_nQOaZHY{R|8EG*bjD|YtsXcqb7tRlbi6gQy3>F@hBZn z_7@aS>iRs~r1%Hos%;;IjQ7D>HIDVFai$zy!SSGf!g)MTdWx(Vx#+%3>nV&)&<>(X3Zh~ta`DZ z(;cb1bMisg6t{v{XDoK+*zzlMQAG7buaOwGZLAGJ_aPkZ##k3u$j@aI#CQj*(dtMU zLYSCW)=$2ZR!(Urz(tXF>8^k|TSh(VZBi$@|GqVv>PRpV+&P-iq1 zg_D)|(oo=5)iD(nerzKLkWWpHsjcvzoyFlTmrym=tVXMI7mpgb5JL?$p^9pJE;M3{ zam5SA)YX{AVSGc-txVBx>@HB=gzv01L7iFmGwdVIUx2xu+919R1S3`4S-4T+8QZvPBAQ3n*y&s!_s+;wXg>D$IJJT&6nWaD4k2tqe!pA8nSaem7j*O?vyTc<-#&(9w!hPJ*T{IXH+ErYN z;kOY%^Rq@r!|nL|Ir}?7f8XWr2oM4U?_f&71k5Eq=(k>baQg-?-mt(IZ%Fg3m<)E4XHEkR{v_Vr zE4~138b*OLNT!=CVFBL9<+*oESZofg)-S*e?iH(2r@kj8UKZ$quidK+;kl)>6!Y-q`gssN_hC#EtQL7{!_j>uy z$b75Qon>dRz&uyh&3C6iiFfyk&UY|Eynk&U4QI69jx*Wt9sh5+_*jv9MeFXY;4D_) zx8Qqn{cE%N*K+-9bNs$s^=Puj@2yztXSfdHE!xKhO#4f>gab6lUqW4Tu^vAc?~`+{ zXayN4@g1dFkdXt2WpgZYZFhB_*}3%3bQR$(T2~9E{Q~E)fWMA>YmS|{iaV<KEaiqV5%)JqJ!jY;b20`n{%Vm0wOZwJw zjV5t_dNH!_XNjvz{5x6TqXRlz7BfRW`W^|v~>+D`<;hCc(X3oZq&ii$ zi|ik(p&M)H-OIJHPcPRRJe@NHo5VhvbwI!y*(;%UuU>4a*@64VI&)g`=;UF&`r!$l zgJO~0a*-!>e{tp$MRG6-X`C=SbO?ry zbBty*IyNOV}#j}omt%SNJpd6yP>cC0>YD8 zT#C`aQA5#6F59C!i(!7JC9_zDiXp=67!`AYV|lyvah*ka`2{kMb$uR~fjOLtfx<2z z(PRD5K|ekdDO`63Gd?Fy?ULB z$>AxkKu&Do_2R-C5kJsoBe@P^0h*ndWUMp|_2CZtgx;eOH_F9zW86v6a{jQJoy=!7 zN1y2CaS9J&PL1n$G}CF(r4WtC>&&DDXf}q&Gh_XJnT;EQnfnXEUv&8g?X`v$C_Pqu zd~8H8N)!6J5h;vjVii}hdlUO&CZ|W66N{b{pV6$y-cpNs&&G7p`A8|}1RmVBT1@oli?-@xPU3IXB_h?5cjA2; zCivN(_|c&~KVdB5FMzd}sK>w5{N$dCU3`y9w2&j^9d|_1Q)o^L!hRQ98Jl@T(%Xo2 zU0j70xGt7)?P3>yh6#4jRlX4UTksE+C+&w7z|A0;o&ONA{G7x9B;A4{ZV>p_hTR~H z#{>rxFQw-%5$JUg zn)xgzYBBLUOzeLX-m;kI0B=;!+Yzwd{K3OsW}nJ_$3&=zWDW z#?8b(@7Nwml}PG^4cK}xr4%I)+tbD1gO)|`IBfiOIO1UBMz#YmBQ!Jd$^$7k+{A0} z$VoTsD$GK7uqF{lqp2Clm3V@e*w^cp3SHv0OdR5w3*5oLP}FxY%kh=Cgnxk)RUL9a zO?w#c#s|DD@%mV-`&9)?T#ATjz92j3=euq1*fcgrNq2ThI=3_Fp3Wrxty2|vurt=R zq_dqrI~vCmOdUky+qo`QCazo0u@$lGaS6}wm5}E8f!|p6Ux}Myb-5J3FP)8eg##GN z5?AXV*t31j?)AMBI_LCeteUQE_+ampG&g8mFWf6J(fbUmF7o&-bi;H+EOkF5M3<2p z*Uo}{Ja(4JZU|$K%3ETZw~xVfPX{LU@2rlc-MIS=_CI4{kF2Hk=U(6Q(%F>M{%a@T zFv(3G*@BM_e=^;Tc4v{}__+}+a$IMT%+4a2U5cC#KbI3aiwx;3GNen9v5&cB<2PX} zXF0$%Z2S+=Mt`!9W9&~(;KpU0Z5++N^y_&?@qu8z()pG;n$^VR8hPoya*bqTaV*F; zz7qegMUbHo7oI=8)8q6pF8)1_Z8+8syzh$W!~8g=^VRpzu1)HDC@V z!`MdG$-alX8TivjxZy%MH`D`JLAS&~S8x>Y@&ZGTcN6a2bMFCjxstrW%;g1={b-BN z;-(Yad*c5?-g|&&QLJy{GrRkS1QH++ARtOaP(XRb^ipPS8 z9hG9C2-th?Vu54t0`|_aBNmDU#iQSS&&+Q2oy4QZ-|zoj-*x>r*Y3UdJkLDSo|&DU z?7ORu5p_&Z$0q8SsE$eM*i;>xsbjL}S)Y38U$PyJkr5X|gh~=q=KnC8B6=b!s2j(J zUVfdpgQIl}Wb1clJ$PP}=TTN*Z>siLiGzsfAGIbni88DoduWu0e)PR=JnQxZ&TtvP zSRUaqF>-i+;yDP893j+s6AW#UBfS9(j|@jgZI1w%PL*`Z^dK3T#6GD+^&?PZ8Wkuw zfEW@S$LNg-j*k~~_RA~=GJToZr0+nO%52h)mNS#G^A+UODj0c-f>Ez37~P^dRmSvJ zFm|efaSIfTU#DQg;|eBr!|XpZDR-2DNfo#(WhPC&M8T8|DsbwpicNb~!O@*@UCc~6 z<`cz^D^Y9)KckqLH1k~r$NxxZw(57PG+W(1jj)Cdk=g9Z!xdXMO~HD8#w)YgRf`l{ zeVKx5?^JNz6AG?>L%|LFAXa9xoAxQVxjAkEGMn9Upn_ZbE4Y26f;*-wxU*crUHp(# zX0v-%D7g0q1@}Fy;C_D0DYMywA1Qcfw}K53TwXGpJ(5mnQFtFZWoC<_!!ZD5wkV#e zpd>-TN#`q=!&gdYwkX@EpkfEc>C6^Y?<#ik?+U6rWiYVjCiYz)+Xj;_|Tyt~go2%H;}HJp|CdWR|^l zW#b%MtC;A8^#-*iM7tB4cu{t+D6e@cz>!h*z08C;bl;#uCmfuaP)5J*HN`iOr}VwV z%!G?AtY za1)D=P9+^HmiVG%7t%`OzrZO>@1dNZ{uNQaU`S;wQ4XPW$iH!jI_N~*D2gS%B-!_L z{Hb<)KarOud!|-8-d2Kf90#;~u`Tyg+A29pXr+s6B^Y^4eiFzpv*o^#*QJYbL>pOWE5XPcl4FpT-^?Zq zSG;fJP011JNMv1YiI0bykw$&Rw`6&o;wz>W33{RwOMF{i9;EoLNikeE??{e(^@)8J zwqfe;UHNXD&i7#*W(XyFPyPm-qnP7FsXP}&3n%oxiZ(g$(`l(dy} zU!mSJV~HP1j>1}@y|19ktJ1m=LJ=j8C4MZ=4^)TAKdQq|B*$}YaHMb0l<8B+L0-!y zhRX!&pGl7VT6VNAtIvq)p0UKwWh?xXOlzI=hgx6ALC`utRm);rF4OBftZMFXn|~=! z2z1Z>6W#6df!h~>FQqEg1n--R-ZdNaw8J1b`P72FZyk1Q)A>rl@Qdfrr8FO1p&U|`x z@g*@Oi8wJgO>#06bK6KYtIhE>4%ZrqF}JPc1gV!l;dYOVx$Pt;OTB7*<)f5x6PQbv zoIeE@NOx$=Z7(^O>UEW`JWMOYatF!jRegR(#@ziRr&{$H9TjssN>00i%d! z1?v@Lc1+AYKyo@(pUd$vx0B@5tUi|$Vs3`yG_5{+6Jzdyl2f+&?B&MX&XUu&`V^ia`iz+$J{QG)4KYgV`6Ss$thlazK)H#2TM-(>QkH%a}SZ6`qc-`jJe$;r-AiB z$H(06l2gL^e4P+;dq_?X>r*U>xra(l73(7w$K1mtr;YWQI4S1#l$=7=+nN(|qmt9f zAYyWtSn^zXD1(%P!F`esk0sBOM>1$84&0K@8$^(?TnKyBKgk4&4|!WFsj*c-f5xW67t;`9N)WH8a-0@Gxkd zDz^k$Ya7){Z{H5d_v*qUw&Y`m|9}N}Zn5Ok;=&XdPwrKS`9_0lrmb^-?2;#gOHoV=6^DX0W2#F=Hmd^%pK4?50hNhcrt&#fz^?x;<_cq5u?jPtjf$sHkSD?F(mrm&3$}$W_JZ*OfixW$} zQSOf*UD|*1y4_GSmVA>O2_-dWPL9ZM7p75IxkZ)*3QZa)sHTV3t@5HkE9nolZj<*0 zTFw4Y>vs80pq0`<3yIw!e-9K|G*Ixfbf?U~YPl|1s#%WJHDyY6m&^$iS~pPe&D2EBhugev$Ua6hfUGcBEqO1t9WlB+hB9&8$^m3{` zPZY6~elC~Ldgb_$P8>vC8A}=9a;2?To-dfCttF<+Qr6f(Q)X#v`rL!HfiBnObne!f z@xtUT)8!(a7F}n?Y$F=va^X&kZZSRIh+-}m^R(z;V^9sqyAdpg@P;~;GT7xBpH_Os zj6C&9v6LY$7yq>URWtI08E+9Zbj0@|QWdl$*{&{X{%vXe?!{%f(i0XpDaoiUh{FTz%CxCWmc6 zHs0lutdry7W9U;)k&tvk8 zqf{WA;^u(qbk6Z>AyDw0WU5;Ltx+nWRWN~mG|lBIv5t71AMq{(Vg8Tf=vd0pE*Fr; zs7MbS9#nJyQ*hq6@MQf51*I}l*zc=ysc z`2vRn5zJAp4p2J5<*K;O@G!@8O#)QBHQ$2L(sSmNliW`Nt+fs%z8N!2%yE;t z`We~igoa_=9b+kFF8}4AbNY&}P(KegovPgBe z$VdY-l`j94p|z4+qote_1(t8)3DjkbM+4{~)K#ZuQ5k#!{S>B33cCaN|?A;m2dWU7{Ci2;i9QAbY@)UFgjZWE(8m67SML z_IOz47xE(Su0UZ{oWfTK7wS2NSo4d$ErHfaaay`NG{40ADNv{jE1<5Hdi)@%u8&Gf zw#@4v$QFcU>7@u4Q8q=a`Erjx0?`)Eh|@AnwZfYlC>$PEK;%okD*{=rCA-YKH;|oU z$u9R^4P+}V*%jW7Kz6e<6Cnc9Tj@2y-ILC2wiR!ccTgZZ#*(e}xX7vFedfg5T;t6M zWZNy-T5nz;OLonqi-5eW^Hv11udI0My*mS0iWToF@5Mm&bvRzSDdg4O7lA^HaO8B8 z@-<#!55F`!!WNLLYrXD)ta&&xWY>Awf$S$M-t}I7AZuyGyTLmxkbPmryU|+}$iB5? zH+lC5vR0POo4qZ8EY*_T;(Zgyc3L)X_4q)EZpqeGyxY94f$UQ&-tFG7K$d33yTdy^ zknOeN-RUg|WNoZ?cX^iuvY*58{Fc1iyE{;58;*I$w3ug4V-y0Apq{mq>3J-Wk2MW8x7T_@tdh-HVhj3)b9`aTMvRziZ zhrK%kS$iwq2Jgi{_DeWk`k6_pV?E-15h&~zj+}mAPmWvc1+nIjdWm4#5%$EHG2Q4f zFB&Lxj5A}p(c|94K;iSS1z6wcRRywdEZHV+Ngz8QY#8zW>D?5__P1nDcuxhg?=728 zdfNh7CoA4l-mih|ODo>fUV7B8h3_ocGhY8dcA#bRSuZz`WmvN3ys|*{nl+HV=$#kH z-m+vbdDjK9_bl1V-ljnIktKV@dq0qU5|;Vb(O12_fx?dP6~XUko4xkE{94!(wtyDd z;tdXDKUuP^-qC? z44wMdA$cBU?Lnb1(2eKo=@%)r! z!0<61{W&`{(4-H3#%!?cXS&njJxO?-aaP)-82!^Td&ah?( zYZ5sourbP|$PDhV(JV42kd3y|PL7-#$i`S{r$nv|WMjiN{qeGSWMiN(E^OGZmKKq1 zfx`H(b-!9#M&v-h=*Kij!cQkP(mBvNwm~|6Vyz;h0dMkk=p`D5OW;3=~dmEQ$7!p8|#a#**j|Nze4FWmaQJ>=%gz3I*XL zkbK9;^gvb^whr0;k-32k3ubYb#{(kE16i@l(Y)S;Iz{dXWV3yl8Cx?VF9fnuUuLdm zog<$IvNG4KG@9#Fmk8J4bXPC;WyWUL$N_<@(w7;VheQSkvT8p)W3zkY=s;HE%Z$w) zk?KHJ=gW-E!y*?4viW{`#%45fOCVd|%Z$xlk!J$gKYW?7*(dUGAUoY}Bfa9=ykF$E zKz4@TMn={@(jn&8%b9)~8QH+dz(BUdw`uY@C^9*aUF6#|`HV#>0@=mBO_R^TkqZLZ zC1IPY`=y)Pvcn@c1X@eO)>ZfOwT47q3bdAo(^1{e*E%w?JJ7l;oFY7QXe1r~5z=09 zc{m-&hDG`ZvMa*YAsZga4P+}Vnf zk&*WU*;>oysK{Q(hGN`STk{*tN~S;7jfR&qf^6`=Waq^qOa$jjeWNMt! z&5bEdj4X&#x+ScH8qJNYi<93PmisA9iaZ{tbX#LelOvzRDc#2P{b^+B!e+fNS3DJG-kr1g)lA7fIGl`KQyWc%7kOfZz7}*1ET_D3d6mX7=s{e5E zfXENJ%L0Yb4HVKhLnwwYUM%$?_a317e^ctw{O=fr>h}N;KJ0z~rZaegpTR&u{Ua@% z)eF@P?k|CAO`Iz8gnt00KH_#g(l>TNqZ*I8BLj`)zJ?$DF}E}juC|4byXOSLt9{`f zB&@21sc&?z4K!|TRAZC-bfEE2oCb>+7<$6}B2b&=-zKZ10=4u$tg_&_z|^c*>XUAB zgz1_*#E+$FQnj0k5KDc^%?h--`C4Ixr`?kRh3;_*VXbG}3j?i}|F|U2xpxO@mA%r0$X0i4p!J4tEU13^$7}ABfyUlOHC}f=3p7MHB}RY4Z8FR+ep6fcrrRYD zriO(3B7fy>3}j#WGIPn>;l3BhcKWig;ji7F0)?jPGKL?OWM4}e{7o5j(I(ME9J*<%yWP(M{XG9R#5Cd_w+$2zfL)PVj(>%x zoAB@5K0)~0Q1}n-XoPEzIo(g&#QD+94`gRqvY*`30(WJT^61Ig7+OGTa|xz0&b z@|`nEk$EId+;NKBL(<&M zRb&fEnmbiQ_o6mN@{L64t$9etLG&v2>$hK&l^UhHM>|856QvxRvsLOk9_p;n9l>ZG!#T0Kge zZDCzy;$RtF4wamBzJ-hZ?sGFjy0QC2@5NcD>FCPotZNZ{8Ino5L0NahMD(M0U1n0R zaYTP^MA90AXZp~>EgVl3!@tN9a9)Z-VZnZHq-P<@|kIR zRpu|H?p}&~ZTvtr{Z8WtsuS%pexREEN0}j_cQ9A?;-H-{!%25lO&-iH)6Lb@noV-3 ztDW#@lD@8XLPZ9;+6m`Sa)hgM!r$^a*{=3T<#%IU?U5=cxo$@hJrof}GRx^hai)I+ zOy?C*4nxr~2%MxvR1(n{)K^_h>9a;fw2FaDAe}E-N#`q8MD%PNyRovPmjrQCw`5V% z>8t6i1C*cQ$8pe&{5sA=^hq3hy~0y$&P45xy?XmDbyW0I$c$SsMmi0M=r1_x;;5u_ zNm`8e^Be@GcR`qlvP{uvBVx7u79B;2svH$j^@iy2@#@M`l?(DU86tXWyjYdiU>ht5*;y^+KxiEn@ZRV)7EE&evk8z?*O);rU2na_QjdGKTRz zwf?pcCvReB7~eAHZwqnahhsVyZ2u{IF|=rhFSYeIhS3hg!glyJGrr`s5PNMXUB=^k z1i5w8ppX1g#^3l*_%OC3#K#9=glvM7mQuZ_o3Gt%+a*D`6 zu)nbkS3^e;3!#p*k$d1`o_74 z&a~wP{NQ;b;pVI8z0_wY@LlRgRN_9L-iX{b(JOe9JUm-}Y#lk~*B>e?q9p=lKc=#J z4qjnDrLwpdAMh%gIW~LrxB)X!d)!Bi8#ZC&%;BXKGo#U&rTE}dU18Boe2E%4L~M*j z{Dw#kPQAZl2%oGgm_HwOtq)ei?%&E)VNtQp)qfw`WCfp~EQA%7?7z36zqt25&jG%e zH2d%6z?9;DD?zn2m9_0zvw6KDezjUG^zRkj*!Z7hgB`5$e^`b* zeAq>OXz71c3f&!aR`k%4hi?#-Apqkb$CDC)Yd+pzrY;0{nS+-W>D~0)Nb7_#ksi@V z(`ckOUS>Te($uYvM(`?Q1SLeZ#FLR$2@G}-BHZK0AZn8Y_el|rbnX-B)XVcCN$y%X zCeo~DB&k=VUEfHXgv45R<>^txgyLb*h)f)o;7%-tW?F)Kv5dk(U-zyvqLC*365Pkm zK(YyL<`|0Iw_rBeeNK#tMBE``65MZ38{;l_#zYQGJT?-EM%pHfRe3%zVRR&tFa}~= zO(Ojh+}C6@lIiXrMW`~L;J$KtG3-Y=kB`ga=t$C7lgFjZqmDbqkITXhO>mz*otaH` z*TZTTR8b_s9TH_`79lgt#ak*Dk%XRJn~3XPcsg=gumQ=d;~2MK471WM;gN_tI?}Ee zvl?kTCXzNL(is_d!P+JCikDH4HZ~O2E))gU#~_{k8E<{0O;6fPgOxUj)OM^og?c>G z=>=BYgweF(?!PF~8MbI?ED93N6k9UEy%J5?@+7oe6zp`?#TYcCOmO=|so?5f{Z9FJEq$$K>g2+VcwTJr zbr#RJxCl0F56@_rP4k&P6`Iet_!$;I%i`x-{3465w)i@W-)8X*7Jtg(TP*&$#rIge zzS?#9FugLH=KEWm@B7!AmSS$wC( z`JQOK>GHKUb7H*vR|R*o_>mUp{5l-J(&A@Xe6_{zviS2B|J35YSv&!AopAce7Vlv3 z42vIZ@xc}!W${vr*I0a^#TQ%rB8y*U@oOx8v&A=9`~!=BZ1Dt4ZR6_4;!%tDwfI1b zkFz*mI~}&az~ZM{e2K*$w)pcF|H|UuS)6w?;q=>E{0NKlW#M7{ITq*Z#l!L&EdHFu zU$yuz7Ee$U3|iFvX@JE?Sp0O0pJ(ygEv{cXUvK|yOa6()zp?nw7LV|rQ*AoGNfvKu z@pOxKvUnGZA7=4>7C+qL!!17A;*%^s)8Zu-ud?`ji=St4-ZzKqW1YpXxA^TA-)Qk? zE&i6pKeG7e7XQiOzgaxOg(J1;_G@ABwifSX@q;ZMwfI1bkFdDi}$qn;T9il@nbDM+v0OAzR2R2So}(h-)!**EdG?m zw_1Fg#kX60kHvqrc!KU`s6>5|V)6DCKgi+-TfCRW`MDdt>64)rA7k;U7B9AVg~jJt ze4)k9wfHiNud?_x7Qe;f_gZ{|#hrMN^!4{8Ne1OG=SbT)V z$69=n#gDf5bc@fjc!|X;EzXyJhs(3T;-_2uY>O|k_@x$KWASS(eyhdrv-ran-)Qj{ zE&iIt-?#WT7XQWK_~%Sqeejj!deiNlX7T+jevrj`S{%P9i?f$)@v#=4Z1H0(e!RsC zEk4KMH5OlB@v|&`uEm#I{Bn!0vG`RMzro_SS^Qy(KV$LNEY5eV>rJ=M9*gt!>S1{c zi?^{jKTsFeKgi;TS$u%SM_WAK;tMQ(uEnpk_=6VTYVpr3?pf=FNfvKz@idFKxA*}T z=R4WM^>c{D54Cu2ix0H;;T9ie@sSoEZ}CYMKicBcEq;Q<3oOpJ#fQsRVevYPFR=LO z7C+nK7g~Io#jmjVT8m$2@mno^x5Xc{_+u7-(&Eoq{1uD8Zt-_4{-MP`vG{h2cg={e zZ@wg7Z@NGK+v09&ygbR`EiK;8;s;o~tHlqqct4Bt#rxs>9bxei79VZ#2^ODX@nbE{ zm-mO$E3|m2#VajdXYo@kzR=?5So}hZFSGa+7GG=eYb<`N#qYQH!xn$s;!j!p1&eRC z_*)kL(Bhw2e22w%TKq?g|7!7sR`KnXYVnR1Kg8nwEPj;5M_YV?#gDdlp2bTnUTN`p z7C*z{OD%qd#n)NF>$!dgx1Jwr#UE&K{k(F${%}h^#^O^feyqh$uy~=xOD$e$@j8ny zu=wc~Kg;6hS^Q#)UuyAH7GH1i>n(nZ#qYBC0~UYO;!j%q1&eR7_&XN=m&L!d_)d%O zwYYi+kj-uUCy5ULs!jV-D~q?a_Q%>e7nVWT70j?f3tYR{FdGy-;yn!X7T+k-qqq!ix0H;Q5GL%@yQmSVeul1&$0N) z7N2MF(=5Ko;ul!_5{s)3iYSNEUrQ687)6EdG(jKePDP z7XQKGzgS!b55ep5C0aby;yo;Wl*K1me1^rZvG@ZPf5hS&E&im%pSJk(7Jtj)?^*mK zi*L6$zatZFk6jl3!Qww#JgI$r{N@(#WbrN*?`QEr79VNxaTY(u;w2WZviNBhzu4lJ zTYRm>ueJCc7Jt^_Z&~~Ui+^eHZ!G?!#UmZ!>$|nZ54L!Jix0KQy2bM?UTyI+ zEPkQIS6KW8i@#*?Pc8nF#Z!VGr|9u8!{RZE54ZRXi=S+9e)C3e+WtC=^J_O@`KuQH z)Z*V-{8x)N-9O%53yZh0_%w^pviP+YzuV$pSo}we|J&kC)KBo4M_nJO7H@0uLoD9g z;<*+tw|J$+Z?*U)i~nMAexgBd=6Y%IBP>3_;`~ZOIQ}e)ms|WF7T;v?S1iu&z=Z98 zW^wh^7^R@||C=RG%rMbSd#nucPx0*PsloH0uGk(t%gQ*e_$ZDC4@xP6E`L}M+FW7F zgMSno{oo%K~X!!wBBQ(?d9zZ_9v5Ne{wTe{+UZFAIbAbJB; z_}dPD4J91N2N*0ic&5QC4L)datHEy#CLvwM?`3eV!5a-eVem_XE|R8xcY_lR))`!5 z@Sg_1FqncSWIX&nS>XtSwFXxke9_=8gY8g2#v5a>+TcY7Z!-9#!4D1oY%mSac&hRl z9AmJ^;6j6I3_f6Ri@~oAHo>!(wA0z(Nd^JJdDl_D;e(q9E;-_D80t5o&IgX*CDOrj zT%C#UIpPo^o=ZB6h;Gz}2=^UG#Q(PsC&GP465%*gh)DMsgU1uAq{t^C@p9rjjyPF` zJL>nG5ehKk4N31q{9T8=_orrwhZ^9opxW$COWBA7ge=^~}8=gYHKzjQT zVdo&j`P)v04={M7!LdZ>;bk03o^P`msE2h1`D{J)9ya_jgIf%~ zVNm%k(&MxA)c=hLo%a0MkImWM# z41PvLpWRNxzLz)zPR4$W!L0=mo#ZfLCf?{njG>CUl2+(N{~Wg~Gq@dh_i&?GwMzO%1(1v8Q-!#k*j9)uiS2~A zhKO~5n~3d&;4{+>E+Y34alf&F*ind0M9hbuAs!&aOGM1awh}Y&P66V9LVQTxl0_`RJ1vN_g(xOMzm9m45PT-inIptzVwn(pX3Z%_{oxw! zRG^-Sm8b_|l@O;8PZnZ5u^Qt5u?FQN)}kHYJ5C+G4ojSi`XtW7FJOuD@tz0b0wJy- zo+88=;y;9Vgm|hD?-5TE;v?eeLi|oV12b&QC7gvq97H@5?;#*A!uuVFX9-bCTr9)| z#IuFCpLh=J5ziIkC*paiC-|&$KHsPYya2DOB4U!kXAhhuLOe*kNQh5}7h~Lp?>m>E zK8Z_(m`z+J#0uhal%Kdlh#kaBg=mL9;#>xQB3>>8|A*;Zfqq0pxt9`G3c>$1vfQ^3 zR|&!Y6|%g~5m&>Hh$!!;#5F?je|apYhrZ{m#T_H@N{sWw^+I$dt`ma)Lvyaib%l5p zzFa`O2JUv6K@paYT^y(r^K6tc$RoG?hA;wz%Pim3L!8iIJco5 ziMQk37{ohJpTs-yxdh@}s8{0MXm8>@LYz&!7xy2;``~xP`_X@h4+yb^_#nzldH*1V~evvi2aF=2+^Ae{~bYmREVRAj|*`;@iB~B#ElrQh?|7Cp7>9UE5s)-ZV;bD zy7EB7T7DYX{(m7&nL?!S9IM;Ag~t!LNuP<9bZ|M2JK81AYqsAby5+B7Tl> zo%n?iTuXAk#Q03yj{ZRW3ga(v2l_=v;Mb@};y37r#Bbqe#P5W-n79-EMBD{GBJPI& z><`={#DT=`;itqOgeW2YhC@k88Zoq!%*b7gQpq9es2L|2NT#E29l4IW2Kz<+NbD@d+eF+H?IL!OBIO`pS1Gy^@nW0`;vrI8M(ifV zDq?pj?kD00%?}d~mEv6@ZmNDH_LQPs7hn|SBI4%#SYmG}PBd6e>?6e~2A2@~N^z;d zYl!`%c#_y(icg8SS!>!AI8cg1iTDBaIN~5Fs);cvRuBgxU&O~B4#09#B8)DF-MA*h$E%=hB!)!q(gwCrRYi= zBgHTxZYGZ>j+0^maXjjgI6;cLi4&#RO3amFFL9C-?YjZ-UdaJOyi#%!5pR>6N1P_b zO5)K{+($e{ip@matbR>APKw0t!0A$SAl42IISc=n$v!z%~ERo^?Vkyc)JV}agiF43ihXTu_IG9*2 z#c(2SrcWSNqWy^u=9$EkrMQP!EyZiZ8Y#Xf)}p-*1J+3~kcdT~V~F!m9^!nIhqwUc zA)bQr5OK5qCGk|0rzh|1{ zxJ-%~;&Lf2A+A7qh?k-~#LG|~;^i1WdIPVJB7?Y6iXp^R=x4;$Qq&UHNU@Z7CH#%J z7VSe^C&eD(dMVQS0Ix!Mh*wK-H1Qhv8}VB7C*pPRH{$hDyg|GH{hW9s`gvdAO;QXZ z-Yms O4OB;G2;g~Z#WxRH1}`ZMtk^h@HMQtTt%1v~wKcf$_x9x0|0@0Fs8c%KwY zi1$lz6Y&8lo+3Vo@sIcr#y{f2Ql$3>Zjhos@e#B$@lmuh@i8fu6Cao24&p{BULbCg zVh8b`ct6$v;1g1GBR(m`DB@G-Kg6e{C?h^2#d*YMrMQmx9Ig+<=ix8J7o=JXz>6%! zK?A{Gl43ORWz-At6^sMKSJ7{Xo27V*xCP??aVz{R6Zo1GgNd(8F@yL9+J*Qg+J*R* z6n7Hemf}U?J5qc>d>7-~AmDpabRxbFKO=qsKO=q!KO=qwKO=6F;#T6nqUl8ekH}r#2xT6;@2q8VBk0KGvc@C zH^lGIZ-_h5Z-~3lZ-~3mZ-{%)Z;0Qc-w=PmIB+=dN7y6&1bf827{7@>OEHc33;d9{ z5915*SBzK0e@n5R_?r~h5`V{akchu0iP90D5-}isNyK7u(h#8Mh!i5;?Gq&?VBL+_ z#1RvSiH?{|Ov1W2v8f}fiOn3bf|%@xD~R3EUPN5KpCC4O#Ph@ytTz!`VEuyF(h-p( zfT@n?N^FI7Fk)**Oedx}VlJ_bBbF1}I^tepJFFiNu~@i|*xnHb9|`Q>h*8A-9B~q{ zqa)5G?(c}}hzDRDg4hY=CT3uL;V9sNju=RM3iD24XRLb=4|2p3Vi!l;L+t8^cZdgL zy?-e15Tr}&hII!b7USm;dtiN(c&HaiM<_BNbKW? zbBI{%yp7n;5ib+_J7N!U0Mn!-u?*{M1{V`ihf9gDcRR5H{g-$L@?r1|;>nKqm{^VVXJU;bekGoVemx3! zKH7nJ0sb#QybyjsT;hl$i0jZU#P#_92JtG?6Y(0<6Y*Nq6Y)CK6Y+Y~6Y&Pr6Y)mW z6Y(b06Y*x`k9Z5}iFh08iFiB4m(jpBLL5Ro7x^$4Bck1Mh$!zABHHsrVlDiXINuSc z5Er0d6Hmc9D)Ap!Mh&zaKBA#B*?GH3m2j>+}X& z6YCt2L7WS}C3eSK~a>Vb%)mV2M2V8@GO}rBIMZDS(uNr)Zh`G!4kQsy@IHeN z8GO{>CWB8I+-&f5gKryr-{6-9zc#qj;P(cF)aCXJCK^mOm~OD6!3=|44E8qI-{2sF zLkx~GIL=_M!KnsMG+1b`#9*1h`36rlxRCg^`M)MGjpcaXQST9^pA0g52ods55naAB znrJSfg+;UKX6NP4npIsiSL97E%+H-GqSZxZQM^1gS~S13aDEi8udR*dO`kBZwz#ac zwy0laRm}kP8rMF3Cl}2wt*I@l&YO@uGTTJ_FVv|jqI{Wa5nj}(lFYBItuCEaS6fu0 zv!U}>onJAVA)4X!pkZNYMRBEwR#es&MMqAU*0ZKIzhDlEQjvdBSgWkGqA1LZtMki? z#MI((DAH8C1a@Rm?F5GW)x!6~+avpD&&@B(&h67rn;B7A!4l>6>8<&M%0grB59{Q= zvZ700R$1V`2{($GsLh`xqBRT3iFtYI{lj_XMdbxm3;K&Lwb8z!OJTGR&w9fL{_2KX zEa8Tfliw5q)Bj-ePfte(&l8NKf1sgHJi}*0$<|w`hcl(&>lHvLDP-fN`}IcvIv|Ys zpC(fBazYX`o-t`#>FdJpuajUM- z4_|wb5NG<0V{|CPEq`3PU6AfVgfZXA*!^^Ale@ni&;$R2^D~b?U-o$DoVr|BIf#{I zHeYW8c(}aRJ&3h>R5a6Vf!$B{YMlFVa4MFbhCLMEpRR>0Z12(6gvdbM&|WHb-`--J zGmc+>8E0s}LXg@hr6U*Rh*O3gkl4NG?T@~cJ0l(Yk1fP@vdAbY zDoI`%St(1BR*o(iUcPkXyL&w$yT}sx)n_%++shuCc3-#9?NRf#IAr;@$jaBZi?ic( zC+?KVVeQ04ZV$2h%`?Rz-~X#I{jlv3?@@QiS>h1c<+x88)3&Y8SP+0mqV=KebFF?+o^wIf>Wj68QtN0cY&lHr-}zBi&- z){On!L%Y0l&`vk`wq0Iic9z(&$Vu99S@Xoc_37U82k91MBi%!h?x7~#)hSF@T#a?%x*#Wg zX}il_-tNwSd3&34Q1|haSR=FAE^EKa%}UMcu%gYH_RHGgTxPXg z*>2h5;pr~W<~na+cqcd^Y%Qv%WENboF!6UYr4AG`dK4duN|A!E(;-U zWXHKp)(<~sYvP&?SrN3!(&3Y~vex?KG+&#xzVfSNXK>cbcYm-wd7$j+?Q;v7>~r_D zUf%>UbN3!rH3Iv%ow7-j&AEFIInn7k0>>u1WRu}r9?fxkT=!a=mFa86jwMdpm607w zk~;9bN&A)U)`2xkTPt@gaSvtqaj@{dGj(5aZ9FN030edd?k=UnT zACCQ-E%Uz+8$Z~azHLfQpB%P+ht*=^yQ^`S5C?Y*!S#)gzttyap_vJX6dsk{CIgwp4o ztTVHkWDU!Xz~@&X6}c1p1I?B$&55i`f!9wj7dy@riI)dne=vM|f$@4zdHwb_SDbIW zUY?CUurPJm{zwmgKd{BhC4b`g=V-sbD|OW}l_CE$_@O!8~xt+ zHatIR$C9Sn?{W0nt;Df;I**ARcx;xo@~R!lV*1{eGrU3Y`x)o~GvN0#recTR&w$_0 zfZxxk_xrIq2Wr1xsr~+{kl%lz{2sZ=Fn*umb_@Ic|5syu+ew*4*sut?kwo zWcAG&oV8;3QCr0!zl>n7^maJSTWoH>8nK>~`w}~MSoa9}uCvdZ_2KbvP8+#XCPcPm z<~+X3ZP9M)3mEsF$Z5SdVc{dY@c#y2!Y-N6Vq<2`n&VeM*KM*nhjl>h`(A_Y@lUq@ zYTESq-?sNMtE*Pee{}dgRqxKVt!wpst^@XI&f)#xbs zm*)k4WsJnk;E%@0zdA2yFh>5>dBIhM=tSI^51 zm;ms z4#d^|Ownq2yJf!T$P%R846U@Ob52T5i%Z)tOWf9BWwTwfS^HIytn`(iWII`}Q>vD1Ac zTJCg3(hj%z=*{g`y`Gb><5?GDe%jG{GZ%XMlD?l&(sajDp6urBc(!R4!r)&`UfApP zj&6pggjVk@d%cB_N~asfGXb66|3paZElqMdZu?;G&}}Vq4plz0;v3OvA@-L2TJ~KSlhjgtuB%`z@1FK*eHFZ^0{OD9+#;gSy z>dsBXk8w}KBmVzA#zoe8UAkdzB9G%-9CryvdAmIChb@`gC=naOGF(>@DgAy+HzjRc z*5NiBHa*0< zaD5;CH$RtVe^V^(!(cO&+ZL$rj7_U4s;-$iYQebDx|vx;HFIh!t7gtADlHRwIa**j zTByisl|sy!SXWzBS36aG(oFCJP<0hGrL!y09STbFtHm6>Hal^Sf0kWcT^R&t6_pju z&aW-ffm(G+ZGLTCjjukTk{!-xIc1gkwf*|~baX|COamJfk__zclPOr^u9)q!;gywT z{yC!b8R!$%Y+2F#`gmc3D&=}zMe8+9)INQK42&--pMbC0`L@TG=T}Xx^x3fLqKf>< z^DLT+is$k^>d@3$)`E(B)U{9R6<|tN*03_HPv_T`R#t?oX+q_sy8MdT(o>Ygk3Oup z7>n|85^W?L6gHDxI=iUCtg`z?Mi!NqkE@(lWd&y!&Mul-RcD2csHz)|rL3ZgLQ60{ ze}49S{38P&tuvAuQy?o?We2PNbwxFK1(kKEn*8~tzHTmT=jP)d3pJvcjv>O1S5{du zJ3}2x5exgEJSdc4q$cSz5DeI_uf~D>fptbJ@L;XZV5J{~BS0yu*!2lDkSnWD&MPa* zuTdEYh@Sy1^0T2?keT{;%!6h+CjnJ4>!m@8#i0aw9;8PSBu7%8njc4*3nB%qKB*uY zvQbrAZK_V6A*eimz6sK2HKnH%Apr8i(&A#AsVXb1teaIKh7kkd_ZsUjAs@f3oxq6+GjnHnf# z(fO~bS*5iInpGAi_}^6^DG5tT!jgGm$-F?qdapO9Se&fhAZ7Iy$?8oihIrFW?M};& zVNireY##Vxf{6)j;LvP50}%aShg^*7?s?OvV4Pk$LQO^uqF4 z_^)RzeY*avwp`3Bs41>3#XmLG=M3r3^Qv&=sVx?BgR{K6x%qiz80KMSR$XaXZD~ai zQZuinAiqLs>yu(XeqLVA=yBO%ZV*uHtNJIt=3M{8S1?#SyQp?vflz?q5|?Z;0@%D# z{O43Fs3R}jT0+m08MwwMxiQ~M2+R9lhJio;WRL%!5LSVTPtAH9-j0&oO+s&$} zFrj$}<~f3>QCo@5ug3(%igjRFp+P-rpgJ|LE7JjSgRY8*-m4JbGvo>T13--o^VpNg zfpkD6M?X<=jT{gZ)##54T0@T!I9Fo?P>m7Fs!?YzMz{fXS}=A^DzVGv*K&9{xvsKS zR2P+tva-U`xo{PIGz2=uR4i56y7w1qDAs^lQDcD`sA?-w8JY&XOyHmRP*TS{9x-^p zXN5k;2&P0BO7ezHm@+y}qdvfw`nm=AoNtKY>LL!@>b$y0V_sfKQGQhwF0cBGsiD19 zC@$cog(80zFTTjbeE5ty^AQ`? z$WT-B=d-><8N*m*s6}l3d2_*yj&su;fWL{o%ZM-IUoU)Mz z`o&eM3Nbe=$1qiaW6&40x04!IrcWd7nxZ_`4+jNR5q21|Q(A+`n+dO-R|);u2;lHs zS-rr7S5$^$8)h`2G6Dn2tm^#g1$lEhg+y#P182OAi7M*KXBDAc&9e*Rhv$u$HaTzn zuwzYH`2_`a)g0X5Gqaif!ny*^FGYSqWsS&3k4F>cSM*g!QNTL`3b2=;QL98TTLRND zO!AA%(WT)l2rVmA$I97#dZXLU7LXK+s>*qovf-*#T2UfuPG)o0ABzQ2;a(#0XcHX* zY3O5_$_LI76X(nh`wKubO^`9yaCUJ^f>Z1xMV~&e?C{y_^R!5vO`yd1`m02Ef z&eA|azyQQj6>H#dgwlZ#6jSGAs;tH8SjHl&a-*N(IT}@ReN+KBpcW8-BW}2OEno%c zqY6OzR86zwC923Jq5$JAN>;Ui)8F6(#X=FV7qEQgeMHHEDvUX$$lfe{EY^Um&dx6{ z&sP~oOHs~)$~~_06?n!bzZjGC`m^HtQ!R(*=T{f1P<^U3^f`v2qVoLGib9y+Ut0CXK57{Gpjoc2`* zm1$TkQ?;#*2-5i|Gl71nA6$)_t3oIds7!}`iZKA7YUlc(F)vWatJlrT!xNNw`Mxzx=i0nJrc$@)+!~#LNjA@*pQ_4> zQOWahuCHt|i7c7i`URZpm&>n-yt)3_+#tKb87Js^nyzQ*dXiqlNm7A2a54^3!wGtU zI+)pdjh>^c*;#%e8yVhRm^W(y9`4M`pPP>hb@9AvbOv=3fF>8kHAO{pc&t^dwg?l` z>LT3b6p8|@SX5)g6~#s9uf_T%vr0o=acK>n8x2iPYKqEBODbz{FEcx@W*+Xy)XWF- zl#l@4=ReYF9%t=0vZ$6%bm|qv?A)>TgPmi;Pj;4yICW8o0bZ11B3FuKIAjr%J-wQh z!=)gwVuV-c&*P4zqYB({aV2Arz|{}Z0!X!f{jy&H*YDy28K5HR(A?VUX%(CcVSKK^ z#rqWYrD2mN4?8Yz%IN9Yc~g(e&Cbg+CPr7(4y&%tUm&=eVZzjMmbS%`n^jZfPCc57 zX)q?eHF?S~OFO@)0H05Lu4|bgoXpLy zF6E6pZgN74kPWjZYEYD#QaF;9P4Ovf7nLx(0t>;_ewwDPO0hl(IhQFVDyVJR*IHK^lq*h2ns zj>&sls0*eZOjdWwRnzbwC?h>1+8!|+~Pb4+P%iQj%>vB+9fR)cyEkIsv2}cK2OV*OBNy84ELVt`~vQ;iL4+A_F2Jr|x7yT;1(7ANEFx?xb zm#2&BSFW||1OiQSDy!KY(5xq8p|^HQ0otmdM9W534CBR!%^4RS=L6Z8jh7bSUNRTY z)t45{^GlB&P>Xh|tl*?kH%3Urg=3gCZp02(-zT-QzieH>_TUV5e#2obhKS?q@H}`~ z5#x`hfBmJw%#PI1bYGLFziurZ1|0!u-ca?Q{DK)VlSxR$3~2V?%KBlwW(K>1Vpv^(I57QsbNMfO%>p z#Q}pGnu+(3RSUF&>ZtL$YRG5(>S(2cYxs&%GRGvAhlOU$gA0s|?4!7XZ0zr51g`p*GV+IB*m#y` z_U~p14*Qp~)Tl2uo*kO}yV-%;{-x~vR~|{Df1aWG;lEG6;3s6c!$yq7Z^+_!$lvPY zG;+!KD?h~IRYClYO+UII)Js+Is)<(Mov}OOv@VBHh94L3oWB7~NHO8S7nx}0>PL~3z{OqMAe)9!g zran-mKK<)vc$pWf3!y`hT&+rSI_tKTN|J?Ao1f%3Fa}C7`ADSms4CiItyABw%nh~J z=2T-oc+NCfV4gD(7PB$GV0`|*1+p~aKNu8GoUR_$~M{dMN8FwM}|1!HKN~2lPvW7nTe=(_Q zlt|ZTsv1ZZp;{XA(U6{G)fqiWEL7v}Oag0E`KX54P_6Z^T`hFe9*S{TMuF z6b|S-r`s;Y&U3mgFC9EbG`0B!p{*s@Axk4J$BvQ^OcH6KB+^1jq=k}53nkIOcl_+a zOMO!~r6qF_LRxAI=jk?tFu#6`|1$3;dR*R3D#1X;d}+N@QJ+jh|E|~jePJq3GX{UH=bhKedfaU|njfE|M~fsTZ}@wOTO=}C(C?W_ngqBg(Xt^w1Ioa-k7 zS7I7pD!UEF@cIao>LW~IgxxAagRb&6QuqoxItBChI`&5T2lGHJ`V7@Lv*9^QahvHA z><`obpieOV1|2_*xCuK7LNI32LT1xKX467u8}tJ|TX23xH`6W{RhwUl)cO#6V-Eix zGG?MQny8jFbnO3&No_`nbls&Y&$(3qo!^du|E=t<(jrfi0ptnN#(pEjZrhmfKI5=~o`| zc+M!{`y$SV7*3~r#+=hB|L7h`-2iF3X$e5STLlFqnB>wz$)$yoQ};_IxwKGnX`$pA z_>Nx;IIM3Lr?hJB6B;Y`!8(6&hFW`UsQiBTQn1dsKu5{pm`i@DO&qoY8LDs}RhoJj+PrT?F23$YT5- z^4PeWNsJGJnwnm|Mk7!^#!tj>t4^Z=9TOuJ56|ChG71A z**SLNGH|YA67Z1JEWs981JN^$X*eM#CvU2zI5FvJPEH204FBY0c>c*rq5TRoVrmW+ zxxj?4Xhc4V6*~rkhkKaaje<<+9^}e!umts6i8P0>a&ORH8p|+Gkq%>JxTrLEpc-vu z$PHLAQiNnxCddkpi41Z=u&9h8b(h4AigNqkUPnAQOug>+gI)c9VcHRPS*qzejvfw! zdV~X!st$w$QF!o}{A*KaUxKNzWxW(sAUxpA#YDRlD<=TCz)Za11mCuV&EYtZiRAPk zYhXn*;n%6qd}Ka;;{HtFd-0h(W(lU(OnA`~k1@4Ptkeo)>ci6Gro=+q_-%+@XH11Q z*`^pVwkmHYZ)#o%>#a#GUUTpvB?sWRhb|wY^Om^MQpMxJW_W_TxgU1zoCvB z(Ucv2KiJ*%FHC$bnBVGDLyjIE<~%VR2n-ko!5@gigU96iO`&}WrY>@mt$~XI)3I^_ zkXK^GfhTdB2@d`dC~Kxps$r(7$Y8>+Q=v_k`S^+ZGokNQXuF&YFM1ZS$+A*Qjj10? zuV_jvH0>86dX+I1+GH0anrB#Ol_q)Yi~SvE@EoiNvfs*@O?H4iD1RcsX-?c3-O*fF z?niXSYPQo=2&^;lgY(PimtRJqx-%oDX19~Qup*~}CU8CkwpoG|H}OHXOc3PDaIgd$ z?GPlIhm{-WrD*D6tPHcQJew$Lqh*?Lews4mM6B3o3CXHVkQKJnAg3ZWT4offJQJJB z|6f_j*{JSP|s>JQr&brEf>t(_9r{v}dyIN67j4A+-=byd;s+}OY(aDq>Qr4lB|YY*luoFWlBx&d zh!*cPa^dAR!_^?Kk-~#{(wmoTQL-``8q3w!wM}tTsJo?SVS7)gr@E!ny;uyMemuVa znJf^+OCqBZxhN@3w=EG#kJrw{@OF!Q&!k2LWO9bCpFS{QNXc_b4n|QabgrL{GmDra zN;fh{Wg_Y{y0efVL3&Bko-!p((RkNfE_O3k9ok^4E?b~gZIaloay8H{Jae=f8q&IC zNyJp}G+SD-B-@39mmFBwCzTj)VsR={IpPGFQOe|!S=MwC5+bfjx^99DeUX)nTulGQ znj+Jxp(8{*QPHV9s*!DiB^j*7(Yaou+SSvMwj}~JS|EUD`RBsI%5_U`nZ$PG#7yaY zccQ9&mIk*I7H#9Q}n~d zWf&Z)Vt1e`DHP=|Ix`*Hv`)xG8@V7cWainp9w@B!^CC- zl|Cr2Rp#d(>9ICU_+RZYzLEBSLyxr%8~tDJvFLuRdww58d#nxP3(ql@`Zqm>6C(fk zU5_vwg%5n?;5z_cG5(^vaqnL;I4jcK_zjShY`$*b+`SkqNlOFSlV1wSZ}H0sj|pNvVe~s8I-~;Dt^2+YSU?L0~olrLLwb4z&n@ z(s$w`RpIOF0R~1Ru%3bI5a8VksUu1&^&$eLcT@45$R8n)));{X2(-qks}@Uf@V(g? zaVePy^ktwg0>cqVb0V(kwMwL12tztOu16q~fvpJCLICk?@sYY0`Y>ggyU`Q;kukMB z%zrQ{Z6ZR9s)1EEE0c0J^gOI8oi8j&{S(0w2&9*%+JwDgSq9QDcvTr~8uc!s>ryR4 zy40It8SX&*v+bEsiZSd!W9y$I-*RZ|AyJI=KEdIU_H-$8(FPG*}= zz>V$w4Uwk3by2Em?`#D8_NLtoNB&O6(b26crQ8eCYQ%9#z66Extt$H5l$3WdAh#im z19zqHmPM6vJ_4%|D1~xgOC3kaBo{enQ)unlly!%|U*-!KGB!$u(>1G$rB zT@D>b?yAgURF6MBrT&7>et^~a0p57w6BpCoQ3!J&6LGX@ z+S?KV(_X%7I&AM;W`OptL!@c%0R&8YYav4!$bG0ee?8gC)?gs}z;rAa$VZU_U#p=9 zrKHTmK;Z33DrGkUZ!u6G`}Al%Hwz!0n@N71UQgmkh5vn4G5Tqy@o*8F#ZgyXA12EDMuCCkPN*W{RQg1Wdg?gHDJ&_EDvpC{ z{xF)_3V~}Gy_0GP)U8x2sqTcj7lG2NskT8qMcYKGFQJ}80E=lWo+N7qaT|&;Z9Rg3 zX>0Qek+zmb;cV*|M4CZdihybBX9&n3)a5dg~%WtV(yKh7a*X@ za8~i!b!vMQxP(z@J@iMg8t->AA|L}f9W~#8mhhS_2l54&76k)|YYD16_Dp(cN=i1an&d#IT!uhH z2EIk0H3Fr&Q5{8}4M3puNPMJTi0@hMc2oHkJd1%;Y%Oyc*p0T`h(PJ3RQ0PUbw2{8 zVO?1k2C`C$G^_&xreX6C2ph(oCmXgFk)~n1fy6W{6{X2Q&Vf^EGw4moU6tvK>hVHo z>QgBGWk#hfLo>r`qu3hDqAE|Cf#i>nsh2{&1IP3sR86b;KkBCTN8lSqA7%klpt#FV z-$}I|N+VD@iRxXbatNd^ruq#k8v!h)t>uv`2k~7LVW1j4p9g&W&C2a%?& z>ku$){RIIT#O`T%8Msd@G5XtSvW7Aj1}@K zlowAx;8oy!t8iXCAt~flC@&s_!>hoVNa4JA0AI+<&kK{69fa=)T-x+11P#vOj4EeOP};_ z8s7fa;Uemaju4gjp zwjipR@9xCCGWt4Ng1PNAk9%k6`x(VdO!^jaudL=FeAS>^z1DHBoPL#2Uj<%mOqRuv zWqG}imcIf^Ti@cvy$bpmEfsJCYI1JpTN2}5MV*4k{5p4u<9$9kj0)@AHSSf`Ef^J6 zwp-lG(7hNHRn;$hi?&atz z1)@g8y;`~fqr!Tf8~1AKPK*lcH9qd0sfQFuI3e!U(HAf(ti<_oudcqbKwcNbyrw46LC1AhV=#$iR0>K)u?rLVgshi zPHf2RvP*PY3Ww|xo!1z2`OKiJhr`6|65To)bf08!_Vorm9y93qu0gM#4SJ8jW|&=~ z&lLuJAH)}Qc8Pv38T9|jL=HG$)WA~)g9hUmE4#$t^7!h^E^*GiMh*MMV0bBf(Pfty zaVC*;7q^n^q`SFEWGCIj%^*8zIj4Sh(h5%Z?4rEPI{a(COc^Z zXGwO_lbjjZNl$S$WG8Lp49HG;nxmeb^ejg@J82U~H#=zyM>IR>9~{N((&M((CdPNn zAtsD4m{`i-{M!sJSZ^?Sr@@qCHR(C+OQSAItVK0F$6!WRgITv3TzsLyC7TQ``_$m_ zV+L2OGR0oG$Ka|%26MeLnc3C18O(dg;F?zr<{vOv@SDMPXVjtR_4N&Im~C+5y`31j z=nJE6u2Pq3@iwDw{nKDc3ln)q!(7^y4lua$QiEmp7~J(dpsJf0scI0}#TtE$z6v+H z;&tN1U(=kN=m}hlYW@m>TIak9fsuWQa_KUI54MdZ-Q zPZclzhUQH7oqATr97fhTKu%qJsEn%kgdN{!x;Cw~8{i}3EPRxsDPH_d%}vBlKfq2O z6tYWm1M;0l*iOh~x8|1R+sE1VAd|N=w>#fy7Po%X)U+hpoIRRbrSEiwII+q({6I-> zYi_Q-eZFlEN_t0gWA>eHvYn90yShBKWZ!;=Z4WYePd5#nR@hF+$8 zgG@fq+>u~1`AhNb(P3n!f#ZkzfdY=Zr56eR@H1X~uYMyeai5eJ?VFD@cTo9-eHG0^ z`fr~ug?)n@?!`KR^zr@jzg_1G`P=i{A}Ir$r`8SdzqAJR)g z-)sNI_Z$6O=)2%=e81J-g}&GQjqi8598R+R`Y!w%-|uyY(D(Yk@%=$h4SjF;8{Z%G zJ)!T7f8+a;el_%6^f$hT_0OU2O@HHiL|4Jrx!(^r|BdfaeRk-3%is9^tS^RdxV@De zTlD13cjy(}l+5JKw+)Qi%x0Ev8y>Y;>CTVZOuF#fDY;radA4qZgO~7tEV)HI`C{FL zQRDH!C3&I$4Hr+IqlY3cP?zW#P-Y*Pd>b>tgntmoVK`?aKVHO#s=XSY8SC+3zKe=E zwKp?jJ3h)Ww)RfSU6jl)o_wjk8uT;1o2@C7aUQ%b*ZV@RdyDkSiD#kss&)B^C3$fD zYfKGT#ues#$uDE2q&8LN2eZFYx6TSG@u2PC=NwPIN{|lepAF2 zq`el`g97`Oh@FKm(8EL9)`%@gd!3#W+Mnk{!sxLdkaVG57Mfn*tOy2{+2pX};B>uy zDs*~L(sP;wncSfFhW3}DSHzngSZm>QrOD*094 z6i>cc_YeJd7EzyD^u*BqTEvc~EY=G{)9Yd)f~MT69}Mlg#LgNc>23PO(6qat>302T zXnIQ;n3RoF8L9Xz$4xYze24xmblTI%?`j?t`Wt5py4P-t&kWyvsm_G(C&WAAZnkAB zO+5Kd-81xjUp&nhyBQ;saXfjMzBqLHFq++VL`SReB6J3KO7Y~o^ztyxzG%irtu((f z4R;~&<{Y4Li_RW5RBUWscZIKF)yCHO79MRPn5&1 zruTl^eTQ@uXTEB=vDHxUhDN2p;vMtFBJBePQqCZ5v3 z<;8}oxZl$(DdYLe5Pkqj8Q+McbIN!X2`8#}N<)`dFRJzq5{+U-m5!%0c6pJb>cqe> z#?LJ=WsJ#z8)(WHKQ}+@A-5(jFNyfITOs=ksohyFuaEeqRWiB6)YRoQ6W_E}wtO)) zb9o)bH*J;-%?|k_qE&64B*jyjyS%*OJMES|Prg$;rKQX3F24OO+4Ds0tz2G^@$K(P z`Jr9DG*jBRyjO zs>{rcr*v?6Wyl<;r_|%Yx4GgOPwD9LQc*B?o!lf`Bl1gV9?be&M5zoK;whcoilCoO z3uZ%OkXIMC1yqn%S9b`MpI56OuS*f7GH8gWbaN+weqOj+Rp-zcbxEWD6{>Nw2c*-D`*Y28`L|d3B$ZfF8t9icR^{8Qp z%j@|`m)8GD$hBxZh#V!Dc?-Fv{g+Oy6OYRr(m07d(C2`9+mH*5$>|%!$SY z(`KF%Y!Bnz;k3*PEZ2mV3GQrKmIsz=L(6&YVnmwwl3!zre&(Cc0}whnpN` z0|#!}Ip$}Tc*-RAjnH9?SU7(=a6PL6e?yBD-OK zbBw12ywo+`^3Ybpvd#B4g|@t?Ek_bx>%A8`)QLJE;|1O?q3tQl zcAb}+7gVT;Wn1Xg4Q*#zw(Grap>3FDyTKbD+Mcm&H+olxwk?)zk#}!s+a9$Ajl9X* z96F3C;4r}KJxbl|?F${wFW}&B38ilFPKFM%q7LY$#a`w5L03$*Y`1z%L)#@$TMpi* zgnc4MAztb>Z$RjERRJ#L3l6ir5h!n&R}$0JpNgHVba#0*L)&1>cDL6dw0-3i%<~>^WN7=wvfb-l7TS_r zIo>iqZpKTk@a_z4-&*PJ^PUQA$yU0R-dmyV`)IlxY2^LhccDY6XyP0x`2jDfVbBZT zMRPz8J?Pa9Z7I>ju&wgCg|=U4}9k%j()Jw)eyFUZct#s?WTA}Trm2SP)DYTWb(mm#l4s9o_bdP&i zgtjxRbQ`?8LfdcAbiqhI;XNHXl#M11M)FDTgV5o4fgEJ#@Rav!=uoae4&t!UE03MN z-ygpe$U*iVPkYTmhw=q-5Qk^Hp`pXkXbzY$&w7`Iwu;fjux;}03~fiObep}WLR$qZ z-4^ey(Dr*YT@LTXLdO5_z6%{HMHA;#Z^Hc+w}N=7tzHt8-|(LcWFwo=Hm^bGP`N-h zvKejn`iBl*M{_{#&v`RL+Ygp)hqpMiWkxeby63%hp)JF*z2NN(ZO5!UU-S-!wklS- zmpmSZ`z<|WrF+?{9NK=eY_E7tLt9lV&sV(xp)Jd@?ewOFws)-^=^Ngn(DtEad(> z+CH{yyS$e|+h>+-w|5}4eHpa{U!iY#r$UGCqTdL?cDBdMXd3j;&(Rz(B5!-GL))*G z?HzAuXgg`y-t}gOwlf@l7vivw2x|47cU$OCIXG~X@67kTr$Sp+V3T?If%jHus}|T~ zN`B~l7ups?3q?crdc|=5ayRv zIJDgp%`@nLPrN0e!^&vJ!LWSlZ44bAisl{^@tOC2=&-gx5mJW(-to}k@d8DN!{=T( z92fhYvazTlzVMoc4x0-UAw%`0cTVWAE$VW=+MbWv^MyI>K%!#7^V7C{%hU$6+@;ajf-9PnTM zK(scB9?6nAOdC|le++*J0&{p3{_lq|pv^B8O9rtbt zZ4Iq-zj}{`wnkRE6W*(#t+AEvH}A{P*2GHpyZ2XUJIhLU(yP=eXnRvD-6`*^(AF%P zF4#Q(@cM@i&7+Bfp8eCC89KCx=78S&%ey1AwTvc)O~sxFZLOl|f|7M?SLo0>nm8!g ziTxNlw29_`+}&8I)ON0TS~gaG<|TPB7$;KV>LprA%)5b3QLRi2)%|DDl90mOl*4SHKI_7=&iD`Wue2lg$jd1 zx!C5=VPv6l;7~rcFLW4HR1p2Z8y?Oo=suFuLw4E2&Kr81&zEgut}cPWAV^7HLyvZHDj$q+w`D3$+K2$XlR=e*d))|vDu+*R$!An z>%?vgZF7S1B+uN~W1;Pmz$SUti@hG&E(>guXZ_gMq3z0GjQoqer5eVZ_CedP3dTrm zjbfRh?do8R#MUI%JhUwe@|1cujSUKIHwAf0J)6a*hqjx8Jf)t^V>gGkTcUZI%`Znz z%UZ)c8E<2ZFgCDc8o0wZFgIFc8aYIZTDDtc8Zn_gSFhN}0#0j+ za_SwMU%+W?)CnEiC$^@5{n4mBD5-DkwE|A-igM}~`>}x2`l6ir$I?4R+y7Y93Dp@8 zYg)kmxMd$08&bf&A!-k*J190M>XcgWN*KJ!wC;L{RGtW)@F- z%B=_KXZm~OW;vKPy4_$h=L%`XgP)U_7`CU~aiJ}|A3$u+xN}2WhW1M{_hkDwX2;W> zb(e<@-3mG6e9R(hGhIAwle-PXm2GsvApSl^qq)l)#?9^_D8GW|1{Dk)%ui`K>|VHT zabsNq*BJ#|`Qs~o0!;gdn-_ZAP^8CJw_oUSTi_8S-{#H?jd$C|?e49i@&3RV-Vn^v zpK~7zJsvI6V~4vZ^w?CugH1GD%Zy%dkA`jogR^B*ROpt|vMc%|yfZMZV?6Cew*un) zo~#+9GCgU2n>GpJX)n3GL$92`E9&sFJ1cakRlp(Y^@_VR^xAd$mh5!5hHg`X%!+DB zJnc32%h2`mz?C-$gx#_mPp}Facts%(zenO}Z@GD)SHHlk=py&HgF@G*PTz>P-K#^l z+#pBO8POhj$6XzIy&q&2c0Y&pU3YiraiU0%_uRvwhl-ZOxPzu2aBmE~MxWN} zbN7kR>-xY;cB@~wABMIij_j&UIo#pZH}0Cy z;nS!C5`XKy9@-8CHvd>P?K}7D&~`YmMKk{1b$SL3En&W9@%3T;^vLW9&4)Dk2RA!( ztytJqynb|hgPhM>#*&qwe9*e`IhrB7^v|n*~SzJM}{R7@i~X z$J~}-{Om~lFYW-u*F`ZZ?aH8RNpswt9NMn2Y`?k-!~7O9KN-0b?y4}&9afs(+^w+T z0v^h`i$Bz-{qF7!W9~LFC*5xmlc9U#Dn&9rxHvs?4*4)FX5&liG8-YvYqdpI-83#i?GJ}Wv8T>oUjCOFS+9UA#OPmHX?bsmJ3)0SHiWy9CWndfS-xcUN z1M!QS|A*MlApfqwmGE)S^^|!?RhxAtMO!*07RxN3#sKUUb;e7ulzR;yneQ7P#Flma zaU9}Ymc>AdFT8DVPhrqjp> zH3*h>ou)>dLGiKE(uhVBUpj4#=tc33)6s~r6hAp#jhIJK%tS?zMf-icjN%RLcPk$W>AbC5s?2nRxH!$FWr@yNI*T#9 zK;bl%mT?QggJV6FIW3JwsA)Q*8xmKi(3u=|F3wDyd0voby)e&OI*ZmtusCN%x4&HG z`9P3o4V`f>Tr$@LIoup-Qj$2X2c7!5B$ElpdzE&A~VQJ?NDElr?Wqe!E*L=sB z%O)A#fC9M~OD5uSHsV8NWaBd<2OpV@sIfS|N@J=yAL=Z|m;wGs8e_!%=+GaKp*NPV zWa!OIKcq{W42<|*=7Aad!!i%dMs!5xff@SaItzciz*=p`hd&9kobs;8s6Mx>9M_+O zeJIX!{Yf~QqJisALL-{E{v@1DODor}i5cEbZW)uCnRjQq{){v=>El*b8BLI&39FpL z$J+US+R4eQGPoPc7>LMrzKKpMV*>rnCT9HEqblPvMzVk$J~PEUEk$K4Mr1j5cE;Ud z8naolsX3ghIqU2&s(S_^kR7gIJv2{(P*uHJDOuGJb+hrUg^vFawnl z!@j_8jw#A-NkvBH?-m%DQx9<}gKf%aR)pD~PW=n!#$Hny6AQYVnQA85Iq5WCSI}(Q zc|YR(i*XqbBbf0hJ~E%h2N&mR$8TN63y5iA@_Pp%|IXKp4-qV9c3hv+%m>TlM9jx& zHsAd0R+C>}HzR28|m4LMb)+DTDu?9;61d!CcnXiF|hh(MruM6WNiw)it@>wO?n@4vI#<wu;g0lEB=jrEBvGBZ-?en^Vm+lNr>&_TZDq;@9cK@^bh*2sQk)C>_zqK4JddK z*2P$##LB$*EIhuXXED~Ys2kt45iC*vyMsvZbn&ZU3-aZY^n#^EBIZ8Urdav7YJhqqbfnj_34wzv1JNxPC z!*oGE7L_j_9T?b)>gP?Uz!t3Au^z-qU%rFmcGPhl*5Jh?FqtLlzcYvgPZz%zwjf_V z94}Y~l)&7?x)1B8SoyfWgIG^st%&k7vGP&kHL%vk%C}|YVdWb$SifKi@|l2i=VSc< z>%X$|xph%H-c>}T48_X!Zk6`(tq{TTclOiOhv`_(>GI_ZNdkLO z{mk+!OC|Uok#OlS^}=aWr;ML6vw2p#em%1&CrutdJ*!D>{YF^>rcRyQJZtpy3&&0# zJ>|TtVU5R)$!jt;FK>iucQ$euJ%03dHFPiR)^*hR)S_4y%K*mF9l0v^K{Sd>@Ld^yMi@ z$wtFs7PcWr!UWsWF{Rqg`bOsl_j+$(?7D;n#jZ`9U%Y+FVos-3=rdPcjBhrrPo^Z} zQ!^T?o;iNXjH%NnOrCmiy~&eij<0v&q_NYd*1KT*^eN*f&rrF;ZTnc&q51G4;tQrz z(?*ZIAb0Fo7BP0}g%?hpk~>l1OMc9(Nt0(znlf_gw2|XR&m8SX4xT#wf=N@(>pykE z%!@})A3yx;PThJm9*(}?+M!3gUR{Q_pEPB7Ztn0&Q^ro7HE#Uy88gRCnlclqaa{8s zr5-na!hf22@}x0i=gb*Ca^#d*lP6D`IsHGYgXDsS{P(Le*3acXtH_L*)6w_;&CWm# zn9F}wgRm?9XDY&(@t;-X;;|D)PybJQ0%L%N{HLie96fX5f0|bMkFx;5|E%ef$A709 zD1OpZzYYH0W8|!vlO`j=98brv@nau!MCn+G5_q{z!U`u1yCEg znsh~!$M&>x+xY3)ohDthJQVGIt>(paVog)WXRcxvE#0&HEV`X0i)hhqoy08kSK>Lb z(h1#T842CcZQT*!9JC9aTBhFfR``2p#mlP#@Z&Z z)7*r8v4)8_6H0K~nS?F6Gu-KenCrHf;C4#f8LRHLIO=xFH4#XP5u2FU61_eTgM%*4 z?`jMcM=91I!L5Y$wC8xm+}0D^_K63POY824VnlANIx>jmy6r!JHP$fUzF4uIv6@}@ z+3?I*vBWkB?)Iy?yDzAD!WDSu()O#+pNK>K5YCOYK=^}Lv+l7P-DAbN$6Dm_vstb$ z=>a>uoF-|p3dVqz!8`g{tULTB#A=vaks3Mq<{C60TVrSe50exg=-Kn<#nS)97~lcQ z1;(Iu(Cz)%P61*7N>f z==2R>{&XSO`yB!^_J4>+)g?5=lwe~pIa6>eFY{t zHv9##hM3!l!|Yj&^LR|NEoPc+F=5Oinh6^5HkuO_d(nAj zqUV~e!F+P#2m;8vSg!F7=Y63`kBuD@eF7$WtJCgm{;Lz+?Z!PG^2PRKdVHqYqoBvP zqsPqBaz01F`L-D)*sB|}nA?SKL zjNURsawhuE>>=>!?{3b-$RWnW7vr7^g9caZr3&mu{Jj?TMA(hY<8I321b6J)jeCm^ zVijOE`Baz?3|)|iKQ^-KK@a?k5&8dN`r~I0YdHSjnExCeZ1CpL0-HS!Cgk|zj0Cs* z1WeZ8zysSz5!UeV;(y$_BBm4EA5?CFyCke(5p}?Jw!-c7FPZ>{E%^>b=kPz^;3V*H z&|2Pz#CYn+Uo@Y@H2{C{FCg{KDyVB&dbOp0s8Z1X9ZN5>^l(deuyl}H@D?NdEu1WV z{YC^*-g0z_rRQ3DzNK%l^evXY*V6Y}`f*Edw)88O{@BuoEPdS4v2cw1_NH07iluqo z%3pl{=9cbkY24LNz<->jr&;7Klr5jqh zr=`bPdXA-UvGhZh=I=KC;+OxCrGK_GPZ*>AF-w=VG+(Y0^~Z0h1#}Zj^Q}An;@78x zrO&o>e@hRu^jJ$zxAbL}UTA5)MkiXI)s}w3(%UWlrlt2;`jDlMTRLXWhgk!^Kgw7- z+tT$c-O|$CEIr85V=aA=rLVH|O_pA2>6MmVW9g?Xy~Wb_dudtx_VWcj{^INXmOfzV zqn18pX@%dgqWR%1yahC0Z{sh1dHl^Qsw-JK+tRfy&EE*4>6=-aza2*HeECmQ_qR0P zq!YEDXX&YyzRJ=IEPaQims@(3rJu3%c1!QJ^aqyy#L_=nnlH|Yw(pds6Yv{p)ShhV zvX;)UbahMDwRCe!cd_&UOOLkn6iZ)b>FX_hr==gV^i!68-qLSb`iP~|!rw{#`P{_P ze34PKKQFU1U$_>v-)!k+mcGZ*t1P|F(ob9ZIZMB0>5nb_rKP{O^e>h^W$A>(g6&JO zbU8~`v2>25>sk6NOSiUkCrkIRbbm{qW9gBWo@nVQmcH21S6TX6OW$beC6>P1(hpdA zt)(|wdb_1xw={pZkIuhOEPc?@-&y)+OaE?ZH~hWY-#$uOI>XY{EuCxW#+Ghn=}wmJ zW$A&I9%1QmmY!_si!FVPrEj$K5=-A>=?5*n*3wT{dXuGhSo#%9zhUXOEd8OSKe6;d zOMheOA1(c}rGK}y#&7r0`BvQ0r7d0F(pi?SW$9c?H?nkFOLw(&UrUd%^i)eeZQsGT6(*sKd|(V zmOf?aRNQkBZGRn0cd_(POJ8E?D=mGErLVX2&6Zwb={qgG+|ny8{g9;}we$u{KV#{w zmVUv~uUPsGOTT65cP+iw(w|uROG|%iY2F_c9j~7){kx@=b-j)E6-CqI)|3J|&C(St zon`47mab#z29|DW=~kBRVCim_?q%uzmL6j1b1gm2(id2o_gwjlzoE>r^p%#r*3!IJ zE1G_ZrSG=%{gz&B>GhU=($bqO&3nV5<-cg@otEBZ>31#tk)=Pi^g&DW1+&ref3oy1 zmM(5zkHx)C(ew$HPO@~GrOR15%hI(ioonfamTqS0HkR&WY2F_lt$%+@^IqVneUzog zTlxY^Uu5aaEWNeqouc7`bA5>Vd?iQ{fVUyTKaoSAG36fH`bZO-yV}J zoo?xhmab~)981@;G~YfPEw7EGJ6XEBrF&a?prwaddW@wfS$dkKFSd04eUN_tTx;2H zvh*F6UTNt^E&YV0pSARJmfmUUU6y{=(jQs+Q%fJT^tYD&(b7L#`h=zbu(Vsc;CL6e zbc&_RSh}L6t5~|arO&ijBbQ??awbRl0*~`*{EIq=~<1KxmrDs|CN=sj7=^HJ* z*wS}c`aVmqwe-`L-fHQWEd8dX-?8*ZmOfzVe_Hw{OaE%=KP>IZUjc^aCzj5zbdIIZ zvUFQZce3;#OOLYj#g<-R>Dw&L7ph0+)5DftZ|UbPz01;HTKb5k|FE>nKg2SNzyC_J zbR|pIvvdnfcd&GSOAod5NJ~$!^o5q5W$DW;eT}7Wu=HX}FSGQ0mVU(2k6U_^rJu9( ztCoJt(t9oaxuw6e^v{<5-O>*K&@VEcNtP~W=^B=9V(HG79%yOvmWW7se9^kU`15JH zrRP}sDoZc0^v#yO)6(}@dbOoDSbDRiU$FF>mVV#TpIJJ1n|84O`OdN*vGlK&K4odI zOu_yuZfU-2IoiKvEnUgdaZB?h&C&ENE#1M=XIr|jrO&bSNJ~$!^i)gp#n93ETxRKc zmcG%_t1P|Q(!X0e5r1GCEic*9sg^#&(&a2&$?JV8F(p@Zlwxx$z zdX%Lvvh-|AUu)?bEPacmAGGw7mVVaKFId_UCYvKE#1Y^y)8Y$(vvJb!_spteY>UCTY8hFw^{mSOTTI9Pb~edrH@O}tZ$B`Yg_t0OFwSuXDq$V(mO5vo~1vt^f#71W@&{7-$nbo zq@|NB&DWww{VQ6!vZZTU`b$la?do0~4qoDsV zOW$GXwU&Ou(mzz-4_b$c*sfwvX(23#o)ne*YcyA+} zT=i=KT}=G|T_=+MOX^7ai=df=*O(mSA6?x18xKviTgV>%5Fz&P!k*~xL{N12MIgGo zI&MP#2T!~EV`Y6fglUd{V_v;&j(Ltp9>}FOZlL@TEb+4F=N$7VYz{aK@#K@j-NJ8$ zsmPpmKFfnlMiwOR`6OouUl%5z3XJFTImm&+i-b1`cL?_jJ>2s~|M9{bg--}S6qdui zRrH%8Tq}G<_?z$y+*3rq`a(X-f_koSwXisbkn#0|1BHB61LNNjHpV>|)Dwh!UIXbXb!IY={9N|sE4}`onLVJCjQAKzfl{00lB3!e~vDEvc+-HCFZcg!;l9Bh-Aj>^HdhT&Gu zOO8T!DhJzGoP5DC4~%xOE!CmMHdCL(HqnH{oNq}Yldj~gj_N_)hW!e;7~?^njrmI6 zfPN>JIBFh=Ol~62Qfe7_yQ3Z?@4$9UE_Kvq@=iy+L@smGTjX7i+DG2)sISO-9Cd_T z?x;V7CAF{1k@sRhPp)uOE_t7$__q%Z9*)$Byx&oM$Olkw@ON1m{iup5bX4It63Q6$p#Y1C-fWhB~l9f^9} zF1%m3o*C4?f%RF^P74O`@H=*Pi3$@;Cwcl_u9Zstoz4qpFc;S1l6l zYDA)4ZAi2We}Qe=Cef}%B-(W+iFQ3eqFw7rv}-eodYI!E z@LkcLk!a7iB-(eJM7!`uWu_gxhn(#yPokaGNVKaliG13V&*A%5*n@lq+arm*hLM<@ zBT2OLe9^oYobA0t^c7?SM=cb+h(tf!L%x9hio~xIJ}rDv>~DyEPxy)OJK=9ahsRl{ zPf1}JVO$s-pEaaLyIM$mM`2IlP_dsYoFMU2g>!`0kf{Gc(YKMvcd3x~gtI46|H#O2*2XOG!psp9&X0h6wQ0IsrkGw zvYoJ(*awN`z16hyo@$c!PP1K?39pg(+ewtOT=YZ2$AnvjytkS8yer%<{7T4sm1$Qz zzD0hCBy_5xphEY$xm?_P(Nrk*N1bA@3n(zSBj|7G5dw3rUoJljx zk06n5yyz*yi-p$;mk5^&9}@DOR@P&y@HG=UGU1zUUdk ztA)Imlld(beV=f(@M*Dc6U}=mSr6VbN$wN-XQIC$QSTpwM<9R63rwgkJc`qB|dCwZjXQz?fg@Z}tH&Qg88A&_u zAtSF8yE*TLzD44f2_FjPM^4|C;Ds!uKWqGZN+Vo-d~VLG)44Cxsr* zqv2Pagdd*;N?lHLbz!c=Hx%7L^x2{Z2uBFd7yES4mkH+!myl@Box=Mh{&8}9d)MI zTZ+A%*n5&=wdzY^pFBqF=ZSp=iSHcV%R>7?v7759$p0>Cd>7wK;@ILbu|Gw^{v3&8 ztrx}qp4dMU`}ZWSiTq09n!;Zsu5HA4U8Ss2CCPF)uO)G9Bu?VmLJoSxWUItKzwyWE{_rB(w3%S+W|QnMqbxiuaZ{b#T3vtbu2g zk~Q(XRWb+9XeDbYwUn%_)N=AnrFf5sQxDHoBs-9EtI;1#L4?2vb9o6$W}@{ zOtw*q_c}OjmEt`OPCKP|?}F0-FG?lbD`l=rby7<4`cp@x(#bA(_9)pIZ;>FoqF>2w zxc*Ca$Fq~kvr#_T1Lc!FmAa4Yg=f%`y_I^I?4#6PvM=5`K=xDWPqM#K{H@&?fM>vx z1C=_99HdltauO; zN*yJ~Vq7ujoE1v(w=`$8QumO^XDvBSsRQJA%ty>QX9DIQd7e_8$cdOQ3Ye?T6s4MxQ!($zX_#N+MM^zLPRINqXJDMjnb@z9v+%5IayA}k z$?IMhW0=S}nD^u*cpfi#DdshK8ODRWT&XL_E0i+V&#uIE4Cfj>f&L|jqa1RnQX|P_n5X2Oc*Zq(ms0b{yRp9_@4@y*E=Rsu;JtXU8o2_`$0qN? zTS>^3IPWI!SL#~w0o0p(5ZgJq3i*%^;d%=Buu@g4f{!TGid>C(Os>KBkZYB?i+mK% zrY6@Z^%1!q+aviH+7|~ON4v-kN(~^NP-+tSq*B+DPoW>ljY_>lK8@|0d`79?$!D?O z$Obnl)r;JW{wKF!zfJx_skh0knCI2NZJ1Z&c06*Fd`_v$$Q?@ELOzdqPQHNs82KXR z1^E)5DMP-D`B5Ew1^r0As#ITcr&6=Y*Oa=Gd>!B8B(=f-zLAsc#_|tzU22xCD#UjP^uF7Bd*($KPhz% zd046Q$Rqf^CXXuh5c#uGFOb7A-sCZ*z9E0XxSt6gN57N5qMhUkr7k3YLw(5K@qI#` z#P&^|!uCo2fq6#$iR;dFz`wBFkV>nINj#2d1?gz@0O@MAoy0?#Um)?|n=eT`==m?Q zm{wVJ!9=ZElEt+eP2wTYlZ2O%xF~#$@D4Ibt9ylylF3@VNv3G^16fL|^jxsCR*gvf z$T*P1gLW<>)3sVo;=$1`kY{Lhh%Bqs?<6ihC)ESXYn4e>&?=9ts8xHil2${=%394P zGqk#q%tXCNJiuo&nWfeHWL2$>len0jmIr2Ql}lFBsykU-s|jQct>%$6(T`+~R$Itg zT768`*6I{_rdApCK|C0!8Ce(YBXN=ZGO`}pN9Jj@iL9^Hdt?Kx4wDVhz6M|;jW=w7 zjkW4XHqmMnd6rg}lTEc+MmE!GBZ-Ued&m}AeNVR3D!C!p3hg0VqdjCBw1;eq_K@w+ z9UquWM8z0?1%P{{m~wB0NO(iM0?0VXipPxuvQJpAzBR}@nWZ0 zRisnr~EmR7fuv$cAfycpv{&e7^u@)E7eHwW>fN;C2@t%j19W4@7BXmuxf zCFUD>l~x~-bFn>K1Z=R*#a`Y4s|(5c>=Adh9RA z8<0;+@J8fAF2Z(5-lWw`@@B0TlecKKj$EwOPV!c*4wAQNd_jXtw5m+ru2oa=4vaIo z6yr?Zsnt?)nO0AdcWJeoyj!cE$a}OZ-5Ol3RUPtPt$L6vu>FwtX*G>psnsI#eyvuM z4`}rg`5@*Cxk{^qHsC{A)g&L*swepf`h{Gr)m`KoY&Yau><7q4u^%AUVV<=G*K5_9 zd`zp66>A4RtyMPp4CWd6Ean-x3Goi)nM{@w1<2F<4nGYaVB5V>TU96%ro*8 zw5J33D&`rv6Wa~>8nzqqb**k9-@tZ5zKQLI+=cCi+>Pyqd<*-5j^G~TN4|~x$al1A zMZSykVDdeT7x}(c9P&%dfAXMKmylm+bp`n~_LJm4@%>4<72EWJm6!`=8!{m=zjVFK7>T2>ZzMse=_+BQDYV{5IGv;9z@R(Nh z$zQbUPaeniK>n)LZR81zKlvNRjr<+$CQoWru`75=t9IlH99NKk;QNvM6Z4S#ORH@p z{v9N>qe^uHu|up+y0{KVdied5jN$hYG6B~s$zu4un8X9)(z}Dj@%t)S!cjfRlK4H6 zOmft%ByJ{pmP~QfUa}N^XC_PII?&l*s-xPHX}GU}OvmqOWEos{BhNrOvaF+yk>zl` zx(8Su*E7iq_}!VT=%_hlCH!7XR(8}{GQ&}CkeQD9Cs_s8rFw!{xZX`x#qX13+)=a0 zY)7pmt05g(9qlD+II3zduqN(@A#?CMELjWJqsZF0o=u+VsE5cpj@m}nb<{^>E`GNr z>*2nw-e7n1yRbZo-`}c}9Uawx?26wH$PVaN;UKah?iV5(;rCOrv7@dan>gwQvMH|X zkjK3RRhv+#R>urt{P^$`vy z+c|2Sa1PnUQFDb0$xiq^mqdQ+$fO$Zk=cumaB^Vd-Qv5znUWWNdUg4PKFS?S;G!^MPE5-(~xO<#GH?jzK+y9Z8H|UlQ#;m&CYUK=#Hw zCHp(-T5rzZ#E{sMB4qt=mwah;Mp2frJW!|?kYIUM&vkR#AfnZgBISSjAugf9tq3f~m&748=v5FQjB z5`Hf{Av`5i+V2NXm?%sVmKRnQW(lhabA)w-dBR4*roxuOuEHL|KEeUQA;RIpiNeXk zX~LPpIl{|@bA|JT3x$h>%Y@5?D}}3s8-yE$n}l11JB4ow_Xyt;9uOWB9uj^pJS;pW zJRv+KRM!+wA$CoM*hLu570wqf6fP1j7TzvgDO@F7EnFwuAlxY2B-|?8 zA$&==NBEv_uW-NcfbgL3u<)4hgz%J5xqiDmVWKceSXx*{m?f+xH20Z3=cqcOn+jVB z+Y0&KMvi+Q;Q-+f;c($ZA>Zvt|7pUR!a2grg>!}Tg$sp?go}l@3s(wP30Di(2{#Bg z3O5P23U><`v?aJhX{uYCkiJErwL~Y=LjzsE)*^jE*9P{TqayDTq#^7 zTrFHD+$7v8+#!5PxJUS&aIbK`@R0C(;bGx1p^8cW3loJ&LUSJ=`qA76$nlW)%EBz6 zxjzv09MN@zc|vo)AnZ*=w-oXjxg4h+!al+Q!Xd)p!imDk!fC>p!a2grg$sp?go}l@ z3zrF(3s(!*2{#Bg3O5P23U>XBw^km^2;pM`) z!ui6*!rO(*gv*61g{y?Ch3kYHgd2sMgjg>MS?2;UR#748=v5FQjB79JCx5S|jM zVlp1WL}8M!ys)w`OIS^qBdjBADr_liE9@xjD(oQ~A{;IpB^)Q5D4Z;uCY&iW_jzI* zFBd&mIA6F}c)M_!aJg`$aFuWaxgGaM3pYvpR$&<)m%fPo1_{4vqI2YUbw2k)h!6IM zDtFxYF|*DaIeN^P>Emas-09;d=i=Rfx#QLhJ922RCNn4S6^0F`PMgu# zypFJb!+zt>n>1tQ_~|42wCiwoCrSBV@u#oKDo@8&d-UW^ed;&#bL}v73Y*ra zex9#;O&urMpSE}YJDK{uGI{FQ@Wqh1=%SgU$Ee&Hmt06zo0;2KRU4Pvh@plIHDIVd zKY050Z!fqUs&E()E^}(&cMKfo1q;k(xdfjKV-q$D&n=@1rl47H$*PcFWw8-~A1>vo z;*t10hjE_*bVaPJ5B(Ccrej69)8>I(`e0>zQ0E}OQizM@cL4d(kNM$iAk6OqWEO45 z5ZLmc>6Kr<^WYTC?@%N^Y?fhuNq&A|{q~|FESEl9g8C&|`5lhr$8v)9u0@#j%frg$ z0PHf!9lepXhViSE@x zjn%=Lu!G^w_;gxl<1-=oK-7a)+S+z5b-YJH{cN>#Qx{!5r*ry-ZHEru(iT>F(+gpz z)bSxoSJ$^PUZLKM$Lcss8f3e7Z0ZtCSL%3MMLT>Qxzk#^1zuc9t~HcJJH} zDNp69!%OF$g*H`u`-2mSEBBp1ALi^hx@fLC>}p-J_^s_SvvBh0)>?VQQ%Se)`liG= z#coYpny|S1JD7CYoe!{tQb+fOH9lR*?XsW$XR+@Vr<6ES8kgsFO_km2us+c5MAC3C zuiuHp%8#6kP44~eSCr~B%o|$=O&YbPKedEwR zDZ`WYU)^i#-%c<_7So%?(~o`}m^<=sB|Ul{Olp7llY;RFKPerT`M2dgE-lLbBz^oH z_z_G0B>jw(-S_V|dj0InhXdnJoZtIk!gKc(r(Ao|;pE{xs*eAtAR+6Kz334} z)}W_p@k51c_oUsNd6tKg*z3!D z9JOvPzVdLEfsOKW{&+aK0Y1LzapmK-_D`3cGZtPxN4$LeN0%hDCuPAunYTG!PAu-Z zBal6-IIS(acwBL>>y)1h-cGw2{qnZY9=W#)8aF0R>Umwp-qFx?VIf=W#|AYyTF#@E zj5UY>5&+1bYUUdXb9S9h}A~3Q+D68-{_UPf2+YZDmfe&a-6gg zJa1SdTSmK4h4JlMNE#!6fss$TibAGu+aiqm-3yO?B(qAlq!V$Hwwoj2n|6OzKN-;l zVbKa&T=8tF#Iw8KOWcl8oQQ{1F`hA&N7B00htq}zvN57o{&t}6^Q6Mnhm)6JOpUnv z^T4S02PS-;G-Wl$vH5u*=Z?=4rv6Q2rdFj-$2cBw=jVZ=-^Vyk!Z;3K9FKXf$IStb zVZ)rTu;EMYi;clv~)JPrxWzf-2?_t<)CE&07qE^Db>T-VUj+>}*^bIY-rbLM2` zW}bOwW)%7q1Am|&-_q=4Agx{q6Z4yK4otkfz7FTkb5{px+{Nob#oKZWo_%~H;3j@W* zKI5pWDlL(7#<9ba$4z)Wq4>`q_zotd9zBkK({T&>irtx2Z3m2$6ZRPs20x9MR%K*1 zSM_dNc{uQ$#K}FbKWgt7MD~jq*{|AZ{3gkX>nUx6kf#>;jmk!x#B?Yl;*1K7-P(3X3@f)9av~aDf5!BG9T=q%-a#YCm2^8&NHOUbSZP}*DrJV zZg(wj=%B>QyQRbfkGRXbpo8)@?=!~uukS6#$#N`_Jw(B{t2XO!1lD|{Dte=KlJr$|1dDJ{lmnO4RQv?F;5x%zE&Qdv)%h}f5ZgbX_lEVZbaMGPcJ<; z`}^CApTT)YV3e6PV%w6vfh^xESZVb-W*^Q;dYPjhJQPUu@4wEUHpzd`pJu*djPAd0 z#1DV4-|s(anlYN|;)Daq!vj+i4g`iLV#RX70b}?DNGBYcmvCs$F3dyycaM00D^~yh z3;mQo?|?ZxWj9m14*7bYcOYT7U$FBI^cdbyl)8JwgT40q{E7RoObi@j9vzr&PANVd zIQjEeM?8oX^xQfE2RCL_(PAy*%Vn!wtT zQV*XwY5-P_3`8c)?@5*PY*;rE;VLJ^t%D8eIs*l+p&+D<6io3kTI|=cdvh}`MNQ3 zz&`Wf7d~@LKb(zh>oxF!JNKWH)Z0yYI&HFv~sEwyiMfrr<|UUu};6 zU~l?-V^m^WlH^N6zEsKg*6tqLlP&4AZQBY{EcuW3Cf@Yc;h|dx%}2hG>1`?d(heo3 z^tts{#b)l$4w=1PD?V6k?0Mt;wMFU3@le~Ng}rZ?_mST~Y1{l0=YND3mAqmc-51gC z)IIOMZ#;cnanBnuLQ`>O`}F*e5)%$2r9F)~=;WToX@}BNUOb#ul6okRU>q`2?=O6< z_?X>K;#}^bwik*L-xxH%-Ig`>^(;<3gr_nN8znng!|N6mCA|@@k1}TVi-!ZYM6ySM z{Yc3q+cJ;s?OFUd?0gHpeXY39t&PRBeeP!$J@k}#a;e*r)MTtll8gJ^`j_Hk4+m1s zNpnAIe5h{d&qQ)rQJP~jB>Ub9TX3)B+|N#ZC{c20eDy=VX|c7Z9ZG{=l8puLn>UPo z#6X|(?N#fN5i(zmv}cwvvO^?u1H-dkUq!^t8xc2e`acslr+gbX|DTMTsVZ)sr00NTb$oD07rXgb9wqrl`o)JB<8(&2dzzw}|x_mcLNAby@(9JtY(vJLU`aHr#E zNpTwTrAoez;wR!=GUI1&MD)IGz4pC@k_QyGU}tR6zT`t@^0~!~q%Q$8_WbVshl_ek zB;8S@GO6hU0)O{mOg)2$I|shu2>2mv)0P;xu2b5MbnTK zP5pavi!lpqH238e_k!ethf9j*0e=$hKKHW?c1*1-8X(s9+XLy;w?0h&32Z`4?Ymn? z&`?pjNc0qmRK!_F>f=2jKE?8JKX$gjN~J+jmF;Cl4P80*oV zhbmIIBIRCS^cCqKYehQ1IHE1bT9Fkvm%XLj~?;0*Q5Qd^=MzCPmJ|wpH8et z`+TkS=#f|t4BR{ThCLq|%X?gXX;oTI!qw))fo~+@dd-w`2HWd|;gH+<>7;Xxmi5A0 z9}YgD$5lgbNVp2I!ZatozxRmkJr6BNOR1VvY_<)+8g<~kNo_ZO;7{*=6W)Z~)&ncl zU2XFQC$=SQ-+tJ5n31+;Tgk9Jh_PvHT%{t)Ci|}K-Ik0vJK?sZeM^h|H{Dl^r`=?I z`q9=N+x@aWHMbk~`ZOVIeHxJU>C)m9%2W%~S{H*PCT6Ft89{_$9+ zj_M5`t=Y2=aTQTDr5DzRg;>jS-P!-JnYyMp1!pa3hs>1iMISUAv-=5In_gPfV}D9Q z;v4C*K2>tYKFXT@EbL!$b$VH0@*9O8CAu^*?ye~|r&QSzNgfI6@EfLrt7gbT~qAfYaa4ViLJfIA%DUpxOI2o`|Nv9|MR5>*|)y@=PM6p+PzKn zGQBFb_WX|jHg@VAi6i!X8#}|#<-d)c-^R{wV<#hKWb91;F?LP^?f9uH%fPsw%4BiWZtAxUT)ZVN6evyEGS~CVyuy4RP$nzb;SqQdlppVa!*q=E(m1_XKZHP zoXo~hWeA(d<)I+%0i8V?d&kE~0ZU6a+w$}4Tk4v##u~V%a;4a`qN=nZlm!bas_Qm1 zjh$3nQ`)?u`iu}{^!2BT>RMcEY63BHTxPDZxCysU%7rMU!O3jp2qJ?K+T0K-$1b)Y zT2n(QZtZNEbVjJLKG;xSUDuqMKPR)PxnlP0x|Z5dV|973rn ztLt2*L@GeNzd}Lj<_;CaupnLooctY^A9+uaPs*8^xw5{#W_D(2 zV{Lg2?(@w&d0ItT_Vn`X>{B}K*Xyi)J%9GPRZXGBrge+9EU9i;w;RS^ydYE)+ECgYQbZ-X0={l((&EeNd67nA#WnS% z%~NtUy134TtO7RE#hE@;BP(#jblnDx6~dP~jVw9SHA0uygf=_*+zO>+M^;cr(#o2X zYa6gMRJ#n#sdX={Ep1p{udxCIiPGh*9<&54#Jk0DqqpU?1zYM$5vVlk2tbu`RzVGJ zYDV9zuXDR;S^WtuxJ+GrhH!NDg33zV=N-mTO57y3nxg6rp*n;bxe47eXbi;$3_x&$kYN!^ z%bMtY3u|Z$35rRhv^i)Io20--1n~-w4n=FOZ!K-C2r|GLni8xFl|omuO%M^>lwXZu zwI!Td7uo>57Dtt=)Tn|nuNX3Q@xD_07|o5EP-Sz_nm~f(oL?|oF?xq_NaJrxE*QaJ z!Sdw=Ck0n5URxAgc~VJHFlaPZZ>aL>38NXPMD-bPECQkB*^<(V5@m!6hf;Ahvlz!W zEGTU*HB`Jbq%OurwET+N(wZ91aA=n^LP3MGn{|{a36Dz{&f^q0xyw-@%(gO5maZsT ze%y-epi$otYAkK8Z=7Se*{D|;9=WK4f}m1vM3pEJ!~iC`50&%zWBC3fLcA=y+^%?wSHidw?-6`^Jb6jfInDiu?5CiSq7 zC>tahyKuKO8!T$!IbtGpu4-6WKW%|avm(SaX1YX;5Nf9qF$HsSmWLW@O3OnhRyS7_ zRhJyc95x|#wkZs4h&mP0k&CKTKMo_t%si{GrMjk~xUs&rC`LauYzZof?wpx=X$i0B zWNhiWkf*1Om}68o1)H#{RD-8NP?_s7hBsifKc)teF9>VT_-P#9wAba*I0Bj8n)Ql%9(iJab29cm6PD_tfm zP5>D2h+LYY!nrW5$X-+5gcT3egvzH)o5fTaqkKrJSzBMxQd4g zI!<{o_aK`}bUx>dP(xF7O+Br&Qk~D6lcQ#>5LbIp;KDkuWTtLWDA38y=bmME0c5w+ zozI^$C9Ky#Nf`b$6lGgIOtrX!7{Qed7!gr>NuE7%aTz@!lV`CqEqqn)Ds}g+PV^Ej zFFmW%@=mYnbQV{4>U17&H|lgoch~83rm!B<>0FWhr1M$Bdq%9T;99=wj?jwuDa$yX znKG;j%w>EnlO&i3W7;XTn>RTEGttj0huwKYpuudh~YLT~Cu)3*&t0V+m z1VA}gR4JBc(SisR8xUe}cFL8OrspcUMstGY4R|zF&I~mzSJ5<@6Wl}*jpiz}xz=bc zZ>r=v5DAP3)UTk1HdL!&ZT%*;Cz?W(*IBT< zwn2$2h;5gUO>)xZ^(YgWH&-^IcTlS(-qcV>x&@l+Hxi@!DAW{cHqgN;sw*owMzD;) z!eB!k)5$1-ZPM(ntwlRmhzIT0>dm#**@qbxxg;YVmL9Lz>y?8}9Z1 z1{-Mxy#rjPZ6@e70?QLMbU_euW!23fmDRYBG8akt!_@M&7sR3b%KTQ9EIdL z8i_e71w+2ImUmZ`&caR$w(Ek`m5bNN%vdBIhXkqx_ePa~^Mh-(ucJ%Q|4OD~EtcbB zD`~32y~bGH;PexH5ODfbKzjfwHn%>6&xD-7Ga-_I!I}^@CV9SZBU+haNe-K*3b0Y; zqc$aKm*UFlaP1N+T?I02mq)}dj)+s5&LisVOg3g$D`;nfRT!$4eJTYK$E-40rLYZv zv2}V&Jx(G*wMI=%MfD~KsH25IrqaNnng{5R4>^y;p(3U{$EJp#i-^r8uu6 zybBc%pj1~FrDg0pSO9Fs6d{LT5tEolLUmZLZozJ1t$|IgQgl+|bX)*|E`*UO*y!4f z+&qZ~22X9?On(_Qq|s&Yq9i4a)dfgXa?7@012hmuuCA*xnoehPJI6``rSMl}V2G79 zVL+e^b*vFPkVa0VX%5E=fWj04!(d&d9K}c^VWm0>p@tS$@=zmoSIQA-nh%5km>A0= z(yR?Q1Xx0_R+S2HL4n!oLjIVa;4xiQQ)>Rp}%ZA3Y!Y$U;>~C85#?MWNbKZecfK*OnWb2qR@R zXm(N&vwRi8823e#6I5S-U&I-zHxQ$&U`Id*Vqfm!)LLNaRz{(8M0Y+Q{E;BYYRab67u(8v^oLSu@ zn{2Wxrcy$mRo%1!aT$HOg8OAwTIri=xwfGamvjk%8IlbYd2}2V9*u_Iy0WzqH2cc}itehA>odiwLiP$DhZ*7m)2m(BCw&V6tKJwXLx|JVGme_n+!GrZoqDL6(Bc`xl=E` zCq%5kyoVEPTm=Ed^OC~ftQ25@Eg72Y6$3jNuoQ+Nfh7<}M|D%HHUbG{MXN5hRom05 z4Nw~{%%zKN)n&J8<65;9t-2bmwmp^*CQr9T)F-BC!wd*06XCDvSb4@eKWuH~jsj24 zaSDhO&%&dg;kA|=C!*GAI%Q*?E-IyDTcsnQbf^@3DPL_QL>Fy6P3??8DZ)+pM)+Qq z&RE_M#iGAbZK~C7l)W`Mlr~{~ihzX(APJn(D8hzXq4SmlS%Dka-LsOAfjvr>UJ0Xz zqub)fCh$VdA_}E;5?N}>>v5i zEN05B^*gSPV{@l&vFrroW(R}KRgLwnIMuD&pw>fju_787p5`^;ub~td#Dn#fYSE92 z2U@9{3}O`P@-UHbuRkc~{^`mJICafED3=ZG>g8>!udZ-i2MNobgY9%()uNK}(-0*!8q4IF+(NJ} z@$01H>@e*!DsUOCv3?6QL$M?sf97%G$aipMc3iDS4>$^@>RThMMlUHZ%E`8A^=vN( zGlGTO2FI-}MsP7!Q!A^mwm=h9;J$}?TnNppEUjq@O~{n{_ApFl&$jbQmy+6Kj>FA= zqGW>H$_1~NAmT)qMCT~ORF^01oT(Z~wK>yvH*o6HnQk1`p6tnN)32w(XAPw&<(3l3ZS~|JFTr|B z%%haPBE_K9m0tffYnYAj_SF@Fl&VlHn`HpxV{-!IpsQBvcu~}GdsrQhH$F(D=|T_C zSvx3+e(6#d=S`fQ>g1iPWv6s~O&3h*1{+=eDUjV&YmC^_Xr2=cZI+7anVgGxwac1{ zgSR;2=_DDArL8=M7^tx-;mw9k zxLLcQw7M~f_NWE9B2-!0QqznZTdJ|qQA(9+NIC?)EXd7`u7!((oLu)JV{ti2IqDj! zT0mgQ09x2&S5!1jj4N7Fon5q~4Bi8dwV5nr09`}yf3xVt6>#VL(z?P>QEfx>mO|c} z9KGVM=5*IyTGT!9x%{A7+s%yV2%HenWD_#8CuCY7#Ga2j@~m@u?l5 zl*dVY=CRA@OI?X<Buc@ zh7z94cV%2xHsZ_`br9Gk6;sRb5DzpEbWH(69TcdDr`N1Goo9skt~%8?}|!2Q+6=`PvyP>x2;Z-ORQaT^z^0{-2T~E1RW~XB`q^} zK7uP2MJrGhD;=Mr(@vwRu5@497EytE#ic~uwPnxxo$f6zE4oKT*Xl79S6nODDyLx? z-Nora=};SKUppYG%y2;$8^X!orFNXw=r}-<@o4Fy3oIMD?gN*CE}5S*g-*bAL!3|H z0)x{XY*M$V?V@|U)^*)a(KL0fX1U@p+|uCjmqqCgrCs$_xM^`XD^gL{sx`yax$s)t zXdO(EyG?ypT^GgDIQ$nwTi0qi-RW=Gr&iip#Vb z+fM6z1cI?kbf!06t?EFIw*_ITM|a~kM%*G4vs}F@6w#Pc+KX5{c3|ENc01gHf@fT< zl-w|`9?Xo@KsmY1^+B~uin}~V+f4#_6XSMLPNzCW&KREoT-{4Q-4sm+;b?q1PVJ;!51wHwTd z`Xq6=TwSw9OIHmHA0%DX;_k^^(qV6D;i?O6Ws=PsX?AYe=$#xoQm=!%u@qh&mdoZW z%Ne&_Dj{+^ElxG@G_PxG%)2M%Y|%z>I7U-P`(s_I(bu=d-7Fm6cGT-q`FgJ|-Y(Q# zdYsMExGl1FP~+9(+Kh}>mAxSuuc9d1l3i;3>Gl?7ycWgSr|gndGjT1tv>fl1!IY?z z@%HoSxH!$%pkQ&KQr)I7UPUutPpA=#Dem7%DqfAeWl&Wz?D{(jh)R#QIJ*Mwo4vZ! z@OTcr3U`O&7SDR@1aQYU43F2)X>u1cI~DI{rndNIO}(`quOivIg_3yYG_5198mV3S zI4$WGB@Ih>D-hO*`gX4IbK-4%sO*MC9kj%~sDqAgXyG~?4_oruoARAP;`LjYPPJ(o zPe;}2JZFPliWe?j-Bru5lg}<0#ptU%9~ph4(7VgUGjYQUpCxWyY+&-iqSm5$fw znGN*~O6extjjNLJ>YS#p62=>j-HPJr>H3;uy!N>C#AA-$U{SFl&LFRqb;o(U)+L5@ zM}Se=aorPOY+dnoPhHFS1B}-64UKrbLJ+G^T&`CgMPYH*K1^vhG_uy$Ev@WQ)@>E- zhIY2hlAB#!+YyUVXWSg#U6w{y|4p0!4RzjWxaF$}r&6ckX>Pf*HojH0r7pUQ;%$Hq zm9Ll;_x>o(%jBJo@P-=779OwNUcK>;W|zk97|-GAy0N3;TP_^ zR6px(BDMUF+bq|;N%6bOrL4OQ>jsB;Z!791&w15yDvsZU(X__xORv)IaBBGNN8RPq zaIM|s(nzK8do)~UcQ`c4{Yc&A)hMdF$+a;w$M4@Lio3(fk@qZhmyaVgcaw{wD~{j8 zk$Stq!S?M{;?}s0wAJZzvUpcAUWMHdv2B%T@9wN{_p9rM*$EFFSJ!PSZLG%Y2b!=B zbfc_%JUgyAGw~oQFEs|`O`CFQQ;P5s$0RNRKT zRmSPu>3r%R?=0iXXVv>p&>cLaxb4MDVdZ^3u2R@Xc(&k>;`MV59-?Mdhce62$35ZY=?mmzjsgq+f;nP z62hEgl@M1I5DILIt@qFHEj*FbxH}U{va6y?3agGqjNfT7N{Vw_BbGVC%Uc08=(?>2 zvC4|G3V6j9tKc=h+suyCAD_Vpa{Stt^m_U1SG*IS+IL&>56|-l6{kJb}QS04SfEgwiY2?BYBI0rAn42&V>S&BkQzi{CJDa zL6nutGQ7V__Y5~7?gHR5d9{^#2*X;vSS$BP&No;bH>*2(zg2wWm7lGQQP0=~^YuY- z*BFt94}0LXit3RU+@keWCAu^G@0O3()5Kq6xY|`?-KFI5g-Ax+^@~|rY%hPawTxYE zcl4)R3FmktR5dpC(W`1|?AKE`Cu7l=@j5yeCn7xWvvlhxDVp%|D!k%HO)N3E_%;IH zzQxy9hCPz=)lcJe_+BQydsJS}Z-0|;*0Pq`#r$M*6K1=dZ1thjW%c+7kIleCP(bDD z&HC%3i|d*T8XNIVB=t2*d=HLqzN`&ZRKvsg@EdMgt;c5ps*%Q*2pZKZT=X}F_`YWg8p`9Xa)nx1gjMzdAyN`9xW8sBrM#`kUUx?+6uLFFpucTj;;fFwq z=Umj6Sq;1dAKY?qmHd4Bd%ETPFm4!;1o&1{@nXqUb^Ig(Uen$rFR2e1TuWJB5>;8< zpQ*JzIx6SY@{wEhxS+hBS-*vo`sBsic!f4zx*U{u-G?kY3Wc_aufNCVU-{lP>;d2l z8^Dl|Jq>)40$&wzeMdLa3-nqPwVX0kdAl~|ny15G}|j1RluGcN2~Xba>l+8iox;agox@X~Ip-4M3$ zCF`K|AyZ4i@(@B-bCJAsyr7~&QJbiOai*ZIVmUsOf-tH+8O``*;B6~>4G0G6ruvN` zp!Ilvy}XuOMOz*C${9zkASVOP`e=$(i!jA7gWpbNnJe(F61;nzpHbD3?>KxCI#kny zXF04h9=s8;uBDc*X~yf<#oD6q??!7+d8jMs8H8@<1Je=}TJZ+`DY-bIs^K?;@SH>g zB9^KbUT|zpO?XMV{t&l{5;jAj#e7LLz8|q1pB=z^fLD~mXXRCjx45o=Z~LcP!{}jc zQG_p@RO1mHqXbXH;ay<5_6Tat@`hecWva`#Sp3p6)LPBSrgwTrSpPzM;VUYxF=F-3 zTq{rKyQSTUBb80Dl&NW_Q=OdJlz4P?s%A0>EA2rzT~*ChSK9}a%)=LDO4aw0!-pd6 zb18I2b)-Tkm{^XA5-mHC%Tr=ir>kIp>x)k>%QJ}`R;9GliaGy;D)h^n?T~5J(qk_@ zgs_(rSyTJ1-9dhR-0>FQ%7l3}R97A%X9~Ur&gi*m`EgkH&a%G@jypNH4i1|QtPoqh zVn(opZx)2G3aPlA9U+HZUDjpTCobh`gbO(}5jEf|4CqIA*D$_%U@g-usd`x(DKVFo zVFhydVEL--zKlF!`shzD-&5)v;C56~>qNGpxTfK+`B8IGoJn8qIM_fdkeF1nVVv;?)4x zspKwzXH^nM`O|qv0;8m9ob(yMFjJBf0Dhp7B8`L2KsyHDXBsDZStJjO&dLT^6>~C+ zsq#_5$pk;Z&u5%<6yc+aOt8-){}u3TzY-zrACR1r5)5M=eo#VCh98v>Dkq(cQshtD zoeyjQeo^cuOBuJ)@xe;^V4e72B|#m2C?cEiMnxt#RoR)X4WbCGn4PG^#ReR-86`+> z#m_WWv#ey%w3=mAs3d_^Rwm)Oip;WBtFkf)>);FMAox_0YYFHbSdd9L5=6Ty)gIMat+e5Sw9I7GC8x;z>? z62C-axs=EBQGzRbn4aX~GrhpYXL^a?C>;8kX2;a}V|!sOy+Bd4zE_ImyM(opgY#vT z^h#BLTqCTActA39V#skwzw%X55f(TK);bD0km_79os;TZi5*Gpu&R&VX+DfJtHAWL zfcva8!`oC0T+#{iWh_T{@_vZXlkDg&RfbEI;ZmjB$c{R@kXN}sV$@MZ4A!YIX1y49 zRyJXk7`IYu*F&1*3!}5n0QnmHXgA>@yUt>F{{hG|SmwZ$1ZU#MdHQ0&%dND|qdWC5(A5kY z(J~}+Rz;WP#7b>ZdaolD(SuwpM?nWtohznuQmZ>vVnrXsGaZWIpfe*$9b56!(=pRm3cgCFSEjGlIA&a??-Cr-H*ltZBDh)(Fx~Fr zGySZ_AwmORbKy*XB)FQ+nf|Yf&vXh#N1~zlOdlniMa&DzJI<6(9l&;m(^|EAG%?2uzrdZ7e z`iV-ifwHg)!MY!O`O_|CLG)6z_-eBvrU;!2&VyR@_swZ!cTiPb$*P`)pJ}YT8sJuy zd<>vnCFuZl%D0jZI8z+3k`CZ01G0fHf7)C}c|;c>D@Kpix!8O3pVm0f&Q`+Q%JNmT z{AT>nsx()%eS~A#KBtOQgrVy}wyKVl{OJ;_fSrLKhHyK;Gb(uonug0-OvHJh$e+$Z zMRXt>(hl&NO5!MgTB-(^l3Lx4q}9hn1P3kEfb>`Ea-<^s>|(V;molaUsg6u`bahVZ z#7>pik<@iCSv71#lOA)T z92w|*E72p?;)f(p{@6*76h$~_UB5^A4apEuDUy}0m5zcAq#_#9QE;N8paZGS71KGX z&Xw4aln-Gf8$Z9%w$(QkiJ2N{hb#YyU$kc19NX0mV38eVFNKYBwXh;435UgyA%D8< z99D!=DaUyjWfA;Gbe}X1YZUHWVTY0e{L{La{uO@M_+*lQZdNjI(^yV07#$XU+0hlz zC75}zWLQD)M)Zndd1H)*F@EE$c2jE;1PuAp2Dl`jbxS^r1__sBT?gP7r50qpiys2H zt%GTh<^m#`JIK2dyeP{CSGEZ6bTQkXP#PO4N@*W}e6}(YDfOr8M&8w8WJIiFmWzcI z;SuiFsdZDt@VUogMRWgS;Ppb6j>a1bI(HPK@g{(NaSYxypg$jjcPr@DewUw{PnH}; zVYm}qa=xE9a!7^Cy$DJ#8NKbwK%&4TyhzPkXOPLW7 z3x5C>8v_AQHVj4g%8vljFa|*7mJIh*kmUYIwn|O~n68p}0LxWUpZ-I3Jt)^H>Wu(5 ztK?k(?JD^kz-KCX7~nrD>4UQvq@clD^-o~sFfnf(!AME2C0MPf1Z9d!pw_AD2(DDr zHh|kylHe6du47#fD=GmiX&US50M3=zvD2pP@ z;8aGBW5WIwz-OXhWdI?7S4lt}2{2kECjl%_$wdIis$>a3rAl%ypFthjngJM6qAUbH zKslT#G2If3lVk}2=Os`HPE%9@PB)+uJgTS!A1Ep)-Avs{{<;UoV|)bwZ_S84f-C!zXDKAu!=yfuU3DABrao6fFMzltJywmoUfke z)vEU-u6;1CBEw19$TwB;#xdnvi)pIm@(KOdQTtW1zskFYc{3$%gbTS4V5h>|ztfa5 zV6Py$6hXXQ!j)~8JKHYPm2Fql`Mndn4_XHrGpdSrVGei!mmJ$p{&Z|~FD1T8F2*|G z|4&PVop3}ncW@h_4ZJ8(n=C6^gm=1_EsouXYsAQ}v-@x}a?t)LRoh{)INJ4}Zg_53 z^g@r0#v2Oyq!_#jpm((Uz%Wdm93*eX&~Y>9mYkn+xFv_7r~b5!E;%2=sU?S0xE!ZY zH8U+I7=*EjQ}Bpjai31z4|=6#&+9p$5r26!ji}9V*GW`$d)Hxu2RMRtC@(YKmCd3rU6;l;*7j zLaEHtm<%{w=ZdAP2skT(O3<_f&9LM<13)#=3hw8qCR#zTTLf0K ziLCVon}=No8oU)I&e;b8nm|qC->xjwY6=UIZ&w!VA^fwuCerQr;f^94njVhk9l;jehL0w>4`&n^)XlB1l~8x^!LKa zKEWj>))|4RhQHV1ezQ}LN${myG!MK4A9#6SCHln{iZ^&N5EX%&k_VZB?~Ht_B4!Cmjck!dg`K5=ceUB#n9e{(KCXGjJ*axvlNDG zy(by4OJR%q>B7?|i-=+L$wq>j`X(E&E_F~p!{{f;1Sb0r1$!pc9AOufz|xsxfL#o# zH_+izd{Doz${*PiYFK&l1`jmhyXmRgGeexLPQ`|XyQ>_2%Amurr#Z>g6-sa_G~7ki zmCSU}l%!#daM37-lO7M{B2$`Y)MU6D+i3j&*qlexQD_)ce6(Zm%v3hz7`L%l*jl1! zin09+cPAL9+{rxStvspP+6j&wsZPBn`mFLNIqhgw+b|~EhNRN5*>07Fk<(lJl`H)T zW=}Z^s`BA>tO?oWwEw5M`X5?y`Yh}Q%y6|I zW?hvoV6`=}qywDj9$64w)6X^1fS-h3V64@3)rb(rJG-2*h)L0>C~rkj{uDv^D1x#-g7R?$<$y&=*G*}4 zpT23ie+pr3nl_~Y?cKLmk*|`V_y_?Dj}@?}Ucln-2{`sK0mr>2V9CD)EFHFi`IhAi zIDUtKlIH}R@X1E8MOz&&#W>?jd% zU%7z$Hwk#)5&=KFS-^u233%uk0T2I9z@r}s_|fMA9_v-d5`H{Fz)zoCIP1nt0!;cECDqu1=MX7UPHZLr(YwW@i75SuL)=w*1&wN z{}yb^0>Qp>nt(I63OFlUiamRsfbTX7*xDxGoMDa3er}F{^HvBrzed1?7YMlMb^(_> zCE!wD6Ej>k@^XU9>jb;<0Re4`1zdHhfNj4PaP8C0l)P@Afa?=mh;1Ju;D)6D{RS17 zS6oY2Xx=SwiTUdJ#Fv`y3oJ2NTE9Un&7>`atIfFr*O-qBTx+%pTxT8Cdi1zu+U_Z-SyVNO4n@Ox&Rz^lw(3%tg>?`+bqH@_78 z26M)F#BVYOUO;$@Sugna%?815GhY{Yr&)9%`FEQ;1m0`@S>*0BPyR0H511pwe?K%I zyomTi=IVB#{@k3mm3n?* z-YM{x=1Ee{ug!Irkp3I7xOfA-orOc_T#4XQWMdBH+3Gq8a zzDMlLTLn8S{c2)ouM_ay%>uUGD&U-_1)RH2z#+ksl&EH0oQDi+FpB&fa@L;aQ({y zZu&xOxuvfZ`~B;sez*Ncs&d!ACHvjS3-6wd0`5JRbstjo1`8Te{SN`B6<p#FLR4UY;q{Urg79|&mjU(f8#!vwUjH|e+|GOpKNW1zTEP~l2{?ANfaB%~Skf$D=?($Q(r;kCXfQyaw6uBf@z@-}nT$W!(;^pN6t~gJ?mG=v1 z`&_`)zZG!JgmOw=w?@GATLf(1FW`o>3i58u6>w9#fSXqcxaDmDw^m8rzkj}f+inwZ z`z`@@ye{C*i6Lsa>skSKFB5Q2y?}d@1nl^}ly~1R1>FCL5Fc19e)+*=QllT_0p-&rqv#)>iXwZ%z{dUNV{@8~z`2nAjh`-VI_#D;&vIdg; zt8rlU^~;?J*cu+4>_2idbdSb;BZJL^G(ZvCL0X#M5ah2!dRoY|K0tW$iLK&opGeK2 z)H^Ez1TKoLbAU96F$+g=?9PhBVc-Z1(hkd4pEe1R6 zvpwt==}CwET@Ram(Zz1_Kh@7=nlYexx>bS4T@~2of5(!ts(FT%dcq}joky2r#0{SO z4(AsCoc>|uZ`GQ2xisJAFSn$u@-NgqnpUUK zJ<&8d>{mVG$upM!1lk-8~GAt0I<=OAC+74bWz5npY*xvWX|9{02bSXRRk>QB- z>iOIw6V0fEgm8DqG%6{Upv$Oak4!Y9Qav)!j5@+26Vs@Hu>@U49qEyYX4FuROf;iL zdt_o7l@&|SWz;y2Of;h=dSs#*HNztl)2Lao1YJfQ`zV>ZdVyjmbVi~&=qnq-c9)FC|C6d z9H;k+9`HH2-;b61qww5LjsvlB91PFlRQEI6c9(T#qKew81svhjL|v5(&!BT;dPb2k z9CmMqEuEF)&BY$!VLKfNF4AQ*52hcB!nliK-8z>+RC?T~kqI{H5#d zO?kQweR*_^Z=_;jdtfa$jeW`2W4qNf9P-I-vUR(K+RQb_q$XzS>|-V-a<|tsGhTp# z4B3_*u+17GW6~4tt<^C-69-g`RoTW2a4E=+P>_*1266+Q*V6qG?M^vn8fvSGVzH_` z$C$E28UTsk!5G7#Z%F*Bi*855F>hIA`yK10aMdo3+}p9_q=6i{)Ff5DUlb@S9Bwb0 z%WPh5za(X2^t=OYu9Mep*8$IKhxbX;Z9FC`N%n%r%u3=saE~;vW6RtmHWE1xkdyI! zY8Wu}6ddt4W@6HSAJc_QPfl{O6(q4JC)@8O8~3h7bW+lQCv>)KSGEOqX<|pl(-6wo z%J#MAt1-tpc4p8v5ppKbF-wz}%P!iL^Kws4!yW=*o*iimpe^*;m)(V2F$N{(+{@*hPRGhKVj(e#SG;$mhU;X9f$v;3t$X?11C zFg-{iha2S?eDIg`oM{=7^{^?Ib$CBz)}yGjnMncuW&Oll1bMXFpXm={fG#HMM`pTC z+hv2_thN6prgmqjK>IyP`-h#-uAbM$^_?+)NbcV_9@h2G<<7p-VT>NX1(~h3fQtwh zC!xn@7H6@ClhWe`D2bM*caNW09F@oEJ^g#w@);|j&qxn(erLjte%7_9F;^rb7~t+= z2#k3++3+*k7-P02!^oaAC1V)tps3e6)GSgn@sqzX43 zn5-(9JVNR?V4xOiOSTQn;*wSV>{i2r0dn2U9CJ~!PFZ!?|WaV#5$$)HawgCJKv|67FS%A=dTV`uD7uWL$Po#uBAUi!kMG)vz-%_y1S(GUcUg!zp*d%(t&U6 z^N#qx!o?lNe_}EIC!Apqp0S2GWl~ttKe1-?vA=bM{2n2PlNgiJBPOS(NuSUcsM83azzXM5OA(H_C`I}}v@anxSsaU|>E zmD%QzVL^QBkXTM=U{C>ptL-iDuM~JTlRYdcq?U)2L@+3A&8J(;;D9E}BuV zdSs#*^#_kkOr!oBOVDN12OgPdMjiCXL^J9$k4#LXzKA90GAhCM)t>6sAZurlsr zoOuuj=dPV`qs&ZOXuLHcWc(R3nH-!I)wqcrF>|bFk+G9S$U$PKqkD=;0*oNjrFNQ0 zf<@1ujIz+lIm3KPNf1QUo&S{*#bFXs3hU^yW2yP&G_ixg7@${uNOO7|03AT!i zLq9?1_2^uoT}FA82`dKmH*S@c$v*3_T2Hm1`)ECflbm!6CS^QyhO>^OIfkV9U`0}X z01*YS5OdPGAeb2x$skWHpOWxMqQ!C+Vo9qgK*mLcF2+gB9*uEII3ry<$vQy`q`si; zZ<}`to_~J9#4U5@TuaN?-&BQ+oTb2e=;w?~-{f53%h8mh&zM3|vN@GfrY}vA4Y!D- z{c;S*F+q-ra!itAvK)KJF-4B4a!fO(Ii**3O1C>lW>^k)O=gMum}aVH1*h>T68@Qi zgTBZNN(lGZS&tS@pCKn2*@+{hwcjbkDcwlb@_aZYaTKQ6nUqe%&xF_2Ut$(pz?@~4 z5Kqk7a5tXrRY}GfE6JNDRqpe9gyo*N@GjuTFa!S*Co=yra#kkj3t;D!2@l-KkHC_= z-)MB|Z*B!ziN@z&;xs{D(dcwRuag>rJ98aX{SU3D@Up{H^+=k9uHh4jdGBlVRHAd9 zFH)Z@>ctE>{`_r#dqFeiypJPppD_lLlk3la5b!WLbD4*Ki8GS&kAo>nK2VIuS3#{I zXO2Ig?`ApzG-K`v90!p)KOz4BsJX!B=HtL|HgRc6{)qv@I3D=C6a0827m0#J;LPg> ztP&XhM8|q0prg>vzZC@LUxhkJ{`IL={@cKrHxihYe@+wh;IvELZk@Q$pU;qBODX(2()p)@^FK@+jYRSt5P1mL>nJO5M?&G_ zH>3@EVHnRa>_rVa%BbT{~gjF8l(2JF;*F zaMJq&J_s6L;56x|w8D`>pIZpPZ%3gbg-ej0_Y~||%|tm0D?_3n3+#Ex!0LfP)42dk z=w1Ant&QZl^vXP?D1RY(t$5@NB*Y^lQ!J0vAz^!D4diW)ECNS7@&z*49%+Dx?UCPu zBObXH3Gql0+Qs$=KOJCu0zZ#OZc`Oe9=QgF(IfNejRiO1 za4K>zXP}QctMG1Czo-%DU+|mvDx_VG8Vq;xm7%ty<~#yNt%vLQDzL<*{`|Ay*=ImA z3SLL4dF?>?mv}s5c)?E67RinzXeFfO)oJtu73Sx>jO?4Cj&B}ITsAWQZs_=cDy3Bp zvodRj8sbFK(g9 zMPl`AG(^vrNF40Rd_*M@*D@3mz3>yZ+v6I&*ncn3yLwyPO9fq#ZlPB`jGD}yun@k1 zC5e|L`C|~UfwgGk3vgHLy(Y?rX#_U=CC9!%F>pDA*IzKA*Ef6geq-L z5IGopTonWm8T0zq8zWMiq{R+kB{)tBpi#=KS8MqMlH{kRB z1@?cK*bPd;A|!_PMHoav0(B;W(nBK80{9~>C~^O2AN@G#VI z0L)>aZh!?><7W?oYKS?5;2E%j1yF%|lL@IOx5_W|yc2}qg9H~$)5>laaq0X+*8!+m>v{;Yo zH4t+uREPF#z|U17nSEA+widt13-s(WrwT6L4AL3+CB8N|e*=m+7c^teH8`FP>gD9@ zNy@(koclp5{4oysJAt(mdx3}Flk_S`ZzG}RCuX}@WwpjTXDw3hcTC&1iA@uvplZvlIqh#Llb zpRC_qOTfPj+JQw}G|nf&(T|Qy2)wMG)?g`t-&zlt{G7;czj|~;ID7p4W#3mgulNTE zaw39O;8lN?k%~zP8Uq(16yQt*gDY?;&L9#*ii0OG!8DFMWj+!U%>bS;=?^H(BFauO z)l((QiA=^!GJ$IN7r6XH(0DSkjxeJXM|DyYxYDK?;)g&R2wF~Js_Y#HZVabp&>Ty} z?H(4_pBC$Ghqciu^8tq{mN<4ks`pa2dF|Y3=W$i*8CpSxh`SiS2xDYOJr=_%`3pQ} z>k^Kti(|wqbf7Kb()v5rELw4Y3}-kc;T0WWzH~ST!Z{h@G>^+Z+8RpItblC1&Lv`^ht85tslnB~$l zc^Fp+R=p+<`#TU3o;;k+QOQiP+;-yRFaIpPuY^kvK==}&QqHe;WeG?l`5UC}9`gw%JN{*lrt)KkA7P#s=zgFdi|XtN7W$?_ryPYj4BQtLdJNIL9!CmhWG`Z40Wa#fU}b!@H&3kF3 zL^G{$HrZKVFJNLb5+zJ&XeumuBgU;$X48-bB#LjHSboe>}!1w7xJ z_aFo}0X_aM90q|B7;PpMJ_w|6Cl2}Vf&U96PzqO`Bat`?zrZLn;dq|7Zf2G&b4orZ z^}D72VgbWyu}XKK<+CRy_F&RE3-p zjjE8dQKJ%aWMax**$1`ByHImhv+8;O*64|>Yu*c^tU^?{`BbAS+#JcliofjW;pPGO zO~&OXNZ8|22P9`)o(Hy!%U6+*ad|QlYFs8^xE+l}pFJ+a!p%I$S>qD@ZC(!uI^z-) z&$yfizH3~vs;q%CE>W6{%ab8^_Z_TSlyLJdm{P6ZAYoVQb%-(`Io0|h*ix;lk&tR_ zLPDzbFsn5q(^V~Ix5JGAj;hvH3Jw8kS8FD143DDA!FN?FBHV1()vAS{u2#Wwpyu5L z3jcJt`GCZWGlgbkTj7QwKJQIUw8Bj$iS3%`3O6&su*1z^2sq)Uge)Cy^3a_fRux$~ z-1OJ1f`4^Q=a*1pSANO1POY+EO)k0)!E6z7X7A z;k>I*y~24-p?Zb$tU}caXWLl8^a|$*jjC|-wnkOBNgihjt8g<)qbl6wYgC1slQgQr zjlTCVTZNnNX|6lmjA1~zUvpNo>Uk^W#2W2zBI}x$Gr=-Jg_|WBRpF*dqtV07%kZ0w z%RXaV;}V@fU8b;CH}^nJ#^pbeka2l75;88^(cR`PLiXt4rW|r=T((hg0tD@Gxd;@` zxGV?XH7+B<%?@Va>gH?+>TzkWZtgPS7OZZPvaD)-45_eiLkTC`>;_w^^S`5KftvSg zQ23|A4c|$c_kbo^;pR3Hztlu4+_aPUjwZUo&Ff&;;bzEKcT71*mJT-?!&u3<4r7O# z`I=R*8|1wI>OQH$%?{FT)Ll=7n+DSUsA($P@LjNZBPUuFw8PC@ZshU(jCQCI${;tz zep{xUh!tio)B07I`L#w>nE8v1@;vdFVUsLlvIITeMkUN#sL`>pTwf+vZQmvUiVeMle+tmsSGiQOLs>Rm=&)W{vu2y?w zwSEh}t6Cq!l27O%eG-)kB~q=AAgHTVPy%Y+2;Cp8lc)v~6Ex8ZGZ&M1k|tVVW(SFL zG|?4i+QG2HObZ0wxfjOBN!06P=`i!lFxEk`^s43-%_`W5rq28S*n1B!DT?;pyLzg7 z*j<9`4hx7ZNsD1ysEC3Y6UnS#Kv6)& zgqRUgF`xVHuI}xAz}NTH|98G~o%8l}_1yid=c(A$)nR73diveW8)gnSsv2w{+2Ezix`lg?#I5A)CJ6Q)G3h4f z@i}tW{rFI}D&^m`>1M9GW1r8$r4)0?PDy?TzkH^U{Eb_To8+^Jd`3+2mLs1}+dOwW z$?YVs4D$KpE9rjl2+n8zN%w;hLuJ5w-k-Oina%qFWMedv1og6mG0N{K|VvO_pqFlv?1M>k_uE$QbCd5&`>#s z+N%3gbSw1S3SGB)eGxL;bMv<0_6gladTt|KH~#WDZItKcZNseu1IKu7V_Y}>t|)D+ z=jLtOsFu5f96QM$I=b5_)&+^w$rfM8hSoyMF5>>cR{|s8k;Uz-%egfdAFB6Qd?qi! zhqvcry{9o?7C!PB+Iu1KdLk1{q+V+AJ#${d%h{yIB-{sHms_g>uUn4mmGwCsRH^Uz zi6ym1-)!_|E{W7DEWYE<%VVX9?G~9IOn!>RxBqz#w@U{vgbX}xq}*``~o0*4LK!B1s|#rGC^ zsXT0){K{Qr@jZK-aqTrjVVP&$9U9KF{_<$mYkLZSnnno_!0CN$fqg z1EOAS^$$#2*(>}V%Ve_HaB#ZD;;R+C_}ff;b`w95Io8U+zCE13i9grc9N3>RcINMW zYm`WxXYCK{&qm8P-%|bYyBrilr9S7G5~&NUlMv{Y=lSE5=UOW_u)h$pqbdunE`jMq zW1{#~xy~99*k3VrmKaeNS#tx^j;Lvgbw^;@X)3r2Au9O}KJz)EB~q`qwggVEnuAjh zK-TWTnSm|UI|ZM~lK9Byf!(_t(Tjb9bs&iSdic;5NhDI2T72Q7*E(7ffmPozPniRy@^UdmxV3lO2PNd#u@nxT0 zRgdso8gWXbuCfLN_U~`PX2kA}l6FcW^>%AU;PwN@_OP4ZomX3Yhp3m=(Jw_>o|8B1 z+KJRP7T+-H`TkOVkei@8=vBsc$k$2f&FUml@3ejiBK+3=&m$B=Y1dkOZz&Ef96XK{ zKDwC&61&^t8%;fjV#heRdlO#wSbX8B=au@WUh6ErpVadz{-<8|T6}$}=T-6;FJ!jf z;%ikshZBx*@QZYx#ka0{Ug`c1;oWvKHM`&9`&d1P#4!$jG8-(ur`7YyJjM&9*=S7; z9LgQz;3xBdwLI`T@fa^8^Pt7o!g~3f zs>L}Oyy9MAoH!PHf6Gjie9huy4W9ifY4>w_-QrXZp3{8kgyOzo4GQenOS_-QE^9{M zv_d)|kvFZif&DJ-p>V_ciM(Y!4=1*?yOew?yqlP)@3`CgD&n}qv?9d}wI$!S$`13Z zwa4TbZkuhHBVivF2tIqQDe!SSd`Y|g@;4&k2np2ev$ylhVN9o+i5dDSXJ(n)fnlaw9p?Ro?;)#2;5+{>e807Z2fqB_ z-@hvFVe5v#_u9Yk{m$A7-{6=$VbJkAZ;?ai@S)^(-XdGKu+2TpifnztHW6=l*ybIc zI$`l=m!%esWLL$Hi<`PvX-+Jm%UGPBCZRJeK2a&f>onKn^n@;J@n>ZTUC!c9OiS(b zBe(P}@esMZ#R+VJbDPG0R!+1ynN2BPzPahNPUs32C$=einsjzTpJZ{8o1*fZlh73{ zPIwcXOEqR#%(6K7O;MTh61tMbiExS@SanM1$`&WZDJov)gsx(7f}Emqotw~AEl!qG zRIV-wUCrXeIYl{kOX!m=PNGv3)IFiATbxj*D5yt5*RVLbPEomfCUi}U6YUh`*gK(X zS)6pID5y_D*S0tTPf<|cgg(XMWIRRXx-g;ZSe%%rD90fQeX7MtdWs?zBy?Si6ZRAp zVt7K=vp9KAQCcGsI@{tzJ{;*)`UZ0m?)8cE`kHg~l)3{Su6c;}WU6%f5clB>ozsVS z4`;mX6qQJCpgH+Zsl9%r{?!@RN~AZ^oFk~z5#KP-JP}JD7(6&iA6WF@D19KFh^05y zoKeUt-3oJmV@h|L=JZ0IX*GK|j#6W4qB-S|XS&m#x zWfJMlG-oIBoOYNSrXr_AdUMTbi#+>IbHfz2pP@OQk!Rm!@(=9h^qt;PbG9ST={s|$ zbc|Cg%}J2lb5VN2GP~y(uhzQKSl_FnWp0d)@oJ+vlahPgnO?(OVkgqi)SOt!Jwv7E zaP)GoLlfz3HD_A#cV0WaEXbjme|f$MK`Kc@BK<6V2h>aEbS6WipVry>Igp>$Ir?Le zSEn=lwBi>rEgBN(?e$@(msSg=MWdfqo=$+g*lqoDKi}+=<-Xo0I0DjJCDJ=+P7~!N zl;@Ak$e^R)=6_RDbLo^x4CC+H~mCe=H0QVS zBChr$wnLCg=HYWlBE7rj)K|DpL!?cNdoOC@u}T%b8; zmS_9W&(GL;X-=f&*}m}`tLP#=*ezL~z)dAT$EVj$fe%`ux8^ilUNdFjMPuH%R>V!D z_tCM7m8!y8aY-Kq&vvEiqdBWXv!zLazuMo{oivVefEEq>t2`EX^zF4&TAO{dWf_ zb5M=aoJ-B~`oQ<%Ws3XY4sAbLbCxyF;l~(bp&-X3Ge&a~HqR?n`(8L4z32ZXv$2|U zv<-E4Lq)uAJ&}HqzBmZUazn=HnL$V;Hw3c`1tFE)kn#GiAf$>La*2K%A>I&MP4ggO z>J#)ULFmcaYokQ^MEwy$6X}!Oa=K4>)93oe$=aG=ikQ(FM`|Kts$CW#Zq+iXS?0_| zQHhKhcJ07cQ`oMu+XlAWur13(o@w_F9O{N0knk*fT3~xX*k;?e1h&S)cD4OjVCx`k z*Vu0cw%)=v$No03JuGZrC2Tj?{Q}!EVOwfn7TE5x%ry`N`7N`T2DWx0-i`JH zfvtzIEw^_DwohWwG;gxM2yCAT+buTdNc6gX32m;o+y`ihj1@NL+4F3li+H!%oKw-W zl@#$-+MJiqvwazkmt`t>o6QLrJ%5L zHfJXE;vEuc-ecbw*b*Y%I-4^XdhtFM@$R)bTcu|!BjT;MIpd*cJ1XMcXLEK-&z33T z-EY?jY(ItL`FnDM-8yh68;)m= zlbw2HsVw4cx90`6gCgEDHYZ2*;(a4*&)S?Y)w5L4swjK7!!1htt=AS}$+E)h-Uxd#H{&DuI%_(2Kntm5f z0ej>%`^CWaqp-bh9|&x}2-_QWY^tATW{l@TT=r4?Qth%U1r8Pc3rBO#eA8|j*sAz8 z(=Xq$IiGAl^kkJ$-M5)8x!dO4q@Hb7I8#*QZF_NGn=5SZ*!KmtYlUr({Ze3CEV{^E zn{(CnbIYNSQAd&&*FW1K;Uq9 zBnwl9{r2?0;l4-~#^D3|_Q2u6<7M%oy*+SvERu!URUg@(1P)Jz9nj<-+wp0B6Ko0F z%zatLCw8^K;h9MJygR#$12!k?^&0qvNcoJzr}p5$;gv`hW_Uhm&kP)1i)3LOKC|x# z9Nvs%VH`fUpMwLw;qd;iZe>*9Rs9$C!5~^~9la#_(&iM)Ua3zJqr+Erh3USnj)?cQ z-8itFD&l=(cMWWHMZ81y=)hJ_#QWCfbiiI&vcopN6CJiWKd|SJBNG13elD=(h9hI= z9nCzu+dN>8N z-XAt+!}e^=!;xWA4rf;OY-fby`8it-r?~bUT7)C}Imet!1BaI36p*@hI3Knbxm7qa zY_`KWmdm;$ExLO~8ajI1;r!=i-NT(>#SvD_`7}u598HrM+>u6c=a<0NUgTZE;T+;# z-gzSLl1_ub)*+mxKVFt{&J7$oh7GHq^J7(|;9*)53c#TIk!%*{qr~A+U|q<{_gwPgQpo1-4PX z&7@hwSs&QO_%@SfE$79+HqOt_quz`^bCPo6*2o5ZI>r`^eZDI(G-QY5qPk zw#Lr0fo-0jrYUC==fl7@-%rz&v#IlYU|Zm)Y0BBm;dJj_Ij;?;=^lPr=CE@1=Q@Nb@YGOJKWMq>PG8-i_*K59Owp34iaLF7{onj?2@6(-V;BUXVWR6T^-meP~ zgp)3CKQB@-a(YK><_0}EFdYn;eEUYd1a>#A%s7^Bhs{Tqyr=}|#C7y1PZ9Nh2F+!qGJb(5YGxLzD_<(C@x?l1Fk z{ZQaB=eQnE=-q+GBHzQ0{-pjXFfNzIr*zo`ev91Z8-t%xG54o+gTUjS<9ck?-2#tC zBOdPCiv4nI)e{4^ZvJhun^oYJwFMqUe{0BWo5jp4I=?mQ`d;CN*rQJm9O^|J!d`oIpTH|O;^p@2MCLv{J#c7pJcoDn?SVrJ z-{F|zzNfbbUc>&>>wW!s;B}7g6&&1t)%WYti~On&_*1VBbmPG58sEzds~_q z2DTZ(_MK*!?R9PMHjkdj`(lXcW*nY(1%Nz>M{N=6lD8DE#^K!6mQqyso?j4>87YDW|h9dkF_Rh($=YgXdz_d4NO0y0Irca}$;+9_OSNTxXRKlth zn2tnEC9S3~1;3B1n3Yj6FP|a&c@~$7CudabP!I{Jo>8&mBtOB5r1T6!!9EbgD<(Pd2udaeyDjTls9xnOHxX&klm+80=wa7Q4H zdpu`U?EOPvX&Nd)7QL`5`jo!WZ-~>mzltLE%?T{cLz!jK3lT4D4>K-5y`}Pe^OrD+ z_ambs+mf)2f2Rw@yD4nrKYl{CRbiWmcURa}^iQGS_ARYzA}z)G31ut_IzN$?YL!@y z<1sDG{daRBt+=c1tykJqdSg&aD`Dlpi3hGqo6RRHXcR_sKM=X3)i$utqXG7b5S4WQ z;ha{=8XVYfHuj~S9iNG`6RfKO`yJ*|VIixYNGolv4or83Oy;I4E!}!Lux~W>!w6By zAMu&*RW8$dKX7`C1w;8J)kVva&4Td$5mSxe)ZSksA*1M6D4?u>qb7oXM^)_r{ z3oj;YZR$sZIXhJ=u$~U=1B{*G-A;O^uxdlC_u*vj)vFD&?3+!7)s9rgCho2olBiZ_ zWkB6iZ8c2bXJyff@ZnZnZ20jRaLcot3S4p0D}_MMp|8=UIN|R`(Gf!M_Hq= z5&Sj1dhLwr*Um&p@@9PGkFSXj&f}ZpOoPe$8OE({{GV<&{$n>hwPv>iaPRipDfrk! zPh#?8ZgFPI2zzggD6Y<9@*ZfF@^1+f&Tv2dj!o&cs%!g?@qhd%w-MW8HF?j~l1E_uKr9jDoo$+-Vv{ z?st2BavK7@?w8zw&HOj;QTBa&aEZNcs@E#E*sI>Xw<7cgQ@zIsH-@Wsi>cm6D`C0S zRIki!fHkH@+-0%5O^w{@-D_&ZBPw>kRi&tU4_eh-sKNvuvueA*%eUBOt8Ni&v+B7} zmu}Bmxh@nEUb33Fz_%&KUbC93vNKL|E2d%{y;xOTOzi*4fl@ z)=I#+2KW=3SQi6xX*tgTe-jw%YJlTJ?0f@m#qtfTVw`RU?j&?Ku#V8fzy?B31J4mI zFz_CsmjSou^s&%4`FEb=LfFdQj1MlcRLksG{>3NBc1!aAK*@(!qQh*#2bb6%#_8pi zi2F7^xWsHfF8^Cp_M4S%sERc+{UIfGn%7c%;2&#ZO2dB{#hO~SD!bQj=CM{VK~`+M zRkjIs1eaJ&kkBb!LVdZ5P7PNpn+cU{Vj|SElB3~L_EJBE1%3%!#NWcHtln4B#~CVyK| z%-a~#onk@VLicK`!tQGHIu?<0;1s2yMi;V3obAR9yaF56Ma#jyW!$7_}sVHHUdYI&yaCKT_AiK~sN_+^&i{?+q~1<9q*GRV>GX`v@X~P)^qD4|`m5n`gGq-| zImMR8yn)c|!MDV`fp7pVx5d1H@G`>cm^Tp4C)^eD2EscD>to(Pc;_0xgE4Q|aEH51 zF>ly-mX@bt-mvj2VOuOTY`hTjMhdqCFUK0X70$Q=Zg0fAVWSpdZ>+g%Ig9X7td$G> z37^H(OJ0P)ah{30O(mz(-)&0QpS4iQ zr3_>SS$s=;7T*uAlIsFbx6xU_ES?v#cqT>tY2J$uuQ|WPmP+o&XQ?l^i6wS!b&6H0 zmOm!7Oj_8dW(P1v786j(atQS*;b!Gtr6lVzuxO_+)kC(ImIx@B;Sv(Jt0-WF}e_rZn69(SZ#)eZ)}hrDPAyqHD6 z3=OP-zs;8z`r8aQBVTokZyPh<{TB{#$LBIp&)p6sgU2LnkJ0m47`~UhD9>hYp3gIB zv&sIcMvtK@-=$qtZqL4ruIds-vtF|JClAb)Nnl4**2HfRCuYKmqiNa0xWvxW?iH8+ ziZwU8<}kFt+6t?`;54d+VO@^33sW*n^ZzhB+rdP1SQ}$)hIJs;w78#|_x}EWVjqdJ zt;6~t*6pEk{;Tk1@LP^`1=f{VS7Y@Trm+v}0jw>wAL^xjyzq)PZriZ-$I5xm{H2-+ zFZd6_&w+1etX;AC3oem^v_A}m&qCSeU|oWBE!Gxj)3Kp;9fmM}+A~hiCGDFKwi)Yo ztYwfcrxoJ_VgB-}3BU9|2#+Bh8*3bE8rBk6{e@GBHOJZtD<@m?mlSN2z*-t>d8`$% zR>bNre`OEHspLn3cEx%j))@NhIIMlJKl@{4KRJTcUxs00I96PXx)V`tg}#i{UpPwO zYXtT0hVOvy?^wGd4^HUB37;lm^_M-^p#9$sXC3_fWxAZM$zSM$+gP`*AEUklVJpD; zE7s=Nm;Uk~Ha26WPd;p%(2d7RTlicR^6LqoK3JLmK&%B=M`OJbE6x@Q->ACf!V_1u z94qr)jdc^&r?C1<6>L<)S{>_Vtp2hU8_!~W5$mgdAe8%?eIWzu+gSaj3d&m@YfY?t zk0Rz?QjM{mgB7?);byX;w+iS7jjdeZN2eDQ}JNk>X`Qh}bg0&jfnpo>%U4qqLq|Fbf563A^ zQTb@dpJ8iF*b|{}hH+eE7{@e!`54>3V*MR!2KIMDtgW!N!Fm=}&b-Je(Z*q&fORES z8)LS={5$dgm49849?Qr&v5YTbW%?E1Q%(5&w?BG&;QzG#_#pOIxZkY?v+pr%Ggg1` z`y<1i4TT@X_93iCv2wq2tU3p49@frShhyb=>{6_p!gC>3p7Sh%6P+6_9d1n3W+@{JIG-llRA(QHjYSc)@GmCXf zQK>o&Z*5PvGGb+7nW~&s-a65$U{$m##j07=t(sQ0l^Z(&@sYQ(cpp|81F?Gt_6HWN ztjkN4DCshS-G!~dt9O54YqTv@eStMMHb-A$U+v6}&nh-E<*L*+rN&nAouF*3wx!B1 zu&$2H*0b!H&QGxjCD#tw*|L9<*JhSG?90~wcYV2s{>1lDneJctmI;-Y zd%8`jlm*sRG4*UMPOdxxPhTwSmr^D1X)$T6)|t)vsO&!Dhm5{>%(#M)V1 zXV7uNMhqD@ddSF&a|%a~$JT(6N=6!0IB49M9OHIu0>_5@xo^&2q~*s93X?N#NWqYC zLq-o8qEwGD<3<#Y9(w+mg7Fgvj2qIYL%a4J8}&gi<9cSt)}7Dp)248ApX}^Dg`)?J zykzi@J|hbU4w^KnPvMx0*(QU=j2bm&boMZXbIyOB*2UuoqlFL~DUF{zcF4upMECp8 z6EcMwSvab2yj!lZ0|sXg8l>!hkXYg9!tsRzMiyQ=WL&?Ig%^)!A^-D|p^Aft6nItq z&tp#53Xbh5u&53_So0;cl!N?_9PlKAHZVYmHz z1wk{SEPuBIqXvv0_IKkJH6u&#_eyWl_$S5SF+b)X)}dd&(U*)IId=TGe^iTqc4+#| z$+q}M#o&=uIOgvqF^Hq)KWxlFZX$m#|B3%21@Kb&dnNF9gF90Gqa^;(SnC&qWA5K8 z#gK91M*sceV$7fcBmZ$n80n_+_ll2BJYd}az!1+={$2^pF8CifON<&aYRtIF|ELr^ zF8hriH^5wu{O4!>NNxH}C>%2JAC;$HzyE=D!8KpO#KA0wmsmeD`rxYEyOQm9$@s#N z7>;o7;a%|dbH@jBSr_%eO$;wfhPhuI*m33H3KCb|wJax*R>nz-XX9%r%PKO|wd{J% z8ELxA^tgU{YPQo(Z&BHH+|hA8HXEiEI(@oxc034j@cgH9o>Mul8|FFHb~Caru>ujQ z>GAY$r%TYcn4XaBREp<072=OOdS$%8QTnVrddGE6wsU4Y&!c04bx$K!U437?y? z&avWpx>ew4egD+yj-_8!v0MxECB#p+nTOELWv0-d2KTs`N+xGs_BWa-IyD0-gW zG&Nrog*-%907UH+};=5TOemGAylM`Pa*H2C@ z(A&`H*-o*z?qA?k>m1h?WV4BD=h?QCs-LhBzrB;%!6{eYabndfpm`@{J5E<8)6=+K zI3>?16W0r@g1A0BCEGbIt`8wrLp>^l^%VtrQEWPtI}CgHIfcf5Y$|g> z3oVLeJ5}RvIZn1yHa^rzplzz60uHonJXSa1hB)zhjH@4-;+5^Nddn$YA0;$#$y6buH8*rzoL%PPucDO3L$oA_dqfp`EdUJ0s8A z8QI(!sDRGOHalZFTO2!sI^C&i8ot9{H#`dzYiyw$rO|sV_M2?IZOU|%*gbl9JZRmP z?3~T*PHw-o<8l28j{-dz#~XtRaEPF<;t<8*;C6I$Gz54@gntz9=X8`!13NPR@Xu!orhj@@6=d*R?_X)=qktQ*V$}rxS}B=-5UYu zyno%IIJoY_0UdPUlj8bjc3=eRchCtdXFHAZoF>`Mxp__sx*kWgs%-D}PW54E*)w#0 zUeRFIAlo_lRHu55qjQ~_yB%GR+qH6>8t9@LeYhqpURZ}n7!rdY!#L!)e(2-3pkUSY zN7zBN;vJmabDSC-o!q)`-~iMBy^+Vr40Q1Hf_Oo^V|@Ci=@=sQ%&8nOi^ugBh?&}9 zSRBXv)L3;hYVv@XI33lVgtkSrSoJa(E$6!qS#kY4;#l=z9*#y>!q6DL+6bR7W&m=W z+%$dbRQ9i?C}17}5^izpprUE)eHi5{F*uFKH%|(cxQC1B7cm~tc^T@4bCFYr{_XbccxVc9NY{%j z=37nwfbl8roShs_ao)p@{|ZA!`M6$+EJ2@viUTk_Vmq5Hb*B~U@18H;@jUPG;=Sp5-s5_{ z>3KeG#V&L`pYc4O_B^+^o=>};Timj{#~6IQqs*;IO3!drTH$Ol1w&!`Y&#b_MPH3} zW_u>z!age<@60g>{c%bWp;dV5MUwAXXronA3a}AtWBtk2^jO_UNBh9CoV2tA@`}~T zh{Yndua33l`d2!&Ib<|Q(>Ge^!cU>1IJ2$7nJx8H$4R0rSL8V;&FUBilzrHSbq%b= zaV^2Yc`JA4UYsY_#0sD(J-NYQ_O7X$oZ5OfdSq#AXNR`)+-+pG_liw!TIeo!aZtel zS{oe*R|?0E;wRk-`a?ziI!aJNuSfdaE^w;mI8HsM zfnJV~RQ)cjPSVN7x%OXIE{~OKUR1faLKXTyta9jYRrR%Q-{a+^ZiK58cEM}_hC@`f zeSto06V9?Jy>N|?7e5C^o^)fi%aB3mI90nkC*jkJcan+Mx;k8Hp4a~uVUVz~C%#rVC^k*W)6Zh}oE8|}i`BKb zO2Jj!Yibh@QeN#|7Gl z=%Gk<1v1S9PPxCO-z7ZVj5Ajl*V(hW}|w93pYGW?{D$8}6hIEE*lri!d_Yha^#fB~uH$ z+p_t`iagQU}sG{+}^K{2C zGxi)ij)i>8SQj0iFe0Ls6*IoO&(jK_!z?vUgb zuV@f+GlK{H-OSc-@a0f^d>^z9JZ#$?rWXEpnEHR>V#~XFJkFKme{iwY;{VHwEfg&q zx4*$i#k~?UBN+=FjAgw2^2RcZYVKu9 zX1tL%mSr}i;_5kc^>*ylnR~f+ysNXwnDwV#X7uw$NZ$(u^sml%k%T+w<6mr2e9oi|9$8!9#8Vo*e@4+rQjuk`Nw;2@zPu6qe*YA;1>k% z7W{!={-e-ay!15>e0TBK{h@V;D+zl&!OaApEtvm$^cF9D{_8Q!qXl0knE&7j`xpJ| z(M#`6Vdp<~!v4<--YxhO!AAs_j78JqKYhaK=L&8oxVPX-1kV%9fBuBie?;&rf)5C` zbTs}+g87fdaQgg*SeSDK7yT>OYwr%i-bXP1(H&0j3c+&)^WR5d|9b^*5&VYWj|KlM znEx6Nr(aWW(K*elU#_q>6nwg1{u4f&emB7b1@oWwVgJ#BrwhJ8@M^&i3*IdFb;0il z-Y@uo;3I;67Ob3TeM$+&&q5;gZ7TRI!RHF@A$YLh5rQule5>Hqf}a<>L+~NNM+6@g zTq+)|Z?53e1-BC1S@30o=L%jYc!S_wg7*skLvRZJZR0N9@la3j1%ihOo+J1=!A}T& zUht2C9sbomRGwCX^8}9(JW23!!D|FRDEKMC&j{Wjc(33O1RoImrQjb0EAy`||9T@X zI3c*2;2gm%1a}a8f#4B>CkUP;c%k5%1g{Z%kKo4zKPUJ{!M_MTH7(j-as&?)TqyV! z!D|G+C-`&0mGMt1Z}EJWTNIf;R~MOz;uGM+Mgi{rJf*%$9rQjMR zqxI`0c%k5z1nW}K_}PLR2|h#cS%SL??jv}R;NgPD3BFYDG{M&hzE1Fsf>#M%C-`B( z&j{Wj_+7zY3jS8G;@>FU#oPZU2(Bc!s^B_;>kB?za67?yg7XCz2p%nXqTnk9&lY^0 z;2Q<65`4Gd2Lx{tyjAcEf?pN9Tkv~=KNkGC;O_+gBsj*`(1iAHn&8rc%L?W@T*L8e z2(Bl%k>Hks+Y9a{c!1zxg2xD+D0qh8If54nUM+Z?;7x+J3Em_41HqpO{#NkMg01vu zd#4I6Ex5eklLhApK22~-!DkCTS8#X1eFYB|JW}uk!P5m_BltSO%LK0!e5c_11V1eJ zNx{zuepT>3!5<6$Qt+>Wbw+gmW(Yn}a8f=3A+FZeRSGX&2Oyh!kJ!M6)uD|o%& zO@g-yeo62?!Ji5KQSk4Ab=m0tP7|CVxT4_Nf*T5MCb+fWvjle(e7@jbf(Hs7CU~6S z34*5yo+)^a;A;h6FZd?GYXv_fc&p&o1%D{`u;AYXd+*KWKJ~`G;_i!}i#S8@NrJui zSQq(wucaj=&j+*ojP!L0_YmAy@L<8i1dkFtUht)YuM|8>@I1kb1uqx8 zQt%yu*9qPz_z}TR3f?C8dBLv;eqHd}g5MMTiQq2<9~OL6@E?NX{9!_MiJ-zfN2!D|HHBY30W#{_Q{{Jh{-1@9L8zTi&c#PnQf~N_d zC-^48_XvJm@QZ@q7W}^8PX&J^_=w(*(B`oF_P6a4*6A z1s4b&Dfr^)(f&AD*ry1dA$YFfg@Ts~zD4i`!H){wEcjW$I|T0%yjSqYf zRh4LaohUe4a4W%ig7XDmD7aAYMS>>_o+kJj!Pg1CQSfbo?-IO0@MD6v2!2uU>w@

k6nwGZ%LQL0c!A*i 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 q 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

GSFFuS7l#f`P~Cs}^7g%7DhdI?^7 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 z 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�^xWow?ujU?cT@mvsa#n>|<%SCBZL|&%|I>pY1Y)=AmRl6j96GG&z zNY7YrG+VaK*vTNaP1BN~X~v=;A)8ngNL1@AWa}i4Hx!@3*hL^>ZH|}zBh`7<0#%)b zY@(K!&9nu?s+j_iD!mPW)a1JWRBMqwME>t88KtphU?{o{0$_EuB-FJ67|}H!fYx=$ z62)V;1DkiC)(^!Puo#(z8Ga1gLswu9CuaF0zA|hRpMhU9G7H%zsF84EyVwQ{+eJ^8 zjbeh!hA=@|!3390pg@|)_rO`&0qdFNKR}Rregx&^!QiI=R8_OB5HB+DCPYRD)lQJB zYLU3F5F&qzZCKyS*SbXuv%a3Sz^{+ zcaTW!l>m_1+W>%-mh(#hY8WYe8*U_j8C~CwbW$=pU?Pnj0M2e_RS%~{Bey$@*@vrgzQOOxY{Q8dyHo(7F-2e3E)9CYT1_FKhB zB>EPL%dj+;-8>SF#(oXK(vXEr8uEd4zHw<43F(H*Kqzil4M5y58-O(8(=b!%M$8A= zdboifwvoSjCzAn=@=*H>DEUxZ$d^l&&OV`k2(&!d-UomWwmtp>H(R=dmp^Jstbinb zbQt+ZWazQ(e3=yYKr=fjS^`XpAdqQs2ME-(n758x?Iw+{z)U& zO$MD<_agve-R}YTti!XD(;I>8m31A!QLNhrCe}JjXRX@>Mq=F~ptIIlx`1`-pxi|J zSy?3AGj9^rPKS9HLA11QArt!+p)Xqd78v_lKq&Uz20-j%#}xZAP{3y&PayHLEAm(N zO$LG3cRY$%`z)QckB^RG-$>9|`z&3+zAaF0EH~$*_A)&4Hd5;hnD-2jQhSFk)wTB) z0BhZ5W8HnA6YDwwE!Ir}Al97;z-Jx5$>LW}WUs9I0|>;rtHH!tXX&hUcYsc;I}LQ! zI!l*m-F}qPBZ?Z-Usgpj#XuRZiR0%@$cx6NW0yzj5QJ)kYE(ALRBK7uN(X{e>}&ua zcAgDD?0gJ>&rWiubV^WmW`L{MnF~s5r=_!Yeh9SK`5zc;?X+|OJ1K=92TfF;Kt(!u zW)f9NB|5;&3m{+2{L~dI=P&nJX(?%C6DY;X%>cy8-vbaUKL_BmlFTWa0+f~Gz*VfA z14?V9rL$J{2c1|s0(90&OP6S6AxD1m2~;E}+F7KH=eJ&&BJNV~v*IkF5!X`)Mc#T4 zT6vZ*L0+-hWw4K*>BITdB^?F(L1u%{+Yd?$ZXOgJL-G{`aF6T4P?D;vW`$RpxWWm9Bv*^zVE>s@2WK7 z<#@y{i)biD3C|tzn+LkIr_UZ!&J!M$Cs+y(Y#vY>ZXRr+)jqYlL~c`l==Tf3gjA5n z|5GE<*50Y!e$c?tbb{2%AV{)|260c7SENku2eqS06ZeA-kSe_ZRh6nrA5*3zt5S{j zT==pZ$a>vmc~FzwA!aum&l#U5B=^DOmKtGR75*^R$@gIN=3W}vr_e} z7j;D>87wv0GyG*YkoCIB@_ezw-2}O;2+H?a{GLU~4x?9MmqlDY2qlKIJgklpj|S260h5VwWv(z|kl%oMgNbDngg`^x0#|dBUR+ zBO_1|)P@yt7OnQF)g`h~`Jvxsf(iDBsP`T&vVre7d~Ybah@z6KLDpke$vt%|7%K2| zzHU=ss|TJ&0{!yRjkLOxSd3TXbXUpgFRxT=lknb*cv;>VmdGYu%0pUX)V8!D@RgYC zs<)SRTvv1|TftL=LEG-c)r*k@!NfmvqH{ zgI}sKamlZ#T+#)kMte;kZ=X~NFAHyBpcDTxDw?F0k+WdPKkv}XBvCATEBVxFD z-=5GFHCs>k9#hT}9@QQXSwK=7cE#mX*ryiWJ}DFWogx_9D!t0`wcX)Swde_aDkqiTY#@Y)f{T$o7?3t`}cHZFNJ7 zZ-6w-G(f_>ZZJQz8%VC|1_Js-*U33GU)xuVRkj~i?pf+`;jQ2XAH2i|FZ02T0{aw{ zvvodkN-N3rfxZIghgu}Ls(^sL0y9HLVaZhm1oRcSG_-)^sscXnG8uFILx-AE>{x1B zV^leBMT8{`OkxGEl*!1aMMJ0-lB={3&{uO)^h^1mXgz8v0wqqtzS1A)_rFO?e<+|>ZQp{&- zmCM5p=r+>)V3d-lvK2f>NL0NX@0)&4^yQ!AgXj5ZPVm8VWxDps?v=EqIG$NbhXNs0 zaG}6TpWcb~EKkl;m5%Q=tZ0?LQgPzWhFp<}q1{GuRksmP9Si7zEp_)KTXeW;K#K8j zX)H?JQBg8g@JNBjPV1-TjgB@=!KUlh0XjV3T!lrWlmPxR1WzBvN}<&RWERfH zY)jE!BSZ#A!5SIkzKLGMs5R{;h;m*4@ht=nIn;6PA+QC&Zvhk*;l|?mEY70?6Ob{! zHEjlwA49rD^58&6wyU9$048PFfBNd&+*dmLCEY<2pra}H70P?Y+m4c5AV@n`~9~|~f!Q#AgMmtUgGUV-8CwTCFWW;U&@ECxCzu=bF8Mh^*;b!c|VAYQ_XM$!R zfSebQGm5}yr+R7?9$tLi);*(O(yWO#F2K0P)wW#xde1{_49p zjc&?mMvA`F{#puvTF9F-&tG#vW&LGo;{A0DXso|1O`^Z{Bljy2#$7Rgr!kXx=TjW%J*h#kI+^=-zVNmOGPVB1eI91+gN!!0ME+j zk@Bn@18Sd@ltmrnJ(_1_Ur<>qEls?YS)j32TAF~BJ4>hfX$o|O+FCa0#=gy7YO6BVlYw$uq(45kgv|h4A2Hhl@_lEo@l*A);|(fpIwARa(!S|$^DX>Mhg7G1OMrP|03v=keF9wdRuEj zMWB{x3ig%mrMJ0*hIy;gh$WZro+j(&<zS&L%1*4FUwe$9FFlVjQ z7DV-z-L?D&kf|E(p<=Is4-;7QYNgCWqh+z(P)GFoIXo1v7k?2;rl_r;5xq_Zjp%hc zawtEi2XZ_Gi=l>95Z1j96BnRaM2?8&$6Cs;xSk3R+>94K2LmW5#!Wo1l{B0Tp8$j>-ya3+D7Lr@ez!8N$$@rPEn zkdgh7l>%_%V^7X@5Xz6NT#21fdFt5%fKNR+=MHn!kF4Yknug<;EPsL9G1h{j#~~xO z9l$&QV%+U;V+YhIjLVAcKO74qWW=@uc#Uo7d$>&^nny2BLhhwR-w5D(03i4$3_gbh zhevZ_cf+9t;GEkZw>&<3ZX$|L9r&qPdFsejPaIgUQSymku>b+hxcB&1?sX|Vmx2o^ z*kU2PC$N;A>yztbqvU{S&sft4B{wzH=|g^6S7&qe7a@z^68ef zoAWGO!y1;STXOmh)v&dk3$)bo8zXcrmmx=LnR^OS%WDD1PwB{GB+EZR9v8b^WoyE& zm3{>}yH>Jf@rxK?!Q$eLOAHHWE6c5q{46Y4JPTB!oie;P-@Sc{l0yGB`{cIP4T?a9 z9<)7K*(RGYTdzbCZN0k8 z2;Uu5*-D;*RsD7J?RIAR;0^-YI@{k@XFdIOrrx_+2TbAXOQ$cw1QrSu+1^cS_ zM{PCebA>>aK2KGdEI=Y|+ydlT#YfRSCyB8aVnpJFk8ft4h#C24JPAtrrO5M-AYEzF zFGyNB>NQ0>ZM3F+U8Qd{={F>;Xy5d~+XXHxngw|%8bgqeekLFzmJdlY0Lbuc(HNd{ zWnTCX6xHMNIgnG#0hpisG$a3hWW?qIcnpBI(>94ToSu&XN~Y&N0AzZ;6@X07j{_LR zQk;-;-bBj35TK+56iHXIety>K)((Jply=Vk=?#OJplSc%NS zu6_(Z>v#p2fyCU3`NNjsB=iqpe!)p)K5EEf_*qBx7<}r5%$|`S;yxkzW8R%>d3SHc zJ!c{a?jvv-fZqWq6@MfNrc$Lk3M`; zH?pO55qCEW*Y$}ZqyjdY-2fox6?Eh+-4&@?8mTz=K!+Gp8*UjH+BI4uYQRajgwR%ac_|azT3gq z7pz3j7ZwR$#BK#&UmK7bWXV0M^nT;N*x^dw-EW-kyI%uf-<3UPOUi0&0Y>`pS70i= z>`efyyqsd7ygqz9QnnVs>F@A21!AywBK(X8LiewN)o+8a4}ii){1p6%2Nc_o7uyPo zcK{Ur1^%}@_z4dvUPNB(=b+dDpztt1k6gDiDJGD|#h{o0px`9jCU?t5zOV5$5VIOL zUUq)+_H>?)_@0zM;xL1n3AJ@s><_U(7FEg%O-s+ zB!phMND=s4bd7d!NC}%|_kX;zH`l9*^4!u8>K4gWZV}KYcuHF}s|b|Z3ig%0Mz>U} zqZ4$D-Tz_Ds`hog6mu}%;Xyb(Zu!+q9sg1C3M4VMa3Tp&=?6rws>5>Yev>{Vy6q99 zUo+{0RQgAgG=0D5O`tD)_(b(%Ld*t_yxbkgh&?|ZPjmnZtNm#11Fa|e9-z+zP;e1$ zIeAE3O<*>Fn+RM2;4T1I+t3M$f z2hnFiCtsP21D$+jvIl^CWpXSEsIN@&ALs%5W`mTM*#O$e%p>s}ESZOikz*UD>GYwJ z7NxSgqYyWO4mL`Sg%3ojdq8fLT0%N1^%;y3rTz^SM5$L%fV$+|KUrx9JI;qOTUdlU zKl@`(;McU5TL*ujz58JndfwQZ8`G>G#J-uZZU&vOeg`Uuy}PDs8O!Hjx}&fw0La(Z z{JcEpcS!LQZHWHGeEdW`S#m4r>6zFHLPkyr2tELiw*j|JM02;`Y@lyo?(Tw(=Q_XD8vW1btC&s_p3dp(Ls*^m8Yw*<>l^mJ(Z2~pf`YQmJ;O!fZ(;4}d8 z1DZu>Ub5YEIC7600rZ0a)OW9W{j2c;p9I`)dJ=7L8Zu(TQI*F7$onVkTSYXtea;11 zJ_zjuwE7?v-HjSt2vsgd(A!S$KbJ0QJcL$9HRKyyOM~SLHlIKvx?B$$pDsHoj9XAs z=W1QL1F*U{`)OTDkSn_U9c@MbWHxkxK!@3iq*su!Ou*h%{wPEA> z0T@c-S`0uM*T(>)adkr>XI zs(AEDdSGdDl(r(Igw4`c6z{dRr|qS-9({YY^-8p%ZOpghm7^Dc>StW(F|RAw9WVcq zzaab|vC3AeD%jUNexw~6bb)r~xk8{ypQl{w4B;!jp=@61ksTc z$8ti6Mfl-b`JYM0UNM#5&y^EOq~jCVH1m6?WG9GambXeDdS?|e=#W* z-9$lOF`>|-UWx=aU-I8UOJ)-dXN)$X;7uI3T1s;)oboK)5I8t&&+b-j+i3tZLp`di4Q z>!#mH^wSq4`q^%YZgg9TyQzmnH}{ih^Dv2SohH$33naR|S)!kxCDEN%N%V_5B)aRj z65airMECqnqI`U`t=+}u|*%9 XTt@ZhOSEL9L`#1s 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ν~sDf%@YEtACH1#>3SNZemn<`qxyr? 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

%`sga3MKf%9f3Q?K5MS5NV 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

xvO%~Ea4akT>DKyNCh)6EPw3>9pUL1JgnU}Tj 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¦{cHA1s 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

AmL4FAkv`F@B_RrwBiav180 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�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

59m8S=Y53Ubw#mn@&)_%D;OCF$%|<-`(y(K) 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

LREXy7>s?qHL9 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

hez84Kp2C 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