From bf6b0d77c31f20241e92fdaf6840bcc183b49eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5ns=20Nilsson?= Date: Fri, 17 May 2024 13:01:31 +0200 Subject: [PATCH] MVE conv int4: interleave im2col * Adds arm_convolve_even_s4.c that interleaves im2col buffer so that weights can be read once when unpacking. * Updates arm_nn_mat_mult_nt_t_s4.c with vld2 intrinsics. * Refactors corresponding unit tests and adds support for null bias test. Change-Id: Id5e521456a3f4cc06e74dda126abac15a58c4af8 --- ARM.CMSIS-NN.pdsc | 2 + Include/arm_nnfunctions.h | 46 +- Include/arm_nnsupportfunctions.h | 53 +- .../arm_convolve_even_s4.c | 230 ++ Source/ConvolutionFunctions/arm_convolve_s4.c | 9 +- .../arm_convolve_wrapper_s4.c | 20 +- ...arm_nn_mat_mult_nt_interleaved_t_even_s4.c | 1879 +++++++++++++++++ .../arm_nn_mat_mult_nt_t_s4.c | 322 ++- Tests/UnitTest/README.md | 3 +- .../RefactoredTestGen/JsonTemplates/conv.json | 135 ++ .../JsonTemplates/conv_null_bias.json | 114 + .../UnitTest/RefactoredTestGen/Lib/op_conv.py | 312 ++- .../Lib/op_fully_connected.py | 35 +- .../RefactoredTestGen/Lib/op_utils.py | 13 +- Tests/UnitTest/RefactoredTestGen/Lib/test.py | 14 +- .../RefactoredTestGen/Lib/test_suite.py | 1 + .../UnitTest/RefactoredTestGen/test_plan.json | 350 ++- .../TestData/basic_2_int4/config_data.h | 29 +- .../TestCases/TestData/basic_2_int4/input.h | 66 + .../TestData/basic_2_int4/input_bias.h | 8 + .../TestData/basic_2_int4/input_weights.h | 49 + .../TestCases/TestData/basic_2_int4/output.h | 99 + .../TestData/basic_2_int4/output_multiplier.h | 22 + .../TestData/basic_2_int4/output_shift.h | 6 + .../TestData/basic_2_int4/test_data.h | 14 +- .../TestData/basic_int4/biases_data.h | 4 +- .../TestData/basic_int4/config_data.h | 29 +- .../TestCases/TestData/basic_int4/input.h | 8 + .../TestData/basic_int4/input_bias.h | 8 + .../TestData/basic_int4/input_data.h | 10 +- .../TestData/basic_int4/input_weights.h | 8 + .../TestCases/TestData/basic_int4/output.h | 9 + .../TestData/basic_int4/output_mult_data.h | 6 +- .../TestData/basic_int4/output_multiplier.h | 8 + .../TestData/basic_int4/output_ref_data.h | 8 +- .../TestData/basic_int4/output_shift.h | 6 + .../TestData/basic_int4/output_shift_data.h | 6 +- .../TestCases/TestData/basic_int4/test_data.h | 14 +- .../TestData/basic_int4/weights_data.h | 6 +- .../TestData/conv_1_x_n_1_int4/config_data.h | 31 +- .../TestData/conv_1_x_n_1_int4/input.h | 6 + .../TestData/conv_1_x_n_1_int4/input_bias.h | 8 + .../conv_1_x_n_1_int4/input_weights.h | 9 + .../TestData/conv_1_x_n_1_int4/output.h | 8 + .../conv_1_x_n_1_int4/output_multiplier.h | 8 + .../TestData/conv_1_x_n_1_int4/output_shift.h | 6 + .../TestData/conv_1_x_n_1_int4/test_data.h | 14 +- .../TestData/conv_1_x_n_2_int4/config_data.h | 27 +- .../TestData/conv_1_x_n_2_int4/input.h | 69 + .../TestData/conv_1_x_n_2_int4/input_bias.h | 8 + .../conv_1_x_n_2_int4/input_weights.h | 21 + .../TestData/conv_1_x_n_2_int4/output.h | 28 + .../conv_1_x_n_2_int4/output_multiplier.h | 8 + .../TestData/conv_1_x_n_2_int4/output_shift.h | 6 + .../TestData/conv_1_x_n_2_int4/test_data.h | 14 +- .../TestData/conv_1_x_n_3_int4/config_data.h | 29 +- .../TestData/conv_1_x_n_3_int4/input.h | 69 + .../TestData/conv_1_x_n_3_int4/input_bias.h | 8 + .../conv_1_x_n_3_int4/input_weights.h | 13 + .../TestData/conv_1_x_n_3_int4/output.h | 15 + .../conv_1_x_n_3_int4/output_multiplier.h | 8 + .../TestData/conv_1_x_n_3_int4/output_shift.h | 6 + .../TestData/conv_1_x_n_3_int4/test_data.h | 14 +- .../TestData/conv_1_x_n_4_int4/config_data.h | 29 +- .../TestData/conv_1_x_n_4_int4/input.h | 9 + .../TestData/conv_1_x_n_4_int4/input_bias.h | 8 + .../conv_1_x_n_4_int4/input_weights.h | 9 + .../TestData/conv_1_x_n_4_int4/output.h | 9 + .../conv_1_x_n_4_int4/output_multiplier.h | 8 + .../TestData/conv_1_x_n_4_int4/output_shift.h | 6 + .../TestData/conv_1_x_n_4_int4/test_data.h | 14 +- .../TestData/conv_1_x_n_5_int4/config_data.h | 29 +- .../TestData/conv_1_x_n_5_int4/input.h | 9 + .../TestData/conv_1_x_n_5_int4/input_bias.h | 8 + .../conv_1_x_n_5_int4/input_weights.h | 8 + .../TestData/conv_1_x_n_5_int4/output.h | 8 + .../conv_1_x_n_5_int4/output_multiplier.h | 8 + .../TestData/conv_1_x_n_5_int4/output_shift.h | 6 + .../TestData/conv_1_x_n_5_int4/test_data.h | 14 +- .../TestData/conv_2_int4/config_data.h | 29 +- .../TestCases/TestData/conv_2_int4/input.h | 8 + .../TestData/conv_2_int4/input_bias.h | 8 + .../TestData/conv_2_int4/input_weights.h | 10 + .../TestCases/TestData/conv_2_int4/output.h | 11 + .../TestData/conv_2_int4/output_multiplier.h | 8 + .../TestData/conv_2_int4/output_shift.h | 6 + .../TestData/conv_2_int4/test_data.h | 14 +- .../config_data.h | 29 +- .../conv_2x2_dilation_5x5_input_int4/input.h | 9 + .../input_bias.h | 8 + .../input_weights.h | 9 + .../conv_2x2_dilation_5x5_input_int4/output.h | 10 + .../output_multiplier.h | 8 + .../output_shift.h | 6 + .../test_data.h | 14 +- .../conv_2x2_dilation_int4/config_data.h | 29 +- .../TestData/conv_2x2_dilation_int4/input.h | 16 + .../conv_2x2_dilation_int4/input_bias.h | 8 + .../conv_2x2_dilation_int4/input_weights.h | 9 + .../TestData/conv_2x2_dilation_int4/output.h | 11 + .../output_multiplier.h | 8 + .../conv_2x2_dilation_int4/output_shift.h | 6 + .../conv_2x2_dilation_int4/test_data.h | 14 +- .../conv_2x3_dilation_int4/config_data.h | 29 +- .../TestData/conv_2x3_dilation_int4/input.h | 7 + .../conv_2x3_dilation_int4/input_bias.h | 8 + .../conv_2x3_dilation_int4/input_weights.h | 9 + .../TestData/conv_2x3_dilation_int4/output.h | 9 + .../output_multiplier.h | 8 + .../conv_2x3_dilation_int4/output_shift.h | 6 + .../conv_2x3_dilation_int4/test_data.h | 14 +- .../TestData/conv_3_int4/config_data.h | 27 +- .../TestCases/TestData/conv_3_int4/input.h | 84 + .../TestData/conv_3_int4/input_bias.h | 8 + .../TestData/conv_3_int4/input_weights.h | 11 + .../TestCases/TestData/conv_3_int4/output.h | 19 + .../TestData/conv_3_int4/output_multiplier.h | 8 + .../TestData/conv_3_int4/output_shift.h | 6 + .../TestData/conv_3_int4/test_data.h | 14 +- .../conv_3x2_dilation_int4/config_data.h | 29 +- .../TestData/conv_3x2_dilation_int4/input.h | 7 + .../conv_3x2_dilation_int4/input_bias.h | 8 + .../conv_3x2_dilation_int4/input_weights.h | 9 + .../TestData/conv_3x2_dilation_int4/output.h | 8 + .../output_multiplier.h | 8 + .../conv_3x2_dilation_int4/output_shift.h | 6 + .../conv_3x2_dilation_int4/test_data.h | 14 +- .../biases_data.h | 6 +- .../config_data.h | 35 +- .../conv_3x3_dilation_5x5_input_int4/input.h | 12 + .../input_bias.h | 8 + .../input_data.h | 43 +- .../input_weights.h | 10 + .../conv_3x3_dilation_5x5_input_int4/output.h | 10 + .../output_mult_data.h | 6 +- .../output_multiplier.h | 8 + .../output_ref_data.h | 22 +- .../output_shift.h | 6 + .../output_shift_data.h | 6 +- .../test_data.h | 14 +- .../weights_data.h | 9 +- .../TestData/conv_4_int4/config_data.h | 29 +- .../TestCases/TestData/conv_4_int4/input.h | 10 + .../TestData/conv_4_int4/input_bias.h | 8 + .../TestData/conv_4_int4/input_weights.h | 9 + .../TestCases/TestData/conv_4_int4/output.h | 8 + .../TestData/conv_4_int4/output_multiplier.h | 8 + .../TestData/conv_4_int4/output_shift.h | 6 + .../TestData/conv_4_int4/test_data.h | 14 +- .../TestData/conv_5_int4/config_data.h | 27 +- .../TestCases/TestData/conv_5_int4/input.h | 869 ++++++++ .../TestData/conv_5_int4/input_bias.h | 8 + .../TestData/conv_5_int4/input_weights.h | 34 + .../TestCases/TestData/conv_5_int4/output.h | 10 + .../TestData/conv_5_int4/output_multiplier.h | 8 + .../TestData/conv_5_int4/output_shift.h | 6 + .../TestData/conv_5_int4/test_data.h | 14 +- .../conv_dilation_golden_int4/config_data.h | 29 +- .../conv_dilation_golden_int4/input.h | 7 + .../conv_dilation_golden_int4/input_bias.h | 8 + .../conv_dilation_golden_int4/input_weights.h | 8 + .../conv_dilation_golden_int4/output.h | 11 + .../output_multiplier.h | 8 + .../conv_dilation_golden_int4/output_shift.h | 6 + .../conv_dilation_golden_int4/test_data.h | 14 +- .../conv_out_activation_int4/config_data.h | 29 +- .../TestData/conv_out_activation_int4/input.h | 8 + .../conv_out_activation_int4/input_bias.h | 8 + .../conv_out_activation_int4/input_weights.h | 10 + .../conv_out_activation_int4/output.h | 9 + .../output_multiplier.h | 8 + .../conv_out_activation_int4/output_shift.h | 6 + .../conv_out_activation_int4/test_data.h | 14 +- .../TestData/int16xint8_spill/bias.h | 2 +- .../TestData/int16xint8_spill/config_data.h | 4 +- .../TestData/int16xint8_spill/input.h | 590 +++--- .../TestData/int16xint8_spill/output.h | 13 +- .../int16xint8_spill/output_multiplier.h | 2 +- .../TestData/int16xint8_spill/output_shift.h | 2 +- .../TestData/int16xint8_spill/weights.h | 1876 ++++++++-------- .../TestData/kernel1x1_int4/config_data.h | 27 +- .../TestCases/TestData/kernel1x1_int4/input.h | 41 + .../TestData/kernel1x1_int4/input_bias.h | 8 + .../TestData/kernel1x1_int4/input_weights.h | 11 + .../TestData/kernel1x1_int4/output.h | 19 + .../kernel1x1_int4/output_multiplier.h | 9 + .../TestData/kernel1x1_int4/output_shift.h | 6 + .../TestData/kernel1x1_int4/test_data.h | 14 +- .../TestData/kernel1x1_int4_2/config_data.h | 31 +- .../TestData/kernel1x1_int4_2/input.h | 9 + .../TestData/kernel1x1_int4_2/input_bias.h | 11 + .../TestData/kernel1x1_int4_2/input_weights.h | 87 + .../TestData/kernel1x1_int4_2/output.h | 11 + .../kernel1x1_int4_2/output_multiplier.h | 15 + .../TestData/kernel1x1_int4_2/output_shift.h | 9 + .../TestData/kernel1x1_int4_2/test_data.h | 14 +- .../TestData/kernel1x1_int4_3/config_data.h | 29 +- .../TestData/kernel1x1_int4_3/input.h | 47 + .../TestData/kernel1x1_int4_3/input_bias.h | 11 + .../TestData/kernel1x1_int4_3/input_weights.h | 27 + .../TestData/kernel1x1_int4_3/output.h | 110 + .../kernel1x1_int4_3/output_multiplier.h | 14 + .../TestData/kernel1x1_int4_3/output_shift.h | 8 + .../TestData/kernel1x1_int4_3/test_data.h | 14 +- .../kernel1x1_stride_x_int4/config_data.h | 29 +- .../TestData/kernel1x1_stride_x_int4/input.h | 19 + .../kernel1x1_stride_x_int4/input_bias.h | 8 + .../kernel1x1_stride_x_int4/input_weights.h | 9 + .../TestData/kernel1x1_stride_x_int4/output.h | 10 + .../output_multiplier.h | 12 + .../kernel1x1_stride_x_int4/output_shift.h | 6 + .../kernel1x1_stride_x_int4/test_data.h | 14 +- .../kernel1x1_stride_x_y_1_int4/config_data.h | 27 +- .../kernel1x1_stride_x_y_1_int4/input.h | 10 + .../kernel1x1_stride_x_y_1_int4/input_bias.h | 8 + .../input_weights.h | 9 + .../kernel1x1_stride_x_y_1_int4/output.h | 9 + .../output_multiplier.h | 12 + .../output_shift.h | 6 + .../kernel1x1_stride_x_y_1_int4/test_data.h | 14 +- .../kernel1x1_stride_x_y_2_int4/config_data.h | 29 +- .../kernel1x1_stride_x_y_2_int4/input.h | 10 + .../kernel1x1_stride_x_y_2_int4/input_bias.h | 8 + .../input_weights.h | 8 + .../kernel1x1_stride_x_y_2_int4/output.h | 9 + .../output_multiplier.h | 12 + .../output_shift.h | 6 + .../kernel1x1_stride_x_y_2_int4/test_data.h | 14 +- .../kernel1x1_stride_x_y_int4/config_data.h | 29 +- .../kernel1x1_stride_x_y_int4/input.h | 57 + .../kernel1x1_stride_x_y_int4/input_bias.h | 9 + .../kernel1x1_stride_x_y_int4/input_weights.h | 16 + .../kernel1x1_stride_x_y_int4/output.h | 15 + .../output_multiplier.h | 22 + .../kernel1x1_stride_x_y_int4/output_shift.h | 6 + .../kernel1x1_stride_x_y_int4/test_data.h | 14 +- .../TestData/stride2pad1_int4/config_data.h | 29 +- .../TestData/stride2pad1_int4/input.h | 9 + .../TestData/stride2pad1_int4/input_bias.h | 8 + .../TestData/stride2pad1_int4/input_weights.h | 8 + .../TestData/stride2pad1_int4/output.h | 8 + .../stride2pad1_int4/output_multiplier.h | 8 + .../TestData/stride2pad1_int4/output_shift.h | 6 + .../TestData/stride2pad1_int4/test_data.h | 14 +- 244 files changed, 8225 insertions(+), 2068 deletions(-) create mode 100644 Source/ConvolutionFunctions/arm_convolve_even_s4.c create mode 100644 Source/NNSupportFunctions/arm_nn_mat_mult_nt_interleaved_t_even_s4.c create mode 100644 Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv.json create mode 100644 Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv_null_bias.json create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_2_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/basic_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_4_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_5_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_shift.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_bias.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_weights.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_multiplier.h create mode 100644 Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_shift.h diff --git a/ARM.CMSIS-NN.pdsc b/ARM.CMSIS-NN.pdsc index 1ee43b66..4221fbf0 100644 --- a/ARM.CMSIS-NN.pdsc +++ b/ARM.CMSIS-NN.pdsc @@ -61,6 +61,7 @@ + @@ -107,6 +108,7 @@ + diff --git a/Include/arm_nnfunctions.h b/Include/arm_nnfunctions.h index 5e8c5bd5..fd3fdd18 100644 --- a/Include/arm_nnfunctions.h +++ b/Include/arm_nnfunctions.h @@ -21,8 +21,8 @@ * Title: arm_nnfunctions.h * Description: Public header file for CMSIS NN Library * - * $Date: 23 April 2024 - * $Revision: V.16.0.0 + * $Date: 04 Jun 2024 + * $Revision: V.16.1.0 * * Target : Arm(R) M-Profile Architecture * -------------------------------------------------------------------- */ @@ -354,6 +354,48 @@ arm_cmsis_nn_status arm_convolve_s4(const cmsis_nn_context *ctx, const int32_t *bias_data, const cmsis_nn_dims *output_dims, int8_t *output_data); + +/** + * @brief Basic s4 convolution function with a requirement of even number of kernels. + * @param[in, out] ctx Function context that contains the additional buffer if required by the function. + * arm_convolve_s4_get_buffer_size will return the buffer_size if required. + * The caller is expected to clear the buffer ,if applicable, for security reasons. + * @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. Note the product must be even. + * @param[in] filter_data Packed Filter data pointer. Data type: int8 packed with 2x int4 + * @param[in] bias_dims Bias tensor dimensions. Format: [C_OUT] + * @param[in] bias_data Optional 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_CMSIS_NN_SUCCESS if successful or + * ARM_CMSIS_NN_ARG_ERROR if incorrect arguments or + * ARM_CMSIS_NN_NO_IMPL_ERROR if not for MVE + * + * @details + * 1. Supported framework: TensorFlow Lite micro + * 2. Additional memory is required for optimization. Refer to argument 'ctx' for details. + * + */ +arm_cmsis_nn_status arm_convolve_even_s4(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 int8_t *input_data, + const cmsis_nn_dims *filter_dims, + const int8_t *filter_data, + const cmsis_nn_dims *bias_dims, + const int32_t *bias_data, + const cmsis_nn_dims *output_dims, + int8_t *output_data); + /** * @brief Basic s8 convolution function * @param[in, out] ctx Function context that contains the additional buffer if required by the function. diff --git a/Include/arm_nnsupportfunctions.h b/Include/arm_nnsupportfunctions.h index cb94d649..854a87f3 100644 --- a/Include/arm_nnsupportfunctions.h +++ b/Include/arm_nnsupportfunctions.h @@ -21,8 +21,8 @@ * Title: arm_nnsupportfunctions.h * Description: Public header file of support functions for CMSIS NN Library * - * $Date: 30 April 2024 - * $Revision: V.22.0.0 + * $Date: 27 May 2024 + * $Revision: V.22.1.0 * * Target : Arm(R) M-Profile Architecture * -------------------------------------------------------------------- */ @@ -461,6 +461,55 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s4(const int8_t *lhs, const int32_t activation_max, const int32_t lhs_cols_offset); +/** + * @brief General Matrix-multiplication function with per-channel requantization. + * This function assumes: + * - LHS input matrix NOT transposed (nt) + * - RHS input matrix transposed (t) + * - RHS is int8 packed with 2x int4 + * - LHS is int8 + * - LHS/RHS input columns must be even numbered + * - LHS must be interleaved. Compare to arm_nn_mat_mult_nt_t_s4 where LHS is not interleaved. + * + * @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. Note this must be even. + * @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 + * @param[in] lhs_cols_offset Column offset between subsequent lhs_rows + * + * @return The function returns ARM_CMSIS_NN_SUCCESS + * + */ +arm_cmsis_nn_status arm_nn_mat_mult_nt_interleaved_t_even_s4(const int8_t *lhs, + const int8_t *rhs, + const int32_t *bias, + int8_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, + const int32_t lhs_cols_offset); + /** * @brief General Matrix-multiplication function with per-channel requantization. * This function assumes: diff --git a/Source/ConvolutionFunctions/arm_convolve_even_s4.c b/Source/ConvolutionFunctions/arm_convolve_even_s4.c new file mode 100644 index 00000000..c514ba20 --- /dev/null +++ b/Source/ConvolutionFunctions/arm_convolve_even_s4.c @@ -0,0 +1,230 @@ +/* + * SPDX-FileCopyrightText: Copyright 2023-2024 Arm Limited and/or its affiliates + * + * 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_even_s4.c + * Description: s8 version of convolution using symmetric quantization with 4 bit weights. + * + * $Date: 05 Jun 2024 + * $Revision: V.1.0.0 + * + * Target : Arm(R) M-Profile Architecture + * + * -------------------------------------------------------------------- */ + +#include "arm_nnfunctions.h" +#include "arm_nnsupportfunctions.h" + +/** + * @ingroup Public + */ + +/** + * @addtogroup NNConv + * @{ + */ + +/* + * Basic s8 convolution function with int4 packed RHS (weights) and even RHS columns, + * + * Refer header file for details. + * + */ +arm_cmsis_nn_status arm_convolve_even_s4(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 int8_t *input_data, + const cmsis_nn_dims *filter_dims, + const int8_t *packed_filter_data, + const cmsis_nn_dims *bias_dims, + const int32_t *bias_data, + const cmsis_nn_dims *output_dims, + int8_t *output_data) +{ + (void)bias_dims; + +#if defined(ARM_MATH_MVEI) + + if (ctx->buf == NULL) + { + return ARM_CMSIS_NN_ARG_ERROR; + } + + int16_t *buffer_a = (int16_t *)ctx->buf; + + const int32_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 dilation_x = conv_params->dilation.w; + const int32_t dilation_y = conv_params->dilation.h; + 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; + const int32_t rhs_cols = kernel_x * kernel_y * input_ch; + const int32_t input_offset = conv_params->input_offset; + + if (rhs_cols & 0x1) + { + return ARM_CMSIS_NN_ARG_ERROR; + } + + const int32_t blk_cnt = rhs_cols >> 5; + + 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++) + { + /* Generate up to four columns from the input tensor a GEMM computation */ + int8_t *im2col_buf = (int8_t *)buffer_a; + const int32_t rhs_rows = output_dims->c; + int8_t *out = output_data; + int32_t lhs_rows = 0; + + /* 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++) + { + const int32_t base_idx_x = stride_x * i_out_x - pad_x; + const int32_t base_idx_y = stride_y * i_out_y - pad_y; + + for (int32_t i_ker_y = 0; i_ker_y < kernel_y; i_ker_y++) + { + for (int32_t i_ker_x = 0; i_ker_x < kernel_x; i_ker_x++) + { + const int32_t k_y = base_idx_y + dilation_y * i_ker_y; + const int32_t k_x = base_idx_x + dilation_x * i_ker_x; + + if (k_y < 0 || k_y >= input_y || k_x < 0 || k_x >= input_x) + { + arm_memset_s8(im2col_buf, (int8_t)-input_offset, sizeof(int8_t) * input_ch); + } + else + { + arm_memcpy_s8(im2col_buf, input_data + (k_y * input_x + k_x) * input_ch, input_ch); + } + im2col_buf += input_ch; + } + } + + /* Reformat most of the buffer by interleaving it */ + int8_t *im2col_buf_interleaved = (int8_t *)buffer_a + lhs_rows * rhs_cols; + for (int j = blk_cnt; j > 0; --j) + { + int8x16x2_t x2 = vld2q_s8(im2col_buf_interleaved); + + vstrbq_s8(im2col_buf_interleaved, x2.val[1]); + im2col_buf_interleaved += 16; + + vstrbq_s8(im2col_buf_interleaved, x2.val[0]); + im2col_buf_interleaved += 16; + } + + lhs_rows++; + + /* Computation is filed for every 4 columns */ + if (lhs_rows == 4) + { + arm_nn_mat_mult_nt_interleaved_t_even_s4((int8_t *)buffer_a, + packed_filter_data, + bias_data, + out, + output_mult, + output_shift, + lhs_rows, + rhs_rows, + rhs_cols, + input_offset, + out_offset, + out_activation_min, + out_activation_max, + rhs_cols); + + out += lhs_rows * rhs_rows; + + lhs_rows = 0; + im2col_buf = (int8_t *)buffer_a; + } + } + } + + /* Handle left over columns */ + if (lhs_rows != 0) + { + arm_nn_mat_mult_nt_interleaved_t_even_s4((int8_t *)buffer_a, + packed_filter_data, + bias_data, + out, + output_mult, + output_shift, + lhs_rows, + rhs_rows, + rhs_cols, + input_offset, + out_offset, + out_activation_min, + out_activation_max, + rhs_cols); + out += lhs_rows * rhs_rows; + lhs_rows = 0; + im2col_buf = (int8_t *)buffer_a; + } + + /* Advance to the next batch */ + input_data += (input_x * input_y * input_ch); + output_data += (output_x * output_y * output_ch); + } +#else + (void)ctx; + (void)conv_params; + (void)quant_params; + (void)input_dims; + (void)input_data; + (void)filter_dims; + (void)packed_filter_data; + (void)bias_data; + (void)output_dims; + (void)output_data; + + return ARM_CMSIS_NN_NO_IMPL_ERROR; + +#endif // #if defined(ARM_MATH_MVEI) + + /* Return to application */ + return ARM_CMSIS_NN_SUCCESS; +} + +/** + * @} end of NNConv group + */ diff --git a/Source/ConvolutionFunctions/arm_convolve_s4.c b/Source/ConvolutionFunctions/arm_convolve_s4.c index aaddc435..acf4ce4a 100644 --- a/Source/ConvolutionFunctions/arm_convolve_s4.c +++ b/Source/ConvolutionFunctions/arm_convolve_s4.c @@ -21,8 +21,8 @@ * Title: arm_convolve_s4.c * Description: s8 version of convolution using symmetric quantization with 4 bit weights. * - * $Date: 10 April 2024 - * $Revision: V.1.1.0 + * $Date: 17 May 2024 + * $Revision: V.1.2.0 * * Target : Arm(R) M-Profile Architecture * @@ -153,11 +153,6 @@ arm_cmsis_nn_status arm_convolve_s4(const cmsis_nn_context *ctx, im2col_buf = (int8_t *)buffer_a; } } - - if (out == NULL) - { - return ARM_CMSIS_NN_NO_IMPL_ERROR; - } } /* Handle left over columns */ diff --git a/Source/ConvolutionFunctions/arm_convolve_wrapper_s4.c b/Source/ConvolutionFunctions/arm_convolve_wrapper_s4.c index 89d3e49d..6c757767 100644 --- a/Source/ConvolutionFunctions/arm_convolve_wrapper_s4.c +++ b/Source/ConvolutionFunctions/arm_convolve_wrapper_s4.c @@ -22,8 +22,8 @@ * Description: s4 convolution layer wrapper function with the main purpose to call the optimal kernel available in * cmsis-nn to perform the convolution. See header files for details. * - * $Date: 10 April 2024 - * $Revision: V.1.1.0 + * $Date: 27 May 2024 + * $Revision: V.1.2.0 * * Target : Arm(R) M-Profile Architecture * @@ -106,6 +106,22 @@ arm_cmsis_nn_status arm_convolve_wrapper_s4(const cmsis_nn_context *ctx, output_dims, output_data); } +#if defined(ARM_MATH_MVEI) + else if (((filter_dims->h * filter_dims->w * input_dims->c) & 0x1) == 0) + { + return arm_convolve_even_s4(ctx, + conv_params, + quant_params, + input_dims, + input_data, + filter_dims, + filter_data, + bias_dims, + bias_data, + output_dims, + output_data); + } +#endif else { return arm_convolve_s4(ctx, diff --git a/Source/NNSupportFunctions/arm_nn_mat_mult_nt_interleaved_t_even_s4.c b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_interleaved_t_even_s4.c new file mode 100644 index 00000000..d3486d36 --- /dev/null +++ b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_interleaved_t_even_s4.c @@ -0,0 +1,1879 @@ +/* + * SPDX-FileCopyrightText: Copyright 2023-2024 Arm Limited and/or its affiliates + * + * 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_nt_interleaved_t_even_s4 + * Description: Matrix multiplication support function with the right-hand-side (rhs) matrix transposed, and 4 bit rhs. + * + * $Date: 04 Jun 2024 + * $Revision: V.1.0.0 + * + * Target : Arm(R) M-Profile Architecture + * + * -------------------------------------------------------------------- */ + +#include "arm_nnsupportfunctions.h" + +/** + * @ingroup groupSupport + */ + +/** + * @addtogroup supportConvolution + * @{ + */ + +/* + * s4 matrix multiplication with the left-hand side interleaved and the right-hand-side matrix transposed and columns + * even + * + * Refer header file for details. + * + */ +arm_cmsis_nn_status arm_nn_mat_mult_nt_interleaved_t_even_s4(const int8_t *lhs, + const int8_t *packed_rhs, + const int32_t *bias, + int8_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, + const int32_t lhs_cols_offset) +{ +#if defined(ARM_MATH_MVEI) + + const int rhs_cols_offset = rhs_cols % 16; + const int32_t blk_cnt = rhs_cols >> 5; + const mve_pred16_t lower_nibble_mask = 21845; // 0101010101010101 + const uint8x16_t gather_offset = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; + const uint32x4_t scatter_offset = {0, (uint32_t)rhs_rows, (uint32_t)rhs_rows * 2, (uint32_t)rhs_rows * 3}; + const int I6_elements_spill = rhs_cols & 0x10; + + int i_items = 0; + + for (; i_items <= (lhs_rows - 4); i_items += 4) + { + int8_t const *col_base = packed_rhs; + + for (int i = 0; i < rhs_rows; i++) + { + int32_t acc_n0 = 0; + int32_t acc_n1 = 0; + int32_t acc_n2 = 0; + int32_t acc_n3 = 0; + + int32_t sum_tmp = 0; + + int8_t const *ip_row_0 = lhs; + int8_t const *ip_row_1 = lhs + lhs_cols_offset; + int8_t const *ip_row_2 = lhs + (2 * lhs_cols_offset); + int8_t const *ip_row_3 = lhs + (3 * lhs_cols_offset); + + const mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16_t lhs_high, lhs_low; + + lhs_high = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + lhs_low = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_low); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + lhs_low = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, ker_low, lhs_low); + acc_n1 = vmladavaq_s8(acc_n1, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + lhs_low = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + acc_n2 = vmladavaq_s8(acc_n2, ker_low, lhs_low); + acc_n2 = vmladavaq_s8(acc_n2, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_3); + ip_row_3 += 16; + lhs_low = vldrbq_s8(ip_row_3); + ip_row_3 += 16; + acc_n3 = vmladavaq_s8(acc_n3, ker_low, lhs_low); + acc_n3 = vmladavaq_s8(acc_n3, ker_high, lhs_high); + + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + acc_n2 = vmladavaq_s8(acc_n2, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_3); + ip_row_3 += 16; + acc_n3 = vmladavaq_s8(acc_n3, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += rhs_cols_offset >> 1; + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_1, rmdr_mask); + acc_n1 = vmladavaq_p_s8(acc_n1, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_2, rmdr_mask); + acc_n2 = vmladavaq_p_s8(acc_n2, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_3, rmdr_mask); + acc_n3 = vmladavaq_p_s8(acc_n3, col_vec, lhs_vec, rmdr_mask); + } + + int32x4_t res = {acc_n0, acc_n1, acc_n2, acc_n3}; + sum_tmp *= lhs_offset; + if (bias) + { + sum_tmp += bias[i]; + } + res = vaddq_n_s32(res, sum_tmp); + + res = arm_requantize_mve(res, dst_multipliers[i], dst_shifts[i]); + res = vaddq_n_s32(res, dst_offset); + + res = vmaxq_s32(res, vdupq_n_s32(activation_min)); + res = vminq_s32(res, vdupq_n_s32(activation_max)); + + vstrbq_scatter_offset_s32(dst, scatter_offset, res); + dst++; + } + lhs += 4 * lhs_cols_offset; + dst += (3 * rhs_rows); + } + + if (lhs_rows % 4 == 3) + { + int8_t const *col_base = packed_rhs; + const mve_pred16_t requant_mask = vctp32q(3); + for (int i = 0; i < rhs_rows; i++) + { + int32_t acc_n0 = 0; + int32_t acc_n1 = 0; + int32_t acc_n2 = 0; + + int8_t const *ip_row_0 = lhs; + int8_t const *ip_row_1 = lhs + lhs_cols_offset; + int8_t const *ip_row_2 = lhs + (2 * lhs_cols_offset); + int32_t sum_tmp = 0; + + mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16_t lhs_high, lhs_low; + + lhs_high = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + lhs_low = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_low); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + lhs_low = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, ker_low, lhs_low); + acc_n1 = vmladavaq_s8(acc_n1, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + lhs_low = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + acc_n2 = vmladavaq_s8(acc_n2, ker_low, lhs_low); + acc_n2 = vmladavaq_s8(acc_n2, ker_high, lhs_high); + + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_2); + ip_row_2 += 16; + acc_n2 = vmladavaq_s8(acc_n2, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += rhs_cols_offset >> 1; + col_vec = vrshlq_m_n_s8(col_vec, 4, (lower_nibble_mask & rmdr_mask)); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_1, rmdr_mask); + acc_n1 = vmladavaq_p_s8(acc_n1, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_2, rmdr_mask); + acc_n2 = vmladavaq_p_s8(acc_n2, col_vec, lhs_vec, rmdr_mask); + } + + int32x4_t res = {acc_n0, acc_n1, acc_n2, 0}; + sum_tmp *= lhs_offset; + if (bias) + { + sum_tmp += bias[i]; + } + + res = vaddq_x_n_s32(res, sum_tmp, requant_mask); + + res = arm_requantize_mve_pred(res, dst_multipliers[i], dst_shifts[i], requant_mask); + res = vaddq_x_n_s32(res, dst_offset, requant_mask); + + res = vmaxq_x_s32(res, vdupq_n_s32(activation_min), requant_mask); + res = vminq_x_s32(res, vdupq_n_s32(activation_max), requant_mask); + + vstrbq_scatter_offset_p_s32(dst, scatter_offset, res, requant_mask); + dst++; + } + lhs += 3 * lhs_cols_offset; + dst += (2 * rhs_rows); + } + + if (lhs_rows % 4 == 2) + { + int8_t const *col_base = packed_rhs; + const mve_pred16_t requant_mask = vctp32q(2); + + for (int i = 0; i < rhs_rows; i++) + { + int32_t acc_n0 = 0; + int32_t acc_n1 = 0; + + int8_t const *ip_row_0 = lhs; + int8_t const *ip_row_1 = lhs + lhs_cols_offset; + int32_t sum_tmp = 0; + + mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16_t lhs_high, lhs_low; + + lhs_high = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + lhs_low = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_low); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_high); + + lhs_high = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + lhs_low = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + + acc_n1 = vmladavaq_s8(acc_n1, ker_low, lhs_low); + acc_n1 = vmladavaq_s8(acc_n1, ker_high, lhs_high); + + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += rhs_cols_offset >> 1; + col_vec = vrshlq_m_n_s8(col_vec, 4, (lower_nibble_mask & rmdr_mask)); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_1, rmdr_mask); + acc_n1 = vmladavaq_p_s8(acc_n1, col_vec, lhs_vec, rmdr_mask); + } + + int32x4_t res = {acc_n0, acc_n1, 0, 0}; + sum_tmp *= lhs_offset; + if (bias) + { + sum_tmp += bias[i]; + } + + res = vaddq_x_n_s32(res, sum_tmp, requant_mask); + + res = arm_requantize_mve_pred(res, dst_multipliers[i], dst_shifts[i], requant_mask); + res = vaddq_x_n_s32(res, dst_offset, requant_mask); + + res = vmaxq_x_s32(res, vdupq_n_s32(activation_min), requant_mask); + res = vminq_x_s32(res, vdupq_n_s32(activation_max), requant_mask); + + vstrbq_scatter_offset_p_s32(dst, scatter_offset, res, requant_mask); + dst++; + } + lhs += 2 * lhs_cols_offset; + dst += (2 * rhs_rows); + } + + if (lhs_rows % 4 == 1) + { + int32_t acc[4]; + const int32_t *multipliers = dst_multipliers; + const int32_t *shifts = dst_shifts; + const int8_t *col_base = packed_rhs; + int col_inc = rhs_cols_offset >> 1; + + for (int i = 0; i < rhs_rows; i++) + { + int32_t acc_n0 = 0; + const int8_t *ip_row_0 = lhs; + int32_t sum_tmp = 0; + mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16_t lhs_high, lhs_low; + + lhs_high = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + lhs_low = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_low); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_high); + + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += col_inc; + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + } + + sum_tmp *= lhs_offset; + sum_tmp += acc_n0; + if (bias) + { + sum_tmp += bias[i]; + } + const int32_t index = i & 0x3; + acc[index] = sum_tmp; + + if (index == 3) + { + int32x4_t res = vldrwq_s32(acc); + res = arm_requantize_mve_32x4(res, vldrwq_s32(multipliers), vldrwq_s32(shifts)); + multipliers += 4; + shifts += 4; + res = vaddq_n_s32(res, dst_offset); + res = vmaxq_s32(res, vdupq_n_s32(activation_min)); + res = vminq_s32(res, vdupq_n_s32(activation_max)); + vstrbq_s32(dst, res); + dst += 4; + } + } + lhs += lhs_cols_offset; + const int32_t tail_rows = rhs_rows & 0x3; + for (int i = 0; i < tail_rows; i++) + { + int32_t acc_n0 = acc[i]; + acc_n0 = arm_nn_requantize(acc_n0, multipliers[i], shifts[i]); + acc_n0 += dst_offset; + acc_n0 = MAX(acc_n0, activation_min); + acc_n0 = MIN(acc_n0, activation_max); + *dst++ = (int8_t)acc_n0; + } + } + +#elif defined(ARM_MATH_DSP) + const int32_t lhs_cols_off1 = lhs_cols_offset - 4; + const int16_t i16_lhs_offset = (int16_t)lhs_offset; + const uint32_t ui32_lhs_offset_i16x2 = PKHBT(i16_lhs_offset, i16_lhs_offset, 16); + const int32_t rhs_cols_int4 = rhs_cols >> 1; + + for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 4); rhs_rows_idx += 4) + { + + const int8_t *lhs_ptr = &lhs[0]; + int8_t *dst_ptr = &dst[0]; + + int32_t lhs_rows_idx = lhs_rows >> 1; + while (lhs_rows_idx) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + int32_t res01 = 0; + int32_t res10 = 0; + int32_t res11 = 0; + + int32_t spillover00 = 0; + int32_t spillover01 = 0; + int32_t spillover10 = 0; + int32_t spillover11 = 0; + + if (bias) + { + res00 = bias[rhs_rows_idx]; + res01 = bias[rhs_rows_idx + 2]; + res10 = bias[rhs_rows_idx]; + res11 = bias[rhs_rows_idx + 2]; + spillover00 = bias[rhs_rows_idx + 1]; + spillover01 = bias[rhs_rows_idx + 3]; + spillover10 = bias[rhs_rows_idx + 1]; + spillover11 = bias[rhs_rows_idx + 3]; + } + + int32_t rhs_cols_idx = 0; + + int32_t lhs_low, rhs_low0, rhs_high0, lhs_high, rhs_low1, rhs_high1; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + } + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + } + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + res10 += lhs_low * rhs_low0; + res10 += lhs_high * rhs_high0; + res11 += lhs_low * rhs_low1; + res11 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + + // 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 + 2], dst_shifts[rhs_rows_idx + 2]); + 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 + 2], dst_shifts[rhs_rows_idx + 2]); + + // 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] = (int8_t)res00; + dst_ptr[2] = (int8_t)res01; + dst_ptr += rhs_rows; + dst_ptr[0] = (int8_t)res10; + dst_ptr[2] = (int8_t)res11; + dst_ptr -= rhs_rows; + + res00 = spillover00; + res01 = spillover01; + res10 = spillover10; + res11 = spillover11; + + rhs_cols_idx = 0; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + } + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + // 4 x MAC res10, res11 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + res10 = SMLAD(rhs_low0, lhs_low, res10); + res11 = SMLAD(rhs_low1, lhs_low, res11); + res10 = SMLAD(rhs_high0, lhs_high, res10); + res11 = SMLAD(rhs_high1, lhs_high, res11); + } + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + res10 += lhs_low * rhs_low0; + res10 += lhs_high * rhs_high0; + res11 += lhs_low * rhs_low1; + res11 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + res10 = arm_nn_requantize(res10, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res11 = arm_nn_requantize(res11, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + + // 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[1] = (int8_t)res00; + dst_ptr[3] = (int8_t)res01; + dst_ptr += rhs_rows; + dst_ptr[1] = (int8_t)res10; + dst_ptr[3] = (int8_t)res11; + dst_ptr += rhs_rows; + + lhs_ptr -= rhs_cols; + lhs_ptr += 2 * lhs_cols_offset; + + lhs_rows_idx--; + } + + // Left-over rows + if (lhs_rows % 2) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + int32_t res01 = 0; + + int32_t spillover00 = 0; + int32_t spillover01 = 0; + + if (bias) + { + res00 = bias[rhs_rows_idx]; + spillover00 = bias[rhs_rows_idx + 1]; + res01 = bias[rhs_rows_idx + 2]; + spillover01 = bias[rhs_rows_idx + 3]; + } + + int32_t rhs_cols_idx = 0; + + int32_t lhs_low, rhs_low0, rhs_high0, lhs_high, rhs_low1, rhs_high1; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + } + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + } + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + + // 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 + 2], dst_shifts[rhs_rows_idx + 2]); + + // 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] = (int8_t)res00; + dst_ptr[2] = (int8_t)res01; + + res00 = spillover00; + res01 = spillover01; + + rhs_cols_idx = 0; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + } + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + read_and_pad_s4((const int8_t *)&packed_rhs_ptr[rhs_cols], &rhs_low1, &rhs_high1); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 4 x MAC res00, res01 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + res01 = SMLAD(rhs_low1, lhs_low, res01); + res01 = SMLAD(rhs_high1, lhs_high, res01); + } + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + + // 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[1] = (int8_t)res00; + dst_ptr[3] = (int8_t)res01; + } + + packed_rhs += 2 * rhs_cols; + dst += 4; + } + + const int32_t rhs_rows_finished = rhs_rows - (rhs_rows % 4); + // Left over rhs rows will be in the range 0 -> 3 + for (int rhs_rows_idx = 0; rhs_rows_idx < rhs_rows % 4; ++rhs_rows_idx) + { + const int8_t *lhs_ptr = &lhs[0]; + int8_t *dst_ptr = &dst[0]; + + int32_t lhs_rows_idx = lhs_rows >> 1; + while (lhs_rows_idx) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + int32_t res10 = 0; + + if (bias) + { + res00 = bias[rhs_rows_finished + rhs_rows_idx]; + res10 = bias[rhs_rows_finished + rhs_rows_idx]; + } + + int32_t rhs_cols_idx = 0; + + int32_t lhs_low, rhs_low0, rhs_high0, lhs_high; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + // 2 x MAC res10 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res10 = SMLAD(rhs_high0, lhs_high, res10); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + // 2 x MAC res10 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res10 = SMLAD(rhs_high0, lhs_high, res10); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + // 2 x MAC res10 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res10 = SMLAD(rhs_high0, lhs_high, res10); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + // 2 x MAC res10 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + res10 = SMLAD(rhs_low0, lhs_low, res10); + res10 = SMLAD(rhs_high0, lhs_high, res10); + } + + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + // 2 x MAC res10 + lhs_high = arm_nn_read_s8x4((const int8_t *)&lhs_ptr[lhs_cols_off1]); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + res10 = SMLAD(rhs_low0, lhs_low, res10); + res10 = SMLAD(rhs_high0, lhs_high, res10); + } + + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + res10 += lhs_low * rhs_low0; + res10 += lhs_high * rhs_high0; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + lhs_ptr += 2 * lhs_cols_offset; + + // Quantize down + res00 = arm_nn_requantize( + res00, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + res10 = arm_nn_requantize( + res10, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + + // Add offset + res00 += dst_offset; + res10 += dst_offset; + + // Clamp the result + res00 = MAX(res00, activation_min); + res00 = MIN(res00, activation_max); + res10 = MAX(res10, activation_min); + res10 = MIN(res10, activation_max); + + dst_ptr[0] = (int8_t)res00; + dst_ptr += rhs_rows; + dst_ptr[0] = (int8_t)res10; + dst_ptr += rhs_rows; + + lhs_rows_idx--; + } + if (lhs_rows % 2) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + + if (bias) + { + res00 = bias[rhs_rows_finished + rhs_rows_idx]; + } + + int32_t rhs_cols_idx = 0; + + int32_t lhs_low, rhs_low0, rhs_high0, lhs_high; + + for (; rhs_cols_idx <= (rhs_cols - 16); rhs_cols_idx += 16) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + } + + for (; rhs_cols_idx <= (rhs_cols - 4); rhs_cols_idx += 4) + { + read_and_pad_s4(packed_rhs_ptr, &rhs_low0, &rhs_high0); + packed_rhs_ptr += 2; + + lhs_high = arm_nn_read_s8x4_ia((const int8_t **)&lhs_ptr); + lhs_low = SXTAB16(ui32_lhs_offset_i16x2, lhs_high); + lhs_high = SXTAB16_RORn(ui32_lhs_offset_i16x2, lhs_high, 8); + + // 2 x MAC res00 + res00 = SMLAD(rhs_low0, lhs_low, res00); + res00 = SMLAD(rhs_high0, lhs_high, res00); + } + + for (; rhs_cols_idx <= rhs_cols - 2; rhs_cols_idx += 2) + { + rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + rhs_high0 = packed_rhs_ptr[0] >> 4; + + lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize( + res00, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + + // Add offset + res00 += dst_offset; + + // Clamp the result + res00 = MAX(res00, activation_min); + res00 = MIN(res00, activation_max); + + dst_ptr[0] = (int8_t)res00; + } + + packed_rhs += rhs_cols_int4; + + ++dst; + } +#else + + const int32_t rhs_cols_int4 = rhs_cols >> 1; + + for (int32_t rhs_rows_idx = 0; rhs_rows_idx <= (rhs_rows - 4); rhs_rows_idx += 4) + { + const int8_t *lhs_ptr = &lhs[0]; + int8_t *dst_ptr = &dst[0]; + + for (int32_t lhs_rows_idx = (lhs_rows >> 1); lhs_rows_idx > 0; --lhs_rows_idx) + { + // To avoid the issue of packed values leaking into the next rhs row + // we instead evaluate the rhs rows in pairs like so: + // rhs[0] and rhs[2], rhs[1] and rhs[3] + + // Start processing rhs_row[0] and rhs_row[2] + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + int32_t res01 = 0; + int32_t res10 = 0; + int32_t res11 = 0; + + int32_t spillover00 = 0; + int32_t spillover01 = 0; + int32_t spillover10 = 0; + int32_t spillover11 = 0; + + if (bias) + { + res00 = bias[rhs_rows_idx]; + res01 = bias[rhs_rows_idx + 2]; + res10 = bias[rhs_rows_idx]; + res11 = bias[rhs_rows_idx + 2]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high0 = packed_rhs_ptr[0] >> 4; + int8_t rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + int8_t rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + + res10 += lhs_low * rhs_low0; + res10 += lhs_high * rhs_high0; + res11 += lhs_low * rhs_low1; + res11 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + + // 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 + 2], dst_shifts[rhs_rows_idx + 2]); + 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 + 2], dst_shifts[rhs_rows_idx + 2]); + + // 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] = (int8_t)res00; + dst_ptr[2] = (int8_t)res01; + dst_ptr += rhs_rows; + dst_ptr[0] = (int8_t)res10; + dst_ptr[2] = (int8_t)res11; + dst_ptr -= rhs_rows; + + // Start processing rhs_row[1] and rhs_row[3] + res00 = spillover00; + res01 = spillover01; + res10 = spillover10; + res11 = spillover11; + if (bias) + { + res00 += bias[rhs_rows_idx + 1]; + res01 += bias[rhs_rows_idx + 3]; + res10 += bias[rhs_rows_idx + 1]; + res11 += bias[rhs_rows_idx + 3]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high0 = packed_rhs_ptr[0] >> 4; + int8_t rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + int8_t rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + + res10 += lhs_low * rhs_low0; + res10 += lhs_high * rhs_high0; + res11 += lhs_low * rhs_low1; + res11 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + res10 = arm_nn_requantize(res10, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res11 = arm_nn_requantize(res11, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + + // 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[1] = (int8_t)res00; + dst_ptr[3] = (int8_t)res01; + dst_ptr += rhs_rows; + dst_ptr[1] = (int8_t)res10; + dst_ptr[3] = (int8_t)res11; + dst_ptr += rhs_rows; + + lhs_ptr -= rhs_cols; + lhs_ptr += 2 * lhs_cols_offset; + } + + // Left-over row + if (lhs_rows % 2) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + + int32_t res00 = 0; + int32_t res01 = 0; + + int32_t spillover00 = 0; + int32_t spillover01 = 0; + + if (bias) + { + res00 += bias[rhs_rows_idx]; + res01 += bias[rhs_rows_idx + 2]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high0 = packed_rhs_ptr[0] >> 4; + + int8_t rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + int8_t rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + + // 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 + 2], dst_shifts[rhs_rows_idx + 2]); + + // 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] = (int8_t)res00; + dst_ptr[2] = (int8_t)res01; + + res00 = spillover00; + res01 = spillover01; + + if (bias) + { + res00 += bias[rhs_rows_idx + 1]; + res01 += bias[rhs_rows_idx + 3]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low0 = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high0 = packed_rhs_ptr[0] >> 4; + + int8_t rhs_low1 = (int8_t)(packed_rhs_ptr[rhs_cols] << 4) >> 4; + int8_t rhs_high1 = packed_rhs_ptr[rhs_cols] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low0; + res00 += lhs_high * rhs_high0; + + res01 += lhs_low * rhs_low1; + res01 += lhs_high * rhs_high1; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize(res00, dst_multipliers[rhs_rows_idx + 1], dst_shifts[rhs_rows_idx + 1]); + res01 = arm_nn_requantize(res01, dst_multipliers[rhs_rows_idx + 3], dst_shifts[rhs_rows_idx + 3]); + + // 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[1] = (int8_t)res00; + dst_ptr[3] = (int8_t)res01; + } + + packed_rhs += 2 * rhs_cols; + dst += 4; + } + + const int32_t rhs_rows_finished = rhs_rows - (rhs_rows % 4); + // Left over rhs rows will be in the range 0 -> 3 + for (int rhs_rows_idx = 0; rhs_rows_idx < rhs_rows % 4; ++rhs_rows_idx) + { + const int8_t *lhs_ptr = &lhs[0]; + int8_t *dst_ptr = &dst[0]; + + for (int32_t lhs_rows_idx = (lhs_rows >> 1); lhs_rows_idx > 0; --lhs_rows_idx) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + int32_t res00 = 0; + int32_t res10 = 0; + if (bias) + { + res00 = bias[rhs_rows_finished + rhs_rows_idx]; + res10 = bias[rhs_rows_finished + rhs_rows_idx]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high = packed_rhs_ptr[0] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low; + res00 += lhs_high * rhs_high; + + lhs_low = (int8_t)lhs_ptr[lhs_cols_offset] + lhs_offset; + lhs_high = (int8_t)lhs_ptr[lhs_cols_offset + 1] + lhs_offset; + + res10 += lhs_low * rhs_low; + res10 += lhs_high * rhs_high; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + lhs_ptr -= rhs_cols; + lhs_ptr += 2 * lhs_cols_offset; + + // Quantize down + res00 = arm_nn_requantize( + res00, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + res10 = arm_nn_requantize( + res10, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + + // Add offset + res00 += dst_offset; + res10 += dst_offset; + + // Clamp the result + res00 = MAX(res00, activation_min); + res00 = MIN(res00, activation_max); + res10 = MAX(res10, activation_min); + res10 = MIN(res10, activation_max); + + dst_ptr[0] = (int8_t)res00; + dst_ptr += rhs_rows; + dst_ptr[0] = (int8_t)res10; + dst_ptr += rhs_rows; + } + if (lhs_rows % 2) + { + const int8_t *packed_rhs_ptr = &packed_rhs[0]; + int32_t res00 = 0; + if (bias) + { + res00 = bias[rhs_rows_finished + rhs_rows_idx]; + } + + for (int32_t rhs_cols_idx = rhs_cols_int4; rhs_cols_idx != 0; --rhs_cols_idx) + { + int8_t rhs_low = (int8_t)(packed_rhs_ptr[0] << 4) >> 4; + int8_t rhs_high = packed_rhs_ptr[0] >> 4; + + int32_t lhs_low = (int8_t)lhs_ptr[0] + lhs_offset; + int32_t lhs_high = (int8_t)lhs_ptr[1] + lhs_offset; + + res00 += lhs_low * rhs_low; + res00 += lhs_high * rhs_high; + + ++packed_rhs_ptr; + lhs_ptr += 2; + } + + // Quantize down + res00 = arm_nn_requantize( + res00, dst_multipliers[rhs_rows_finished + rhs_rows_idx], dst_shifts[rhs_rows_finished + rhs_rows_idx]); + + // Add offset + res00 += dst_offset; + + // Clamp the result + res00 = MAX(res00, activation_min); + res00 = MIN(res00, activation_max); + + dst_ptr[0] = (int8_t)res00; + } + + packed_rhs += rhs_cols_int4; + + ++dst; + } + +#endif + + return ARM_CMSIS_NN_SUCCESS; +} + +/** + * @} end of Doxygen group + */ diff --git a/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s4.c b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s4.c index 4cc00682..7d63c80f 100644 --- a/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s4.c +++ b/Source/NNSupportFunctions/arm_nn_mat_mult_nt_t_s4.c @@ -21,8 +21,8 @@ * Title: arm_nn_mat_mult_nt_t_s4 * Description: Matrix multiplication support function with the right-hand-side (rhs) matrix transposed, and 4 bit rhs. * - * $Date: 10 April 2024 - * $Revision: V.1.1.0 + * $Date: 27 May 2024 + * $Revision: V.1.2.0 * * Target : Arm(R) M-Profile Architecture * @@ -63,14 +63,16 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s4(const int8_t *lhs, #if defined(ARM_MATH_MVEI) int i_items = 0; const int rhs_cols_offset = rhs_cols % 16; - const int32_t blk_cnt = rhs_cols >> 4; const mve_pred16_t lower_nibble_mask = 21845; // 0101010101010101 const uint8x16_t gather_offset = {0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7}; const uint32x4_t scatter_offset = {0, (uint32_t)rhs_rows, (uint32_t)rhs_rows * 2, (uint32_t)rhs_rows * 3}; + const int I6_elements_spill = rhs_cols & 0x10; for (; i_items <= (lhs_rows - 4); i_items += 4) { + const int32_t blk_cnt = rhs_cols >> 4; int8_t const *col_base = packed_rhs; + for (int i = 0; i < rhs_rows; i++) { @@ -173,13 +175,15 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s4(const int8_t *lhs, lhs += 4 * lhs_cols_offset; dst += (3 * rhs_rows); } - if (lhs_rows % 4 == 3) + + for (; i_items <= (lhs_rows - 3); i_items += 3) { int8_t const *col_base = packed_rhs; const mve_pred16_t requant_mask = vctp32q(3); + const int32_t blk_cnt = rhs_cols >> 4; + for (int i = 0; i < rhs_rows; i++) { - int32_t acc_n0 = 0; int32_t acc_n1 = 0; int32_t acc_n2 = 0; @@ -269,97 +273,230 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s4(const int8_t *lhs, lhs += 3 * lhs_cols_offset; dst += (2 * rhs_rows); } - else + + for (; i_items <= (lhs_rows - 2); i_items += 2) + { + int8_t const *col_base = packed_rhs; + const mve_pred16_t requant_mask = vctp32q(2); + const int32_t blk_cnt = rhs_cols >> 5; + + for (int i = 0; i < rhs_rows; i++) + { + int32_t acc_n0 = 0; + int32_t acc_n1 = 0; + + int8_t const *ip_row_0 = lhs; + int8_t const *ip_row_1 = lhs + lhs_cols_offset; + + int32_t sum_tmp = 0; + + mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + if ((rhs_cols & 0x1) & (i & 0x1)) + { + rmdr_mask >>= 1; + int32_t col = col_base[0] >> 4; + sum_tmp = col; + acc_n0 += ip_row_0[0] * col; + acc_n1 += ip_row_1[0] * col; + + ++col_base; + ++ip_row_0; + ++ip_row_1; + } + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16x2_t lhs_x2 = vld2q_s8(ip_row_0); + + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_x2.val[0]); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_x2.val[1]); + + lhs_x2 = vld2q_s8(ip_row_1); + acc_n1 = vmladavaq_s8(acc_n1, ker_low, lhs_x2.val[0]); + acc_n1 = vmladavaq_s8(acc_n1, ker_high, lhs_x2.val[1]); + + ip_row_0 += 32; + ip_row_1 += 32; + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + + lhs_vec = vldrbq_s8(ip_row_1); + ip_row_1 += 16; + acc_n1 = vmladavaq_s8(acc_n1, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += rhs_cols_offset >> 1; + col_vec = vrshlq_m_n_s8(col_vec, 4, (lower_nibble_mask & rmdr_mask)); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + + lhs_vec = vldrbq_z_s8(ip_row_1, rmdr_mask); + acc_n1 = vmladavaq_p_s8(acc_n1, col_vec, lhs_vec, rmdr_mask); + } + + int32x4_t res = {acc_n0, acc_n1, 0, 0}; + sum_tmp *= lhs_offset; + if (bias) + { + sum_tmp += bias[i]; + } + + res = vaddq_x_n_s32(res, sum_tmp, requant_mask); + + res = arm_requantize_mve_pred(res, dst_multipliers[i], dst_shifts[i], requant_mask); + res = vaddq_x_n_s32(res, dst_offset, requant_mask); + + res = vmaxq_x_s32(res, vdupq_n_s32(activation_min), requant_mask); + res = vminq_x_s32(res, vdupq_n_s32(activation_max), requant_mask); + + vstrbq_scatter_offset_p_s32(dst, scatter_offset, res, requant_mask); + dst++; + } + lhs += 2 * lhs_cols_offset; + dst += (2 * rhs_rows); + } + + for (; i_items < lhs_rows; i_items++) { - for (; i_items < lhs_rows; i_items++) + int32_t acc[4]; + const int32_t *multipliers = dst_multipliers; + const int32_t *shifts = dst_shifts; + const int8_t *col_base = packed_rhs; + const int32_t blk_cnt = rhs_cols >> 5; + int col_inc = rhs_cols_offset >> 1; + + for (int i = 0; i < rhs_rows; i++) { - int32_t acc[4]; - const int32_t *multipliers = dst_multipliers; - const int32_t *shifts = dst_shifts; - const int8_t *col_base = packed_rhs; - int col_inc = rhs_cols_offset >> 1; - - for (int i = 0; i < rhs_rows; i++) - { - int32_t acc_n0 = 0; - const int8_t *ip_row_0 = lhs; - int32_t sum_tmp = 0; - mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); - - if ((rhs_cols & 0x1) & (i & 0x1)) - { - rmdr_mask >>= 1; - int32_t col = col_base[0] >> 4; - sum_tmp += col; - acc_n0 += ip_row_0[0] * col; - - ++col_base; - ++ip_row_0; - } - - for (int j = blk_cnt; j > 0; --j) - { - int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); - col_base += 8; - - col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); - col_vec = vshrq_n_s8(col_vec, 4); - - sum_tmp = vaddvaq_s8(sum_tmp, col_vec); - - int8x16_t lhs_vec = vldrbq_s8(ip_row_0); - ip_row_0 += 16; - acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); - } - - if (rmdr_mask) - { - int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); - col_base += col_inc; - col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); - col_vec = vshrq_n_s8(col_vec, 4); - - sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); - - int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); - acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); - } - - sum_tmp *= lhs_offset; - sum_tmp += acc_n0; - if (bias) - { - sum_tmp += bias[i]; - } - const int32_t index = i & 0x3; - acc[index] = sum_tmp; - - if (index == 3) - { - int32x4_t res = vldrwq_s32(acc); - res = arm_requantize_mve_32x4(res, vldrwq_s32(multipliers), vldrwq_s32(shifts)); - multipliers += 4; - shifts += 4; - res = vaddq_n_s32(res, dst_offset); - res = vmaxq_s32(res, vdupq_n_s32(activation_min)); - res = vminq_s32(res, vdupq_n_s32(activation_max)); - vstrbq_s32(dst, res); - dst += 4; - } - } - lhs += lhs_cols_offset; - const int32_t tail_rows = rhs_rows & 0x3; - for (int i = 0; i < tail_rows; i++) - { - int32_t acc_n0 = acc[i]; - acc_n0 = arm_nn_requantize(acc_n0, multipliers[i], shifts[i]); - acc_n0 += dst_offset; - acc_n0 = MAX(acc_n0, activation_min); - acc_n0 = MIN(acc_n0, activation_max); - *dst++ = (int8_t)acc_n0; + int32_t acc_n0 = 0; + const int8_t *ip_row_0 = lhs; + int32_t sum_tmp = 0; + mve_pred16_t rmdr_mask = vctp8q(rhs_cols_offset); + + if ((rhs_cols & 0x1) & (i & 0x1)) + { + rmdr_mask >>= 1; + int32_t col = col_base[0] >> 4; + sum_tmp += col; + acc_n0 += ip_row_0[0] * col; + + ++col_base; + ++ip_row_0; + } + + for (int j = blk_cnt; j > 0; --j) + { + const int8x16_t col_vec = vldrbq_s8(col_base); + + int8x16_t ker_low = vrshlq_n_s8(col_vec, 4); + ker_low = vshrq_n_s8(ker_low, 4); + int8x16_t ker_high = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, ker_low); + sum_tmp = vaddvaq_s8(sum_tmp, ker_high); + + int8x16x2_t lhs_x2 = vld2q_s8(ip_row_0); + + acc_n0 = vmladavaq_s8(acc_n0, ker_low, lhs_x2.val[0]); + acc_n0 = vmladavaq_s8(acc_n0, ker_high, lhs_x2.val[1]); + + ip_row_0 += 32; + col_base += 16; + } + + if (I6_elements_spill) + { + int8x16_t col_vec = vldrbq_gather_offset_s8(col_base, gather_offset); + col_base += 8; + + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_s8(sum_tmp, col_vec); + + int8x16_t lhs_vec = vldrbq_s8(ip_row_0); + ip_row_0 += 16; + acc_n0 = vmladavaq_s8(acc_n0, col_vec, lhs_vec); + } + + if (rmdr_mask) + { + int8x16_t col_vec = vldrbq_gather_offset_z_s8(col_base, gather_offset, rmdr_mask); + col_base += col_inc; + col_vec = vrshlq_m_n_s8(col_vec, 4, lower_nibble_mask); + col_vec = vshrq_n_s8(col_vec, 4); + + sum_tmp = vaddvaq_p_s8(sum_tmp, col_vec, rmdr_mask); + + int8x16_t lhs_vec = vldrbq_z_s8(ip_row_0, rmdr_mask); + acc_n0 = vmladavaq_p_s8(acc_n0, col_vec, lhs_vec, rmdr_mask); + } + + sum_tmp *= lhs_offset; + sum_tmp += acc_n0; + if (bias) + { + sum_tmp += bias[i]; + } + const int32_t index = i & 0x3; + acc[index] = sum_tmp; + + if (index == 3) + { + int32x4_t res = vldrwq_s32(acc); + res = arm_requantize_mve_32x4(res, vldrwq_s32(multipliers), vldrwq_s32(shifts)); + multipliers += 4; + shifts += 4; + res = vaddq_n_s32(res, dst_offset); + res = vmaxq_s32(res, vdupq_n_s32(activation_min)); + res = vminq_s32(res, vdupq_n_s32(activation_max)); + vstrbq_s32(dst, res); + dst += 4; } } + lhs += lhs_cols_offset; + const int32_t tail_rows = rhs_rows & 0x3; + for (int i = 0; i < tail_rows; i++) + { + int32_t acc_n0 = acc[i]; + acc_n0 = arm_nn_requantize(acc_n0, multipliers[i], shifts[i]); + acc_n0 += dst_offset; + acc_n0 = MAX(acc_n0, activation_min); + acc_n0 = MIN(acc_n0, activation_max); + *dst++ = (int8_t)acc_n0; + } } + #elif defined(ARM_MATH_DSP) const int32_t lhs_cols_off1 = lhs_cols_offset - 4; const int16_t i16_lhs_offset = (int16_t)lhs_offset; @@ -1910,9 +2047,10 @@ arm_cmsis_nn_status arm_nn_mat_mult_nt_t_s4(const int8_t *lhs, } #endif + return ARM_CMSIS_NN_SUCCESS; } /** * @} end of Doxygen group - */ \ No newline at end of file + */ diff --git a/Tests/UnitTest/README.md b/Tests/UnitTest/README.md index f9c18a8e..f557600e 100644 --- a/Tests/UnitTest/README.md +++ b/Tests/UnitTest/README.md @@ -164,7 +164,8 @@ Current progress: | Operator | Old | New | Notes | --- | --- | --- | --- -| convolution | x | x | New version only supports 16x8 +| convolution | x | x | New version only supports 16x8 and int4 packed weights +| depthwise conv | x | | | fully_connected | x | x | New version only supports int4 packed weights | lstm | x | x | Only new version supporting 16x8 | svdf | x | | diff --git a/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv.json b/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv.json new file mode 100644 index 00000000..4fff26b4 --- /dev/null +++ b/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv.json @@ -0,0 +1,135 @@ +{ + "version": 3, + "operator_codes": [ + { + "deprecated_builtin_code": 3, + "version": 1, + "builtin_code": "CONV_2D" + } + ], + "subgraphs": [ + { + "tensors": [ + { + "shape": [ + batch_size, + input_h, + input_w, + in_ch + ], + "type": "INT8", + "buffer": 0, + "name": "tensor_input", + "quantization": { + "scale": [ + input_scale + ], + "zero_point": [ + input_zp + ], + "quantized_dimension": 0 + }, + "is_variable": false + }, + { + "shape": [ + out_ch, + filter_y, + filter_x, + in_ch + ], + "type": "INT4", + "buffer": 1, + "name": "tensor_weight", + "quantization": { + "scale": w_scale, + "zero_point": w_zp, + "details_type": "NONE", + "quantized_dimension": 0 + }, + "is_variable": false + }, + { + "shape": [ + out_ch + ], + "type": "INT32", + "buffer": 2, + "name": "tensor_bias", + "quantization": { + "scale": bias_scale, + "zero_point": bias_zp, + "details_type": "NONE", + "quantized_dimension": 0 + }, + "is_variable": false + }, + { + "shape": [ + batch_size, + output_h, + output_w, + out_ch + ], + "type": "INT8", + "name": "tensor_output", + "buffer": 3, + "quantization": { + "scale": [ + output_scale + ], + "zero_point": [ + output_zp + ], + "details_type": "NONE", + "quantized_dimension": 0 + }, + "is_variable": false + } + ], + "inputs": [ + 0 + ], + "outputs": [ + 3 + ], + "operators": [ + { + "opcode_index": 0, + "inputs": [ + 0, + 1, + 2 + ], + "outputs": [ + 3 + ], + "builtin_options_type": "Conv2DOptions", + "builtin_options": { + "padding": padding, + "stride_w": stride_x, + "stride_h": stride_y, + "fused_activation_function": "NONE", + "dilation_w_factor": dilation_x, + "dilation_h_factor": dilation_y + }, + "custom_options_format": "FLEXBUFFERS" + } + ] + } + ], + "buffers": [ + {}, + { + "data": [ + input_weights + ] + }, + { + "data": [ + input_bias + ] + }, + {} + ] +} diff --git a/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv_null_bias.json b/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv_null_bias.json new file mode 100644 index 00000000..61849c4d --- /dev/null +++ b/Tests/UnitTest/RefactoredTestGen/JsonTemplates/conv_null_bias.json @@ -0,0 +1,114 @@ +{ + "version": 3, + "operator_codes": [ + { + "deprecated_builtin_code": 3, + "version": 1, + "builtin_code": "CONV_2D" + } + ], + "subgraphs": [ + { + "tensors": [ + { + "shape": [ + batch_size, + input_h, + input_w, + in_ch + ], + "type": "INT8", + "buffer": 0, + "name": "tensor_input", + "quantization": { + "scale": [ + input_scale + ], + "zero_point": [ + input_zp + ], + "quantized_dimension": 0 + }, + "is_variable": false + }, + { + "shape": [ + out_ch, + filter_y, + filter_x, + in_ch + ], + "type": "INT4", + "buffer": 1, + "name": "tensor_weight", + "quantization": { + "scale": w_scale, + "zero_point": w_zp, + "details_type": "NONE", + "quantized_dimension": 0 + }, + "is_variable": false + }, + { + "shape": [ + batch_size, + output_h, + output_w, + out_ch + ], + "type": "INT8", + "name": "tensor_output", + "buffer": 2, + "quantization": { + "scale": [ + output_scale + ], + "zero_point": [ + output_zp + ], + "details_type": "NONE", + "quantized_dimension": 0 + }, + "is_variable": false + } + ], + "inputs": [ + 0 + ], + "outputs": [ + 2 + ], + "operators": [ + { + "opcode_index": 0, + "inputs": [ + 0, + 1 + ], + "outputs": [ + 2 + ], + "builtin_options_type": "Conv2DOptions", + "builtin_options": { + "padding": padding, + "stride_w": stride_x, + "stride_h": stride_y, + "fused_activation_function": "NONE", + "dilation_w_factor": dilation_x, + "dilation_h_factor": dilation_y + }, + "custom_options_format": "FLEXBUFFERS" + } + ] + } + ], + "buffers": [ + {}, + { + "data": [ + input_weights + ] + }, + {} + ] +} diff --git a/Tests/UnitTest/RefactoredTestGen/Lib/op_conv.py b/Tests/UnitTest/RefactoredTestGen/Lib/op_conv.py index 5653e516..a51bed6b 100644 --- a/Tests/UnitTest/RefactoredTestGen/Lib/op_conv.py +++ b/Tests/UnitTest/RefactoredTestGen/Lib/op_conv.py @@ -22,6 +22,141 @@ import tf_keras as keras import numpy as np +import tflite_micro + + +def generate_data(tflite_fname, params): + tensors = {} + effective_scales = {} + scales = {} + generated_params = {} + aliases = {} + + # To be removed + aliases["output_multiplier"] = "output_mult" + aliases["bias"] = "biases" + aliases["output"] = "output_ref" + + if params["tflite_generator"] == "json": + interpreter = tflite_micro.runtime.Interpreter.from_file( + model_path=str(tflite_fname), arena_size=params["arena_size"], + intrepreter_config=tflite_micro.runtime.InterpreterConfig.kPreserveAllTensors) + + x_output = interpreter.get_output_details(0)["shape"][2] + y_output = interpreter.get_output_details(0)["shape"][1] + + scales["input_scale"] = interpreter.get_input_details(0)["quantization_parameters"]["scales"][0] + scales["input_zero_point"] = interpreter.get_input_details(0)["quantization_parameters"]["zero_points"][0] + scales["output_scale"] = interpreter.get_output_details(0)["quantization_parameters"]["scales"][0] + scales["output_zero_point"] = interpreter.get_output_details(0)["quantization_parameters"]["zero_points"][0] + + scales["scaling_factors"] = params["w_scale"] + else: + + interpreter = Interpreter(str(tflite_fname), experimental_op_resolver_type=OpResolverType.BUILTIN_REF) + interpreter.allocate_tensors() + tensor_details = interpreter.get_tensor_details() + + if params["generate_bias"]: + filter_index = 1 + bias_index = 2 + else: + filter_index = 2 + bias_index = 1 + + filter_layer = tensor_details[filter_index] + scales["scaling_factors"] = filter_layer['quantization_parameters']['scales'] + + if params["generate_bias"]: + bias_layer = tensor_details[bias_index] + else: + bias_layer = None + + input_details = interpreter.get_input_details() + (scales["input_scale"], scales["input_zero_point"]) = input_details[0]['quantization'] + + output_details = interpreter.get_output_details() + (scales["output_scale"], scales["output_zero_point"]) = output_details[0]['quantization'] + + x_output = output_details[0]['shape'][2] + y_output = output_details[0]['shape'][1] + + tensors["weights"] = interpreter.get_tensor(filter_layer['index']) + if params["generate_bias"]: + tensors["bias"] = interpreter.get_tensor(bias_layer['index']) + else: + tensors["bias"] = None + + def calculate_padding(x_output, y_output, params): + x_input = params["input_w"] + y_input = params["input_h"] + + if params["padding"] == "SAME": + # Take dilation into account. + filter_x = (params["filter_x"] - 1) * params["dilation_x"] + 1 + filter_y = (params["filter_y"] - 1) * params["dilation_y"] + 1 + + pad_along_width = max((x_output - 1) * params["stride_x"] + filter_x - x_input, 0) + pad_along_height = max((y_output - 1) * params["stride_y"] + filter_y - y_input, 0) + + pad_top = pad_along_height // 2 + + pad_left = pad_along_width // 2 + pad_top_offset = pad_along_height % 2 + pad_left_offset = pad_along_width % 2 + + pad_y_with_offset = pad_top + pad_top_offset + pad_x_with_offset = pad_left + pad_left_offset + pad_x = pad_left + pad_y = pad_top + else: + pad_x = 0 + pad_y = 0 + pad_y_with_offset = 0 + pad_x_with_offset = 0 + + return pad_y_with_offset, pad_x_with_offset, pad_y, pad_x + + pad_y_with_offset, pad_x_with_offset, pad_y, pad_x = calculate_padding(x_output, y_output, params) + + def generate_quantize_per_channel_multiplier(params, scales): + def quantize_scale(scale): + significand, shift = math.frexp(scale) + significand_q31 = round(significand * (1 << 31)) + return significand_q31, shift + + num_channels = params["out_ch"] + per_channel_multiplier = [] + per_channel_shift = [] + + if len(scales["scaling_factors"]) != num_channels: + raise RuntimeError("Missing scaling factors") + + for i in range(num_channels): + effective_output_scale = scales["input_scale"] * scales["scaling_factors"][i] / scales["output_scale"] + (quantized_multiplier, shift) = quantize_scale(effective_output_scale) + + per_channel_multiplier.append(quantized_multiplier) + per_channel_shift.append(shift) + + return per_channel_multiplier, per_channel_shift + + generated_params["input_batches"] = params["batch_size"] + generated_params["pad_x"] = pad_x + generated_params["pad_y"] = pad_y + generated_params["output_h"] = y_output + generated_params["output_w"] = x_output + generated_params["dst_size"] = x_output * y_output * params["out_ch"] * params["batch_size"] + generated_params["input_offset"] = -scales["input_zero_point"] + generated_params["output_offset"] = scales["output_zero_point"] + + per_channel_multiplier, per_channel_shift = generate_quantize_per_channel_multiplier(params, scales) + + tensors["output_multiplier"] = np.array(per_channel_multiplier) + tensors["output_shift"] = np.array(per_channel_shift) + + return Lib.op_utils.Generated_data(generated_params, tensors, scales, effective_scales, aliases) + class Op_conv(Lib.op_utils.Op_type): @@ -61,12 +196,16 @@ def get_shapes(params): shapes["input"] = (params["batch_size"], params["input_h"], params["input_w"], in_ch) shapes["weight_shape"] = [params["filter_y"], params["filter_x"], filter_ch, out_ch] + if params["tflite_generator"] == "json": + params["json_template"] = "conv.json" if params["generate_bias"] else "conv_null_bias.json" + else: + shapes["representational_dataset"] = (params["batch_size"], params["input_h"], params["input_w"], in_ch) + if params["generate_bias"]: shapes["bias_shape"] = [out_ch] else: shapes["bias_shape"] = [] - shapes["representational_dataset"] = (params["batch_size"], params["input_h"], params["input_w"], in_ch) return shapes def generate_keras_model(shapes, params): @@ -98,119 +237,114 @@ def generate_keras_model(shapes, params): return model def generate_data_tflite(tflite_fname, params): - tensors = {} - effective_scales = {} - scales = {} - generated_params = {} - aliases = {} - - # To be removed - aliases["output_multiplier"] = "output_mult" - aliases["bias"] = "biases" - aliases["output"] = "output_ref" + return generate_data(tflite_fname, params) - interpreter = Interpreter(str(tflite_fname), experimental_op_resolver_type=OpResolverType.BUILTIN_REF) - interpreter.allocate_tensors() - tensor_details = interpreter.get_tensor_details() - input_state = tensor_details[0] + def post_model_update(tflite_path, generated_data, params): - if params["generate_bias"]: - filter_index = 1 - bias_index = 2 - else: - filter_index = 2 - bias_index = 1 + data = generate_data(tflite_path, params) - filter_layer = tensor_details[filter_index] + generated_data.params |= data.params + generated_data.aliases |= data.aliases + generated_data.tensors |= data.tensors - if params["generate_bias"]: - bias_layer = tensor_details[bias_index] - else: - bias_layer = None + return generated_data - input_details = interpreter.get_input_details() - (scales["input_scale"], scales["input_zero_point"]) = input_details[0]['quantization'] + def generate_data_json(shapes, params): - output_details = interpreter.get_output_details() - (scales["output_scale"], scales["output_zero_point"]) = output_details[0]['quantization'] + if params["weights_data_type"] != "int4_t": + raise RuntimeError("Only int4 weights support json generated models") - x_output = output_details[0]['shape'][2] - y_output = output_details[0]['shape'][1] + tensors = {} + effective_scales = {} + scales = {} + generated_params = {} + aliases = {} - def calculate_padding(x_output, y_output, params): - x_input = params["input_w"] - y_input = params["input_h"] + generated_params["input_batches"] = params["batch_size"] + generated_params["dst_size"] = params["out_ch"] * params["batch_size"] - if params["padding"] == "SAME": - # Take dilation into account. - filter_x = (params["filter_x"] - 1) * params["dilation_x"] + 1 - filter_y = (params["filter_y"] - 1) * params["dilation_y"] + 1 + def quantize_float_data(data=None, quantization_bit_range=8, quantization_type="affine", tf_tensor=False): + if data is None: + return - pad_along_width = max((x_output - 1) * params["stride_x"] + filter_x - x_input, 0) - pad_along_height = max((y_output - 1) * params["stride_y"] + filter_y - y_input, 0) + if tf_tensor: + data = data.numpy() + data_max = np.amax(data) + data_min = np.amin(data) - pad_top = pad_along_height // 2 - pad_left = pad_along_width // 2 - pad_top_offset = pad_along_height % 2 - pad_left_offset = pad_along_width % 2 + if quantization_type.lower() == "affine": + data_min = min(data_min, 0.0) + data_max = max(data_max, 0.0) - pad_y_with_offset = pad_top + pad_top_offset - pad_x_with_offset = pad_left + pad_left_offset - pad_x = pad_left - pad_y = pad_top - else: - pad_x = 0 - pad_y = 0 - pad_y_with_offset = 0 - pad_x_with_offset = 0 + scale = (data_max - data_min) / (pow(2, quantization_bit_range) - 1) + zero_point = -(round(data_max * scale)) - pow(2, quantization_bit_range - 1) + zero_point = max(zero_point, pow(quantization_bit_range - 1) - 1) + zero_point = min(zero_point, -pow(quantization_bit_range - 1)) - return pad_y_with_offset, pad_x_with_offset, pad_y, pad_x + elif quantization_type.lower() == "symmetric": + absolute_max = max(abs(data_min), abs(data_max)) + scale = absolute_max / (pow(2, quantization_bit_range - 1) - 1) + zero_point = 0 - pad_y_with_offset, pad_x_with_offset, pad_y, pad_x = calculate_padding(x_output, y_output, params) + else: + raise RuntimeError("Quantization scheme not supported") - tensors["weights"] = interpreter.get_tensor(filter_layer['index']) + scale = 0.1 if scale == 0 else scale + quantized_data = [(x // scale) + zero_point for x in data] + return np.array(quantized_data), scale, zero_point if params["generate_bias"]: - tensors["bias"] = interpreter.get_tensor(bias_layer['index']) + quant_bias, bias_scale, bias_zp = quantize_float_data( + np.random.randint( + params["bias_min"], + params["bias_max"], + size=shapes["bias_shape"]), + quantization_bit_range=8, + quantization_type="symmetric", + tf_tensor=(not params["generate_bias"])) + + params["bias_scale"] = [bias_scale] * params["out_ch"] + params["bias_zp"] = [bias_zp] * params["out_ch"] + + tensors["input_bias"] = quant_bias else: - tensors["bias"] = None + tensors["input_bias"] = None - scales["scaling_factors"] = filter_layer['quantization_parameters']['scales'] + params["w_zp"] = [0] * params["out_ch"] + params["w_scale"] = np.random.uniform(0.001, 0.01, size=[params["out_ch"]]).tolist() - def generate_quantize_per_channel_multiplier(params, scales): - def quantize_scale(scale): - significand, shift = math.frexp(scale) - significand_q31 = round(significand * (1 << 31)) - return significand_q31, shift + params["output_scale"] = np.random.uniform(0.02, 0.06) - num_channels = params["out_ch"] - per_channel_multiplier = [] - per_channel_shift = [] + if params["padding"] == "SAME": + # TODO dilation with padding + output_x = math.ceil(float(params["input_w"]) / float(params["stride_x"])) + output_y = math.ceil(float(params["input_h"]) / float(params["stride_y"])) + else: + dilation_filter_x = (params["filter_x"] - 1) * (params["dilation_x"] - 1) + dilation_filter_y = (params["filter_y"] - 1) * (params["dilation_y"] - 1) - if len(scales["scaling_factors"]) != num_channels: - raise RuntimeError("Missing scaling factors") + output_x = math.ceil( + float(params["input_w"] - params["filter_x"] - dilation_filter_x + 1) / float(params["stride_x"])) + output_y = math.ceil( + float(params["input_h"] - params["filter_y"] - dilation_filter_y + 1) / float(params["stride_y"])) + generated_params["output_h"] = output_y + generated_params["output_w"] = output_x - for i in range(num_channels): - effective_output_scale = scales["input_scale"] * scales["scaling_factors"][i] / scales["output_scale"] - (quantized_multiplier, shift) = quantize_scale(effective_output_scale) + generated_params["input_offset"] = -params["input_zp"] + generated_params["output_offset"] = params["output_zp"] - per_channel_multiplier.append(quantized_multiplier) - per_channel_shift.append(shift) + aliases["input_bias"] = "biases" + aliases["input_weights"] = "weights" - return per_channel_multiplier, per_channel_shift + weights = np.random.randint( + params["weights_min"], params["weights_max"], size=shapes["weight_shape"]) - generated_params["input_batches"] = params["batch_size"] - generated_params["pad_x"] = pad_x - generated_params["pad_y"] = pad_y - generated_params["output_h"] = y_output - generated_params["output_w"] = x_output - generated_params["dst_size"] = x_output * y_output * params["out_ch"] * params["batch_size"] - generated_params["input_offset"] = -input_state['quantization_parameters']['zero_points'][0] - generated_params["output_offset"] = output_details[0]['quantization'][1] - - per_channel_multiplier, per_channel_shift = generate_quantize_per_channel_multiplier(params, scales) - - tensors["output_multiplier"] = np.array(per_channel_multiplier) - tensors["output_shift"] = np.array(per_channel_shift) + uneven = weights.size % 2 + if uneven: + weights = np.append(weights, 0) + + temp = np.reshape(weights, (weights.size // 2, 2)).astype(np.uint8) + weights = 0xff & ((0xf0 & (temp[:, 1] << 4)) | (temp[:, 0] & 0xf)) + tensors["input_weights"] = weights return Lib.op_utils.Generated_data(generated_params, tensors, scales, effective_scales, aliases) diff --git a/Tests/UnitTest/RefactoredTestGen/Lib/op_fully_connected.py b/Tests/UnitTest/RefactoredTestGen/Lib/op_fully_connected.py index f7dccf94..73c11cea 100644 --- a/Tests/UnitTest/RefactoredTestGen/Lib/op_fully_connected.py +++ b/Tests/UnitTest/RefactoredTestGen/Lib/op_fully_connected.py @@ -32,14 +32,28 @@ def get_shapes(params): params["out_activation_min"] = Lib.op_utils.get_dtype_min(params["input_data_type"]) if "out_activation_max" not in params: params["out_activation_max"] = Lib.op_utils.get_dtype_max(params["input_data_type"]) + + if params["weights_data_type"] == "int4_t": + w_min = Lib.op_utils.get_dtype_min("int4_t") + w_max = Lib.op_utils.get_dtype_max("int4_t") + b_min = Lib.op_utils.get_dtype_min("int8_t") + b_max = Lib.op_utils.get_dtype_max("int8_t") + print("dadasdas") + else: + w_min = Lib.op_utils.get_dtype_min("int32_t") + w_max = Lib.op_utils.get_dtype_max("int32_t") + b_min = Lib.op_utils.get_dtype_min("int32_t") + b_max = Lib.op_utils.get_dtype_max("int32_t") + if "bias_min" not in params: - params["bias_min"] = Lib.op_utils.get_dtype_min("int32_t") + params["bias_min"] = b_min if "bias_max" not in params: - params["bias_max"] = Lib.op_utils.get_dtype_max("int32_t") + params["bias_max"] = b_max + if "weights_min" not in params: - params["weights_min"] = Lib.op_utils.get_dtype_min("int32_t") + params["weights_min"] = w_min if "weights_max" not in params: - params["weights_max"] = Lib.op_utils.get_dtype_max("int32_t") + params["weights_max"] = w_max in_ch = params["in_ch"] out_ch = params["out_ch"] @@ -76,11 +90,9 @@ def generate_data_json(shapes, params): aliases["output"] = "output_ref" aliases["input_weights"] = "weights" - # TODOx - minval = -7 - maxval = 8 - weights = np.random.randint(minval, maxval, size=shapes["weight_shape"]) - + weights = np.random.randint( + params["weights_min"], params["weights_max"], size=shapes["weight_shape"]) +# Lib.op_utils.get_dtype_min("int4_t"), Lib.op_utils.get_dtype_max("int4_t"), size=shapes["weight_shape"]) uneven = weights.size % 2 if uneven: weights = np.append(weights, 0) @@ -90,7 +102,10 @@ def generate_data_json(shapes, params): tensors["input_weights"] = weights if params["generate_bias"]: - tensors["input_bias"] = np.random.randint(minval, maxval, size=shapes["bias_shape"]) + tensors["input_bias"] = np.random.randint( + params["bias_min"], + params["bias_max"], + size=shapes["bias_shape"]) else: tensors["input_bias"] = None diff --git a/Tests/UnitTest/RefactoredTestGen/Lib/op_utils.py b/Tests/UnitTest/RefactoredTestGen/Lib/op_utils.py index f7b3c00a..50809627 100644 --- a/Tests/UnitTest/RefactoredTestGen/Lib/op_utils.py +++ b/Tests/UnitTest/RefactoredTestGen/Lib/op_utils.py @@ -58,6 +58,13 @@ def generate_data_json(shapes, params) -> Generated_data: """ raise NotImplementedError + @staticmethod + def post_model_update(tflite_path, generated_data, params) -> Generated_data: + """ + Optional function for updating parameters after model has been created. + """ + return generated_data + def generate_tf_tensor(dims, minval, maxval, decimals=0, datatype=tf.float32): array = minval + (maxval - minval) * np.random.rand(*dims) @@ -71,6 +78,8 @@ def get_dtype(name, params): if "bias" in name: return params["bias_data_type"] elif "weight" in name or "kernel" in name: + if params["weights_data_type"] == "int4_t": + return "int8_t" return params["weights_data_type"] elif "multiplier" in name or "shift" in name: return params["shift_and_mult_data_type"] @@ -90,7 +99,7 @@ def get_tf_dtype(dtype): def get_np_dtype(dtype): - if dtype == "int8_t": + if dtype == "int8_t" or dtype == "int4_t": return np.uint8 if dtype == "int16_t": return np.uint16 @@ -103,7 +112,7 @@ def get_np_dtype(dtype): def get_dtype_len(dtype): - if dtype == "int8_t": + if dtype == "int8_t" or dtype == "int4_t": return 1 elif dtype == "int16_t": return 2 diff --git a/Tests/UnitTest/RefactoredTestGen/Lib/test.py b/Tests/UnitTest/RefactoredTestGen/Lib/test.py index 783f094a..6625bae1 100644 --- a/Tests/UnitTest/RefactoredTestGen/Lib/test.py +++ b/Tests/UnitTest/RefactoredTestGen/Lib/test.py @@ -87,6 +87,8 @@ def generate(params, args, fpaths): else: raise ValueError(f"Invalid tflite generator in {params['name']}") + data = op_type.post_model_update(fpaths["tflite"], data, params) + params.update(data.params) # Quantize scales @@ -108,7 +110,10 @@ def generate(params, args, fpaths): elif params["interpreter"] == "tflite_runtime": data.tensors["output"] = invoke_tflite_runtime(fpaths["tflite"], input_tensor) elif params["interpreter"] == "tflite_micro": - data.tensors["output"] = invoke_tflite_micro(fpaths["tflite"], input_tensor) + if "arena_size" in params: + data.tensors["output"] = invoke_tflite_micro(fpaths["tflite"], input_tensor, params["arena_size"]) + else: + data.tensors["output"] = invoke_tflite_micro(fpaths["tflite"], input_tensor) else: raise ValueError(f"Invalid interpreter in {params['name']}") @@ -120,7 +125,7 @@ def include_in_config(key): "suite_name", "name", "input_data_type", "op_type", "input_data_type", "weights_data_type", "bias_data_type", "shift_and_mult_data_type", "interpreter", "tflite_generator", "json_template", "groups", "generate_bias", "bias_min", "bias_max", "weights_min", "weights_max", "bias_zp", "w_zp", - "input_zp", "output_zp", "w_scale", "bias_scale", "input_scale", "output_scale" + "input_zp", "output_zp", "w_scale", "bias_scale", "input_scale", "output_scale", "arena_size" ] config_params = {key: val for key, val in params.items() if include_in_config(key)} @@ -209,8 +214,9 @@ def invoke_tflite_runtime(tflite_path, input_tensor): return data.flatten() -def invoke_tflite_micro(tflite_path, input_tensor): - interpreter = tflite_micro.runtime.Interpreter.from_file(model_path=str(tflite_path)) +def invoke_tflite_micro(tflite_path, input_tensor, arena_size=30000): + interpreter = tflite_micro.runtime.Interpreter.from_file(model_path=str(tflite_path), arena_size=arena_size) + interpreter.set_input(input_tensor, 0) interpreter.invoke() data = interpreter.get_output(0) diff --git a/Tests/UnitTest/RefactoredTestGen/Lib/test_suite.py b/Tests/UnitTest/RefactoredTestGen/Lib/test_suite.py index d730337d..6db09ec6 100644 --- a/Tests/UnitTest/RefactoredTestGen/Lib/test_suite.py +++ b/Tests/UnitTest/RefactoredTestGen/Lib/test_suite.py @@ -36,6 +36,7 @@ def is_common(key): tests = [] for test_params in params["tests"]: if (test_params["name"] in args.tests) or (args.tests == []): + print() print(f"- {test_params['name']}") # Test params overrides common params diff --git a/Tests/UnitTest/RefactoredTestGen/test_plan.json b/Tests/UnitTest/RefactoredTestGen/test_plan.json index 2373c9a3..02b64987 100644 --- a/Tests/UnitTest/RefactoredTestGen/test_plan.json +++ b/Tests/UnitTest/RefactoredTestGen/test_plan.json @@ -1,4 +1,346 @@ [ +{ + "suite_name" : "test_arm_convolve_s4", + "op_type" : "conv", + "input_data_type": "int8_t", + "weights_data_type": "int4_t", + "bias_data_type": "int32_t", + "shift_and_mult_data_type": "int32_t", + "interpreter": "tflite_micro", + "tflite_generator": "json", + "arena_size": 30000, + "input_scale": 0.046774, + "input_zp": -128, + "output_zp": 0, + "groups": 1, + "tests" : [ + {"name" : "basic_int4", + "in_ch" : 1, + "out_ch" : 1, + "input_w" : 5, + "input_h" : 8, + "filter_x" : 2, + "filter_y": 4, + "padding": "VALID" + }, + {"name" : "basic_2_int4", + "in_ch" : 5, + "out_ch" : 15, + "input_w" : 15, + "input_h" : 15, + "filter_x" : 5, + "filter_y": 5, + "padding": "VALID" + }, + {"name" : "stride2pad1_int4", + "in_ch" : 1, + "out_ch" : 1, + "input_w" : 7, + "input_h" : 7, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 2, + "stride_y": 2, + "padding": "SAME" + }, + {"name" : "kernel1x1_int4", + "in_ch" : 19, + "out_ch" : 7, + "input_w" : 7, + "input_h" : 5, + "filter_x" : 1, + "filter_y": 1, + "padding": "VALID" + }, + {"name" : "kernel1x1_int4_2", + "in_ch" : 60, + "out_ch" : 60, + "input_w" : 1, + "input_h" : 1, + "filter_x" : 1, + "filter_y": 1, + "padding": "VALID" + }, + {"name" : "kernel1x1_int4_3", + "in_ch" : 18, + "out_ch" : 47, + "input_w" : 43, + "input_h" : 1, + "filter_x" : 1, + "filter_y": 1, + "bias_min": -2147484647, + "bias_max": 2147484647, + "padding": "VALID" + }, + {"name" : "kernel1x1_stride_x_int4", + "in_ch" : 9, + "out_ch" : 5, + "input_w" : 7, + "input_h" : 4, + "filter_x" : 1, + "filter_y": 1, + "stride_x": 3, + "stride_y": 1, + "bias_min": -2147484647, + "bias_max": 2147484647, + "padding": "VALID" + }, + {"name" : "kernel1x1_stride_x_y_int4", + "input_batches": 3, + "in_ch" : 23, + "out_ch" : 15, + "input_w" : 7, + "input_h" : 6, + "filter_x" : 1, + "filter_y": 1, + "stride_x": 2, + "stride_y": 2, + "out_activation_min": -6, + "padding": "VALID" + }, + {"name" : "kernel1x1_stride_x_y_1_int4", + "input_batches": 2, + "in_ch" : 5, + "out_ch" : 5, + "input_w" : 4, + "input_h" : 4, + "filter_x" : 1, + "filter_y": 1, + "stride_x": 2, + "stride_y": 2, + "generate_bias": false, + "padding": "VALID" + }, + {"name" : "kernel1x1_stride_x_y_2_int4", + "input_batches": 2, + "in_ch" : 5, + "out_ch" : 5, + "input_w" : 4, + "input_h" : 4, + "filter_x" : 1, + "filter_y": 1, + "stride_x": 3, + "stride_y": 3, + "generate_bias": false, + "padding": "VALID" + }, + {"name" : "conv_3_int4", + "input_batches": 2, + "in_ch" : 3, + "out_ch" : 1, + "input_w" : 10, + "input_h" : 49, + "filter_x" : 4, + "filter_y": 10, + "stride_x": 1, + "stride_y": 2, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_1_x_n_1_int4", + "input_batches": 2, + "in_ch" : 4, + "out_ch" : 3, + "input_w" : 2, + "input_h" : 1, + "filter_x" : 3, + "filter_y": 1, + "stride_x": 1, + "stride_y": 2, + "padding": "SAME" + }, + {"name" : "conv_1_x_n_2_int4", + "input_batches": 2, + "in_ch" : 4, + "out_ch" : 3, + "input_w" : 296, + "input_h" : 1, + "filter_x" : 48, + "filter_y": 1, + "stride_x": 2, + "stride_y": 1, + "generate_bias": false, + "padding": "VALID" + }, + {"name" : "conv_1_x_n_3_int4", + "input_batches": 2, + "in_ch" : 4, + "out_ch" : 1, + "input_w" : 296, + "input_h" : 1, + "filter_x" : 48, + "filter_y": 1, + "stride_x": 2, + "stride_y": 1, + "out_activation_min": -112, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_1_x_n_4_int4", + "input_batches": 2, + "in_ch" : 4, + "out_ch" : 4, + "input_w" : 16, + "input_h" : 1, + "filter_x" : 3, + "filter_y": 1, + "stride_x": 2, + "stride_y": 1, + "out_activation_min": -99, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_1_x_n_5_int4", + "input_batches": 2, + "in_ch" : 4, + "out_ch" : 1, + "input_w" : 17, + "input_h" : 1, + "filter_x" : 3, + "filter_y": 1, + "stride_x": 3, + "stride_y": 1, + "out_activation_min": -109, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_2_int4", + "input_batches": 2, + "in_ch" : 2, + "out_ch" : 4, + "input_w" : 6, + "input_h" : 3, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "out_activation_min": -119, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_4_int4", + "input_batches": 3, + "in_ch" : 3, + "out_ch" : 3, + "input_w" : 5, + "input_h" : 5, + "filter_x" : 2, + "filter_y": 3, + "stride_x": 2, + "stride_y": 2, + "padding": "VALID" + }, + {"name" : "conv_5_int4", + "input_batches": 3, + "in_ch" : 128, + "out_ch" : 1, + "input_w" : 128, + "input_h" : 1, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 4, + "stride_y": 4, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_out_activation_int4", + "input_batches": 3, + "in_ch" : 4, + "out_ch" : 2, + "input_w" : 3, + "input_h" : 3, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "out_activation_min": -61, + "out_activation_max": 108, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_dilation_golden_int4", + "input_batches": 2, + "in_ch" : 1, + "out_ch" : 3, + "input_w" : 6, + "input_h" : 4, + "filter_x" : 2, + "filter_y": 2, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 3, + "dilation_y": 2, + "generate_bias": false, + "padding": "SAME" + }, + {"name" : "conv_2x2_dilation_int4", + "input_batches": 2, + "in_ch" : 2, + "out_ch" : 2, + "input_w" : 10, + "input_h" : 10, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 2, + "dilation_y": 2, + "padding": "VALID" + }, + {"name" : "conv_2x3_dilation_int4", + "in_ch" : 2, + "out_ch" : 2, + "input_w" : 3, + "input_h" : 3, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 2, + "dilation_y": 3, + "padding": "SAME" + }, + {"name" : "conv_3x2_dilation_int4", + "in_ch" : 2, + "out_ch" : 2, + "input_w" : 3, + "input_h" : 3, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 3, + "dilation_y": 2, + "padding": "SAME" + }, + {"name" : "conv_2x2_dilation_5x5_input_int4", + "in_ch" : 2, + "out_ch" : 2, + "input_w" : 5, + "input_h" : 5, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 2, + "dilation_y": 2, + "padding": "SAME" + }, + {"name" : "conv_3x3_dilation_5x5_input_int4", + "in_ch" : 5, + "out_ch" : 2, + "input_w" : 5, + "input_h" : 5, + "filter_x" : 3, + "filter_y": 3, + "stride_x": 1, + "stride_y": 1, + "dilation_x": 3, + "dilation_y": 3, + "padding": "SAME" + } + ] +}, { "suite_name" : "test_arm_convolve_s16", "op_type" : "conv", @@ -27,9 +369,9 @@ "filter_x" : 9, "filter_y": 4, "padding": "VALID", - "input_min": 32667, + "input_min": -32667, "input_max": 32767, - "out_activation_min": 32667 + "out_activation_min": -32667 }, {"name" : "int16xint8_spill2", "in_ch" : 12, @@ -239,7 +581,7 @@ "suite_name" : "test_arm_fully_connected_s4", "op_type" : "fully_connected", "input_data_type": "int8_t", - "weights_data_type": "int8_t", + "weights_data_type": "int4_t", "bias_data_type": "int32_t", "interpreter": "tensorflow", "tflite_generator": "json", @@ -286,7 +628,7 @@ "in_ch" : 89, "out_ch" : 22, "input_zp": 120, - "output_zp": 100 + "output_zp": 10 }, {"name" : "fully_connected_int4_6", "in_ch" : 89, diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/config_data.h index 7af5441f..46ef20ab 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_2_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define BASIC_2_INT4_OUT_CH 15 #define BASIC_2_INT4_IN_CH 5 +#define BASIC_2_INT4_OUT_CH 15 #define BASIC_2_INT4_INPUT_W 15 #define BASIC_2_INT4_INPUT_H 15 -#define BASIC_2_INT4_DST_SIZE 1815 -#define BASIC_2_INT4_INPUT_SIZE 1125 -#define BASIC_2_INT4_OUT_ACTIVATION_MIN -128 -#define BASIC_2_INT4_OUT_ACTIVATION_MAX 127 -#define BASIC_2_INT4_INPUT_BATCHES 1 #define BASIC_2_INT4_FILTER_X 5 #define BASIC_2_INT4_FILTER_Y 5 +#define BASIC_2_INT4_PADDING VALID #define BASIC_2_INT4_STRIDE_X 1 #define BASIC_2_INT4_STRIDE_Y 1 -#define BASIC_2_INT4_PAD_X 0 -#define BASIC_2_INT4_PAD_Y 0 -#define BASIC_2_INT4_OUTPUT_W 11 -#define BASIC_2_INT4_OUTPUT_H 11 -#define BASIC_2_INT4_INPUT_OFFSET 0 -#define BASIC_2_INT4_OUTPUT_OFFSET 0 #define BASIC_2_INT4_DILATION_X 1 #define BASIC_2_INT4_DILATION_Y 1 +#define BASIC_2_INT4_BATCH_SIZE 1 +#define BASIC_2_INT4_OUT_ACTIVATION_MIN -128 +#define BASIC_2_INT4_OUT_ACTIVATION_MAX 127 +#define BASIC_2_INT4_INPUT_BATCHES 1 +#define BASIC_2_INT4_DST_SIZE 1815 +#define BASIC_2_INT4_OUTPUT_H 11 +#define BASIC_2_INT4_OUTPUT_W 11 +#define BASIC_2_INT4_INPUT_OFFSET 128 +#define BASIC_2_INT4_OUTPUT_OFFSET 0 +#define BASIC_2_INT4_PAD_X 0 +#define BASIC_2_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/input.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input.h new file mode 100644 index 00000000..154081ae --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input.h @@ -0,0 +1,66 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_2_int4_input[1125] = { + 12, 1, 12, -110, -88, -49, 125, -126, -28, -4, 56, 111, -121, 1, 8, -118, 31, 16, -48, + -55, 94, 87, 2, -41, -42, 18, -16, -74, 80, -56, -73, 93, 52, -107, -79, -123, -118, 9, + -46, -21, -88, 83, -45, 31, 9, -55, 32, 121, -96, 67, -95, -14, 27, -104, 118, 84, 11, + 100, 85, -75, -9, 67, -99, 16, 40, -5, 123, 43, 28, 4, -26, -79, 125, 2, 71, -40, + 126, -77, 1, 40, 8, 16, -55, 17, -54, 81, 25, 45, -16, -76, -110, 93, 64, -107, 98, + -76, 39, -100, 16, 20, -119, 3, 54, -79, 47, -21, -31, -47, 118, 17, 95, 99, -104, 53, + 35, 28, -33, -35, -68, 112, 69, -19, -40, 5, -20, 31, -2, 65, 109, -71, 77, -21, -27, + 63, -79, -59, 44, 26, 65, 7, -97, 72, -50, 8, -116, 31, -47, 39, -4, -7, -89, -59, + 92, 36, -43, 98, 8, 54, 44, -35, 65, -56, -93, -22, -41, 73, 49, -82, 49, -65, -92, + 43, 5, -77, -39, -23, 42, -106, -101, 113, -95, -29, -90, 96, -72, -97, -86, -7, 83, -29, + -83, -69, -91, 14, 111, 84, 69, 106, -18, -35, -72, -62, -53, -88, -15, -111, -128, 122, -31, + -91, -82, -124, -73, 52, -7, 17, 102, 19, -50, 0, 119, 40, -117, 10, 16, 84, -16, 13, + 73, -61, -37, -104, -43, -86, -23, -112, 68, 0, 19, -66, -53, 36, 29, 57, -13, 21, 105, + 97, 105, -12, -26, 65, -98, -30, 75, 39, 122, 10, 65, 0, -104, -99, -27, 95, -50, -32, + 121, -33, 98, -114, 23, 36, -88, -106, 122, -96, 7, 48, 4, 117, -118, -70, 94, -28, -100, + 39, 57, 18, 32, -65, -89, -82, -68, 93, -98, 114, -56, -119, 116, 69, -3, -15, 47, 78, + 76, -36, 82, 50, -102, -17, -89, 108, -34, -119, 126, -84, 76, -99, 64, 101, -89, 8, 97, + -47, 16, -59, -63, -51, 1, -42, 28, -7, 4, -86, -96, -35, 101, 35, -51, 112, -30, -119, + -110, 41, -26, 22, 111, -109, -98, -101, 34, 102, -89, 86, 26, 116, -11, -64, 50, -41, 41, + -95, -76, -109, 5, -20, 32, 116, -37, -97, -53, 58, 38, -69, -14, 63, -35, 64, -21, -79, + -84, -108, 84, -79, -41, -9, 26, 72, -91, -100, 110, 89, -45, 53, 70, 44, 68, 78, 56, + 82, -108, 26, 99, 72, 85, 55, -65, -108, 26, -107, 53, -79, 8, -6, 57, -125, -100, 22, + -91, -47, -101, 45, 122, 26, 114, -68, -90, -88, -49, -33, -86, -4, 28, 30, 112, 56, 118, + -110, 22, -18, -94, 38, -104, 63, 25, -12, -63, -87, 11, 48, 87, -126, 12, 13, -84, -66, + 94, -10, 107, 3, 52, 82, -64, -17, -111, 47, 125, -89, 113, -28, -53, 65, -2, -32, -106, + -92, 111, -47, -50, -121, 17, -51, 117, 4, -16, -79, -107, 27, -24, -57, -80, 10, -94, 121, + -68, -51, -90, -64, 27, 51, 113, 83, -93, -104, 57, 126, -61, 73, 83, -82, -81, 75, 32, + -71, -37, -120, 47, -60, -54, 9, 80, 4, -99, 112, -40, 82, 55, -98, 22, 84, -75, -26, + -79, -63, -98, -122, -102, 4, 123, -49, 46, -17, -63, 11, -32, 93, 43, 33, -11, -38, -79, + -112, -66, 94, 16, -98, -71, 96, 93, 6, 63, 97, -27, 27, 12, -13, -111, -57, 111, -89, + -76, -107, 3, -29, 121, 107, 126, -66, 4, -109, -119, -92, 74, 54, -33, -14, 101, -8, -112, + -96, -77, 18, -85, -33, -63, 48, 104, -17, -39, 16, 63, 93, -25, 100, -122, -84, -32, 115, + -105, 22, 66, -37, -24, -119, 66, 15, -31, 16, 103, 28, -47, -11, -2, -91, 71, -70, -119, + -11, -40, -87, -40, 84, 91, -47, 94, 27, -31, 99, 9, 125, 25, 44, 127, -18, 14, -88, + 85, 102, -5, -89, -98, -41, 93, -119, 45, 84, -74, -63, -78, -29, 0, 77, -74, -50, -23, + 99, -34, 12, 17, -34, -57, 20, -44, -31, -27, 27, 108, -100, -108, -80, -69, 15, 115, -82, + 110, -69, -105, 104, -101, 37, -19, 25, 40, -29, -74, -27, 69, 48, 67, -85, 17, -8, 39, + 55, 86, 14, -100, -61, -77, -105, -107, -115, -63, 11, 10, 2, 11, 54, -6, -36, 17, -111, + -54, -13, -75, 4, 62, -51, -106, -14, 0, -57, 122, -108, 6, 121, 104, -23, 54, -3, 47, + 9, 30, -58, 43, 59, 75, 119, -90, 3, -62, -34, 13, -108, -42, -126, 16, -52, 42, -117, + 0, 3, 74, 6, -68, -81, 20, -79, -44, 96, -128, -75, -88, 94, -50, 80, 116, 68, -7, + -18, -59, -101, -64, 103, 118, -76, 38, -27, -67, -112, 10, 116, 120, 108, 63, -40, -89, 108, + -116, -15, -118, 19, 97, 80, 64, -68, -1, -115, -42, -90, -27, -107, 3, -6, 124, 103, 45, + 23, -83, -114, 38, 17, -53, -22, -26, -120, -47, 46, -79, -42, -69, -104, 6, 62, -100, 71, + 109, -1, 40, -1, 68, 125, 89, -71, 94, 71, -37, -15, 116, -39, -80, -64, 123, -51, 45, + 80, 37, 30, 117, 29, 97, 36, -52, 54, 125, 86, -110, 36, 87, 77, -41, 4, -74, -83, + 95, -48, -61, -113, -128, -32, 99, 6, -85, 40, -75, -76, 42, -76, -3, -123, -124, 77, -102, + 49, -17, -24, 49, -126, 54, 42, 2, 126, 37, -14, -119, -116, 70, 63, 77, 96, 27, -2, + -100, -47, 36, -84, 30, 34, 104, -26, -25, -105, -54, -38, -39, -8, 8, 94, -99, 70, -21, + -20, -69, -59, -92, 79, -64, 117, 6, 102, 18, 7, 67, -27, 51, -28, 51, 23, 72, -2, + -103, -23, -55, -7, 96, 9, -101, 96, 68, -56, 73, 5, 79, -76, 124, 20, 117, 45, -122, + -76, 91, 119, 29, -67, 45, 73, -47, 94, -50, 107, -52, 121, -94, -44, -71, 105, 120, 92, + 49, -60, 98, -102, 56, 103, 106, -16, -22, 62, 25, 35, 76, 10, 86, 122, -36, 54, 25, + 24, 35, -115, -74, 63, 48, -23, -87, -2, -114, -79, 108, -81, -66, -53, -107, 94, 107, 18, + 53, -66, 67, -87, 80, -88, 10, -106, 117, -72, -108, -72, -4, 22, 98, 122, -72, -128, -76, + -58, 84, 40, 6, 4, 78, -77, -14, 27, -93, 23, 74, 112, -39, -33, -128, 98, 95, 109, + 18, -52, 50, 24, 38, -78, -100, -69, 49, -3, -53, -100, 51, -31, -5, -79, -84, -53, 86, + -123, 85, -12, -18, 21, 20, -21, 71, 93, -97, -27, -96, 7, 15, -75, 71, 122, -77, 120, + 97, 108, -24, 66, -60, -81, -67, 78, 52, 23, 91, -8, -82, 42, -69, 85, 29, 56, -92, + 69, -18, -18, -47}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_bias.h new file mode 100644 index 00000000..17891f83 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_2_int4_input_bias[15] = {-47, 49, 22, -88, 127, 66, 40, 24, -57, 51, -13, -60, 40, 14, 93}; + +const int32_t *const basic_2_int4_biases = basic_2_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_weights.h new file mode 100644 index 00000000..e848171d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/input_weights.h @@ -0,0 +1,49 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_2_int4_input_weights[938] = { + 217, 166, 69, 19, 188, 131, 170, 170, 216, 125, 108, 55, 52, 22, 42, 1, 79, 221, 3, 30, 235, 31, 156, + 42, 30, 202, 175, 133, 69, 86, 86, 140, 27, 81, 249, 194, 204, 233, 131, 169, 29, 232, 174, 35, 208, 52, + 87, 7, 205, 153, 161, 48, 137, 232, 162, 114, 237, 16, 107, 75, 224, 81, 215, 129, 159, 11, 112, 127, 141, + 10, 115, 150, 134, 129, 119, 53, 125, 38, 16, 220, 171, 29, 107, 58, 250, 189, 255, 197, 47, 70, 165, 223, + 92, 2, 152, 196, 187, 218, 16, 149, 115, 187, 137, 22, 211, 108, 105, 161, 175, 13, 89, 48, 229, 12, 213, + 98, 161, 251, 80, 183, 146, 19, 214, 217, 119, 76, 43, 154, 25, 163, 152, 227, 56, 238, 79, 58, 35, 37, + 79, 231, 15, 58, 33, 100, 200, 82, 225, 0, 40, 186, 193, 59, 190, 178, 36, 125, 241, 32, 212, 126, 63, + 219, 124, 195, 193, 132, 235, 130, 93, 217, 20, 8, 212, 162, 96, 191, 61, 19, 118, 40, 171, 71, 80, 175, + 146, 44, 239, 217, 208, 243, 17, 182, 217, 6, 211, 34, 35, 67, 111, 194, 29, 225, 17, 99, 4, 51, 214, + 214, 208, 138, 37, 210, 71, 103, 252, 117, 65, 128, 219, 103, 255, 247, 61, 205, 32, 67, 60, 173, 91, 67, + 120, 55, 217, 154, 108, 204, 203, 163, 213, 95, 109, 81, 92, 163, 134, 165, 208, 108, 158, 250, 46, 50, 161, + 60, 111, 3, 35, 159, 173, 115, 127, 114, 87, 72, 228, 173, 238, 23, 213, 93, 150, 254, 84, 117, 209, 60, + 94, 142, 217, 225, 214, 151, 175, 51, 204, 248, 195, 26, 58, 52, 140, 85, 163, 119, 225, 42, 182, 174, 97, + 63, 30, 3, 191, 214, 173, 147, 163, 85, 132, 52, 98, 117, 68, 225, 40, 92, 200, 142, 152, 103, 204, 138, + 3, 211, 1, 126, 135, 44, 5, 165, 192, 135, 187, 255, 128, 33, 81, 99, 99, 61, 243, 117, 169, 46, 231, + 150, 10, 118, 203, 46, 195, 132, 225, 170, 216, 207, 213, 68, 196, 78, 46, 15, 47, 146, 16, 127, 27, 112, + 117, 154, 205, 156, 240, 192, 50, 55, 98, 5, 90, 103, 189, 228, 157, 24, 5, 100, 194, 80, 53, 169, 152, + 5, 140, 240, 15, 85, 39, 88, 234, 130, 222, 22, 122, 140, 14, 252, 163, 189, 83, 144, 39, 72, 122, 69, + 87, 81, 223, 149, 81, 204, 24, 156, 179, 166, 126, 10, 160, 122, 249, 217, 180, 229, 246, 0, 236, 204, 181, + 190, 68, 9, 145, 100, 87, 226, 51, 80, 109, 77, 201, 112, 10, 16, 15, 208, 65, 142, 206, 245, 96, 118, + 201, 9, 143, 195, 101, 121, 181, 206, 123, 158, 6, 138, 198, 172, 20, 148, 237, 14, 101, 41, 164, 0, 103, + 134, 112, 156, 200, 197, 173, 30, 53, 191, 55, 73, 16, 131, 124, 196, 87, 40, 51, 46, 94, 111, 161, 190, + 90, 102, 129, 94, 118, 44, 118, 22, 7, 227, 94, 214, 189, 233, 144, 147, 17, 18, 85, 92, 240, 147, 75, + 235, 18, 139, 141, 86, 194, 134, 8, 54, 204, 1, 227, 127, 107, 154, 167, 167, 209, 91, 139, 252, 117, 26, + 246, 205, 46, 125, 111, 114, 227, 153, 169, 104, 128, 103, 140, 223, 111, 185, 48, 218, 97, 161, 161, 32, 20, + 128, 115, 205, 126, 147, 133, 235, 162, 218, 242, 104, 255, 228, 103, 170, 243, 204, 220, 252, 140, 123, 87, 186, + 141, 185, 208, 4, 137, 136, 152, 43, 139, 14, 33, 82, 179, 47, 24, 13, 102, 80, 245, 73, 190, 189, 51, + 248, 18, 219, 131, 146, 95, 34, 252, 62, 28, 250, 38, 50, 238, 44, 166, 245, 202, 207, 34, 164, 107, 123, + 113, 217, 41, 140, 80, 173, 72, 147, 213, 184, 141, 59, 17, 32, 245, 183, 11, 64, 138, 249, 162, 175, 6, + 243, 54, 152, 29, 101, 246, 136, 54, 154, 52, 58, 150, 177, 241, 194, 152, 31, 201, 86, 178, 149, 21, 125, + 28, 166, 25, 72, 213, 234, 0, 80, 149, 60, 175, 154, 98, 202, 137, 103, 27, 161, 114, 111, 193, 5, 121, + 251, 141, 244, 254, 29, 169, 62, 233, 114, 106, 187, 43, 133, 134, 191, 139, 30, 107, 22, 75, 7, 2, 78, + 63, 59, 76, 139, 196, 86, 235, 142, 4, 191, 64, 6, 104, 169, 230, 248, 163, 180, 4, 179, 238, 46, 114, + 99, 231, 21, 93, 12, 86, 90, 183, 181, 152, 103, 184, 245, 135, 92, 92, 189, 239, 102, 124, 98, 116, 47, + 32, 195, 34, 141, 55, 132, 11, 66, 189, 167, 106, 222, 172, 75, 101, 148, 84, 5, 149, 16, 178, 18, 251, + 113, 145, 80, 18, 76, 216, 205, 34, 210, 152, 243, 225, 86, 48, 78, 139, 18, 46, 44, 87, 19, 180, 22, + 189, 198, 5, 59, 233, 1, 63, 127, 94, 52, 102, 93, 28, 49, 236, 131, 23, 222, 22, 3, 66, 212, 83, + 165, 61, 49, 204, 29, 126, 61, 221, 22, 222, 39, 35, 178, 250, 143, 22, 48, 165, 237, 228, 38, 9, 198, + 255, 143, 95, 216, 233, 194, 199, 127, 213, 172, 17, 240, 89, 71, 115, 49, 195, 11, 11, 138, 57, 17, 87, + 161, 102, 127, 193, 26, 147, 183, 51, 58, 116, 166, 179, 60, 179, 25, 59, 66, 203, 213, 123, 154, 170, 159, + 184, 110, 191, 61, 235, 141, 229, 199, 255, 212, 202, 91, 147, 86, 129, 29, 29, 2}; + +const int8_t *const basic_2_int4_weights = basic_2_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/output.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output.h new file mode 100644 index 00000000..0d2367a0 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output.h @@ -0,0 +1,99 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_2_int4_output[1815] = { + -88, -29, -72, -13, 23, -41, -25, -32, -12, -60, -62, -10, 43, 29, -48, -83, -31, -63, 42, -3, + -56, -26, -37, 1, -67, -56, -12, 26, 8, -46, -120, -42, -46, 48, 24, -65, -7, -5, -8, -97, + -65, -19, 34, 10, -43, -94, -46, -79, 36, 8, -75, -33, 9, -3, -81, -54, -22, -4, 37, -32, + -97, -37, -95, 30, 8, -102, -2, -64, -9, -55, -63, -17, 22, 25, -40, -85, -67, -22, 37, 22, + -56, -16, -12, -5, -108, -58, -15, 1, 46, -33, -105, -22, -5, 76, 74, -78, -23, -12, 1, -60, + -42, -16, -7, 28, -27, -59, -39, -100, -18, 65, -106, -26, -37, -7, -72, -65, -23, 41, 18, -30, + -78, -8, -75, 60, 19, -89, -11, -21, -2, -69, -54, -13, 4, 28, -48, -93, -77, -74, 47, 47, + -22, -5, 12, -8, -65, -43, -5, -18, 33, -59, -91, -72, -81, 62, 4, -63, -15, -5, 4, -68, + -20, -18, 11, 30, -46, -101, -11, -55, -12, 50, -70, -9, -19, -18, -54, -51, -16, 26, 35, -46, + -48, -34, -66, 19, 22, -96, -14, -24, -6, -59, -51, -14, 1, 41, -27, -83, -33, -65, 5, 16, + -39, -19, -24, -10, -103, -64, -18, -13, 28, -35, -91, -46, -44, 30, 31, -64, -12, 3, 3, -79, + -70, -19, 37, 14, -47, -97, -39, -63, 40, 9, -59, -23, 9, -2, -64, -47, -11, 37, 25, -29, + -68, -53, -99, 35, 11, -39, -18, 9, -3, -71, -46, -14, 7, 18, -21, -109, -16, -55, -38, -12, + -72, -14, 24, -4, -96, -64, -23, 34, 24, -37, -67, -55, -21, -15, 39, -102, -21, -26, -4, -90, + -47, -15, 43, 21, -36, -77, -48, -82, 35, -4, -103, -21, 16, -4, -70, -54, -13, 4, 23, -30, + -69, -17, -63, 8, 27, -80, -15, -14, 9, -75, -75, -29, 12, 18, -5, -108, -60, -105, 4, -4, + -69, -5, -14, 5, -77, -62, -20, 17, 24, -25, -93, -66, -35, 3, 38, -75, -28, -13, -5, -61, + -40, -12, 33, 31, -30, -97, -69, -93, 33, 1, -62, -22, -6, -5, -65, -37, -17, 24, 50, -22, + -66, -67, -75, 35, 12, -25, -30, -47, -5, -73, -31, -23, -18, 22, -35, -89, -28, -62, 55, 9, + -71, -22, 5, 1, -101, -72, -25, -1, 38, -46, -63, -33, -59, 16, 60, -30, -13, 7, 5, -74, + -43, -23, 6, 38, -28, -111, -41, -48, 0, 15, -24, 1, -41, -7, -91, -75, -17, 24, 18, -26, + -69, -28, -29, 65, -3, -100, -21, -10, -3, -64, -39, -15, 13, 20, -10, -80, -43, -35, 26, 63, + -78, -12, -12, -13, -49, -20, -13, 26, 18, -30, -55, -54, -69, 31, -1, -66, -14, 1, -5, -95, + -39, -14, 35, 18, -40, -81, -55, -13, 0, 17, 6, 8, -2, -14, -89, -64, -17, 14, 19, -48, + -96, -17, -82, 64, 18, -50, -17, -33, 3, -56, -52, -10, 1, 27, -51, -99, -51, -37, 25, 42, + -88, -25, -12, -1, -70, -42, -16, 32, 8, -37, -70, -26, -103, 12, 3, -110, -20, -40, -1, -96, + -74, -15, 57, 29, -42, -57, -32, -48, 63, 30, -61, -4, -33, -6, -75, -68, -13, -10, 15, -24, + -105, -1, -86, 86, -7, -96, -31, -13, -7, -74, -60, -23, 20, 23, -18, -65, -51, -70, -3, 23, + -54, -20, -21, -3, -84, -94, -16, 4, 40, -35, -97, -26, -71, 56, 24, -75, -20, -1, -5, -82, + -27, -13, 16, 27, -41, -117, -27, -38, 74, 42, -63, -10, -12, -1, -41, -49, -15, -8, 3, -26, + -94, -59, -63, -27, 23, -66, -27, -36, 2, -85, -86, -17, -11, 28, -21, -67, -83, -66, 10, -7, + -99, -24, -24, -10, -84, -45, -14, 12, 34, -51, -128, -47, -31, 12, 23, -49, -9, -1, -2, -87, + -27, -21, 22, 11, -38, -52, -65, -41, 34, 22, -65, -18, -16, 5, -89, -64, -9, 15, 40, -4, + -61, -57, -37, 2, 41, -64, -9, -41, -7, -76, -77, -16, 2, 29, -44, -99, -30, -81, 19, 20, + -74, -24, -6, -8, -58, -28, -10, 17, 31, -31, -98, -112, -70, 6, 21, -57, -9, -5, -14, -92, + -49, -12, 24, 31, -45, -60, -8, -52, 13, 32, -82, -16, -25, 2, -86, -44, -23, 16, 9, -42, + -48, -11, -51, 10, 45, -89, -14, 22, -5, -51, -66, -13, 13, 29, -27, -114, -56, -79, 45, 39, + -70, -25, 4, 4, -71, -27, -14, 26, 23, -20, -118, -55, -67, -30, -18, -32, -9, -1, 7, -91, + -64, -14, 19, 24, -24, -82, -29, -47, 41, 8, -44, -24, -9, -8, -72, -54, -18, 35, 13, -24, + -112, -57, -85, 23, 48, -109, -32, -36, -3, -76, -40, -20, 48, 4, -46, -80, -54, -69, -11, 33, + -77, -6, -9, -8, -74, -79, -20, 14, 19, -34, -88, -27, -52, 63, 5, -86, 0, -33, -4, -70, + -43, -14, 29, 32, -44, -125, -75, -3, 15, 35, -74, -10, 11, -8, -74, -51, -24, -3, 43, -41, + -51, -48, -72, 21, 26, -81, -33, -10, -4, -72, -42, -16, 9, 43, -23, -116, -17, -70, 19, 16, + -65, -12, -32, -10, -102, -77, -15, 17, 28, -33, -126, -67, -53, 42, 7, -49, 10, -26, 0, -88, + -64, -11, 18, 25, -41, -81, -62, -64, 25, 24, 6, -9, -6, -17, -64, -24, -13, 12, 18, -48, + -35, -50, -80, -28, 18, -49, -18, -15, -6, -77, -46, -14, 28, 9, -36, -100, -47, -68, 33, 31, + -65, 3, -21, -16, -94, -63, -19, 26, 52, -35, -124, -77, -51, 55, 78, -59, 4, -20, -10, -77, + -19, -13, -4, 22, -33, -43, -31, -54, -11, 63, -92, -3, -32, -3, -76, -64, -12, 0, 28, -34, + -113, -40, -45, -1, 23, -47, -26, 37, -11, -51, -23, -16, 16, 6, -38, -69, -51, -73, 3, 23, + -33, -14, -6, 1, -88, -65, -11, -4, 54, -44, -97, -12, -80, 3, 32, -76, -17, -42, -6, -80, + -68, -18, 28, 1, -50, -102, -67, -84, 24, 29, -68, -10, -15, -15, -70, -39, -11, 8, 24, -42, + -72, -54, -80, 24, 18, -74, -42, -40, -3, -62, -43, -15, 31, 27, -38, -117, -38, -94, 60, 3, + -78, -22, 2, -1, -76, -75, -20, 28, 27, -47, -101, -38, -23, -11, 35, -82, -7, -33, -8, -88, + -54, -23, -3, 34, -18, -69, -87, -60, 6, 24, -124, -24, -8, -6, -54, -73, -14, 19, 28, -30, + -60, -39, -62, 33, 54, -41, -24, -15, 10, -67, -49, -16, 33, 13, -27, -76, -39, -52, 23, 2, + -12, -15, 17, 0, -75, -63, -23, 32, 15, -13, -112, -36, -39, -3, 38, -106, -18, -31, -1, -61, + -45, -20, 8, 7, -37, -50, -53, -77, 8, -8, -52, -28, 9, -13, -76, -39, -6, 7, 23, -51, + -80, -37, -69, 42, 30, -56, -3, -43, 3, -65, -57, -23, 10, 36, -53, -57, -47, -73, 62, 39, + -55, -8, -31, 1, -59, -40, -12, 40, 4, -23, -96, 15, -63, -12, 21, -104, -23, 13, -7, -69, + -33, -19, 53, 24, -41, -41, -30, -59, 59, 30, -41, -21, -8, -4, -61, -38, -19, 7, 43, -19, + -83, -33, -78, 51, 43, -47, -22, -24, 1, -91, -66, -14, 40, 23, -16, -128, -13, -77, -19, 45, + -95, -17, -14, -6, -85, -99, -16, 27, 16, -47, -93, -52, -69, 70, 54, -109, -7, 11, -11, -70, + -21, -8, 15, 24, -9, -75, -56, -64, 36, 42, -33, -4, -37, -4, -94, -64, -11, 28, -15, -45, + -81, -45, -45, 22, 3, -75, -22, -11, 0, -75, -54, -22, 32, 6, -43, -125, -39, -40, 64, 52, + -72, 11, -27, -7, -77, -54, -27, 11, 37, -40, -96, -68, -69, 32, 8, -35, -15, -33, 0, -61, + -54, -16, 6, -4, -31, -100, -58, -66, -20, 22, -49, -20, -25, -2, -76, -70, -16, -1, 31, -40, + -78, -55, -77, 16, 38, -58, -17, -5, -1, -72, -25, -15, 20, 21, -35, -97, -66, -89, 28, 13, + -55, -18, -7, -9, -98, -45, -16, -7, 24, -37, -95, -75, -75, 25, -2, -81, 0, -14, -8, -87, + -51, -16, 15, 46, -48, -38, -46, -22, -10, 43, -36, -6, -28, -8, -87, -16, -23, 16, 20, -39, + -98, -51, -62, 62, 21, -84, -24, 22, -7, -80, -45, -17, 39, 38, -58, -87, -40, -78, -15, 39, + -96, -11, -19, -2, -82, -48, -20, 27, 33, -39, -110, -67, -62, -4, 31, -119, 0, 41, -10, -111, + -61, -24, -14, 31, -52, -101, -73, -53, 47, 20, -101, -6, -25, -5, -60, -69, -10, -2, -13, -47, + -118, -69, -63, 25, 27, -33, -11, -5, 4, -75, -69, -7, -6, 20, -25, -69, -45, -37, 21, 17, + -41, -19, 7, -7, -83, -63, -14, 12, 19, -41, -68, -52, -71, 49, 27, -87, -9, -21, -6, -80, + -25, -15, -8, 31, -24, -51, -14, -58, 16, 17, -49, -17, -2, -8, -69, -37, -20, 28, 45, -55, + -105, -62, -76, 46, 56, -101, -8, -19, -15, -80, -65, -14, -5, 11, -51, -93, -70, -93, 32, -13, + -108, -17, 0, -2, -97, -112, -17, 11, 27, -41, -128, -82, -38, 30, 6, -33, -26, -16, -7, -61, + -54, -16, -4, 41, -36, -88, -60, -78, 35, 6, -49, -29, -29, -2, -72, -43, -19, 50, 28, -30, + -67, -54, -42, -2, -7, 6, -21, -34, -4, -92, -80, -13, 38, 21, -36, -106, -33, -32, 50, 42, + -69, -30, -5, -15, -78, -49, -10, 24, 16, -25, -75, -60, -75, 56, 4, -55, -7, -6, -7, -96, + -48, -12, 12, 16, -26, -42, 11, -78, 33, 2, -78, -13, -37, 0, -75, -57, -21, 29, 16, -39, + -95, -68, -59, 25, 52, -84, -12, -6, -5, -61, -41, -18, 23, 17, -48, -121, -71, -50, 4, 28, + -84, -5, -6, 2, -85, -55, -18, 15, 10, -50, -69, -54, -35, 9, 22, -63, -18, -36, -3, -61, + -89, -2, 2, 44, -31, -95, -61, -64, 43, 12, -67, -37, -22, -6, -96, -46, -22, 5, 28, -30, + -94, -42, -51, 23, 33, -58, -31, -17, -1, -78, -52, -17, 9, 23, -19, -88, -41, -96, 14, 46, + -55, -6, -30, -2, -109, -81, -15, 17, 20, -34, -95, -59, -71, 10, 53, -111, -22, -34, 0, -90, + -38, -18, 32, 16, -39, -128, -44, -45, 53, 40, -115, -8, 6, -6, -68, -38, -28, 25, 44, -40, + -86, -38, -65, 42, 21, -104, -34, -20, -4, -65, -52, -16, 47, 24, -31, -92, -15, -73, 26, 17, + -90, -23, -28, 0, -83, -77, -18, 14, 43, -18, -103, -80, -53, 66, 36, -63, -18, 0, 8, -81, + -50, -12, -19, 21, -50, -65, -78, -70, 11, 20, -62, -19, -12, -8, -76, -73, -22, 3, 19, -37, + -85, -44, -58, -10, -1, -34, -17, 0, -3, -92, -61, -16, -5, 16, -56}; + +const int8_t *const basic_2_int4_output_ref = basic_2_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_multiplier.h new file mode 100644 index 00000000..56351aab --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_multiplier.h @@ -0,0 +1,22 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_2_int4_output_multiplier[15] = {1690096537, + 1548717458, + 1634179310, + 2116218896, + 1358968353, + 2086765292, + 1351559079, + 1492265592, + 1514044601, + 2041455297, + 1108715588, + 1306504288, + 1229579466, + 1143479585, + 1877594615}; + +const int32_t *const basic_2_int4_output_mult = basic_2_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_shift.h new file mode 100644 index 00000000..b5732261 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_2_int4_output_shift[15] = {-7, -7, -7, -7, -7, -7, -8, -7, -9, -8, -7, -9, -7, -7, -8}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_2_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/basic_2_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_2_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_2_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/biases_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/biases_data.h index 03e1d314..fb467d77 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/biases_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/biases_data.h @@ -1,5 +1,5 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/config_data.h index b88502a2..a39a75f0 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define BASIC_INT4_OUT_CH 1 #define BASIC_INT4_IN_CH 1 +#define BASIC_INT4_OUT_CH 1 #define BASIC_INT4_INPUT_W 5 #define BASIC_INT4_INPUT_H 8 -#define BASIC_INT4_DST_SIZE 20 -#define BASIC_INT4_INPUT_SIZE 40 -#define BASIC_INT4_OUT_ACTIVATION_MIN -128 -#define BASIC_INT4_OUT_ACTIVATION_MAX 127 -#define BASIC_INT4_INPUT_BATCHES 1 #define BASIC_INT4_FILTER_X 2 #define BASIC_INT4_FILTER_Y 4 +#define BASIC_INT4_PADDING VALID #define BASIC_INT4_STRIDE_X 1 #define BASIC_INT4_STRIDE_Y 1 -#define BASIC_INT4_PAD_X 0 -#define BASIC_INT4_PAD_Y 0 -#define BASIC_INT4_OUTPUT_W 4 -#define BASIC_INT4_OUTPUT_H 5 -#define BASIC_INT4_INPUT_OFFSET 0 -#define BASIC_INT4_OUTPUT_OFFSET 0 #define BASIC_INT4_DILATION_X 1 #define BASIC_INT4_DILATION_Y 1 +#define BASIC_INT4_BATCH_SIZE 1 +#define BASIC_INT4_OUT_ACTIVATION_MIN -128 +#define BASIC_INT4_OUT_ACTIVATION_MAX 127 +#define BASIC_INT4_INPUT_BATCHES 1 +#define BASIC_INT4_DST_SIZE 20 +#define BASIC_INT4_OUTPUT_H 5 +#define BASIC_INT4_OUTPUT_W 4 +#define BASIC_INT4_INPUT_OFFSET 128 +#define BASIC_INT4_OUTPUT_OFFSET 0 +#define BASIC_INT4_PAD_X 0 +#define BASIC_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/input.h b/Tests/UnitTest/TestCases/TestData/basic_int4/input.h new file mode 100644 index 00000000..cf399f2f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/input.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_int4_input[40] = {93, -70, 95, -77, -82, 8, 64, -124, 27, -1, 70, -97, -7, -11, + 94, 57, -6, 17, 83, -58, -81, 43, 98, 36, -96, 60, -74, 27, + 109, 90, -112, 41, -94, 48, -48, 43, -41, 65, 21, 79}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/basic_int4/input_bias.h new file mode 100644 index 00000000..98973b2d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_int4_input_bias[1] = {127}; + +const int32_t *const basic_int4_biases = basic_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/input_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/input_data.h index 6fdc11b8..1829ad9a 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/input_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/input_data.h @@ -1,8 +1,8 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int8_t basic_int4_input[40] = {-27, -108, 57, 22, -70, -13, 125, -103, 16, -104, -17, 22, 35, 92, - 44, -74, 109, -95, -18, 6, -56, 34, 87, -75, 60, -87, 27, -96, - 112, -106, 98, 82, 4, 98, -97, 105, -50, 37, -36, -2}; +const int8_t basic_int4_input[40] = {-56, -120, -61, 63, -74, 75, -64, 37, 103, -54, -110, 114, -9, -116, + -49, -77, 94, 35, 40, -96, -122, -98, 80, 106, -80, -48, 123, 33, + 0, 113, -101, -65, 118, 72, -6, 91, 37, -127, 30, 51}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/basic_int4/input_weights.h new file mode 100644 index 00000000..5228d8f6 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/input_weights.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_int4_input_weights[4] = {31, 159, 77, 156}; + +const int8_t *const basic_int4_weights = basic_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output.h new file mode 100644 index 00000000..65f3c847 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t basic_int4_output[20] = {-19, -6, -17, -9, -9, -16, -12, -15, -9, -10, + -21, -18, -15, -11, -11, -8, -5, -16, -16, -22}; + +const int8_t *const basic_int4_output_ref = basic_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output_mult_data.h index 7e9ade26..9e67ff4d 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/output_mult_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output_mult_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int32_t basic_int4_output_mult[1] = {1235486272}; +const int32_t basic_int4_output_mult[1] = {1404586390}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output_multiplier.h new file mode 100644 index 00000000..18148206 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_int4_output_multiplier[1] = {1484293166}; + +const int32_t *const basic_int4_output_mult = basic_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output_ref_data.h index b1b0395d..69f0153d 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/output_ref_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output_ref_data.h @@ -1,7 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int8_t basic_int4_output_ref[20] = {-45, 127, -104, -51, -44, -24, 127, 5, -41, 61, - -128, 97, 15, 80, 1, 74, 8, -76, -4, 19}; +const int8_t basic_int4_output_ref[20] = {0, -6, -12, -3, -10, -6, -5, -8, -13, -7, + -4, -3, -2, -15, -11, 0, -8, -2, -10, -12}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift.h new file mode 100644 index 00000000..e8fca106 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t basic_int4_output_shift[1] = {-7}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift_data.h index 25bb2aaf..32ceafbe 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/output_shift_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int32_t basic_int4_output_shift[1] = {-3}; +const int32_t basic_int4_output_shift[1] = {-7}; diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/basic_int4/weights_data.h b/Tests/UnitTest/TestCases/TestData/basic_int4/weights_data.h index 9f14cd24..3e80467e 100644 --- a/Tests/UnitTest/TestCases/TestData/basic_int4/weights_data.h +++ b/Tests/UnitTest/TestCases/TestData/basic_int4/weights_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int8_t basic_int4_weights[4] = {-2, 54, -36, -106}; +const int8_t basic_int4_weights[4] = {-36, -110, 63, -31}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/config_data.h index 1fdc7a48..d4c6122b 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_1_X_N_1_INT4_OUT_CH 3 +#define CONV_1_X_N_1_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_1_INT4_IN_CH 4 +#define CONV_1_X_N_1_INT4_OUT_CH 3 #define CONV_1_X_N_1_INT4_INPUT_W 2 #define CONV_1_X_N_1_INT4_INPUT_H 1 -#define CONV_1_X_N_1_INT4_DST_SIZE 12 -#define CONV_1_X_N_1_INT4_INPUT_SIZE 8 -#define CONV_1_X_N_1_INT4_OUT_ACTIVATION_MIN -127 -#define CONV_1_X_N_1_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_1_X_N_1_INT4_INPUT_BATCHES 2 #define CONV_1_X_N_1_INT4_FILTER_X 3 #define CONV_1_X_N_1_INT4_FILTER_Y 1 #define CONV_1_X_N_1_INT4_STRIDE_X 1 -#define CONV_1_X_N_1_INT4_STRIDE_Y 1 -#define CONV_1_X_N_1_INT4_PAD_X 1 -#define CONV_1_X_N_1_INT4_PAD_Y 0 -#define CONV_1_X_N_1_INT4_OUTPUT_W 2 -#define CONV_1_X_N_1_INT4_OUTPUT_H 1 -#define CONV_1_X_N_1_INT4_INPUT_OFFSET 0 -#define CONV_1_X_N_1_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_1_INT4_STRIDE_Y 2 +#define CONV_1_X_N_1_INT4_PADDING SAME #define CONV_1_X_N_1_INT4_DILATION_X 1 #define CONV_1_X_N_1_INT4_DILATION_Y 1 +#define CONV_1_X_N_1_INT4_BATCH_SIZE 1 +#define CONV_1_X_N_1_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_1_X_N_1_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_1_X_N_1_INT4_DST_SIZE 6 +#define CONV_1_X_N_1_INT4_OUTPUT_H 1 +#define CONV_1_X_N_1_INT4_OUTPUT_W 2 +#define CONV_1_X_N_1_INT4_INPUT_OFFSET 128 +#define CONV_1_X_N_1_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_1_INT4_PAD_X 1 +#define CONV_1_X_N_1_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input.h new file mode 100644 index 00000000..fa2c365f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_1_int4_input[8] = {113, 121, -95, -51, 46, -100, -42, 20}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_bias.h new file mode 100644 index 00000000..646463b4 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_1_int4_input_bias[3] = {126, 51, 12}; + +const int32_t *const conv_1_x_n_1_int4_biases = conv_1_x_n_1_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_weights.h new file mode 100644 index 00000000..c7365e80 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_1_int4_input_weights[18] = + {230, 220, 40, 120, 155, 26, 182, 68, 53, 89, 0, 118, 6, 157, 205, 8, 183, 214}; + +const int8_t *const conv_1_x_n_1_int4_weights = conv_1_x_n_1_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output.h new file mode 100644 index 00000000..17264ada --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_1_int4_output[6] = {-21, 26, -3, -2, 12, -2}; + +const int8_t *const conv_1_x_n_1_int4_output_ref = conv_1_x_n_1_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_multiplier.h new file mode 100644 index 00000000..f806c905 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_1_int4_output_multiplier[3] = {1144632851, 1902745396, 1794992290}; + +const int32_t *const conv_1_x_n_1_int4_output_mult = conv_1_x_n_1_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_shift.h new file mode 100644 index 00000000..59292b96 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_1_int4_output_shift[3] = {-6, -7, -8}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_1_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/config_data.h index 8aff4cb6..e70c6c2e 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_1_X_N_2_INT4_OUT_CH 3 +#define CONV_1_X_N_2_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_2_INT4_IN_CH 4 +#define CONV_1_X_N_2_INT4_OUT_CH 3 #define CONV_1_X_N_2_INT4_INPUT_W 296 #define CONV_1_X_N_2_INT4_INPUT_H 1 -#define CONV_1_X_N_2_INT4_DST_SIZE 375 -#define CONV_1_X_N_2_INT4_INPUT_SIZE 1184 -#define CONV_1_X_N_2_INT4_OUT_ACTIVATION_MIN -111 -#define CONV_1_X_N_2_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_1_X_N_2_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_2_INT4_FILTER_X 48 #define CONV_1_X_N_2_INT4_FILTER_Y 1 #define CONV_1_X_N_2_INT4_STRIDE_X 2 #define CONV_1_X_N_2_INT4_STRIDE_Y 1 -#define CONV_1_X_N_2_INT4_PAD_X 0 -#define CONV_1_X_N_2_INT4_PAD_Y 0 -#define CONV_1_X_N_2_INT4_OUTPUT_W 125 +#define CONV_1_X_N_2_INT4_PADDING VALID +#define CONV_1_X_N_2_INT4_DILATION_X 1 +#define CONV_1_X_N_2_INT4_DILATION_Y 1 +#define CONV_1_X_N_2_INT4_BATCH_SIZE 1 +#define CONV_1_X_N_2_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_1_X_N_2_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_1_X_N_2_INT4_DST_SIZE 375 #define CONV_1_X_N_2_INT4_OUTPUT_H 1 +#define CONV_1_X_N_2_INT4_OUTPUT_W 125 #define CONV_1_X_N_2_INT4_INPUT_OFFSET 128 #define CONV_1_X_N_2_INT4_OUTPUT_OFFSET 0 -#define CONV_1_X_N_2_INT4_DILATION_X 1 -#define CONV_1_X_N_2_INT4_DILATION_Y 1 +#define CONV_1_X_N_2_INT4_PAD_X 0 +#define CONV_1_X_N_2_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input.h new file mode 100644 index 00000000..5e38742b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input.h @@ -0,0 +1,69 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_2_int4_input[1184] = { + 108, -60, 57, 27, 29, 102, 122, 16, -47, 23, -90, 11, -104, -49, -95, -8, 91, -51, 121, + 124, 90, 56, 9, -11, -21, -104, 66, -111, -127, -14, -60, 26, -87, 54, 51, -75, 47, 108, + -66, -11, -88, 24, -116, -36, -128, 51, 111, 117, 67, -41, 49, -62, 98, -54, 35, -69, 27, + 54, 38, 115, 83, 21, -105, -77, 111, 21, -82, 1, 9, 100, 121, -31, -74, -127, 51, 32, + 125, 100, 62, -92, 88, -42, -35, 81, 90, 28, -105, 23, -44, 106, -80, 51, -93, 54, 6, + 118, 48, 37, -71, -97, -85, 117, -30, 16, -60, 47, -86, -68, 4, 33, -80, -11, -48, -29, + 25, 78, 80, -73, -59, -15, -16, 14, 32, 15, 95, -27, -100, 83, -4, -73, 4, -22, -37, + -20, 71, -66, 21, -127, -12, 35, -94, -15, 89, 119, 124, -66, 102, 65, 91, 124, -106, -98, + 3, 2, -51, -126, -77, -76, -36, -120, 125, -77, -73, 57, 105, -98, 115, -52, 31, 117, -89, + -88, -35, 115, -22, 102, -14, 75, 65, 84, 46, -97, -95, 75, 49, 61, 66, -2, -55, 49, + -62, -103, 112, 87, -82, -90, 79, 121, -87, -118, 0, 66, 96, 111, 63, -68, -118, -17, 108, + 109, 97, 57, 78, -124, 117, -6, 12, -111, 94, 17, 82, 7, -33, 113, 106, -74, 73, -50, + -52, -70, -113, -96, -108, 13, -66, -41, -21, -102, 124, 61, 52, 114, -55, 54, -41, 113, -81, + 60, 34, 58, 109, -117, 122, -23, -26, 100, -89, 108, 108, 117, 27, -103, -9, 77, 82, -59, + 69, -114, 14, -37, -9, -6, 88, -48, 2, -66, -30, 54, -47, -69, -26, 54, -32, 89, -60, + 103, -4, -49, -69, 39, 3, -123, 103, 120, 96, 29, 66, -8, -25, 105, 90, -127, -100, -125, + -100, -34, -53, 35, 111, -100, 114, 23, 33, -45, 21, 34, -106, -56, 70, -39, -59, 44, 68, + 15, 26, -80, 64, -97, -83, 124, -64, -75, 28, -85, 32, -109, 123, -78, 21, 80, 71, 49, + -43, 71, 83, 112, 49, 26, 68, 57, -51, -36, 24, 42, 52, 106, 0, -30, 80, -114, -39, + 5, -12, -121, -119, -17, 2, -99, 57, -43, -53, 113, 27, 55, -49, 126, -94, 15, 46, 11, + -107, -4, 78, -53, 71, 64, -121, -71, 54, -36, 19, 69, 86, -85, -79, -5, -50, -88, -48, + 81, -12, -123, 31, 9, -55, -69, -72, 95, 42, -26, -96, 76, 66, -20, -32, -14, -16, 62, + 29, -105, 87, 41, -66, -120, 69, -48, -65, -67, -5, -99, 54, -81, 49, 30, -6, 39, -29, + 106, 70, -63, 29, 73, 112, 63, 12, -62, -16, -79, -73, -120, 33, 65, 121, 41, 102, -85, + -64, -123, 69, 77, -73, -15, -40, 27, 109, 66, 6, 54, 38, -37, 65, 123, -39, 16, -126, + -5, -112, 113, 89, 83, 103, 41, -73, -86, -116, -73, 5, -100, -87, -109, -89, -122, -123, -16, + 104, -38, 69, -1, 56, -108, -110, 54, 104, -104, -117, -57, -99, -41, 53, -83, -5, -41, -95, + -77, 45, -42, 71, 41, -87, -101, 54, -111, 90, 112, -68, 123, 115, -93, -110, -92, -2, 38, + 2, 95, 92, 34, -26, -5, 105, -123, -27, -77, 106, -6, -11, -107, -79, -124, 41, 125, -17, + -86, -1, -95, 75, -116, 30, -99, 8, 50, 87, 36, 113, -81, -4, 41, -117, 107, 17, 32, + 39, 47, -22, -32, -26, 75, -36, -29, -49, -29, 119, 87, 126, 127, -115, -67, -73, 22, 58, + 39, -4, -47, -61, -71, 86, -44, -65, 41, 86, 69, -8, 58, -53, -105, 111, -73, -18, -23, + 45, 71, 89, -83, -46, 9, -38, -85, 108, 34, 122, 45, -87, -29, -20, 0, 10, 46, -57, + -110, -64, -101, 25, 15, -45, -95, -12, -70, -42, 14, -24, -83, 68, -70, -25, 23, -36, -22, + 97, 2, -43, 90, -123, -112, 19, -37, 91, -16, -103, 66, -27, 31, 48, 31, -18, -86, 72, + -35, -75, 43, -29, 95, 8, 99, -43, 61, -106, 63, -41, 71, -43, -24, 41, 112, -73, -85, + 16, 112, -54, -11, 8, 61, -17, 12, 19, 93, 78, 67, -8, -37, -116, -43, 97, -118, 85, + 89, 62, 95, 69, 25, 56, 103, -57, -6, 95, 0, 66, 62, -13, 82, -118, -83, -28, -113, + 39, -39, 58, 51, -9, -38, -42, 67, 74, -48, 114, -48, 62, 111, 75, 60, 74, 29, -38, + 15, -24, 42, -85, 70, 83, 57, 31, 84, 73, 51, -102, 12, -10, -106, -26, 42, -60, -58, + -82, -27, -30, 126, -22, 5, 126, -33, 75, 100, -87, -35, -110, -116, -80, -18, 68, 27, -100, + -24, 82, -41, -47, 48, -35, -63, 41, -64, -95, 91, 3, 15, -74, -76, 24, 97, -118, -7, + 59, -92, 90, 62, 27, -20, 118, -26, 51, -118, -3, -84, -97, -80, -80, 79, 65, 79, -107, + -122, -53, 55, 75, 99, -71, 105, -39, -16, 36, -33, -62, 66, 71, 8, -50, -104, 53, -116, + 5, 103, 15, -24, -67, 17, -44, 103, 124, -73, -44, 74, -105, 109, 84, 40, -28, -62, -117, + 20, -29, -25, 103, 22, 121, 60, -116, -89, 92, -28, 26, -126, 15, 9, 72, -10, 43, 112, + 50, 108, -56, -85, 70, 16, 63, -78, -120, 126, 49, 103, 63, 33, 25, -116, 71, 126, -42, + -124, 65, -88, -82, 90, -78, 54, -101, 114, -92, -72, 14, 5, 81, -38, 39, -81, -70, -55, + -128, 5, -82, 10, 18, -26, -60, 54, 92, -82, 8, 5, 27, -83, 37, -88, -117, -11, -45, + 72, -57, -86, -51, 81, 66, -42, 69, -81, -72, -54, 38, -16, -99, 47, -18, 48, 112, 112, + 124, -6, 81, -127, -4, 24, -95, -103, -62, 62, -66, -24, 37, 48, -96, 53, -49, -25, 50, + 118, -59, 0, 89, 58, 120, -34, -116, 70, 89, -113, -24, 38, 61, -61, 61, -60, 14, 117, + -58, 62, -114, 14, -21, 50, 50, -121, 70, -71, 42, -104, 29, 10, -73, 124, 81, 97, -113, + -52, 77, 108, 78, 26, 42, -13, 52, -52, -39, 72, 88, 62, -107, -124, -3, -10, -48, -9, + -58, 64, -19, -54, 13, 56, -19, -58, 6, -64, -14, -54, 108, -73, 63, 113, -13, -100, -111, + 122, -107, -41, 48, 70, 80, 67, 17, -26, 55, -26, 35, -125, -120, -122, -36, -75, 49, -64, + -13, -62, -12, -64, 110, -73, 127, 36, 16, -97, -81, 13, 28, -87, 101, -20, 111, -56, -103, + 38, 90, -4, 25, -127, -17, 5, -34, 105, 92, -38, 22, -65, 57, -116, -45, 79, -25, 107, + -111, -22, 119, -111, 54, -63, -57, 116, 17, 33, -91, -11, 120, -64, 11, 108, 26, -120, -4, + 60, 24, -81, -9, -41, 7, -18, -118, -94, -18, 53, 36, 3, -96, 99, 16, 63, 50, 24, + -12, -113, -57, 57, -123, -20, 53, -15, 39, 119, -80, -92, 26, -56, 65, 105, 26, -15, 113, + 23, -83, 114, 122, -48, -51, -101, 101, -110, 3, 92, 47, -57, 44, -9, 21, 92, -61, 118, + 57, 125, -80, 2, 119, 85}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_bias.h new file mode 100644 index 00000000..8e65e8c1 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_1_x_n_2_int4_input_bias = NULL; + +const int32_t *const conv_1_x_n_2_int4_biases = conv_1_x_n_2_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_weights.h new file mode 100644 index 00000000..5a3f370f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/input_weights.h @@ -0,0 +1,21 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_2_int4_input_weights[288] = { + 49, 74, 79, 208, 86, 24, 34, 105, 117, 199, 255, 142, 202, 72, 154, 128, 165, 170, 33, 161, 9, 128, 132, + 211, 53, 191, 148, 36, 112, 56, 39, 166, 109, 156, 14, 43, 205, 7, 110, 177, 51, 43, 102, 142, 61, 249, + 66, 79, 199, 220, 248, 227, 27, 210, 80, 30, 78, 211, 170, 165, 69, 161, 232, 23, 203, 118, 120, 249, 187, + 229, 249, 220, 179, 246, 17, 82, 11, 177, 178, 8, 69, 229, 175, 202, 216, 139, 79, 125, 117, 191, 3, 63, + 245, 53, 102, 45, 83, 52, 193, 216, 220, 179, 138, 184, 160, 7, 6, 146, 8, 27, 33, 114, 45, 94, 144, + 129, 251, 131, 180, 5, 188, 7, 235, 25, 251, 26, 171, 6, 88, 205, 189, 208, 83, 232, 208, 47, 215, 250, + 74, 119, 27, 115, 39, 247, 110, 202, 157, 203, 86, 94, 104, 29, 100, 148, 66, 212, 202, 103, 3, 131, 183, + 203, 167, 16, 142, 99, 172, 106, 196, 0, 109, 165, 112, 56, 206, 124, 244, 132, 194, 162, 144, 15, 68, 84, + 75, 101, 129, 194, 134, 168, 246, 15, 225, 188, 6, 144, 84, 97, 192, 167, 12, 146, 151, 186, 242, 159, 14, + 228, 65, 128, 128, 20, 49, 79, 123, 255, 218, 15, 27, 135, 249, 161, 129, 91, 29, 29, 60, 237, 22, 87, + 67, 228, 16, 22, 132, 47, 192, 102, 34, 104, 27, 46, 217, 211, 129, 203, 176, 20, 97, 115, 98, 118, 105, + 41, 226, 49, 161, 189, 202, 68, 199, 56, 123, 25, 120, 113, 248, 228, 162, 11, 1, 228, 206, 32, 8, 104, + 71, 67, 110, 239, 154, 217, 232, 70, 199, 218, 43, 50}; + +const int8_t *const conv_1_x_n_2_int4_weights = conv_1_x_n_2_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output.h new file mode 100644 index 00000000..e9ccddf9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output.h @@ -0,0 +1,28 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_2_int4_output[375] = { + 0, -109, -104, -81, -109, -77, -20, -126, -128, -107, -120, -128, -50, -99, -70, -62, -128, -102, -70, + -128, -128, -106, -125, 35, -23, -127, -128, -39, -128, -128, -77, -22, -125, -30, -65, -95, -78, -102, + -118, -63, -123, -72, 5, -128, -99, -94, -124, -128, -68, -122, -31, -73, -118, -31, -99, -103, -94, + -64, -128, -128, -55, -128, -106, -65, -50, -116, -95, -19, -26, -59, -128, -52, -43, -128, -128, -82, + -67, -12, -49, -85, -32, -67, -107, -87, -109, -113, -97, -68, -42, -19, -30, -128, -108, -52, -128, + -62, -70, -52, -90, -25, 29, -65, -72, -128, -38, -47, -115, -58, -74, -83, -105, -91, -122, 13, + -46, -125, -50, -109, -114, -31, -79, 8, -96, -42, -77, -23, -52, -128, -106, -85, -128, -36, -74, + -56, -31, -31, -128, -27, -76, -128, -63, 7, -87, -97, -8, -101, -81, -48, -74, -80, -26, -128, + -107, -65, -43, -68, -45, -51, -128, -38, -124, -31, -65, -115, -78, -81, -111, -97, -37, -71, 4, + -50, -128, -66, -49, -106, -96, -65, -110, -36, -58, -115, -33, -60, -128, -76, -41, -55, -46, -52, + -111, -66, -88, -87, -101, -43, -128, -65, -72, -128, -64, -114, -80, -55, -50, -128, -13, -74, -109, + -128, -62, -90, -128, -85, -60, -56, -59, -128, -63, -52, -81, -93, -38, -97, -68, -34, -112, -86, + -53, -95, -80, -24, -56, -30, -95, -101, -61, -70, -128, -30, -50, -94, -64, -51, -128, -22, -59, + -128, -92, -61, -128, -97, -55, -75, -104, -53, -128, -109, 12, -128, -103, -72, -113, -36, -104, -63, + -61, -69, -77, -96, -65, -128, -112, -76, -116, -54, -94, -80, -78, -60, -92, -121, -67, -114, -21, + -30, -121, -42, -65, -122, -52, -63, -120, -76, -79, -112, -42, -63, -79, -66, -72, -98, -62, -87, + -128, -128, -70, -104, -83, -48, -125, -117, -69, -128, -51, -87, -102, -76, -95, -107, -53, -46, -48, + -82, -64, -128, -96, -56, -75, -59, -98, -81, -75, -5, -66, -101, -84, -38, -30, -51, -61, -92, + -68, -109, -78, -43, -128, -61, -92, -97, -70, -78, -73, -31, -81, -116, -81, -87, -103, -128, -18, + -115, -77, -76, -116, -65, -33, -94, -59, -89, -111, -128, -52, -94, -114}; + +const int8_t *const conv_1_x_n_2_int4_output_ref = conv_1_x_n_2_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_multiplier.h new file mode 100644 index 00000000..9c1ec45e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_2_int4_output_multiplier[3] = {1419830435, 1137794488, 1134867691}; + +const int32_t *const conv_1_x_n_2_int4_output_mult = conv_1_x_n_2_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_shift.h new file mode 100644 index 00000000..6715820d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_2_int4_output_shift[3] = {-7, -6, -6}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_2_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/config_data.h index 91a9a56f..4d0ee8f5 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_1_X_N_3_INT4_OUT_CH 1 +#define CONV_1_X_N_3_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_3_INT4_IN_CH 4 +#define CONV_1_X_N_3_INT4_OUT_CH 1 #define CONV_1_X_N_3_INT4_INPUT_W 296 #define CONV_1_X_N_3_INT4_INPUT_H 1 -#define CONV_1_X_N_3_INT4_DST_SIZE 148 -#define CONV_1_X_N_3_INT4_INPUT_SIZE 1184 -#define CONV_1_X_N_3_INT4_OUT_ACTIVATION_MIN -111 -#define CONV_1_X_N_3_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_1_X_N_3_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_3_INT4_FILTER_X 48 #define CONV_1_X_N_3_INT4_FILTER_Y 1 #define CONV_1_X_N_3_INT4_STRIDE_X 2 #define CONV_1_X_N_3_INT4_STRIDE_Y 1 -#define CONV_1_X_N_3_INT4_PAD_X 23 -#define CONV_1_X_N_3_INT4_PAD_Y 0 -#define CONV_1_X_N_3_INT4_OUTPUT_W 148 -#define CONV_1_X_N_3_INT4_OUTPUT_H 1 -#define CONV_1_X_N_3_INT4_INPUT_OFFSET 0 -#define CONV_1_X_N_3_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_3_INT4_OUT_ACTIVATION_MIN -112 +#define CONV_1_X_N_3_INT4_PADDING SAME #define CONV_1_X_N_3_INT4_DILATION_X 1 #define CONV_1_X_N_3_INT4_DILATION_Y 1 +#define CONV_1_X_N_3_INT4_BATCH_SIZE 1 +#define CONV_1_X_N_3_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_1_X_N_3_INT4_DST_SIZE 148 +#define CONV_1_X_N_3_INT4_OUTPUT_H 1 +#define CONV_1_X_N_3_INT4_OUTPUT_W 148 +#define CONV_1_X_N_3_INT4_INPUT_OFFSET 128 +#define CONV_1_X_N_3_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_3_INT4_PAD_X 23 +#define CONV_1_X_N_3_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input.h new file mode 100644 index 00000000..33e32834 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input.h @@ -0,0 +1,69 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_3_int4_input[1184] = { + 126, 22, 77, -15, 76, 45, -126, -62, -65, -4, 96, -86, 105, 40, -51, -88, 93, 41, -9, + 100, 8, -100, -123, -97, -76, 7, 74, 11, 106, 5, 43, 49, 106, 35, -127, 102, -9, 28, + 87, 20, 5, -79, -72, 116, -29, 93, -105, -78, 50, 102, 68, 77, -91, -9, -116, 120, 126, + 13, -42, 39, -29, 100, -47, 50, 73, -66, -6, 101, -28, -61, 92, 54, 25, 68, 124, 35, + -17, 95, -13, -62, 35, -88, -91, -110, 11, -95, 32, 73, 127, 19, 97, 17, -46, -34, -102, + -19, -48, -106, 115, 66, 58, -95, 98, -113, -8, -101, 108, -10, 71, 104, -96, -59, -11, 75, + 112, 30, -107, -71, -9, 21, 39, 37, -12, -77, 34, 32, -104, -5, -70, 117, -46, 23, -13, + -1, 48, -36, -75, -60, -10, -105, 62, -113, -68, 34, -64, -113, 33, -30, -62, -75, 26, -99, + 118, 24, 91, 29, 97, 115, 62, 66, 5, 19, 120, -122, -78, -57, 97, -73, -123, 5, -45, + 54, -28, -85, -61, -10, 1, -11, 62, -56, 88, -107, 121, -51, 116, 106, -25, -50, -18, -44, + -92, -18, -26, 112, -117, -52, 16, -17, -90, -67, -26, -38, -111, 55, -34, -112, 93, 36, 7, + -21, 80, -21, 103, 83, 126, 108, -94, 77, -123, -86, -52, -44, -16, -37, 46, -27, 62, 62, + 37, 104, 120, -36, -77, 9, -93, 56, -47, -30, 75, 87, -63, 69, -8, 122, 87, 86, -115, + 43, -101, 26, 49, -115, -50, 39, -93, -21, 4, 108, 111, -91, 68, -36, 46, 68, -33, -81, + -106, -63, 0, 3, -15, 67, 24, -66, 31, 66, 97, 93, 91, 38, -87, 57, -69, 4, -8, + -35, -21, 109, -36, -61, 90, 11, -124, -20, -72, -78, -117, -118, 66, 38, -117, 79, 48, 73, + -68, -11, -91, 23, -55, 89, 32, -77, -124, 57, -122, -38, 48, 6, 118, 0, -123, 71, 70, + 124, -41, 39, -124, -122, 82, 2, 91, -128, -96, 60, 5, -113, 28, 4, -55, 62, -79, 39, + -63, 108, -86, -11, -82, 3, -91, -62, -118, -97, 65, 76, 44, -26, 21, 93, -87, -97, 85, + -38, 118, 19, -56, 6, 76, -115, 93, 104, 72, 101, -69, 86, 43, 97, -105, -31, -116, -75, + 85, -56, 1, 75, 112, -15, 59, 49, 76, 56, -86, -89, 80, -89, -18, 121, -44, 118, -20, + -112, 99, 124, 36, -100, -35, -5, -14, 2, -17, -118, 62, -64, 4, -9, -55, 102, 32, 114, + 125, -17, -60, 24, 57, -55, -45, 58, -95, 43, 46, 42, -85, 20, -3, -49, -32, 16, -31, + 85, 116, 35, 31, -48, 64, -74, 23, -20, 10, 13, 37, -28, 87, -73, -37, -21, 95, 122, + 116, -52, -48, 34, 76, 96, 5, -42, 89, 5, 65, 57, 63, 77, -23, 83, -27, 79, 114, + 61, -23, 119, 30, 115, 34, -70, 50, 107, 80, 85, -14, -50, -36, 11, -45, 76, 111, 85, + -97, -103, -23, -16, -49, 116, 72, -119, 26, 125, 49, 54, -115, -113, -14, -10, 45, -4, -99, + 14, 98, 27, -109, 92, 69, 54, 83, 102, 68, 70, -29, 15, -114, 13, 50, -112, 75, -93, + 25, 33, -30, 11, 17, 32, -74, -92, 35, -79, 60, -120, -90, -76, -72, 116, 32, -36, -98, + -14, -30, -106, -125, -106, 30, 113, 39, 75, 77, -38, 68, 87, 30, -34, -78, 126, 66, 95, + 33, -84, 22, 116, -50, 2, -57, 120, -36, 21, -109, 121, 37, -91, 26, 55, -62, 52, -26, + 54, 108, 19, 44, -21, -24, -54, -25, -113, -90, -42, -17, -125, -78, -100, 82, 86, 69, 12, + -91, 1, 3, 41, -107, 127, -105, 123, -125, -74, 60, -3, 7, 100, -77, 11, -25, -60, 84, + 79, -41, -94, -17, -6, 106, -24, -76, -76, -78, -77, 96, 106, 55, 30, -43, 94, 34, 114, + -76, -83, 97, 18, -26, 52, -79, -64, 51, 107, 5, 111, -30, 100, 108, 108, 54, 16, 78, + 117, 59, -74, -89, 60, -66, -33, 13, 36, 53, -110, 45, 29, 51, 84, 53, -89, 106, 57, + 51, -128, -75, -91, 89, -55, -24, -94, 14, -7, 66, -22, -77, 123, -124, -125, -64, -85, -2, + -126, -128, -81, 39, -70, -25, -17, -73, -108, 65, -95, 50, -3, 127, 6, -10, -77, -20, -58, + -31, 72, 30, -107, -100, -52, -53, -96, -67, -15, 28, 4, -106, 121, 112, -77, -29, -121, -123, + -37, -55, -45, 40, 33, 109, -28, 72, 92, 112, -120, -127, -81, 37, -52, -75, -43, 103, -103, + -49, 103, 7, -70, -107, -48, -100, -102, -124, 70, -28, -46, 39, -73, -80, 105, -110, 103, -58, + -31, 98, -29, -82, 18, 42, 4, -100, -104, 1, -33, 10, -3, -109, -58, 105, 110, -110, 118, + -115, 76, 32, -91, 52, 94, -10, -11, -64, -30, 79, -91, -18, -100, 122, -76, 31, -70, -98, + 14, -39, -24, -7, -50, 27, 99, -93, -86, -90, 4, 119, 57, -30, -62, 107, 28, -78, 9, + -107, -13, -49, 50, 62, -62, -89, -6, 8, 112, -25, 115, 112, -34, -9, 84, -124, -70, -126, + -98, 124, -58, -57, -115, -46, 120, -107, -104, -107, 111, 50, -37, -71, -56, -10, -109, 97, -6, + -48, -124, -67, -62, 93, 93, 76, -84, -13, 18, -25, 8, -107, 19, 95, -44, -71, 69, 13, + 61, -112, 121, -59, -99, 42, 41, -39, -110, 124, 52, 87, -106, 53, 28, 9, 100, -118, 105, + -124, 29, -81, -89, -58, 66, -26, -33, -73, -38, 17, -91, 39, -98, 30, -78, 21, 32, -113, + 89, -74, -58, 87, -24, 92, 57, 85, 52, -121, -90, 19, -87, 60, -117, 53, -22, 78, -75, + -30, -20, -91, 3, 78, -34, -90, -12, 63, 17, 26, -9, 44, -6, 118, -114, 95, -116, -11, + 121, 11, -53, -53, 96, -55, -42, 44, 102, -100, -119, 117, 78, -6, 25, -28, 50, -41, -47, + -40, 48, -117, 22, 11, -38, 5, -106, -49, -85, 67, -37, -102, 102, 34, 125, 102, -66, 93, + 87, -116, -127, 48, 118, -67, -66, -69, -61, -95, 41, -8, 64, -110, -38, 48, -106, 100, 25, + -124, -76, 31, 78, -30, 105, -99, -94, 73, 118, -95, -82, 92, -76, 117, 48, -115, 60, 79, + -65, 100, -32, -12, 119, -28, 70, -25, -73, 92, 18, -4, -84, 85, 4, 47, -24, -67, 0, + -83, -79, -115, -22, 62, -112, 82, 9, 16, -89, -3, -20, 97, 120, -56, -34, 5, -24, -88, + -66, 45, 69, -95, -106, 66, 90, -87, 65, 44, -46, -23, 124, 84, 77, 75, 126, -85, 61, + 113, -60, 116, -44, -23, 122, 90, -53, 68, 59, -90, 1, -12, -99, -125, -11, 59, -103, -110, + 81, -105, 2, -4, -26, 55, 19, -106, 113, -92, -73, -104, 100, -79, -7, -22, -94, 104, -82, + 39, 69, 86, -11, 105, -64, 1, -7, 61, 55, 105, -57, 48, 99, -12, 67, 41, 25, -74, + 86, -108, -15, -92, -38, 56, 15, -78, -93, 87, 96, -98, -128, 54, 25, 9, 24, 96, -9, + -96, -117, -107, -20, -58, 11}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_bias.h new file mode 100644 index 00000000..27e51332 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_1_x_n_3_int4_input_bias = NULL; + +const int32_t *const conv_1_x_n_3_int4_biases = conv_1_x_n_3_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_weights.h new file mode 100644 index 00000000..d60a406e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/input_weights.h @@ -0,0 +1,13 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_3_int4_input_weights[96] = { + 49, 228, 195, 154, 38, 90, 65, 151, 22, 196, 64, 245, 91, 89, 135, 162, 29, 68, 59, 38, + 31, 155, 163, 253, 248, 79, 172, 71, 42, 26, 73, 230, 161, 63, 144, 127, 102, 4, 112, 75, + 2, 175, 71, 236, 178, 81, 106, 79, 57, 234, 203, 10, 80, 196, 50, 91, 30, 231, 207, 69, + 27, 117, 190, 95, 44, 63, 106, 88, 31, 109, 111, 163, 249, 96, 96, 0, 226, 67, 171, 227, + 9, 103, 183, 108, 130, 83, 163, 229, 176, 158, 135, 60, 207, 121, 47, 166}; + +const int8_t *const conv_1_x_n_3_int4_weights = conv_1_x_n_3_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output.h new file mode 100644 index 00000000..d0f066a8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output.h @@ -0,0 +1,15 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_3_int4_output[148] = { + 16, 17, 30, 26, 14, 4, -13, -13, 5, -24, 15, 7, 3, -31, -4, -37, 41, -28, 22, -12, 0, 2, + -18, 9, 26, 40, 39, -14, -10, -8, 10, 3, -19, 21, -3, -3, 1, 15, 15, -5, 16, -7, 33, 5, + 8, 3, 7, 8, 5, -7, -8, 28, -10, -10, -8, 3, 13, 14, 0, 36, 21, -17, -13, -4, 26, 30, + -3, 5, 25, -15, 10, 29, 13, 11, 23, 23, 6, 7, -9, -12, 30, 27, 11, -11, -48, 34, -40, 8, + -32, -19, -5, 15, 28, -3, 3, 0, 28, 21, -23, 6, 31, -8, 55, -1, 2, -14, 39, 19, 34, -3, + -8, -14, -33, 9, -19, 15, 6, 23, 12, 3, -28, 22, 31, 35, 4, 19, -20, -25, -16, 35, -27, 12, + 5, 12, 29, 0, -9, 3, -35, 33, -1, 33, -32, -33, 9, 12, 8, 10}; + +const int8_t *const conv_1_x_n_3_int4_output_ref = conv_1_x_n_3_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_multiplier.h new file mode 100644 index 00000000..226a9780 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_3_int4_output_multiplier[1] = {1382460100}; + +const int32_t *const conv_1_x_n_3_int4_output_mult = conv_1_x_n_3_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_shift.h new file mode 100644 index 00000000..aa6e1e37 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_3_int4_output_shift[1] = {-7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_3_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/config_data.h index 637cc2e1..dd98306e 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_1_X_N_4_INT4_OUT_CH 4 +#define CONV_1_X_N_4_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_4_INT4_IN_CH 4 +#define CONV_1_X_N_4_INT4_OUT_CH 4 #define CONV_1_X_N_4_INT4_INPUT_W 16 #define CONV_1_X_N_4_INT4_INPUT_H 1 -#define CONV_1_X_N_4_INT4_DST_SIZE 32 -#define CONV_1_X_N_4_INT4_INPUT_SIZE 64 -#define CONV_1_X_N_4_INT4_OUT_ACTIVATION_MIN -88 -#define CONV_1_X_N_4_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_1_X_N_4_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_4_INT4_FILTER_X 3 #define CONV_1_X_N_4_INT4_FILTER_Y 1 #define CONV_1_X_N_4_INT4_STRIDE_X 2 #define CONV_1_X_N_4_INT4_STRIDE_Y 1 -#define CONV_1_X_N_4_INT4_PAD_X 0 -#define CONV_1_X_N_4_INT4_PAD_Y 0 -#define CONV_1_X_N_4_INT4_OUTPUT_W 8 -#define CONV_1_X_N_4_INT4_OUTPUT_H 1 -#define CONV_1_X_N_4_INT4_INPUT_OFFSET 0 -#define CONV_1_X_N_4_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_4_INT4_OUT_ACTIVATION_MIN -99 +#define CONV_1_X_N_4_INT4_PADDING SAME #define CONV_1_X_N_4_INT4_DILATION_X 1 #define CONV_1_X_N_4_INT4_DILATION_Y 1 +#define CONV_1_X_N_4_INT4_BATCH_SIZE 1 +#define CONV_1_X_N_4_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_1_X_N_4_INT4_DST_SIZE 32 +#define CONV_1_X_N_4_INT4_OUTPUT_H 1 +#define CONV_1_X_N_4_INT4_OUTPUT_W 8 +#define CONV_1_X_N_4_INT4_INPUT_OFFSET 128 +#define CONV_1_X_N_4_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_4_INT4_PAD_X 0 +#define CONV_1_X_N_4_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input.h new file mode 100644 index 00000000..ee870f3b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_4_int4_input[64] = { + 22, -82, 63, 96, -4, 91, 122, 58, -37, 76, 63, -101, 120, 8, 24, 33, -50, 67, -72, 85, 5, -48, + -91, -124, 119, -98, 123, 59, 25, -69, -27, -3, -109, 9, 53, -64, 21, 102, -119, -52, 33, 29, -113, 66, + 60, -70, -126, -123, 21, 15, -44, -9, 43, 28, -74, 82, 36, 11, -56, -42, -12, -10, 44, -116}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_bias.h new file mode 100644 index 00000000..a78511b6 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_1_x_n_4_int4_input_bias = NULL; + +const int32_t *const conv_1_x_n_4_int4_biases = conv_1_x_n_4_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_weights.h new file mode 100644 index 00000000..95e0c76a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_4_int4_input_weights[24] = {111, 204, 110, 125, 56, 161, 23, 199, 0, 18, 171, 75, + 114, 193, 99, 164, 9, 1, 135, 18, 98, 243, 34, 104}; + +const int8_t *const conv_1_x_n_4_int4_weights = conv_1_x_n_4_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output.h new file mode 100644 index 00000000..b62aa3c2 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_4_int4_output[32] = {0, -2, 3, 14, 0, 9, 7, 13, -30, -9, 1, -1, -13, 8, 2, 12, + -6, 2, 3, 15, -17, -5, 2, 8, 5, 0, 1, 11, 1, 10, 7, 9}; + +const int8_t *const conv_1_x_n_4_int4_output_ref = conv_1_x_n_4_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_multiplier.h new file mode 100644 index 00000000..5fd7b17e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_4_int4_output_multiplier[4] = {1584509187, 1512346304, 1512815607, 1494793850}; + +const int32_t *const conv_1_x_n_4_int4_output_mult = conv_1_x_n_4_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_shift.h new file mode 100644 index 00000000..535fac24 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_4_int4_output_shift[4] = {-6, -7, -8, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_4_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/config_data.h index ccb7a05b..820b893a 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_1_X_N_5_INT4_OUT_CH 1 +#define CONV_1_X_N_5_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_5_INT4_IN_CH 4 +#define CONV_1_X_N_5_INT4_OUT_CH 1 #define CONV_1_X_N_5_INT4_INPUT_W 17 #define CONV_1_X_N_5_INT4_INPUT_H 1 -#define CONV_1_X_N_5_INT4_DST_SIZE 6 -#define CONV_1_X_N_5_INT4_INPUT_SIZE 68 -#define CONV_1_X_N_5_INT4_OUT_ACTIVATION_MIN -88 -#define CONV_1_X_N_5_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_1_X_N_5_INT4_INPUT_BATCHES 1 #define CONV_1_X_N_5_INT4_FILTER_X 3 #define CONV_1_X_N_5_INT4_FILTER_Y 1 #define CONV_1_X_N_5_INT4_STRIDE_X 3 #define CONV_1_X_N_5_INT4_STRIDE_Y 1 -#define CONV_1_X_N_5_INT4_PAD_X 0 -#define CONV_1_X_N_5_INT4_PAD_Y 0 -#define CONV_1_X_N_5_INT4_OUTPUT_W 6 -#define CONV_1_X_N_5_INT4_OUTPUT_H 1 -#define CONV_1_X_N_5_INT4_INPUT_OFFSET 0 -#define CONV_1_X_N_5_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_5_INT4_OUT_ACTIVATION_MIN -109 +#define CONV_1_X_N_5_INT4_PADDING SAME #define CONV_1_X_N_5_INT4_DILATION_X 1 #define CONV_1_X_N_5_INT4_DILATION_Y 1 +#define CONV_1_X_N_5_INT4_BATCH_SIZE 1 +#define CONV_1_X_N_5_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_1_X_N_5_INT4_DST_SIZE 6 +#define CONV_1_X_N_5_INT4_OUTPUT_H 1 +#define CONV_1_X_N_5_INT4_OUTPUT_W 6 +#define CONV_1_X_N_5_INT4_INPUT_OFFSET 128 +#define CONV_1_X_N_5_INT4_OUTPUT_OFFSET 0 +#define CONV_1_X_N_5_INT4_PAD_X 0 +#define CONV_1_X_N_5_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input.h new file mode 100644 index 00000000..edf92ba1 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_5_int4_input[68] = { + 56, 93, -24, 89, -108, 68, 98, 33, 89, -88, 12, 68, -89, 117, 12, -66, -50, 91, 72, -45, 3, 47, 57, + 71, -34, 45, 35, 16, -80, -51, 115, 98, -43, -39, 6, 99, 55, -33, -46, -111, -57, 20, -3, 100, 38, 70, + -30, 37, 87, -68, 9, -126, -117, 13, 30, 108, 90, 90, 7, 80, -58, 98, -33, 18, 47, -98, 14, -68}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_bias.h new file mode 100644 index 00000000..7ad60a60 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_1_x_n_5_int4_input_bias = NULL; + +const int32_t *const conv_1_x_n_5_int4_biases = conv_1_x_n_5_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_weights.h new file mode 100644 index 00000000..307b2f28 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/input_weights.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_5_int4_input_weights[6] = {99, 199, 183, 233, 154, 123}; + +const int8_t *const conv_1_x_n_5_int4_weights = conv_1_x_n_5_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output.h new file mode 100644 index 00000000..6ab62389 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_1_x_n_5_int4_output[6] = {-10, -7, -3, -9, -12, 8}; + +const int8_t *const conv_1_x_n_5_int4_output_ref = conv_1_x_n_5_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_multiplier.h new file mode 100644 index 00000000..478bf01e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_5_int4_output_multiplier[1] = {1424630276}; + +const int32_t *const conv_1_x_n_5_int4_output_mult = conv_1_x_n_5_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_shift.h new file mode 100644 index 00000000..00b40455 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_1_x_n_5_int4_output_shift[1] = {-7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_1_x_n_5_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/config_data.h index 4e05e513..0728176e 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_2_INT4_OUT_CH 4 +#define CONV_2_INT4_INPUT_BATCHES 1 #define CONV_2_INT4_IN_CH 2 +#define CONV_2_INT4_OUT_CH 4 #define CONV_2_INT4_INPUT_W 6 #define CONV_2_INT4_INPUT_H 3 -#define CONV_2_INT4_DST_SIZE 72 -#define CONV_2_INT4_INPUT_SIZE 36 -#define CONV_2_INT4_OUT_ACTIVATION_MIN -101 -#define CONV_2_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_2_INT4_INPUT_BATCHES 1 #define CONV_2_INT4_FILTER_X 3 #define CONV_2_INT4_FILTER_Y 3 #define CONV_2_INT4_STRIDE_X 1 #define CONV_2_INT4_STRIDE_Y 1 -#define CONV_2_INT4_PAD_X 1 -#define CONV_2_INT4_PAD_Y 1 -#define CONV_2_INT4_OUTPUT_W 6 -#define CONV_2_INT4_OUTPUT_H 3 -#define CONV_2_INT4_INPUT_OFFSET 0 -#define CONV_2_INT4_OUTPUT_OFFSET 0 +#define CONV_2_INT4_OUT_ACTIVATION_MIN -119 +#define CONV_2_INT4_PADDING SAME #define CONV_2_INT4_DILATION_X 1 #define CONV_2_INT4_DILATION_Y 1 +#define CONV_2_INT4_BATCH_SIZE 1 +#define CONV_2_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_2_INT4_DST_SIZE 72 +#define CONV_2_INT4_OUTPUT_H 3 +#define CONV_2_INT4_OUTPUT_W 6 +#define CONV_2_INT4_INPUT_OFFSET 128 +#define CONV_2_INT4_OUTPUT_OFFSET 0 +#define CONV_2_INT4_PAD_X 1 +#define CONV_2_INT4_PAD_Y 1 diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input.h new file mode 100644 index 00000000..e66cd490 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2_int4_input[36] = {-3, 119, -66, 47, 106, 16, -68, -118, 105, 23, -4, 98, + -13, -90, 52, 31, -41, 52, -12, 61, -44, -4, 102, 74, + -100, -18, 2, -119, -28, 94, 43, 84, 37, -121, -52, -25}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_bias.h new file mode 100644 index 00000000..2b107809 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_2_int4_input_bias = NULL; + +const int32_t *const conv_2_int4_biases = conv_2_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_weights.h new file mode 100644 index 00000000..2d3c51b8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/input_weights.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2_int4_input_weights[36] = {188, 47, 134, 75, 245, 191, 108, 106, 75, 254, 28, 254, + 85, 41, 66, 110, 195, 19, 19, 98, 26, 230, 211, 172, + 100, 247, 128, 40, 130, 96, 210, 69, 117, 241, 132, 184}; + +const int8_t *const conv_2_int4_weights = conv_2_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output.h new file mode 100644 index 00000000..767b73db --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2_int4_output[72] = {-12, 3, -6, 9, -5, 8, -5, 5, 22, 2, 2, -11, 0, 9, 1, 1, 1, 4, + -2, 4, 1, 5, 10, 7, -12, -1, 0, 2, -16, 3, -1, 8, -15, 3, -1, -13, + -11, 4, 4, -7, -23, 7, 4, 23, -8, -4, 12, -15, -4, -2, -4, 19, -16, -1, + 0, 15, -35, 1, 0, 23, -6, 1, 2, 11, -12, 0, 1, 13, -12, -1, 9, -4}; + +const int8_t *const conv_2_int4_output_ref = conv_2_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_multiplier.h new file mode 100644 index 00000000..f645b655 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2_int4_output_multiplier[4] = {1317315346, 1379445586, 1643844183, 1173999121}; + +const int32_t *const conv_2_int4_output_mult = conv_2_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_shift.h new file mode 100644 index 00000000..73a8030d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2_int4_output_shift[4] = {-6, -8, -8, -6}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_2_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/config_data.h index 4d940de6..e4e084d0 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_CH 2 #define CONV_2X2_DILATION_5X5_INPUT_INT4_IN_CH 2 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_CH 2 #define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_W 5 #define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_H 5 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_DST_SIZE 50 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_SIZE 50 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_BATCHES 1 #define CONV_2X2_DILATION_5X5_INPUT_INT4_FILTER_X 3 #define CONV_2X2_DILATION_5X5_INPUT_INT4_FILTER_Y 3 #define CONV_2X2_DILATION_5X5_INPUT_INT4_STRIDE_X 1 #define CONV_2X2_DILATION_5X5_INPUT_INT4_STRIDE_Y 1 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_PAD_X 2 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_PAD_Y 2 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_W 5 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_H 5 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_OFFSET 0 -#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_OFFSET 0 #define CONV_2X2_DILATION_5X5_INPUT_INT4_DILATION_X 2 #define CONV_2X2_DILATION_5X5_INPUT_INT4_DILATION_Y 2 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_PADDING SAME +#define CONV_2X2_DILATION_5X5_INPUT_INT4_BATCH_SIZE 1 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_BATCHES 1 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_DST_SIZE 50 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_H 5 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_W 5 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_INPUT_OFFSET 128 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_OUTPUT_OFFSET 0 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_PAD_X 2 +#define CONV_2X2_DILATION_5X5_INPUT_INT4_PAD_Y 2 diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input.h new file mode 100644 index 00000000..f7affcce --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_5x5_input_int4_input[50] = { + 120, 76, 93, -74, 81, 41, -28, -3, 106, 49, 82, 69, 30, 98, 71, 60, 58, + -29, -84, 80, 48, 117, 68, 15, -102, 97, -59, -126, 70, -40, -6, 8, -40, -110, + -21, 43, 31, 18, 66, -104, -63, 22, 71, 99, 61, 96, -113, -117, -61, -90}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_bias.h new file mode 100644 index 00000000..1c845e7c --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_5x5_input_int4_input_bias[2] = {-120, 126}; + +const int32_t *const conv_2x2_dilation_5x5_input_int4_biases = conv_2x2_dilation_5x5_input_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_weights.h new file mode 100644 index 00000000..51377466 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_5x5_input_int4_input_weights[18] = + {77, 102, 130, 43, 207, 204, 95, 126, 197, 144, 203, 195, 1, 80, 254, 52, 223, 215}; + +const int8_t *const conv_2x2_dilation_5x5_input_int4_weights = conv_2x2_dilation_5x5_input_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output.h new file mode 100644 index 00000000..c127fbdf --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_5x5_input_int4_output[50] = { + -7, -1, -2, 0, -1, 4, -5, 3, -2, 2, -7, 0, -7, 2, -1, 4, -1, 1, -4, 3, 2, -1, 3, -2, 3, + -3, 3, 1, 11, -2, -2, -2, 1, -3, -4, -5, 3, -3, 4, -3, -6, -4, 3, 0, 0, -2, -1, -1, 6, -4}; + +const int8_t *const conv_2x2_dilation_5x5_input_int4_output_ref = conv_2x2_dilation_5x5_input_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_multiplier.h new file mode 100644 index 00000000..e884224e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_5x5_input_int4_output_multiplier[2] = {1884586598, 1653431570}; + +const int32_t *const conv_2x2_dilation_5x5_input_int4_output_mult = conv_2x2_dilation_5x5_input_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_shift.h new file mode 100644 index 00000000..c89f702a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_5x5_input_int4_output_shift[2] = {-8, -9}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_5x5_input_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/config_data.h index 91616b69..c8cf94d8 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_2X2_DILATION_INT4_OUT_CH 2 +#define CONV_2X2_DILATION_INT4_INPUT_BATCHES 1 #define CONV_2X2_DILATION_INT4_IN_CH 2 +#define CONV_2X2_DILATION_INT4_OUT_CH 2 #define CONV_2X2_DILATION_INT4_INPUT_W 10 #define CONV_2X2_DILATION_INT4_INPUT_H 10 -#define CONV_2X2_DILATION_INT4_DST_SIZE 72 -#define CONV_2X2_DILATION_INT4_INPUT_SIZE 200 -#define CONV_2X2_DILATION_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_2X2_DILATION_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_2X2_DILATION_INT4_INPUT_BATCHES 1 #define CONV_2X2_DILATION_INT4_FILTER_X 3 #define CONV_2X2_DILATION_INT4_FILTER_Y 3 #define CONV_2X2_DILATION_INT4_STRIDE_X 1 #define CONV_2X2_DILATION_INT4_STRIDE_Y 1 -#define CONV_2X2_DILATION_INT4_PAD_X 0 -#define CONV_2X2_DILATION_INT4_PAD_Y 0 -#define CONV_2X2_DILATION_INT4_OUTPUT_W 6 -#define CONV_2X2_DILATION_INT4_OUTPUT_H 6 -#define CONV_2X2_DILATION_INT4_INPUT_OFFSET 0 -#define CONV_2X2_DILATION_INT4_OUTPUT_OFFSET 0 #define CONV_2X2_DILATION_INT4_DILATION_X 2 #define CONV_2X2_DILATION_INT4_DILATION_Y 2 +#define CONV_2X2_DILATION_INT4_PADDING VALID +#define CONV_2X2_DILATION_INT4_BATCH_SIZE 1 +#define CONV_2X2_DILATION_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_2X2_DILATION_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_2X2_DILATION_INT4_DST_SIZE 72 +#define CONV_2X2_DILATION_INT4_OUTPUT_H 6 +#define CONV_2X2_DILATION_INT4_OUTPUT_W 6 +#define CONV_2X2_DILATION_INT4_INPUT_OFFSET 128 +#define CONV_2X2_DILATION_INT4_OUTPUT_OFFSET 0 +#define CONV_2X2_DILATION_INT4_PAD_X 0 +#define CONV_2X2_DILATION_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input.h new file mode 100644 index 00000000..0a0fa0bc --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input.h @@ -0,0 +1,16 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_int4_input[200] = { + 59, 102, 43, 26, 102, -93, -63, 69, 47, 112, 50, 70, -16, 78, -58, -89, 79, -40, 2, 69, + -87, -2, -13, 63, -5, -114, 22, 102, 18, 94, -119, -80, -21, 109, -72, 123, 77, -71, -125, -107, + -84, 121, -66, 55, -94, 81, -59, -82, -46, -90, -123, 55, 5, 71, 8, 25, 34, -10, -49, 24, + 64, 33, 48, -49, -114, -37, 83, -88, 86, 60, -23, 48, -63, 31, -125, 61, 125, 91, 40, 97, + 41, 24, -78, 70, -13, -108, -81, -55, -44, 22, -39, -81, -36, -33, -74, 61, -75, 126, -74, -4, + -28, 49, 125, -72, -93, -122, 75, -88, -48, -67, 3, -86, -73, 65, -106, -82, 117, 119, 85, 93, + -112, -70, 122, -78, 81, -59, 0, 63, 49, 13, -119, -122, -93, 82, 17, -10, 92, 6, 105, -116, + 34, 28, -37, -49, 49, 103, 56, -29, 117, 14, 16, -93, 52, -16, 81, 79, 16, -3, -34, 23, + -90, -10, -50, 104, -44, -60, -74, 5, -46, 70, 91, 44, 16, -39, 72, -87, 45, 97, -123, -90, + 93, -54, 63, 87, 9, -87, -19, 61, 117, -72, -22, -31, 31, -76, 27, 119, 44, 45, -104, 60}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_bias.h new file mode 100644 index 00000000..2fd596d7 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_int4_input_bias[2] = {-82, -128}; + +const int32_t *const conv_2x2_dilation_int4_biases = conv_2x2_dilation_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_weights.h new file mode 100644 index 00000000..f6d19139 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_int4_input_weights[18] = + {35, 241, 98, 83, 175, 182, 158, 205, 61, 9, 90, 242, 155, 81, 82, 192, 23, 0}; + +const int8_t *const conv_2x2_dilation_int4_weights = conv_2x2_dilation_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output.h new file mode 100644 index 00000000..649b2cf9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x2_dilation_int4_output[72] = {3, -9, 0, -4, 3, -3, -1, 3, 0, 3, 1, -2, 3, -5, -2, 2, 1, 4, + 0, 1, 2, 0, -2, 4, 0, 3, 1, -3, 0, 4, -2, 1, -4, 0, -3, 6, + 1, -4, 2, -6, -7, 5, 1, -5, -1, 5, 2, 8, 2, -2, -4, -4, -4, 1, + 0, -2, 1, -1, -2, 5, -1, 1, -2, -8, 1, 1, 0, -6, 3, 2, -2, 4}; + +const int8_t *const conv_2x2_dilation_int4_output_ref = conv_2x2_dilation_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_multiplier.h new file mode 100644 index 00000000..b3d9452a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_int4_output_multiplier[2] = {1137366995, 1681226932}; + +const int32_t *const conv_2x2_dilation_int4_output_mult = conv_2x2_dilation_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_shift.h new file mode 100644 index 00000000..76a05ada --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x2_dilation_int4_output_shift[2] = {-8, -8}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x2_dilation_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/config_data.h index a168c8ce..729f7247 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_2X3_DILATION_INT4_OUT_CH 2 #define CONV_2X3_DILATION_INT4_IN_CH 2 +#define CONV_2X3_DILATION_INT4_OUT_CH 2 #define CONV_2X3_DILATION_INT4_INPUT_W 3 #define CONV_2X3_DILATION_INT4_INPUT_H 3 -#define CONV_2X3_DILATION_INT4_DST_SIZE 18 -#define CONV_2X3_DILATION_INT4_INPUT_SIZE 18 -#define CONV_2X3_DILATION_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_2X3_DILATION_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_2X3_DILATION_INT4_INPUT_BATCHES 1 #define CONV_2X3_DILATION_INT4_FILTER_X 3 #define CONV_2X3_DILATION_INT4_FILTER_Y 3 #define CONV_2X3_DILATION_INT4_STRIDE_X 1 #define CONV_2X3_DILATION_INT4_STRIDE_Y 1 -#define CONV_2X3_DILATION_INT4_PAD_X 2 -#define CONV_2X3_DILATION_INT4_PAD_Y 2 -#define CONV_2X3_DILATION_INT4_OUTPUT_W 3 +#define CONV_2X3_DILATION_INT4_DILATION_X 2 +#define CONV_2X3_DILATION_INT4_DILATION_Y 3 +#define CONV_2X3_DILATION_INT4_PADDING SAME +#define CONV_2X3_DILATION_INT4_BATCH_SIZE 1 +#define CONV_2X3_DILATION_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_2X3_DILATION_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_2X3_DILATION_INT4_INPUT_BATCHES 1 +#define CONV_2X3_DILATION_INT4_DST_SIZE 18 #define CONV_2X3_DILATION_INT4_OUTPUT_H 3 -#define CONV_2X3_DILATION_INT4_INPUT_OFFSET 0 +#define CONV_2X3_DILATION_INT4_OUTPUT_W 3 +#define CONV_2X3_DILATION_INT4_INPUT_OFFSET 128 #define CONV_2X3_DILATION_INT4_OUTPUT_OFFSET 0 -#define CONV_2X3_DILATION_INT4_DILATION_X 2 -#define CONV_2X3_DILATION_INT4_DILATION_Y 2 +#define CONV_2X3_DILATION_INT4_PAD_X 2 +#define CONV_2X3_DILATION_INT4_PAD_Y 3 diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input.h new file mode 100644 index 00000000..13e179f8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input.h @@ -0,0 +1,7 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x3_dilation_int4_input[18] = + {38, -40, -39, 45, -68, 87, 67, 121, 45, -66, -122, -114, -5, -23, -62, -44, 88, -128}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_bias.h new file mode 100644 index 00000000..81ef50a6 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x3_dilation_int4_input_bias[2] = {-127, 111}; + +const int32_t *const conv_2x3_dilation_int4_biases = conv_2x3_dilation_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_weights.h new file mode 100644 index 00000000..2213b845 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x3_dilation_int4_input_weights[18] = + {68, 37, 104, 141, 234, 99, 187, 114, 35, 118, 91, 241, 140, 34, 31, 20, 148, 70}; + +const int8_t *const conv_2x3_dilation_int4_weights = conv_2x3_dilation_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output.h new file mode 100644 index 00000000..614d093b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_2x3_dilation_int4_output[18] = + {1, 8, -8, 7, -16, -8, -13, 11, -10, 6, -21, -29, -3, 4, -5, 4, -20, -9}; + +const int8_t *const conv_2x3_dilation_int4_output_ref = conv_2x3_dilation_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_multiplier.h new file mode 100644 index 00000000..dbad8bee --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x3_dilation_int4_output_multiplier[2] = {2115826307, 1500506760}; + +const int32_t *const conv_2x3_dilation_int4_output_mult = conv_2x3_dilation_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_shift.h new file mode 100644 index 00000000..3cb597ad --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_2x3_dilation_int4_output_shift[2] = {-7, -6}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_2x3_dilation_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/config_data.h index f01b2203..b95905d0 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_3_INT4_OUT_CH 1 +#define CONV_3_INT4_INPUT_BATCHES 1 #define CONV_3_INT4_IN_CH 3 +#define CONV_3_INT4_OUT_CH 1 #define CONV_3_INT4_INPUT_W 10 #define CONV_3_INT4_INPUT_H 49 -#define CONV_3_INT4_DST_SIZE 250 -#define CONV_3_INT4_INPUT_SIZE 1470 -#define CONV_3_INT4_OUT_ACTIVATION_MIN -127 -#define CONV_3_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_3_INT4_INPUT_BATCHES 1 #define CONV_3_INT4_FILTER_X 4 #define CONV_3_INT4_FILTER_Y 10 #define CONV_3_INT4_STRIDE_X 1 #define CONV_3_INT4_STRIDE_Y 2 -#define CONV_3_INT4_PAD_X 1 -#define CONV_3_INT4_PAD_Y 4 -#define CONV_3_INT4_OUTPUT_W 10 +#define CONV_3_INT4_PADDING SAME +#define CONV_3_INT4_DILATION_X 1 +#define CONV_3_INT4_DILATION_Y 1 +#define CONV_3_INT4_BATCH_SIZE 1 +#define CONV_3_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_3_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_3_INT4_DST_SIZE 250 #define CONV_3_INT4_OUTPUT_H 25 +#define CONV_3_INT4_OUTPUT_W 10 #define CONV_3_INT4_INPUT_OFFSET 128 #define CONV_3_INT4_OUTPUT_OFFSET 0 -#define CONV_3_INT4_DILATION_X 1 -#define CONV_3_INT4_DILATION_Y 1 +#define CONV_3_INT4_PAD_X 1 +#define CONV_3_INT4_PAD_Y 4 diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input.h new file mode 100644 index 00000000..e02f4889 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input.h @@ -0,0 +1,84 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3_int4_input[1470] = { + -70, 81, 17, 25, -65, 97, 14, 106, -85, 7, 26, 117, -106, -7, 49, 108, 34, 92, -50, + -43, 7, 73, 57, -104, 88, 115, -126, -112, 16, -82, 32, -84, -125, 69, -102, -52, 93, -73, + -30, -51, -122, -3, 71, -10, -7, 100, -7, 2, 49, -41, -117, 29, -63, -78, 112, -21, 101, + 110, 111, -35, 47, -16, -13, -41, 40, 78, 69, -109, -19, 64, -120, -120, -46, -16, -21, 20, + 77, 17, 116, 45, 44, 71, -122, 0, 115, -121, 80, 87, 93, -95, -39, 14, 120, 6, -52, + 111, -28, -61, 115, 21, 21, -87, 98, -54, 126, 77, -111, 108, -20, 111, 49, 121, 8, -5, + 93, 65, -54, 52, 94, 121, 113, -70, 98, 58, 79, -104, 36, 97, -72, -33, 95, 44, -89, + -86, 81, 31, 105, -11, -102, 55, 30, -30, -16, 20, 0, -72, 14, -87, -8, 81, 125, 23, + 37, -1, -6, 89, -34, 39, 44, 12, 45, -98, 44, 72, 25, 90, 102, -108, 93, 60, 46, + 58, -4, -50, 34, -38, -45, 62, 117, 32, 108, 74, 16, 29, 107, 2, -124, 65, -78, -51, + -68, 18, 62, 6, -94, 36, -50, -81, -79, -68, -97, -120, 127, 16, -47, -111, 117, 11, -98, + 63, -73, -23, 81, -7, -85, -38, -74, -69, -71, 21, 24, -10, 39, 10, 78, -10, -72, -78, + 110, -72, -15, 109, 12, -91, -113, -7, 19, 87, 124, -16, -7, 31, -18, 80, 62, -79, -120, + -116, 8, 121, -49, 15, -94, -61, 96, -79, -14, -7, 46, 28, -100, -51, 56, 58, 54, -18, + -110, -119, -47, 55, -120, 96, 93, 125, 26, -12, 25, -60, 46, -47, 125, 54, 9, -94, -85, + -106, -50, -80, 58, -102, 100, -108, -87, -98, 48, 54, -119, 1, 4, 77, -107, -39, 64, -98, + 0, 122, -111, 118, 9, -25, -107, -108, 40, 105, -84, 32, -58, 103, -101, 92, 4, 72, 27, + 3, 37, -60, -119, 120, 81, -62, -8, 27, 84, -34, 47, 25, -112, -58, -95, -49, -30, -34, + -87, -71, -120, 60, -102, 119, 87, -73, 11, 88, -106, 106, -5, -99, 113, -79, -51, -33, 54, + 116, 58, 51, -99, 113, -11, -6, 85, -86, -90, 23, 108, -94, 78, -91, -110, 3, 32, 0, + 25, 34, 9, 32, -75, -35, -105, 93, 113, 68, 1, 91, -66, 83, -109, 25, -79, -21, 54, + 4, 110, -123, -102, -104, -2, 27, 28, 74, 63, 85, -64, 13, -30, 33, -24, -20, 78, 2, + -99, 45, -116, 52, 71, 28, -41, -114, -117, -116, -118, -31, 93, 18, -76, 39, -3, 46, -121, + 7, -104, 18, 22, -94, 36, 64, 76, 56, 121, 35, -84, 11, 93, -32, 43, -108, -21, -97, + -2, -4, 36, 56, -90, 18, -121, 61, 66, 119, 15, -38, -8, -95, 103, 111, 26, -101, -60, + -2, -66, -67, 87, 55, 89, 11, 79, -41, -107, -38, 20, -35, 5, -104, -51, -54, -112, 11, + 40, -60, -67, -46, 14, -112, 22, 4, -69, 17, 56, -60, 70, -115, -97, -108, -112, 93, 39, + -48, -48, -61, 119, 56, 67, 40, -17, 120, -21, 80, 87, -59, 120, -76, -21, -52, 39, 62, + 35, 95, 117, 18, -40, 112, -26, 123, 6, -82, -76, -42, 66, 16, 96, -36, -57, 111, -36, + 24, -72, -10, -96, 107, -26, -124, -94, 8, 78, -47, -69, 64, -64, -32, 18, 108, 71, 123, + 58, 51, -49, 83, -126, -9, 124, -123, 107, -55, 36, -73, -119, -63, -34, 56, -110, 77, 85, + 124, 82, 62, 70, -119, 92, -57, 93, -18, 106, -26, 27, -37, -112, -90, -98, 47, -33, 1, + -112, 3, -87, 38, -107, -16, 46, -15, -123, 4, 61, -19, 9, -78, 115, 82, -119, 22, -112, + -56, 2, -85, -115, 88, -95, -55, 105, -18, -109, 12, -122, -92, -16, 67, -29, 65, 62, 24, + 84, 84, 92, -53, -79, 122, -127, 86, -66, -64, -35, 99, -116, -128, 100, -54, -95, 98, 35, + -84, 32, -11, -14, -126, -47, -122, 58, -6, 11, 5, 84, -11, 38, -99, 109, -4, -108, -23, + -3, 102, 76, -54, -119, -68, -9, -70, 58, 109, -69, -75, 37, 83, 120, 70, -90, -94, -81, + 100, -92, -115, 59, 103, 67, 8, 51, 47, -15, 69, -2, -50, -5, 67, 57, 35, -12, 0, + -122, -15, 119, 61, 124, -69, 37, -38, 41, 94, -116, 55, 123, 30, -3, -47, 18, 111, 58, + -92, 43, 120, -76, 20, -49, 22, -62, 127, 74, 116, -109, 18, 78, 0, 32, -13, 42, -47, + -55, 122, 76, 118, 27, -28, 23, 36, 101, -95, -75, 38, -79, -4, -124, 87, -37, -7, 30, + -121, 93, 83, -57, -2, -82, 26, 16, 62, -8, 31, -63, 31, 48, 1, -16, -64, -4, -107, + 48, -83, -11, -86, -41, 17, -112, 66, 94, -19, -77, 23, -121, -74, -8, 81, -81, -114, 126, + -82, -85, 125, -111, 110, -43, 115, 14, -70, 76, 60, 9, 40, -4, -109, -118, -100, 93, -77, + 55, -61, 45, 89, 54, -45, -67, 9, -94, 115, -68, -44, -123, 94, -26, -99, -87, -84, -13, + -37, -127, 47, -39, -103, 97, 113, 35, -42, 1, 74, -38, 85, 120, -19, 60, -93, -52, -119, + -94, 115, -113, -104, 125, -9, -82, 50, 42, -10, -35, -116, -118, -38, 0, -55, 16, 44, -15, + 81, 55, -34, -28, 46, -89, 92, 87, -36, 57, 5, -81, 33, -12, 0, -9, 32, 42, 50, + 117, 79, 88, -19, -79, -118, 8, -91, 89, -105, 64, 117, -95, -110, -63, 78, -49, 22, -103, + 92, 43, -44, -68, 59, -13, 74, -2, -82, 106, 4, -88, 75, 42, 101, -8, 62, -26, 103, + 7, 88, -28, -2, -15, -96, 70, 24, -52, 51, 104, -38, 92, -73, -44, -81, 60, -46, 83, + -3, 44, -102, 22, 46, -108, 103, 81, 57, 42, 68, -59, -72, -78, 59, -100, 96, 27, -10, + 35, -75, 57, -75, -102, 33, 41, -42, -79, 13, 79, -39, 44, 15, -80, 2, 73, -66, -65, + 82, -26, 24, 29, 53, 90, 36, -126, -76, 17, -18, -66, 93, -125, -110, -4, -47, -93, 72, + -126, 62, -115, -111, 22, 112, -61, -52, 93, 80, 65, -46, 112, 91, -31, 50, 69, -28, -32, + 33, 16, 96, 119, 102, -68, -40, -54, -98, -91, 97, 5, 44, 8, -61, -69, 65, 118, -70, + -95, -92, 89, 74, -63, -30, -45, -5, -29, 86, -98, -4, -19, 123, 90, -61, -113, 102, 112, + 52, 75, 121, -79, -4, -15, -105, -3, 56, 59, -60, 20, -109, 51, -58, -4, -52, 87, 38, + -31, -69, 76, 91, 64, 36, -39, -100, 112, -22, -94, -88, 41, 108, 108, 110, 25, -88, 105, + 37, 28, -124, 91, 120, 6, 9, 56, -40, -69, 60, -66, -107, -100, 25, -11, 94, 25, -17, + -72, -116, 71, -113, -68, -68, 53, 25, 59, 84, -106, 5, -81, -125, -54, 11, 8, -40, -82, + -64, 74, -69, 34, 13, 122, 6, -16, -23, -25, -70, 126, -13, 115, -50, 117, 94, -126, -69, + -64, -43, 87, 61, -24, -55, 36, -97, 2, 99, -51, -13, -17, -16, -108, 30, -33, 71, 94, + -15, 28, -1, -127, -6, -96, -35, 100, -100, 86, -44, 5, 20, 54, -22, 39, -44, -119, 45, + 38, 56, 34, -74, 62, 27, -33, 58, 80, 11, 93, 32, 99, 41, -12, -17, 80, -54, -121, + 109, 89, 26, 57, 70, 43, 13, -66, 26, 56, 120, 52, 79, -21, 44, -36, -52, -38, -73, + 68, 85, 66, -7, -106, 1, -55, 90, -23, 62, 39, 30, 22, 97, -76, 45, -11, 21, 58, + -95, 96, 63, -52, 124, 5, -88, 12, -69, -31, 88, 116, -22, -8, -84, -68, 6, 37, 11, + -53, -78, -7, -9, 89, 108, -96, 73, -86, -48, -120, 34, 24, -8, -2, -48, 123, 120, -96, + -77, -109, 127, 55, 74, 86, 113, -39, -122, 98, 122, -6, -88, -3, -54, -71, -64, -126, -89, + 48, -126, -10, -44, -92, 59, -26, -28, -13, -1, -67, 66, -71, 123, 123, 34, -128, -46, 77, + 109, 114, 21, -5, 43, -3, 95, -58, -34, 111, -44, 10, -1, 95, -66, 48, -68, 42, 92, + 81, 121, 0, -13, 67, 78, -103, -6, -65, -110, 51, 75, -36, 9, -34, 15, -61, 102, -19, + 104, -82, 13, -30, -51, 105, 66, -64, -65, 116, -58, -30, 79, -70, 54, 69, 118, 44, 98, + -107, 74, -62, 102, 74, 49, -28, 57, -51, -45, 59, -47, -99, -57, 58, -23, 3, 29, -34, + 19, 111, 79, 96, 72, -17, 4, 28, 76, -94, -103, -120, 105, 110, 71, 101, 30, -11, -56, + -82, 75, 114, -46, -81, -108, -59, 69, -55, -69, -67, -128, 32, -125, 122, 3, -29, 69, 95, + 71, -64, -127, 80, -124, 44, 46}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_bias.h new file mode 100644 index 00000000..ee49758c --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_3_int4_input_bias = NULL; + +const int32_t *const conv_3_int4_biases = conv_3_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_weights.h new file mode 100644 index 00000000..691d1f3f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/input_weights.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3_int4_input_weights[60] = {91, 134, 186, 156, 86, 84, 75, 16, 155, 0, 179, 191, 41, 13, 189, + 237, 97, 91, 17, 3, 255, 13, 156, 19, 124, 46, 81, 95, 205, 122, + 169, 149, 54, 227, 102, 66, 69, 54, 43, 76, 147, 68, 210, 246, 80, + 30, 222, 156, 40, 164, 96, 80, 215, 77, 238, 64, 208, 145, 150, 15}; + +const int8_t *const conv_3_int4_weights = conv_3_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output.h new file mode 100644 index 00000000..df15fdf7 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output.h @@ -0,0 +1,19 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3_int4_output[250] = { + -1, 3, 5, 12, 7, 5, 4, 12, 16, 12, 3, 10, 4, 8, -10, -5, 10, -10, 7, 2, 4, -7, -5, + -9, -4, 6, -10, -27, -16, -11, -9, -7, -3, 6, -16, -13, -9, -1, -17, -24, 8, -3, -21, 6, -27, -10, + -3, 4, 16, -14, -27, 3, 1, 6, -19, 10, -6, 4, 8, -6, -29, 3, -6, -3, -11, 4, -8, -20, 7, + 0, -7, -5, 7, -5, -2, -13, -29, 2, -9, -4, -12, -8, 10, -3, -7, 2, 4, 1, -2, -18, -19, -19, + -25, -15, 5, 13, 6, -3, -14, -5, -28, 2, 0, 1, -13, 8, 4, -10, -3, 1, -17, -9, 6, -23, 0, + 3, -15, 11, 10, -9, 5, -21, 4, 0, 13, -1, -5, -20, -2, 10, -15, -12, -17, -7, -14, -21, 8, -3, + 4, 6, -16, -7, -2, -13, -6, -2, 3, -4, 8, 3, -1, -7, -2, 7, 6, -3, 1, -11, -7, 1, 4, + -12, 4, -11, 2, 11, 0, -9, -8, -6, -11, 9, 7, -19, -8, 2, -9, 1, 2, -5, -1, 3, -17, -2, + 0, -24, -13, -20, 6, -5, -18, -19, 9, -7, 3, -16, 12, -11, -1, -7, -3, -1, -1, -10, 3, -9, -3, + -15, -6, -7, -9, 2, -8, -29, -10, -11, 3, -13, -6, -16, -12, -8, -6, -6, -5, -1, -4, -10, -5, 6, + -18, -11, -7, 14, -5, 3, -3, 8, -4, -4, -30, -10, -21, -19, -20, -26, 1, -19, -13, -22}; + +const int8_t *const conv_3_int4_output_ref = conv_3_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_multiplier.h new file mode 100644 index 00000000..427dec64 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3_int4_output_multiplier[1] = {1577486152}; + +const int32_t *const conv_3_int4_output_mult = conv_3_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_shift.h new file mode 100644 index 00000000..103b4df6 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3_int4_output_shift[1] = {-8}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_3_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/config_data.h index 5406e6ef..8bee180d 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_3X2_DILATION_INT4_OUT_CH 2 #define CONV_3X2_DILATION_INT4_IN_CH 2 +#define CONV_3X2_DILATION_INT4_OUT_CH 2 #define CONV_3X2_DILATION_INT4_INPUT_W 3 #define CONV_3X2_DILATION_INT4_INPUT_H 3 -#define CONV_3X2_DILATION_INT4_DST_SIZE 18 -#define CONV_3X2_DILATION_INT4_INPUT_SIZE 18 -#define CONV_3X2_DILATION_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_3X2_DILATION_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_3X2_DILATION_INT4_INPUT_BATCHES 1 #define CONV_3X2_DILATION_INT4_FILTER_X 3 #define CONV_3X2_DILATION_INT4_FILTER_Y 3 #define CONV_3X2_DILATION_INT4_STRIDE_X 1 #define CONV_3X2_DILATION_INT4_STRIDE_Y 1 -#define CONV_3X2_DILATION_INT4_PAD_X 3 -#define CONV_3X2_DILATION_INT4_PAD_Y 2 -#define CONV_3X2_DILATION_INT4_OUTPUT_W 3 -#define CONV_3X2_DILATION_INT4_OUTPUT_H 3 -#define CONV_3X2_DILATION_INT4_INPUT_OFFSET 0 -#define CONV_3X2_DILATION_INT4_OUTPUT_OFFSET 0 #define CONV_3X2_DILATION_INT4_DILATION_X 3 #define CONV_3X2_DILATION_INT4_DILATION_Y 2 +#define CONV_3X2_DILATION_INT4_PADDING SAME +#define CONV_3X2_DILATION_INT4_BATCH_SIZE 1 +#define CONV_3X2_DILATION_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_3X2_DILATION_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_3X2_DILATION_INT4_INPUT_BATCHES 1 +#define CONV_3X2_DILATION_INT4_DST_SIZE 18 +#define CONV_3X2_DILATION_INT4_OUTPUT_H 3 +#define CONV_3X2_DILATION_INT4_OUTPUT_W 3 +#define CONV_3X2_DILATION_INT4_INPUT_OFFSET 128 +#define CONV_3X2_DILATION_INT4_OUTPUT_OFFSET 0 +#define CONV_3X2_DILATION_INT4_PAD_X 3 +#define CONV_3X2_DILATION_INT4_PAD_Y 2 diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input.h new file mode 100644 index 00000000..0b0d0081 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input.h @@ -0,0 +1,7 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x2_dilation_int4_input[18] = + {67, 79, 94, -94, 84, 81, -106, -5, 104, -70, -2, 108, -95, 7, 46, -114, -47, 86}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_bias.h new file mode 100644 index 00000000..717b9d76 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x2_dilation_int4_input_bias[2] = {-127, 119}; + +const int32_t *const conv_3x2_dilation_int4_biases = conv_3x2_dilation_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_weights.h new file mode 100644 index 00000000..22f217b5 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x2_dilation_int4_input_weights[18] = + {58, 167, 19, 191, 66, 52, 86, 14, 161, 207, 112, 87, 133, 181, 142, 17, 107, 170}; + +const int8_t *const conv_3x2_dilation_int4_weights = conv_3x2_dilation_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output.h new file mode 100644 index 00000000..9e2b4d8e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x2_dilation_int4_output[18] = {4, 4, 0, 2, 4, 6, 2, -2, 2, 6, 5, -2, 3, 6, 7, 6, 5, 5}; + +const int8_t *const conv_3x2_dilation_int4_output_ref = conv_3x2_dilation_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_multiplier.h new file mode 100644 index 00000000..5ea790ad --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x2_dilation_int4_output_multiplier[2] = {1203167036, 1532354537}; + +const int32_t *const conv_3x2_dilation_int4_output_mult = conv_3x2_dilation_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_shift.h new file mode 100644 index 00000000..f9c72fe8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x2_dilation_int4_output_shift[2] = {-7, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x2_dilation_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/biases_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/biases_data.h index b8bc5015..ae8747b5 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/biases_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/biases_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int32_t conv_3x3_dilation_5x5_input_int4_biases[2] = {-17, -127}; +const int32_t conv_3x3_dilation_5x5_input_int4_biases[2] = {127, -103}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/config_data.h index a1b8f2eb..6edf1d9d 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once +#define CONV_3X3_DILATION_5X5_INPUT_INT4_IN_CH 5 #define CONV_3X3_DILATION_5X5_INPUT_INT4_OUT_CH 2 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_IN_CH 2 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_W 9 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_H 11 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_DST_SIZE 198 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_SIZE 198 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_BATCHES 1 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_W 5 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_H 5 #define CONV_3X3_DILATION_5X5_INPUT_INT4_FILTER_X 3 #define CONV_3X3_DILATION_5X5_INPUT_INT4_FILTER_Y 3 #define CONV_3X3_DILATION_5X5_INPUT_INT4_STRIDE_X 1 #define CONV_3X3_DILATION_5X5_INPUT_INT4_STRIDE_Y 1 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_PAD_X 2 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_PAD_Y 2 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUTPUT_W 9 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUTPUT_H 11 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_OFFSET 0 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_DILATION_X 3 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_DILATION_Y 3 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_PADDING SAME +#define CONV_3X3_DILATION_5X5_INPUT_INT4_BATCH_SIZE 1 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_BATCHES 1 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_DST_SIZE 50 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUTPUT_H 5 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_OUTPUT_W 5 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_INPUT_OFFSET 128 #define CONV_3X3_DILATION_5X5_INPUT_INT4_OUTPUT_OFFSET 0 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_DILATION_X 2 -#define CONV_3X3_DILATION_5X5_INPUT_INT4_DILATION_Y 2 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_PAD_X 3 +#define CONV_3X3_DILATION_5X5_INPUT_INT4_PAD_Y 3 diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input.h new file mode 100644 index 00000000..a4d25cd8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input.h @@ -0,0 +1,12 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x3_dilation_5x5_input_int4_input[125] = { + 18, -121, -112, 36, -107, 68, 38, 62, 9, -21, 26, 11, -113, -94, 60, -30, -44, -71, -122, 0, 103, + 100, 17, -14, -51, 33, -91, -43, -116, -15, 55, -75, -29, 18, 54, 119, 46, 23, 70, 73, -43, -125, + 124, -15, 34, 9, -30, -125, -40, 118, 78, 111, 86, 87, -92, -115, 20, 53, 83, -128, 106, -14, 118, + -47, 82, -106, -13, -64, 100, 78, 108, 118, 75, 20, 85, -55, 78, 12, 63, 38, -115, 47, 43, -103, + 41, 101, -16, -49, -51, 114, -94, -26, -3, -6, -84, -29, -19, 94, -104, 47, -116, -47, -8, 88, -110, + 90, 85, -113, 106, -14, 38, 74, 27, 19, 49, 57, -85, 34, 119, -113, 36, -52, 90, -101, 105}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_bias.h new file mode 100644 index 00000000..187d7ece --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x3_dilation_5x5_input_int4_input_bias[2] = {127, -39}; + +const int32_t *const conv_3x3_dilation_5x5_input_int4_biases = conv_3x3_dilation_5x5_input_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_data.h index dbe62168..1c4aad3e 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_data.h @@ -1,16 +1,33 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int8_t conv_3x3_dilation_5x5_input_int4_input[198] = { - -115, -50, 63, 126, -63, 105, 86, 64, -24, 50, -53, 36, -94, 67, 40, -78, -66, 67, -55, 24, - 36, 21, 43, 42, 66, 65, -104, 81, -97, -69, 77, 121, 19, 108, 44, -118, 15, -125, -128, -112, - -65, 16, 70, -102, -37, 28, -107, -5, -32, 69, 85, 85, -55, -90, 45, -86, 69, -104, 48, 8, - -6, 76, -2, 58, 48, -16, -85, 97, -125, 71, -82, 120, -114, 77, -84, -128, -78, -53, 62, -66, - -14, 75, -25, 61, 98, -24, -86, 29, 105, -10, 53, 35, 38, -98, -102, -94, 104, -103, -56, -20, - 81, 86, -123, -59, 62, 19, 25, 111, 114, 95, -1, -39, -2, 79, -120, -96, -17, 99, 105, 54, - -120, 92, -17, 5, -19, 76, 109, 97, -27, 33, 115, 35, -82, 83, 32, -4, -81, -41, -15, -23, - -4, -73, 32, 93, -87, 20, -25, -26, -111, 82, 71, 43, 72, -123, -73, 110, -101, 4, -64, -85, - -93, -108, 80, -125, -78, 107, -85, 10, -24, -7, -61, 36, 73, 80, -97, -38, -12, 121, -6, -20, - -107, -50, -46, -103, 104, -111, -51, 47, 88, -110, 98, -23, 114, 1, 123, 70, 96, -57}; +const int8_t conv_3x3_dilation_5x5_input_int4_input[495] = { + 72, -21, 73, -79, -111, 15, 110, -37, -114, 88, -10, 61, -107, 104, -128, -10, 95, 76, -49, + -98, -93, -44, -55, -88, -112, 42, -74, 98, -124, 0, 35, 5, 60, -102, -51, -72, -3, -4, + -67, -32, 79, 109, -96, 57, 66, 87, 82, -77, 41, -63, 77, 50, -23, -87, 57, -77, 8, + 95, 116, 97, 108, 91, -14, 84, 119, -52, 63, -91, -43, -64, 91, 70, 80, 54, 69, -64, + 32, -89, 16, -86, 31, -28, -29, 66, -80, 41, 104, 27, -3, -118, -67, -17, 97, -65, 106, + -112, -33, -123, 72, 73, 30, 21, -57, -102, -89, -47, 48, 122, 98, -110, 58, -29, 42, 68, + 22, -60, -27, -21, -33, -30, 58, 13, 21, -81, 46, -107, -36, -5, 53, -92, 82, -44, -109, + 0, -123, -16, -85, 104, 46, -28, -16, -43, 47, -110, -99, 112, 51, -102, -120, 25, -9, 122, + -43, -126, 44, -111, -13, 110, -18, -43, -91, -106, -92, 44, 0, 55, 12, 117, -62, -65, -35, + 67, 39, 58, -116, -33, -102, 76, 32, 85, 47, 23, 81, -79, 15, 85, 53, -8, -34, -15, + -53, 43, -64, 65, 85, 94, 71, 5, -105, -55, -122, 0, 27, 108, -48, 75, 54, 126, -127, + 51, -38, 77, -57, -81, -59, 24, 11, -120, -122, -96, -7, -55, -73, 79, 112, -48, -108, 85, + 66, -110, 64, -87, -58, -85, 102, -74, -71, -92, -28, -12, 114, 106, -49, 50, -82, -19, 89, + 64, 109, -126, -40, 109, 85, -11, -36, 108, 24, 7, -108, -85, -84, -77, -6, 87, 105, -92, + -19, -73, 26, 95, 116, -21, 36, 72, -106, -12, -55, 61, -53, -93, 90, 100, -62, 51, -94, + 22, -74, 23, 1, 92, -67, 49, -111, 45, 42, 66, 94, -69, -113, -7, -79, 4, 91, 95, + 118, 47, -100, 115, 101, -110, 95, 24, -79, 90, -45, -42, 20, -126, -95, 23, 114, -23, 74, + -4, 73, -80, 28, -110, 119, 52, 126, 82, -91, 78, 45, -124, -53, 4, 93, 101, -87, 94, + -121, 80, 51, -58, -53, -22, 20, 23, -12, 3, 107, 32, -17, -5, 43, 115, 22, 77, 81, + -3, -123, 108, 40, 32, -77, 89, 17, -2, 61, 91, -44, 1, 73, -19, -2, 76, -30, 89, + -25, -116, -128, -40, 72, 60, 108, 67, -12, -73, 121, -48, -4, 62, 120, 97, -44, -8, -83, + -10, -71, -91, -70, 34, 38, -20, 41, 99, -75, 92, -47, -103, 29, 74, -47, 54, -4, -42, + 2, -23, -71, 2, 84, -128, 53, -41, 99, 1, 121, -78, -44, 1, 63, -116, 33, -79, 35, + 54, -85, 12, -5, -77, 44, -97, 102, 44, -15, -15, -10, 106, -11, -108, 76, -20, -43, 10, + -1, 18, -107, -23, 36, -68, -82, -118, 97, -17, 21, 2, 47, -46, 101, -94, 112, -116, 18, + -121, 37, -91, 35, -20, 126, -89, 124, 93, -42, -8, 32, -24, 51, -106, 8, -91, 121, -57, + 92}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_weights.h new file mode 100644 index 00000000..382b8377 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/input_weights.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x3_dilation_5x5_input_int4_input_weights[45] = { + 228, 95, 1, 111, 31, 91, 115, 199, 61, 122, 247, 93, 189, 139, 96, 175, 67, 244, 77, 232, 71, 106, 94, + 8, 169, 193, 88, 180, 86, 92, 198, 230, 130, 159, 200, 156, 97, 143, 68, 170, 48, 240, 195, 183, 68}; + +const int8_t *const conv_3x3_dilation_5x5_input_int4_weights = conv_3x3_dilation_5x5_input_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output.h new file mode 100644 index 00000000..c63e3915 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_3x3_dilation_5x5_input_int4_output[50] = { + -1, -40, -11, -96, -3, -28, -6, -40, 3, -33, -2, -40, -6, -82, 0, -84, -2, -59, 1, -62, 7, -90, -9, -91, 3, -95, + -6, -40, -1, -99, 0, -40, 0, -61, 5, -67, 7, -50, 9, -101, 5, -22, 13, -73, 6, -80, 13, -102, -2, -77}; + +const int8_t *const conv_3x3_dilation_5x5_input_int4_output_ref = conv_3x3_dilation_5x5_input_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_mult_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_mult_data.h index ac832fd6..0ee05585 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_mult_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_mult_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int32_t conv_3x3_dilation_5x5_input_int4_output_mult[2] = {1201670146, 1422927664}; +const int32_t conv_3x3_dilation_5x5_input_int4_output_mult[2] = {1984185454, 2094485588}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_multiplier.h new file mode 100644 index 00000000..7e063c76 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x3_dilation_5x5_input_int4_output_multiplier[2] = {1082204480, 1242212747}; + +const int32_t *const conv_3x3_dilation_5x5_input_int4_output_mult = conv_3x3_dilation_5x5_input_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_ref_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_ref_data.h index c27f04b0..4b777967 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_ref_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_ref_data.h @@ -1,15 +1,15 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include const int8_t conv_3x3_dilation_5x5_input_int4_output_ref[198] = { - -43, 26, -61, -59, -61, -61, -61, 15, -61, -21, -61, -16, -61, -16, 12, 4, -31, 13, -35, -2, -24, -30, - -61, -39, -61, -2, -61, -61, 94, 6, 24, -61, -61, -61, 77, 32, 44, -51, 107, 107, -61, -6, -61, 16, - -61, -40, 107, -61, -61, 61, -41, -54, 58, 60, 107, -14, 57, 48, -61, -10, -61, 9, -61, -61, -61, -61, - -61, 26, -61, 57, -35, -61, -61, -15, 107, 12, -46, -41, -61, -26, 10, -61, -61, -61, 3, -28, -61, 68, - 57, -34, -22, 30, 107, -30, 107, 94, 107, -61, -6, 35, -61, -37, -61, -61, -61, -3, -61, -61, -61, -61, - 84, 33, -61, -50, -4, -50, -61, 67, -43, -61, 20, -33, 11, 41, -61, 2, -20, -8, -15, -53, 27, -61, - -61, 15, -61, 22, 40, 29, -51, -61, 107, -15, -61, 8, -61, 59, -6, -13, 79, 38, -61, -61, -61, 85, - -61, 107, -61, 42, 107, 13, 89, 79, 47, 77, -61, -26, 28, 6, -61, -25, 7, 16, -61, -61, 92, -10, - -61, -11, -61, 10, 102, -4, 74, 2, 107, 22, -61, -45, 107, -14, 10, -54, 58, -50, -7, -47, 52, -13}; + -20, -10, -24, -20, -31, 4, -49, 2, -19, -26, -37, -6, -33, 1, -35, 4, -43, 21, -22, -15, -27, -6, + -26, -5, -53, -10, -48, -4, -61, 9, -21, -21, -30, 15, -32, -4, -20, -27, 2, -17, -61, -22, -43, -1, + -33, -21, -25, -33, -40, -11, -29, 8, -43, -17, -33, -18, -23, -13, -56, -39, -61, -9, -43, -31, -55, -61, + -48, -12, -26, -27, -39, -27, -34, 0, -45, -27, -45, -22, -61, -40, -41, -36, -61, -27, -39, -30, -61, -18, + -19, 3, -15, -10, -14, -23, -19, -46, -47, -14, -49, -25, -61, -30, -50, -27, -19, -16, -30, -45, -30, -2, + -35, -20, -59, -40, -39, -27, -57, -60, -57, -8, -35, -31, -41, -3, -46, 0, -27, -37, -51, -7, -40, -20, + -61, -28, -31, -18, -55, -60, -14, -47, -32, -24, -36, -10, -32, -28, -29, -13, -61, -37, -44, -29, -61, -46, + -61, 4, -61, -27, -49, -11, -30, -46, -36, 0, -21, -8, -61, -11, -46, -31, -48, -30, -61, -19, -51, -21, + -45, -14, -42, -7, -32, 2, -35, -11, -47, -20, -54, -20, -61, -8, -30, -24, -61, 0, -19, -10, -51, -19}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift.h new file mode 100644 index 00000000..d94f95db --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_3x3_dilation_5x5_input_int4_output_shift[2] = {-7, -5}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift_data.h index d3d5a068..e3c1e519 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/output_shift_data.h @@ -1,6 +1,6 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int32_t conv_3x3_dilation_5x5_input_int4_output_shift[2] = {-2, -4}; +const int32_t conv_3x3_dilation_5x5_input_int4_output_shift[2] = {-7, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/weights_data.h b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/weights_data.h index e316fd3b..df1f5989 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/weights_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_3x3_dilation_5x5_input_int4/weights_data.h @@ -1,7 +1,8 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by test_settings.py using tensorflow version 2.16.1 (Keras version 2.16.0). +// Interpreter from tensorflow version 2.16.1 and revision v2.16.1-0-g5bc9d26649c. #pragma once #include -const int8_t conv_3x3_dilation_5x5_input_int4_weights[18] = - {53, -80, -10, 0, -96, -90, 84, -14, -53, 12, 86, -49, 83, -82, -119, 80, -92, -62}; +const int8_t conv_3x3_dilation_5x5_input_int4_weights[45] = { + 26, 51, 43, -46, -4, -16, -81, -112, -85, -106, -87, 75, -63, 35, -68, 25, 80, 31, 5, 30, 64, -7, -32, + -68, 58, 0, -82, 32, -16, 15, 9, 3, 101, 48, -45, -77, 11, -47, 33, 95, 68, 9, 9, 3, -99}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/config_data.h index 4a26231b..1b07973b 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_4_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_4_INT4_OUT_CH 3 +#define CONV_4_INT4_INPUT_BATCHES 1 #define CONV_4_INT4_IN_CH 3 +#define CONV_4_INT4_OUT_CH 3 #define CONV_4_INT4_INPUT_W 5 #define CONV_4_INT4_INPUT_H 5 -#define CONV_4_INT4_DST_SIZE 36 -#define CONV_4_INT4_INPUT_SIZE 75 -#define CONV_4_INT4_OUT_ACTIVATION_MIN -109 -#define CONV_4_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_4_INT4_INPUT_BATCHES 3 #define CONV_4_INT4_FILTER_X 2 #define CONV_4_INT4_FILTER_Y 3 #define CONV_4_INT4_STRIDE_X 2 #define CONV_4_INT4_STRIDE_Y 2 -#define CONV_4_INT4_PAD_X 0 -#define CONV_4_INT4_PAD_Y 0 -#define CONV_4_INT4_OUTPUT_W 2 -#define CONV_4_INT4_OUTPUT_H 2 -#define CONV_4_INT4_INPUT_OFFSET 0 -#define CONV_4_INT4_OUTPUT_OFFSET 0 +#define CONV_4_INT4_PADDING VALID #define CONV_4_INT4_DILATION_X 1 #define CONV_4_INT4_DILATION_Y 1 +#define CONV_4_INT4_BATCH_SIZE 1 +#define CONV_4_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_4_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_4_INT4_DST_SIZE 12 +#define CONV_4_INT4_OUTPUT_H 2 +#define CONV_4_INT4_OUTPUT_W 2 +#define CONV_4_INT4_INPUT_OFFSET 128 +#define CONV_4_INT4_OUTPUT_OFFSET 0 +#define CONV_4_INT4_PAD_X 0 +#define CONV_4_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input.h new file mode 100644 index 00000000..fc45794d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_4_int4_input[75] = {-36, -62, -86, 25, -69, -37, 92, -12, -59, -48, -80, -7, -74, 87, -73, + 41, 124, 52, 117, -51, -107, 103, -105, -24, -80, 66, -113, 88, -48, 2, + -56, 72, -23, -18, -38, -78, 43, -30, 28, -8, 115, -8, 30, 42, 19, + 4, 23, -29, 60, -34, 76, -3, -33, -83, 69, -56, -61, 46, 43, 45, + 27, -11, 42, 92, -96, -56, -6, -33, 117, -56, -126, 115, -79, 52, 99}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_bias.h new file mode 100644 index 00000000..9bef221e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_4_int4_input_bias[3] = {16, -127, -59}; + +const int32_t *const conv_4_int4_biases = conv_4_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_weights.h new file mode 100644 index 00000000..cb472ee9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_4_int4_input_weights[27] = {241, 74, 110, 144, 45, 54, 97, 27, 211, 56, 147, 193, 104, 122, + 188, 139, 87, 203, 20, 191, 55, 243, 159, 134, 175, 114, 193}; + +const int8_t *const conv_4_int4_weights = conv_4_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output.h new file mode 100644 index 00000000..86b9ad21 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_4_int4_output[12] = {3, -9, -12, 10, -20, 20, 1, -4, -7, -6, -6, 1}; + +const int8_t *const conv_4_int4_output_ref = conv_4_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_multiplier.h new file mode 100644 index 00000000..2ddcbe2a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_4_int4_output_multiplier[3] = {1429975550, 1641108794, 2124757624}; + +const int32_t *const conv_4_int4_output_mult = conv_4_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_shift.h new file mode 100644 index 00000000..ed4b9d16 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_4_int4_output_shift[3] = {-7, -8, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_4_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_4_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_4_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_4_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/config_data.h index d422b766..0cc9a1eb 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_5_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_5_INT4_OUT_CH 1 +#define CONV_5_INT4_INPUT_BATCHES 1 #define CONV_5_INT4_IN_CH 128 +#define CONV_5_INT4_OUT_CH 1 #define CONV_5_INT4_INPUT_W 128 #define CONV_5_INT4_INPUT_H 1 -#define CONV_5_INT4_DST_SIZE 32 -#define CONV_5_INT4_INPUT_SIZE 16384 -#define CONV_5_INT4_OUT_ACTIVATION_MIN -88 -#define CONV_5_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_5_INT4_INPUT_BATCHES 1 #define CONV_5_INT4_FILTER_X 3 #define CONV_5_INT4_FILTER_Y 3 #define CONV_5_INT4_STRIDE_X 4 #define CONV_5_INT4_STRIDE_Y 4 -#define CONV_5_INT4_PAD_X 0 -#define CONV_5_INT4_PAD_Y 1 -#define CONV_5_INT4_OUTPUT_W 32 +#define CONV_5_INT4_PADDING SAME +#define CONV_5_INT4_DILATION_X 1 +#define CONV_5_INT4_DILATION_Y 1 +#define CONV_5_INT4_BATCH_SIZE 1 +#define CONV_5_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_5_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_5_INT4_DST_SIZE 32 #define CONV_5_INT4_OUTPUT_H 1 +#define CONV_5_INT4_OUTPUT_W 32 #define CONV_5_INT4_INPUT_OFFSET 128 #define CONV_5_INT4_OUTPUT_OFFSET 0 -#define CONV_5_INT4_DILATION_X 1 -#define CONV_5_INT4_DILATION_Y 1 +#define CONV_5_INT4_PAD_X 0 +#define CONV_5_INT4_PAD_Y 1 diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input.h new file mode 100644 index 00000000..4c128e33 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input.h @@ -0,0 +1,869 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_5_int4_input[16384] = { + -7, -62, -53, 112, 42, 25, 124, 8, -63, 118, -29, 115, 44, -20, 118, 103, 31, 5, 125, + 25, 92, -84, 120, 28, -97, -45, -85, 78, -1, 10, 62, 38, 8, 114, 70, 10, -90, 24, + 69, 7, -19, -124, -62, -14, 79, -92, 78, -76, 13, 110, -5, 4, -90, -79, 86, 57, 22, + 97, 90, -126, 105, -120, -62, 54, -52, 34, 40, 53, -120, -56, -26, 40, -7, -79, 111, -29, + -76, -57, -12, -42, 13, -6, 122, 105, -36, -88, 56, -116, 114, -94, -9, -17, 122, 72, -22, + -17, -1, -52, 59, -28, 38, -25, 102, -49, -79, -24, 50, -95, -17, -21, -32, -7, -59, -61, + -120, 27, 13, 91, -71, 57, -115, 67, -101, -14, -1, -124, -47, -69, -63, -25, -19, -26, -59, + -15, 57, 43, 27, -41, 64, -49, 6, 110, 9, -127, -99, 56, -52, 42, 123, -95, 58, 14, + 103, 74, -121, 12, 17, 79, 55, -1, -87, 79, 80, -101, 24, 113, -12, 61, 116, -88, 15, + 115, -1, -60, 45, 123, 73, 52, -121, 96, -55, 106, 4, -31, -36, 8, 127, 76, 36, -93, + 5, -33, -70, 1, 1, 73, -128, -35, 57, -43, -84, -106, -98, -64, -60, -95, 49, -78, -23, + -20, 25, 39, -118, 119, 30, 81, 79, 99, 25, -84, 111, -56, 69, -20, -62, 24, 111, -2, + -65, 26, 78, 72, -28, -52, 81, -31, 10, 31, 53, -68, 43, 100, 14, 76, 74, 121, 17, + -99, 42, 17, 48, -66, 46, -28, 81, -46, 10, -34, -21, -8, -99, 92, 32, 56, 70, 94, + -102, -26, 111, 71, -117, -25, -34, 25, -3, 44, -39, -91, 79, -100, -49, 90, -108, 47, -73, + -21, -85, 43, -106, 98, -88, 25, -111, 52, 116, -29, -9, 13, -13, -80, -122, -53, 13, 95, + 33, 114, 43, 101, -35, -108, -78, -25, 14, -125, -115, -124, -53, 38, -58, -58, -127, 24, -92, + 27, -85, -48, 90, -111, -44, -125, 14, -70, -14, 18, -126, -94, 48, 69, -72, 95, -78, -90, + 43, 103, 110, 61, 120, 111, -37, -45, -44, -61, -53, 32, 71, -57, 114, 13, -87, -15, 10, + 60, 38, 29, -13, -18, 94, -78, 70, 95, 106, 124, -57, 13, 72, -2, 78, -99, 60, 72, + -61, -95, -128, -107, 94, -43, -88, -62, -56, 107, 29, 83, 117, 7, 11, -3, -126, 52, 4, + -80, -43, -64, 47, 78, 75, 26, 92, -42, 71, 86, 56, -42, 119, -5, -92, 13, -22, 70, + -61, -1, 5, -19, 7, 39, -80, -43, 7, -64, -32, 55, 17, 67, -112, 89, 57, -125, 84, + 114, 10, -116, -45, 33, 91, 101, 0, 19, 45, 113, 118, 89, 110, 4, -82, 105, 86, -29, + 36, 125, 50, -1, -14, 0, 31, 61, 95, 78, 30, 2, 105, 51, 93, 69, -53, 26, -99, + -34, 41, -85, -81, -17, 14, -95, 90, 56, -81, 123, -93, -76, 105, 76, 23, 104, 77, -85, + -73, 96, 2, -91, 79, 81, -4, 99, -10, -13, -15, -29, -121, 44, 97, -35, -127, -11, -56, + 12, -110, -35, 38, 5, 50, 43, -30, 44, -51, 74, 82, 107, -55, -26, -44, -48, -61, -74, + -26, -123, -24, 21, 35, -37, 27, 112, 41, 28, -106, 6, -45, -102, 36, 58, 55, -70, -114, + 102, 117, -61, -71, -35, -74, 26, 89, 100, 48, -117, 122, 112, -1, -93, -39, -20, -77, 49, + 74, -84, 38, 90, -112, -109, -78, 104, -115, 55, -107, 42, -83, 121, -96, 55, 111, 25, 27, + -23, -94, 10, -93, 101, 73, -3, -10, -29, 114, 81, -26, -18, -21, -52, 72, 123, -77, -17, + -56, -75, 44, -12, -108, -39, 10, 73, 86, -22, -93, 6, -2, 34, 70, 75, 38, 9, 40, + 18, 9, -119, -59, -19, 43, 120, 37, 72, 0, -64, 15, -89, 49, -73, -84, -56, 91, -54, + -17, 117, -8, -37, 120, -105, -30, 109, 85, -114, -47, -12, 62, 32, 119, -80, -19, 43, 104, + -10, -46, 43, -65, -74, -70, 8, -55, 96, 44, -118, -58, -102, 88, 61, 64, 85, -92, 84, + 126, 84, 110, -92, -23, -78, -106, -89, 6, 47, 80, -67, 0, -51, 124, -109, -10, -88, -85, + -92, -96, -103, -23, 101, 76, 42, -38, 46, -52, 85, 20, -47, 13, 92, -83, -113, 123, -42, + -24, 11, 110, 79, -3, -106, -3, -45, -73, -60, -63, 3, -14, -21, 20, 70, 107, 106, -3, + 82, 117, 79, -125, -7, 25, 104, -61, 3, 33, -57, -95, -21, 31, -20, 113, 122, -6, -50, + 4, -70, 17, -48, -64, 122, 13, 67, -113, -10, 6, 57, 79, -97, 120, 91, 20, 86, 16, + -64, -7, 3, 63, -40, 8, 39, 35, -6, -105, 72, -125, -66, -25, -128, -51, 110, 85, 39, + 82, 32, 109, -20, 38, -27, -80, 123, 103, -52, 54, -83, -46, -48, -18, 64, -90, 109, 125, + 49, -6, -2, 51, -106, 115, 28, 0, 54, -97, -86, -104, -68, -16, 127, 81, 32, 47, -91, + 73, 65, 84, 15, -90, 14, 65, -116, 93, -46, -71, -58, -90, -111, 105, 19, -62, -55, 74, + 6, -28, 28, -74, 23, -113, 79, 90, -29, 117, -60, -8, -9, -79, 121, -13, -35, -49, -3, + -85, 0, -92, -8, -101, 119, 73, -110, 126, 38, 43, 52, 22, -104, -113, -60, 115, -39, -53, + -32, 105, -125, 69, 45, -107, -97, 72, -96, 89, -35, -18, -78, 52, 125, 115, 54, -77, 14, + 117, -52, -70, -39, -122, 108, -78, 70, -51, 118, 25, -68, -14, -12, -9, 41, -98, -32, -40, + -107, 33, -27, -95, 100, 57, -72, -121, 94, 90, -74, 61, 25, 77, 99, 34, 80, 49, 48, + -72, -81, -29, 60, -7, -118, 33, 30, 39, 61, 82, 68, 113, 108, -56, 27, -122, -104, -124, + -28, -52, -39, -19, 84, 121, 64, 25, -51, 54, -107, -80, 73, -25, -28, -67, -33, 105, -43, + 26, 3, 113, 29, 114, 96, 20, 28, 70, 43, -51, -92, -111, -51, 39, 115, 82, -17, -14, + 11, 119, 91, -121, -67, 89, 38, 46, 111, -109, -52, 47, 65, -41, -79, -59, 100, -115, -107, + 10, -65, -46, 82, -72, 105, 55, -97, 19, 103, 26, 81, -31, 107, 102, -95, -43, 58, 81, + -80, 120, 24, -63, -49, -97, 15, -121, 41, 125, 20, -6, -102, -85, 34, -107, 58, -21, -5, + 57, -5, 90, -65, -114, 64, -28, -9, -91, 0, -5, 54, -9, 27, 35, 107, 2, -88, 1, + -100, -45, -24, -96, 35, 122, -6, -126, 7, 51, 80, 15, 113, 77, 109, 22, -9, -1, 126, + 52, -103, -105, 34, -78, 102, 86, 16, -10, 2, 108, -64, 74, 15, -1, 17, -121, 7, -12, + 127, 83, -16, -63, -62, -10, -47, -89, -101, 66, 64, 61, -25, 50, 106, -82, -22, -120, -7, + 17, -110, -39, -74, -63, 27, -91, 52, -83, -112, -15, 27, -69, -54, 59, 73, 85, -115, -87, + 113, -91, 28, -82, -10, 60, -85, 17, 4, -118, -32, -86, -9, 63, -81, -10, 84, 108, 116, + -66, -13, 92, -67, 90, -127, 99, -12, 111, 10, 58, -113, -2, -88, -21, -101, 38, -124, 102, + -72, -108, -55, -5, 115, -100, 80, -26, 102, -123, 102, -6, -41, -62, -82, -118, 83, 117, -115, + -25, 90, -109, -91, -85, 17, -58, 107, -24, 67, 10, 127, -98, -55, -80, 125, -104, 79, 69, + -59, -25, 48, 22, 58, -96, 29, 123, 109, -83, -112, -112, -122, -37, -109, 65, -78, -76, 90, + 101, 60, 10, -96, -99, -90, -86, 126, 39, 18, 48, 25, -112, 81, 87, 7, -24, 112, -111, + 23, 61, 123, 107, -72, -63, 31, 29, 8, -60, -92, 56, -43, -118, -28, -2, -40, 21, 41, + -22, 89, -11, -10, 105, 24, -56, -73, -28, -10, 4, -41, 77, 52, 113, -62, -72, -121, 75, + 37, -90, -56, -89, 116, 17, 86, -125, 23, 54, 101, 17, 18, -70, -75, -87, -63, -119, 38, + 8, -32, -84, 90, -57, 111, 73, 88, 18, -17, -106, -118, 70, -124, -102, 48, 4, 47, -62, + 124, 33, -47, -58, 38, 94, 63, 6, 117, -117, 3, -73, -113, -114, -9, -85, 10, -49, -20, + -87, 24, 60, -92, 10, -34, 39, -115, -102, 8, -67, 118, 54, 85, -30, 20, -123, 106, -19, + -42, 61, -99, -50, -27, -112, 86, 65, 124, -74, 17, -127, -36, -59, 90, 1, -32, -53, 42, + -15, 48, 62, 2, -114, 13, 13, 91, -116, 70, -8, 95, -89, 122, 28, -9, 8, 8, -66, + -79, -126, -12, 17, -36, 109, -16, 120, 116, -60, -104, -53, -10, 78, -57, 4, -55, -47, -123, + 105, 57, 15, 77, 44, -108, -108, 90, -87, 96, -72, 39, 34, -83, -66, 12, 97, -16, 101, + 1, -79, 75, -84, -61, -1, 1, -56, 71, 99, 85, 76, -28, 3, 74, 4, -71, 48, 1, + -41, 75, 56, 114, -104, 61, 98, 61, 87, 98, 22, -58, 122, -68, 90, -69, -93, -89, 1, + 36, 1, -27, 119, 24, 69, 14, -76, 20, -47, -41, -16, -32, 52, 91, -94, -46, 44, 125, + 109, 122, -34, -4, -34, -83, -91, 28, -20, 22, 118, -22, 15, 109, -92, 56, 43, -54, -28, + -77, -88, 41, -66, -95, -54, -68, -89, 94, -53, -18, 61, 112, -83, 23, 23, 21, -120, -10, + -12, -94, 126, -125, 78, -124, -24, -6, -19, -118, 6, -90, 121, -29, 64, -63, 121, 90, -57, + 75, -16, -126, 13, 47, 93, 28, -54, 57, 24, 123, -30, 122, -35, -93, -41, 48, -106, -5, + 17, -9, 85, 90, 44, 92, 78, -66, -119, 121, 74, 68, 46, 10, 86, 89, -29, 118, 102, + 105, 71, 67, 12, -34, 54, -77, 34, -73, 5, 25, -102, -120, 99, -25, 110, 67, -46, 8, + -128, -85, -67, 120, 50, 30, 16, -3, -5, -68, -106, -117, -8, -46, 84, -77, -116, -19, 16, + 30, -85, -88, -120, 111, 115, 2, 95, -98, -90, 66, 50, -44, -108, -104, 82, 82, -82, 66, + 50, 55, -49, -124, 22, -85, -83, 71, 47, 123, 52, 86, -60, -107, -71, 119, 98, -12, -24, + -7, 60, -73, -86, 110, 60, -10, -118, -61, -11, -109, -28, -108, 59, -70, 64, 114, -66, 53, + 119, -104, -18, -111, 48, 35, 14, -106, 122, -123, -79, 100, 37, 65, 98, 106, -94, 54, 86, + 10, 55, -21, 23, 105, -119, 10, -121, -56, -85, -1, 23, -75, -85, -103, 62, 93, 43, 92, + 95, -108, 31, 1, -33, -53, 100, 49, 16, -52, 8, 49, 119, 15, -90, 4, -78, -87, -13, + -50, -93, 73, -56, 2, -99, -127, -85, 34, -18, 123, 15, 42, 30, -23, 38, -61, -116, -91, + -33, -56, -36, -94, -18, 68, 120, -112, 67, -53, -7, -46, -16, -19, 12, 102, -78, -97, -93, + -36, -51, -61, 51, -32, -46, -3, -96, -104, 19, -21, -120, 106, 71, 103, 15, 106, 85, -23, + 107, -6, -27, 80, -11, 55, -84, 11, 50, -37, 59, -17, 107, 109, 99, -70, -22, 35, -51, + 13, -96, -83, -21, 30, 47, -18, -36, -30, -15, 110, -16, 80, -23, 25, 8, 52, 5, 88, + -82, 120, -105, 54, 106, -50, 33, -63, 63, -1, 115, 57, -44, -30, -119, 16, 66, 6, 126, + -60, -32, 102, 113, 91, -53, 46, 78, 14, 5, 31, 8, 55, -63, -62, 58, -51, 46, -8, + 54, 113, -27, -95, -58, 59, 8, -3, -9, 109, 7, 55, 56, -22, 10, -70, -126, -65, -2, + 5, 63, -77, -44, -61, -67, 81, 30, 98, -27, 49, -112, 110, 48, 22, 47, -126, -49, -61, + 20, 46, -66, -60, -15, 31, -112, 95, 59, 38, -6, -56, 25, 107, -126, -115, -10, 96, -48, + -78, 59, 108, -115, 18, -126, -67, 14, 102, -105, 116, -78, 66, 61, 61, 62, -127, 111, -88, + 60, -19, -70, -25, -60, 25, -41, -67, -51, -75, 7, -91, -26, 45, 98, -107, -76, -97, 38, + -121, -70, -98, 105, -67, 61, -31, 55, 104, -35, -35, 62, 3, -9, -98, -106, -35, -63, 94, + 37, 98, 98, -49, -85, -43, -23, 112, 48, 75, 123, -29, 34, 19, 93, 80, 45, 12, 15, + -110, -117, 20, 23, -78, 112, -13, 6, 124, 7, 38, -97, 52, -31, -116, -19, 23, 122, -85, + 125, 63, -97, -25, -30, 39, -82, 52, 111, 108, 47, -9, 72, -114, 21, -110, 21, -78, -32, + 80, -45, -101, -81, -22, 50, -94, 118, -71, 33, 114, 17, -102, -108, 63, -123, -89, 23, -50, + -83, 4, 73, -60, -103, -58, 40, 56, 2, 112, -9, 47, -82, 44, 120, -119, -75, 54, -73, + 92, -53, 99, -67, -61, -49, 28, -101, 78, 62, -90, 0, 85, 32, 90, -82, 36, -17, -60, + -103, 42, -54, 48, -115, -41, 52, -45, 32, 91, 21, -124, 89, 106, -58, 67, 5, 31, 25, + 121, -126, 107, 24, -123, -125, 91, -32, -100, 23, -126, -115, 105, 94, 108, 78, -45, -116, -99, + -26, 114, -2, -94, 8, -31, 0, 6, -31, -110, 71, -65, -93, 9, 83, 89, -27, -21, -44, + 64, 114, -42, 60, -27, -51, -27, 122, -46, -50, 19, 70, -17, 95, 79, 34, 97, 46, 109, + -36, 117, 81, -49, -80, 57, -60, -37, -80, -112, 41, -6, -1, -100, -123, -82, 41, -99, -30, + 1, -89, 72, 105, 107, -64, 21, -70, -11, 70, 2, -6, 118, -27, -59, -121, -108, -81, -44, + -119, -84, 19, 98, -87, 39, 33, -88, -98, 104, 115, 78, 6, -66, -95, 110, -79, 33, 124, + -8, -82, -47, -93, 103, 59, -84, 3, 39, -71, -6, -25, -103, -51, -67, 118, 116, 36, 76, + 75, 123, -41, 1, -118, -114, 67, 101, -21, 31, -121, 64, 2, -92, -128, -98, 110, -16, 21, + 69, 45, -109, -122, -87, -96, -75, -11, -109, 66, 116, 39, -35, 90, -50, -15, 2, -112, 93, + -81, 43, 8, -81, 68, 88, 57, -30, 124, 90, 46, 101, 6, 65, 109, 77, 103, -64, -113, + -91, -78, -118, 90, 1, 81, -63, -87, -26, 86, -67, 53, -71, -58, 116, -22, 101, -44, 119, + 39, 62, -20, -77, 28, 32, -94, -43, 123, -61, -21, 59, 79, 26, -28, -56, -33, 118, 5, + -123, -116, -95, -30, -93, -102, -115, -29, -54, 86, 66, 14, 106, 106, -79, 21, -94, 5, -123, + -95, -21, 19, -123, -77, -94, -102, 6, 59, -88, -88, 42, 96, -47, 63, -115, 100, 44, 68, + 40, 97, -100, 32, 84, 121, 42, 74, -36, -20, -108, -56, -3, -83, -72, 2, 30, 23, -54, + 122, 51, 39, -109, -46, -56, 93, 85, 75, 55, 13, 125, 11, 65, 117, -35, 16, 3, -93, + -65, 86, 77, 67, 67, 107, -118, 122, -49, 43, 4, 6, -100, -110, 94, 109, -65, -120, 67, + -7, -12, 72, -27, 73, -79, 117, 117, 120, 86, -107, -15, -35, -73, 105, -37, -46, -40, -16, + -28, -53, -75, 33, 3, 97, -75, 86, 52, 58, 120, -117, -38, 53, -75, -15, 18, -99, 12, + -69, -87, 85, -35, -21, 10, -107, 34, 67, 55, 43, -68, -110, -114, 62, 6, 60, -71, -101, + -85, 100, 84, 90, 51, -3, -33, -13, -24, -12, 45, 39, 75, 25, -123, 104, -97, -62, 100, + -84, -81, 61, 98, -79, -6, -12, 52, -30, -112, -117, 102, 53, -11, -8, -105, -106, -93, 10, + 39, -79, -52, -42, -57, -71, 105, -47, -122, -119, 61, -114, -19, -33, 65, 25, 94, -66, -111, + -89, -89, 84, -17, 55, -84, 68, -101, 7, -105, -102, -7, -100, 71, 28, 105, -18, -69, -80, + 11, -105, -45, -17, -48, 95, 57, 7, -71, -51, 34, -22, 20, 17, -73, -32, -50, -15, 70, + -50, 64, -5, -43, 1, -102, -58, -13, -62, -104, 24, -23, 12, 69, -18, 6, -38, -103, -33, + 20, 104, -71, 61, -11, 15, 43, 125, 41, 73, -61, 55, 104, 86, 120, 61, -121, 61, -42, + 11, -106, 16, 97, 54, 104, -17, -70, 55, 86, 46, 91, 88, -90, 56, 97, 12, -84, -54, + -99, -95, 45, 122, -90, 40, 45, -11, 107, -70, 64, -22, -120, -50, -51, -81, 82, 99, 102, + 28, 17, 104, 101, 26, -16, 105, 33, -121, -17, 91, 65, -55, -55, 66, 46, -104, -64, -9, + -109, -39, -11, 63, -32, -62, 92, 99, 32, -18, 24, 120, -65, 126, 91, -8, 41, -3, 113, + 5, -72, 11, -113, -106, 115, 99, 62, -33, 15, -78, 16, -97, 102, -45, -71, -47, 5, 49, + 84, -89, 79, -2, 4, 119, -125, -113, 113, 83, 73, 44, -106, 105, -94, -40, -12, -117, -37, + 120, -31, -34, 67, 108, -61, 38, 83, -103, -1, -97, 23, 11, 108, -31, 14, 1, 30, -113, + -5, -84, 60, -84, 113, -38, 95, -68, 50, -127, 126, -10, 3, 87, 49, -2, -92, 68, 111, + -54, -96, -104, 69, -93, -44, 28, 115, 25, -22, -67, -127, -84, -108, 72, 109, 112, 61, -116, + 108, -13, -94, 17, 101, -119, -91, -73, -76, 59, -12, -101, 20, -19, -89, 43, -83, -38, -23, + -123, 42, 15, -88, -52, 116, 38, -74, 10, -103, -30, -64, -20, 120, 93, -23, 28, -73, 32, + 106, -61, -66, 39, 48, 46, -12, 53, 21, 9, 101, 76, -96, 55, -28, 66, 106, -84, -86, + -61, 57, 83, -87, -60, -128, 83, 81, -92, 65, -5, 106, 3, -92, -17, -14, -37, -112, 119, + -108, 18, 68, -104, 77, -81, 18, -98, -86, 85, 58, -64, -53, 44, -103, 113, 80, 41, -103, + 111, -102, -70, 16, -73, -55, -2, 37, 98, -95, -16, 47, -61, 69, 118, 66, 65, -20, -3, + 93, -84, 70, -48, 87, -123, -23, 68, 95, 39, 120, -113, 124, 110, -73, 17, 75, -50, 14, + -52, 13, -7, -122, 109, -2, 64, 63, 103, -72, 72, 19, 112, -120, 56, 125, 90, 95, -7, + -24, 121, 21, 121, -112, 90, 98, 62, -99, -123, -65, 21, 78, -7, 57, -100, -71, -114, -120, + 117, -113, 84, 124, 54, -53, -107, 114, -99, -57, -109, -7, -126, 38, 102, 68, -120, 124, 35, + 17, 31, -58, 118, 123, 21, -102, -81, 85, -35, -113, -51, -89, -108, -49, 78, 90, 5, 98, + 106, 116, 11, 32, -81, 114, -55, -39, -48, 1, -120, -51, 69, 73, 43, 75, -88, 99, -1, + -23, 33, -31, -21, -32, 11, -49, 88, -72, -7, 11, -28, -9, -48, -59, -125, -47, 126, -81, + -16, 42, -38, -82, 65, -44, -66, 73, -56, -79, -20, -122, -101, 40, 46, -23, -120, 54, -93, + 32, -2, -124, 42, -37, 34, -102, 51, -102, -24, -100, -2, -124, -125, 75, -50, -106, -31, -16, + 95, 59, -92, -20, 48, 117, 38, 11, 11, 98, -111, 41, -65, -59, -20, -106, 47, 116, -103, + 78, -12, -32, 61, -57, -121, -31, 107, -11, 9, 2, 91, 9, -9, 121, -57, 47, 124, 15, + -77, -84, 5, 108, 90, 86, 82, 27, -79, -42, -18, 28, -25, 90, -18, 41, 113, 112, -43, + 108, 126, 65, -16, 54, 93, -10, 71, -124, 92, -96, 29, -56, 33, 105, -94, -108, 80, 96, + 40, 29, -115, 101, 46, 75, 55, 48, 90, 85, 52, 13, 66, -115, 22, -84, -70, -97, -7, + 106, 68, -109, 100, -103, 9, 118, 124, -64, -82, -7, -50, -66, -16, -113, -33, 13, 37, 77, + 74, -92, -44, -3, -5, 107, 56, -116, 102, 79, -8, 6, -90, 9, 71, 18, 115, 45, 121, + 48, -49, -98, 85, 36, -42, -38, -28, -93, 12, -113, -115, 84, -122, 49, 41, -31, -93, 103, + -89, 13, 70, -127, 71, -118, 51, 109, -38, 89, 6, -101, -14, 10, 119, -13, 7, 86, -31, + 40, -55, 104, 43, -126, -124, 117, 47, 64, 72, 31, -91, 115, -90, -16, -7, 5, -27, -108, + -31, 121, 31, 85, 24, -128, -119, 75, 105, 21, -101, 103, -58, -61, 17, 2, -36, 54, 51, + -4, 122, -122, 37, -36, -20, 98, -52, 61, -105, -88, 5, 51, 78, -41, -68, -4, 66, -128, + 98, 13, 1, 37, -94, 79, -4, 19, 65, -39, -26, 119, 114, -23, 45, -111, 121, -57, -69, + 26, -124, 39, 7, -68, 61, 95, 102, 102, 26, -9, 59, 77, 5, -54, -37, -33, 44, -93, + 32, -26, 8, -41, 111, 52, -18, 13, 68, -77, 112, 37, -128, -17, 83, -32, 41, -49, 48, + -17, -125, -12, -1, 54, -67, 84, 52, -75, 92, -100, -9, 63, 56, -74, -61, -106, 100, -70, + 46, 35, 23, 120, -53, 98, 10, 17, -65, -29, -19, 33, 10, 17, 91, 12, 33, 83, -65, + 48, 75, -82, -6, -76, -50, -33, 119, -84, -88, 11, -62, 35, -123, 93, 87, 117, 19, -88, + -59, -106, -14, -56, -73, 21, -39, -23, 75, 27, 68, -14, 52, 84, -31, -52, 31, 81, -29, + -20, -87, 117, -105, 4, -92, 60, 119, 24, 86, 112, -54, 35, 19, 48, 44, 56, 12, -54, + 81, 57, 32, 34, -98, -65, 38, -125, -58, 35, 4, 122, -121, -122, 70, -90, -30, 17, 61, + 113, 18, -25, -31, 119, -46, 42, 84, 20, 34, -59, -98, -111, -77, 119, 31, 25, -11, -27, + 113, 19, 100, 95, 89, -43, -59, 46, 22, 28, 81, 73, 63, 49, -105, -114, 93, -116, -60, + -81, -69, -49, -37, 55, 103, -42, -25, 91, 50, 108, 89, 57, 76, 79, -94, -84, -107, -35, + 78, -72, 101, 109, 110, 96, 96, -54, -95, -128, -102, 113, -74, -39, -43, 72, 74, 20, -105, + 1, -96, 49, 24, 87, -65, 37, 23, 49, -62, -38, 75, 18, -96, -45, 1, -75, 66, 119, + -35, -25, 60, -58, -58, 26, 114, -68, 71, -100, 17, -78, -39, -3, 74, 8, -37, -12, 3, + 80, 10, -15, -108, -17, -58, 38, -62, -86, -51, 42, 8, -26, -50, 76, 127, -60, -68, -16, + 2, 121, 125, -89, -64, -112, -125, -53, -92, 104, -118, -72, 81, 74, 50, -7, -62, 6, 124, + -10, 83, 44, -120, -22, -114, 116, 1, 24, 110, 18, -41, 110, 63, -37, 31, -1, 92, -82, + 27, -63, 33, -110, -17, -49, -63, -57, 109, -84, -78, -85, 22, 1, -49, 125, 75, -121, -101, + -31, 44, 110, -49, 43, 111, -20, -116, -56, -79, -70, -57, 10, 108, -20, -84, -57, 106, 58, + 47, -44, -65, 25, -76, -84, -15, -109, 38, 26, 65, 80, 87, 94, 39, -55, -82, -45, 95, + 69, 84, 16, -6, -14, -15, 45, 87, 33, -70, 11, 42, 29, 25, 96, -100, 10, 7, -33, + 118, 9, 57, -91, -90, -47, -27, -127, -108, -105, -18, 82, -60, -12, -51, 74, -15, -113, -22, + 77, 91, 2, -89, 71, 97, 51, 93, -17, 90, -82, 126, 116, -15, -40, 70, 112, -59, -78, + 52, -104, 72, -19, -12, -48, -125, 18, -4, -81, -14, -126, 5, 38, -32, 78, 97, 9, 25, + 96, -19, -24, -35, -90, -106, 60, -101, 72, 121, -33, 94, 21, 8, 53, 126, -55, -118, -117, + 110, -17, 105, -22, 12, 81, -90, 119, 127, 27, -80, -39, 112, 58, 119, 17, -47, 96, -118, + -36, -30, 105, 106, -60, 23, 5, -93, -68, 67, 119, 97, -1, 41, -1, 52, 65, 49, -99, + -11, 121, -122, -96, -67, -77, 116, -62, 103, -115, -26, -13, -14, 22, 69, 57, -28, -122, 109, + -99, 57, -39, -90, -2, -36, 20, -115, 125, -10, 94, -105, -126, -42, -46, 82, 77, -47, -90, + 5, -53, -127, 93, -122, -11, 35, -112, -112, -58, 27, 77, -62, -69, 66, 110, 24, -44, 76, + -88, 69, 87, 100, -71, 94, 114, -12, -70, 24, 33, -110, 18, -75, -101, -107, 82, -120, -79, + 48, 54, -50, -87, -8, 41, -15, -93, 126, -44, -109, -78, -51, 47, -3, 17, -105, -92, -55, + 77, -114, -42, 21, 30, 9, 37, -40, 61, 113, 16, -1, 54, -29, -2, 108, 54, -37, 26, + 79, 18, 34, 88, -24, 65, 67, -10, 12, -48, 69, 84, -18, 74, -94, 67, -43, -108, -109, + 38, 86, 115, 65, 28, 76, -117, 67, 53, 76, -91, -18, 81, -52, -115, 82, 0, 55, -25, + -53, -94, -51, -104, 123, 86, -14, 90, -122, 64, -112, -114, -85, -67, -65, 87, -63, 5, 69, + 45, 92, 43, -19, 98, -72, -71, 46, 55, -56, 124, -119, -9, 83, 98, 15, -105, 31, 42, + -17, 69, 103, 9, -26, -101, -3, -20, -24, -3, 75, 109, -110, 32, 97, -58, 73, -68, 34, + 4, 119, -39, 48, -126, -95, 77, -83, 22, 110, -11, -51, 66, -23, -46, 77, -124, 52, -110, + 62, 36, -96, -6, 90, -117, 53, 26, 102, 73, 47, 65, -104, 101, -78, 73, -14, -57, -78, + -10, 57, -104, 116, -20, 120, -64, 110, 97, -124, -38, 42, -39, -17, -17, -120, 69, 24, 81, + -110, -8, -57, -8, 122, -84, 118, 3, 89, -40, -96, -38, -120, 81, 102, 95, -60, 110, -63, + 106, -18, 87, 73, -115, 11, -98, 42, 80, -28, -126, -118, 14, 42, -86, 15, 44, -5, 6, + 56, 83, -10, 63, -18, 13, 13, 80, 109, -118, -98, 15, -118, -77, 38, 6, 76, -74, 44, + 48, -89, 110, -99, -14, 118, 95, 30, -3, 5, 31, 109, -83, -122, 41, -24, 19, 80, 104, + -113, 11, -109, -69, -27, 90, 100, 86, 44, -108, 102, -24, 4, -115, 72, 88, 18, 42, -95, + -53, -105, 48, 71, -71, 104, -83, 92, -36, 97, -8, 60, -47, 54, 76, 126, -92, -56, -71, + -93, 92, 94, -60, -1, -35, -117, -28, -75, 121, 55, -116, -128, 75, 88, 49, -41, -37, -75, + 81, 64, 54, -35, 19, -32, 92, -126, 123, -107, -124, 125, -23, 84, 18, 68, 63, -9, -26, + -93, 119, 26, 60, 19, 52, 35, -7, 38, 111, -52, 51, 52, -79, 16, -122, -88, 26, -65, + 125, 125, 60, -32, 66, 48, -38, 92, -17, -125, 27, -26, -48, -109, -11, 61, -31, -1, 78, + -57, -90, 95, -35, 87, 51, -34, -53, 99, -12, 60, 90, -71, 74, 58, -69, 24, 101, -26, + 65, -48, 0, -13, -3, 77, -61, 82, 70, -62, 55, -58, -13, 37, 80, -15, -33, 46, 112, + -35, 54, 78, -30, -3, -40, -91, 90, -15, 17, 105, -2, -125, 10, -6, 10, 79, -42, 41, + 101, 64, -8, -93, -45, -50, -41, 8, 103, -31, 46, -51, -99, 94, 126, -30, 54, 85, -35, + -29, 6, 108, 65, -104, -97, -63, -82, -86, 105, -108, -44, 94, -49, -15, -30, -114, -20, 7, + 99, -9, -107, 36, 75, 117, -112, -56, -126, -46, -2, 120, 36, -62, 9, -7, 41, -28, -14, + -91, -53, 52, 65, -46, 67, 9, -22, -105, -97, -108, 8, 33, 40, 38, -97, 37, 38, -128, + -9, 81, -5, -32, -97, 43, -85, -80, 6, -77, 81, 87, 9, -76, 16, 58, -94, 32, 27, + -61, 53, -51, 53, 95, -35, 17, -19, -30, 84, -3, 15, -69, -23, -111, 0, 77, -60, -57, + 126, -33, 22, -14, 117, -65, -25, -4, 49, 105, -19, -20, 69, 73, -76, -93, -2, 125, -106, + 67, -10, -42, 59, -5, -12, -33, -52, -68, -127, -29, -15, 15, -44, 63, 65, 48, -88, 26, + 121, 15, -122, -119, -126, 37, -21, 55, 37, 12, 8, -107, 98, -113, 28, 37, -97, -102, -53, + 72, -4, -91, -54, -107, 66, 48, -124, 90, 8, -84, 126, -121, -43, 43, 35, -15, 74, 86, + -8, 66, 45, 57, -7, -90, -39, 48, 56, -42, 50, -38, 34, 34, 57, -126, -22, -63, -19, + -23, -85, 24, 89, 122, -104, 54, 98, -108, -94, -122, -42, -121, 62, 60, 25, 67, 105, -38, + -41, 45, -51, -92, 37, 43, 28, 71, 30, 111, 1, -43, -104, -27, -12, 3, 34, 63, -68, + -32, 67, 123, -42, -121, -94, -77, -120, -42, 42, -71, 47, -2, -55, 121, 17, -105, 94, 84, + 112, -3, -39, -98, -29, -89, 83, 75, -116, -44, -4, -128, 126, 22, 55, -100, 53, 29, -61, + 75, 6, 18, 104, -62, 122, 42, 76, 36, 80, -123, -66, 95, 31, 16, 17, -71, -29, 125, + -94, 110, -123, 44, 109, -82, 52, -83, 36, -54, 53, -46, 38, 21, 65, -15, 47, 5, 94, + 21, -21, 32, 107, -84, 57, -41, 92, 108, 81, -51, -19, 0, 95, -112, 47, -69, -83, 49, + 84, 121, 125, -108, -60, 43, -37, 56, -121, -41, -64, 92, 60, 84, -13, -92, -71, -126, 24, + 20, 55, -65, 38, 33, 22, 107, -74, -38, 49, 2, -125, 92, 60, -65, -125, 52, -96, 86, + -37, 114, -58, 38, 56, -7, -111, 114, 79, -40, -117, 5, 65, -121, 108, -84, 97, -113, 70, + 83, -113, -28, 86, -58, 83, 8, 49, 44, 7, 124, 87, -75, -40, -6, 126, -19, 102, -124, + 26, -61, -124, -119, 31, -107, 44, -15, 112, 26, 36, -60, -84, -9, 113, 105, -38, 110, 122, + -44, -46, 13, 15, 102, -84, 106, 33, 63, -66, -107, 11, -31, -8, 72, 40, -48, 4, 47, + 10, 122, -79, 50, -68, -76, -122, -102, -16, -1, -24, -93, -105, 127, 105, -41, 124, -63, -99, + -84, 2, -4, -54, -121, 80, -72, 11, 74, -37, -35, 107, -59, 17, 109, -53, -78, 99, -105, + -109, -17, -112, 23, 58, -31, 17, -83, -91, -58, -89, -50, -61, -108, 83, 81, 103, 96, 73, + 87, -30, 59, -39, -29, -78, -38, 39, -65, 95, 15, 48, 105, 82, -100, -27, -75, 55, -68, + -12, 47, 11, 73, 47, 118, 9, -26, -78, -97, -70, -113, -85, 111, -50, -87, 3, 87, -14, + 91, -109, -36, 33, -3, 99, 85, 121, 19, -27, 45, 38, 2, 66, 114, -42, -15, -79, -25, + -109, -109, 83, 51, -34, -85, -26, -61, -33, 10, -22, 90, -85, -50, 34, -73, 111, -86, 7, + 19, -7, 41, -56, -50, 8, -72, -18, -47, 108, -53, 72, -11, -9, 27, -46, 116, 46, -90, + -87, 79, -124, 109, -64, -52, -73, 33, -105, 38, -120, 110, 56, 102, 83, 63, 48, -113, 49, + 43, -55, -91, -46, 65, 81, -65, 9, 41, 38, 126, -14, 17, -106, 50, -57, 127, -50, -17, + 30, -122, 29, -55, -119, -100, 0, -46, 120, 100, -21, -52, -10, -110, -71, -127, 117, -2, 42, + -122, -41, -69, 98, 106, -111, 27, 51, 30, 94, -124, -21, -76, -122, -26, -28, 58, 34, -100, + -21, -7, 13, 35, 122, -82, 16, 53, -127, 121, -56, -105, 99, 117, 83, 9, 54, -37, -92, + -78, 77, -71, 94, -18, -114, -25, -128, -91, -54, 57, -117, 11, -76, 89, -99, 90, -94, -117, + 111, -70, -82, 96, 81, 13, -127, 80, 58, 52, 73, 71, -52, 99, -22, -66, 108, -53, -5, + -109, 59, 71, 91, 67, 31, -102, -10, -72, -18, 122, 39, -41, 63, -119, -32, -48, 18, 118, + 75, 127, 90, 75, -44, 126, 37, -41, -31, 20, 92, 71, 34, 41, -103, 11, -102, -37, -101, + -27, 26, -84, -42, 35, -32, 85, -9, 47, 113, 22, 54, 80, 80, -47, -9, -73, -115, -79, + -12, -46, -32, 102, 11, -50, -124, 108, -60, 39, 76, 113, 51, -62, -95, 91, -57, 54, 10, + -27, 110, -103, 105, -23, -76, -43, -71, 59, -83, 4, -31, 96, 7, 57, 48, 25, -8, -52, + 66, 82, 50, -79, -50, -124, -20, -65, 100, 52, 54, 44, 62, -87, -94, 73, -25, 24, 99, + -125, -116, 42, -26, 90, 2, -28, 72, 102, 78, -3, -124, -114, -44, -106, 100, -88, 99, -67, + 27, -22, 49, 97, -88, 70, 112, -11, -17, -76, 95, 32, 8, 91, 79, -76, -34, -60, 78, + 81, 56, -105, -79, 43, 51, -16, 110, 66, -3, -33, 93, -57, -77, -50, 39, 118, -110, 66, + -83, 91, 66, 61, 18, -62, -71, 95, 33, -75, 4, -46, -96, -63, 50, 19, 18, 56, -15, + -104, -126, 59, 126, 75, -38, -57, -69, -96, 105, -64, 80, -111, 15, 123, 23, -66, -11, -75, + -74, -28, 93, 72, 21, 6, 37, 47, 64, 46, -45, 23, -52, 3, 72, 15, 52, 79, -122, + -83, 107, 110, -45, 62, 117, 113, 41, 89, -115, -93, -62, -127, 30, -120, 126, -112, -64, -45, + 103, 92, 72, 110, -2, -117, 91, -49, 123, 76, -116, -76, -94, -39, 54, 53, 65, 98, -25, + 49, 14, -58, -33, 83, -24, -53, -65, -124, -110, -103, -106, -34, 33, 26, 53, -16, 51, -34, + 51, -86, 108, -82, 74, -3, -4, -38, 29, 111, -61, -75, 101, 82, 108, 8, 50, -75, 85, + -111, 59, -59, 22, 17, -114, -98, 126, 111, -100, 69, 80, -90, 53, -7, 76, -73, -101, 33, + -24, -106, -84, -103, -79, -42, 12, 14, 85, -18, 103, 48, -17, 86, -102, -55, 17, 79, -25, + 101, -26, -31, 0, 61, 92, -83, -65, 19, 33, 69, -120, 47, 1, -24, 19, 110, -56, -115, + -40, 67, 75, 91, 97, 118, 77, -4, 76, 25, 38, -123, -20, 110, 34, 32, -89, -120, -89, + 2, 58, -100, 77, -117, -108, 7, -128, 29, -103, 27, 75, 113, -69, -52, -9, 66, 101, -49, + -93, -22, -32, 8, -47, -67, -17, -26, 89, -16, -18, -78, 17, -120, 28, 65, -81, -47, 117, + 44, 118, 86, 93, -18, -76, 91, 9, -31, 63, 46, 100, 29, 21, -65, 117, -87, -125, 108, + -25, 6, -74, 32, -25, -5, -8, 91, -34, -103, -96, 0, 25, -60, 62, 56, -81, -57, -122, + -21, 58, -20, 6, -111, -32, 52, 68, -76, -8, -7, 1, 101, -75, 124, -21, -14, 103, -38, + 82, 65, -90, -50, -98, 71, 120, 116, -21, -27, 72, 31, 124, -93, 124, -21, 27, -118, -86, + -43, -26, 103, -25, 101, -5, -92, 120, -95, -112, -75, 78, -7, -120, -25, -113, -75, -28, 19, + 118, -87, 118, -108, 104, 126, -55, 103, 117, -59, 115, 53, -14, -92, -121, 46, 53, -105, -68, + 120, -26, 69, 5, 7, 99, 103, 16, -112, 113, 103, 92, 0, -112, 2, -60, -118, -121, -72, + 62, -84, 40, 117, 4, 104, -107, -34, -99, -71, -38, 82, -66, -71, 66, -127, -21, -76, 2, + 89, 115, -30, 45, -13, -81, -115, 13, -107, -10, -94, 59, -2, -62, -15, -62, 4, -34, -111, + 65, -2, 64, -29, -20, 126, -75, 83, -53, -84, -95, 97, -98, -41, -89, -79, 96, -49, 82, + -1, 127, -125, -88, 41, -11, -122, 104, -76, -74, -83, 68, 19, -83, -69, -66, 111, -107, -121, + 52, 52, 64, 8, -95, -88, 77, 108, 76, 48, -27, 119, -84, -7, 78, -34, 50, 47, -25, + 57, -34, 73, -9, -40, -91, 52, -39, -52, 42, -103, 49, 52, 71, -79, -37, 34, 64, -91, + -98, -9, -13, -47, -57, 100, -57, 42, 25, -50, -121, -47, -84, 25, 33, 69, 61, 69, 62, + -107, 7, -25, 67, -75, 14, 4, 50, 72, -53, 88, 70, 86, 102, 123, -78, 64, 103, 99, + 124, -29, 0, -68, 113, -67, -84, -40, 107, 1, 39, 23, -80, 113, -106, 70, -70, -80, 17, + 28, 42, -102, 91, -7, -73, 49, 13, 62, 112, -95, -43, 101, -62, -124, 85, 1, -100, -60, + 5, -26, 8, -89, 8, 125, -111, -87, 26, -52, 103, -77, 2, 43, -83, -10, -69, 44, -111, + -118, 53, 97, 108, 62, 59, -120, -79, 68, 65, -52, 41, 112, 73, -3, -84, 115, 39, -59, + 4, 30, 19, 106, 12, -86, 64, -99, -68, -10, -88, -32, 86, -110, -31, 118, -9, -72, 12, + -125, 102, 37, 115, -16, 101, -59, -26, -38, -88, -54, 39, 93, 24, -120, -17, -96, -37, 23, + 126, -61, 7, -65, 84, 18, -91, 57, -72, -3, 68, -60, 106, 34, -36, 27, 116, -55, 1, + -102, 115, 70, 46, -15, -109, 59, 113, 95, -13, -3, 98, 14, 123, -28, 50, 52, 104, 113, + -24, 6, -16, -33, 102, -56, -56, 26, 37, -103, 10, -50, -78, -68, -73, 25, -100, -110, 24, + -9, 46, -75, -8, 120, 20, -37, 13, -114, -94, -21, 117, -61, 33, 13, -124, -38, -81, -35, + 96, -81, -37, -109, -76, -90, 29, 66, 28, 29, -20, -45, -100, -19, -15, 127, -52, -76, -36, + 8, -64, -41, 24, -115, 53, 73, 13, -72, 72, 111, -53, -114, 103, -110, 20, 43, 121, 21, + 31, -80, -68, -73, -86, -108, -81, -128, -57, 1, -121, -81, -111, 29, 28, 118, -72, -83, 40, + 91, 57, -30, -104, -102, 65, -125, -68, 35, 106, -7, -87, -61, 79, 31, 1, 78, -104, 67, + 59, 23, 50, 122, 64, 125, -111, -60, -51, -74, -112, -79, -7, 82, 51, -2, 32, -47, -105, + -29, 69, 20, 44, -21, -69, 106, -18, -9, -93, -85, -74, -38, -84, -81, 119, -35, 50, 35, + -14, -98, -88, 77, 30, -116, -91, 89, -27, 16, -100, -126, 39, 93, 88, -12, 82, -49, 71, + 88, 98, -21, -24, 65, -28, -117, -7, -86, 108, -114, -126, -112, -4, 85, 37, -7, -79, 81, + 87, -89, -124, 64, 11, -26, 56, -95, -18, -52, 106, -64, -76, 22, 16, -40, -86, 88, 19, + -64, 1, -81, 9, 114, -82, -26, 10, 72, -1, -8, 91, -73, -66, 103, -82, -99, 96, 85, + 17, -19, 26, 94, 112, -75, 113, 51, -68, -58, 113, 19, -75, -120, 91, 108, -104, -86, -38, + 7, -61, -66, 24, 109, 97, 38, 53, -65, 110, -85, 24, -30, -51, -88, 30, 62, 106, 102, + -46, -30, -118, 110, -114, -99, 45, -54, 125, 33, -91, 115, -2, -58, -126, -74, -31, 72, 37, + 16, 87, -117, -27, 34, -100, 20, -95, -23, 63, -22, 107, 100, 75, -30, 27, -82, -25, 32, + 47, 57, -21, 88, 29, -97, 41, 85, 116, 123, 117, 113, 68, -25, 47, -59, 61, 81, 41, + 83, 98, -24, -49, 49, 82, 34, -65, 5, -102, -46, 91, -19, -103, -114, 10, 120, -48, -108, + 78, 111, 91, -79, -23, -104, 89, 18, 43, -72, -51, 17, -26, -60, -109, -17, -93, -73, 122, + 71, -117, -122, -102, -95, 91, 31, 54, -28, 105, 101, -28, 14, -24, -90, -9, -102, 9, -102, + 37, -87, 21, -78, 71, -5, -109, -48, 30, 49, -23, -113, 7, -8, 19, 70, 6, 85, -15, + 70, -48, 62, 3, 19, -13, 24, 67, -53, -81, -100, -120, 83, -77, 15, 118, -89, -123, 27, + 43, 13, -8, -10, 97, -110, 62, 68, 0, -99, 41, 7, -103, -100, 85, 19, -86, -114, -35, + -32, 57, 114, 85, 15, -86, -95, 3, 8, 95, -71, 87, -30, 51, 17, -115, -112, 110, 103, + 89, -1, -89, -107, -52, 15, -46, -116, -98, 49, -124, -96, 74, 91, -39, -103, 106, 89, -87, + 70, 21, 117, 68, 17, 115, 123, -44, 86, -99, 111, 16, 25, 78, 44, -116, 50, -49, -14, + 125, 68, 68, -128, 23, -56, -116, -1, 20, 15, -67, -114, -108, -35, 69, 119, 80, 4, 112, + -13, -15, -64, -91, 92, 124, 119, -90, 20, -50, 47, 7, 38, 20, -50, -26, -113, 125, 117, + -23, 107, 12, -49, 94, -115, -18, -44, -57, -122, 56, 39, 82, -31, 35, -19, 70, -6, -105, + 116, -102, -25, -69, 43, -56, -16, -3, 40, 16, -89, -112, 57, 17, -122, 126, -121, 41, -8, + 27, -78, 21, -30, 4, 56, 79, 32, -4, -95, 26, 40, 122, -101, 6, -116, -39, -44, -125, + -99, 32, 71, -54, 119, 18, 107, 104, -94, -88, 96, 96, -90, 77, -75, -7, -111, 22, 41, + -120, -123, 44, -13, -69, 17, 3, -110, -55, 5, 69, 34, -99, 121, -3, 78, -60, 67, 21, + 36, -94, 27, 56, 115, 121, 32, 20, 37, -79, 81, -82, 73, 4, 117, -53, -60, -106, -113, + 28, -126, -6, -27, 65, 115, 22, 2, -77, -20, -103, -47, -7, 107, 92, 84, -126, -106, -32, + -31, 74, -3, -118, 14, 56, 19, -84, -37, -51, -72, -20, 91, 23, 44, 6, 109, -81, -98, + 65, -49, -123, 125, -111, 24, -116, -36, -76, 52, 96, 31, 38, 94, -101, -52, -88, -5, -119, + 31, -38, -119, 46, -94, 9, -63, -41, -89, -34, -36, 62, -105, 90, -51, 93, -15, -14, -24, + 56, -101, 105, 53, 118, 117, -97, -22, -73, 35, -7, 89, -62, 74, 45, 46, 120, 75, -47, + 22, -77, -36, 102, -118, 95, 68, -105, 80, 6, -62, -70, 74, -86, 10, 41, -89, -89, 43, + 3, 52, 12, 51, 5, 62, 0, 21, 54, -102, -79, 114, 32, -105, 39, 30, 64, -114, -16, + 93, -101, -109, -86, 55, -28, -65, 15, 59, -9, 42, 76, -96, 27, -64, 56, -75, -28, -6, + -93, 47, 1, -6, 117, -82, 17, -43, 105, 58, 45, 0, 86, 2, 61, 67, 60, -16, -2, + -127, -78, -70, 105, 51, -31, 85, 104, -21, 96, -16, 19, 109, 19, 105, -98, -92, 83, 4, + 36, 5, -104, -107, -72, -85, 46, 55, -110, -75, -52, 90, -14, 68, 60, 95, 64, -15, 83, + 19, -7, 91, -66, 38, 85, 57, 65, -49, -128, 112, 47, -47, 120, -49, 3, 13, 22, -106, + -52, -112, -62, -31, -21, 106, -109, 83, 100, 111, -124, 27, -84, -90, 102, -52, 84, 108, 8, + 85, -37, -61, -9, 48, 84, 101, -112, 56, -60, -35, 47, -117, -72, 88, 8, 24, 115, 63, + 4, 92, -98, 90, -86, 0, -23, 3, 121, -48, 76, 104, -50, -122, -37, 102, 73, -70, -16, + -35, 121, -94, -45, -21, 116, -4, 111, -121, -82, 6, 10, -81, -59, -127, -97, 29, -19, 124, + 99, 124, -22, -102, 4, -67, -23, -3, -76, -70, -126, -27, 97, 51, 116, -35, 45, -88, 32, + -1, 96, 80, -5, 117, 3, 20, 1, 53, 81, 42, 86, -80, -93, -69, -85, -28, 70, 82, + 54, 26, -82, 83, -115, 7, 53, -17, 57, 95, 31, 44, -9, -88, 60, 73, 102, 2, 97, + 0, -120, -101, -61, -47, -17, -25, -85, -7, 37, -54, -75, 6, 21, 105, -60, -9, -96, -13, + -74, -16, -19, -79, -112, -2, 25, -56, -91, -45, -10, 104, 22, 126, -94, 99, -41, -62, -27, + 37, 93, -54, -85, 23, 54, -67, -113, -26, -36, -3, -7, 124, 11, 105, -24, -74, 111, -93, + -9, -96, 118, 127, 65, 27, -124, -10, 110, 87, 114, -29, 51, -69, 29, 19, 122, -96, 54, + 85, -77, -9, 71, -109, -35, -57, 22, 96, 101, 22, -6, 93, -97, 28, -50, -19, -108, -103, + 30, -90, 118, 32, 49, 17, 73, -53, 110, 66, 55, 39, -107, -112, -40, -32, 78, 59, 51, + -61, 101, -110, 106, -76, 75, -113, -22, 105, -62, -97, -128, -16, -36, -87, 26, 71, 103, -26, + 52, 34, 24, 112, -31, -103, 82, 78, 97, 106, 27, 56, 76, -77, 36, 62, -59, 47, -101, + -83, -74, -125, -26, 109, -6, -88, -80, -108, -87, -39, -44, 118, -35, -48, 31, -64, 83, -20, + -11, 62, -84, 4, -4, -59, 51, -66, 82, -29, 19, 93, 74, 57, 103, 105, -65, 69, -124, + -101, -82, -75, 11, 12, 112, -20, 120, 4, -21, -37, 11, -120, -49, 67, -6, 125, -19, 64, + 33, 100, -31, 93, -47, 5, -77, 40, 41, -93, 56, -46, 109, -88, 60, 33, -99, 31, -100, + 43, 89, -37, -108, 73, 46, -44, -49, 30, 11, -6, -13, -124, 66, 95, -66, -13, -124, -89, + 103, 85, -9, -19, 84, -50, 83, -23, -23, -92, -121, -54, 38, -40, 26, -47, -102, 27, -107, + -37, -120, -119, -26, 87, -117, 33, 2, 121, 11, 90, -69, 110, -56, -71, -127, 124, 23, -118, + -59, -60, -3, 79, 28, 104, -79, 15, 19, -127, 38, -58, 8, -42, 6, -48, -43, 93, 82, + 17, 4, -92, -69, 95, 27, -99, 45, -56, 104, 51, 2, -42, 99, 111, -48, 101, 61, -50, + -113, 116, -95, 87, -76, -55, 120, -62, 37, 5, -113, -118, 28, 101, 37, 12, 0, -36, -38, + -101, 108, 76, 58, 8, -86, 42, -99, -64, 123, 37, 47, 99, 77, 9, 92, -110, 53, -81, + -22, -104, 59, -70, -72, 28, -77, 43, -9, 69, 34, -5, -103, -27, 13, 90, -103, 27, 81, + -55, 4, 65, -57, -70, -4, 95, -57, -88, -91, 37, 106, -128, 111, -57, 54, 18, 86, 121, + 49, -108, -71, -62, -26, 5, 105, 123, 123, -90, -23, -4, 61, 84, 66, -103, -111, -95, 8, + -60, -31, -29, -32, -15, -10, -29, -101, 92, -121, -19, -2, -75, -118, -106, 118, 20, -56, -119, + -1, 35, -80, -65, 1, 65, -8, 119, -117, -41, -28, -97, -99, -104, -82, 93, 25, -83, -120, + 43, 94, 62, 108, -53, 83, -56, -121, -11, -37, -3, -57, -10, 122, -54, -65, 66, 109, 120, + 87, 91, 26, 119, 32, -113, 45, -78, -126, 85, -121, -21, -128, 6, -92, -12, -10, -11, -88, + -15, 84, 74, -108, -92, -27, 75, -55, 42, 86, 51, 77, -9, -102, 67, -119, 112, 69, -59, + 60, 49, 59, -12, 63, -100, -1, -113, 84, 46, 74, 90, -71, -89, -62, -56, 30, -63, 55, + 69, 79, 63, 26, -60, 104, 108, 126, -79, -96, 65, 10, -92, -102, 23, -75, -123, -22, -47, + -4, -49, -54, 76, -18, 9, 19, -121, -122, -69, 54, 17, -37, 72, -14, 26, -30, 24, -52, + 120, -25, 122, 87, -57, 40, -23, -49, -24, 30, 18, -79, -2, 50, -41, -66, -24, -38, 103, + 125, -59, -123, -53, -9, 119, -61, 114, 60, -73, -61, 91, 108, 115, -94, -76, 80, 115, -40, + 92, -41, -124, 26, 74, 117, 48, 16, -12, -55, 19, 33, 15, -43, -102, 11, -100, -62, -22, + 84, -43, -78, 98, 25, -52, -10, -68, 51, -116, -79, 82, -63, -97, -101, 105, -70, -60, 22, + -62, 31, -75, -94, -57, 101, -8, -123, 10, -67, 124, 44, 94, -91, 101, -4, 83, 107, 111, + 36, -60, 37, -82, -52, 53, 4, 15, -119, 87, -100, 66, 63, -45, -10, -56, 30, -28, 34, + -83, -124, -59, -55, -53, -26, -73, 18, -67, 30, 115, 79, -87, 113, -59, -109, 45, -28, 90, + -77, -25, 74, 22, 113, 50, -107, -11, -108, -72, 46, 117, -44, 28, 54, 42, 102, -32, -119, + -36, 46, 121, 75, -59, -72, -24, 51, -99, 31, -5, -28, -23, -14, -115, 54, -102, -95, 86, + 12, 44, -26, 120, 43, -68, 108, -7, -106, -83, 101, -69, 9, -51, -77, 25, -109, 112, -5, + 6, -87, -77, 101, 28, 104, -2, -88, -88, -36, 119, -53, 6, 112, 61, -61, -95, -75, -106, + -16, 89, 87, 46, -62, -115, -13, 9, -37, -88, 4, -63, 126, 36, 91, -122, 62, 53, -61, + -38, -87, 127, -22, -124, -51, 37, -117, 0, -127, -50, -68, -40, -75, 0, 79, 13, -50, -85, + -18, 94, -27, 58, -16, 49, 11, -116, 103, -62, 41, 52, -120, -14, 20, 45, 89, -17, 19, + 35, -56, -62, 76, 70, 45, 117, -17, 23, 96, 45, -122, 37, 46, 122, 104, -87, -106, 45, + -11, -84, -82, -85, -80, -3, 75, 97, 61, 0, 62, -100, 88, 102, 80, 49, -115, 123, 65, + -11, -88, -87, -105, 65, -92, -5, -23, 61, -32, 39, 36, 82, 107, 106, 78, -121, 11, 125, + 125, 15, -78, -99, 76, -114, 79, 112, 107, -120, 38, 81, 66, 43, 97, 119, 65, 15, -41, + 82, 63, -13, -102, 105, -56, -122, -113, 18, -29, -29, 110, -66, 36, -115, 46, -36, 47, -122, + -90, -16, -49, -28, 103, 14, 15, 15, -117, 14, -25, 39, 87, 30, 63, 117, 126, -33, 95, + 103, 53, -121, 53, -94, 107, -94, -102, 96, -30, 65, 0, 113, 54, -34, -85, -62, -29, 122, + -122, -97, 48, -86, 124, -51, -4, 57, 41, 70, -44, -111, -111, 85, -30, -75, 34, 124, -83, + -122, -5, 71, -122, 82, -73, 119, -47, 103, -15, -124, 51, -83, -26, -23, -82, -36, -15, -28, + 104, 59, -94, 38, -116, 107, 59, -123, 64, 54, -29, -124, 103, -16, 70, -66, -48, 116, -105, + -79, 88, 63, 71, -105, -96, 3, -25, 95, 104, -77, 4, 79, -108, 41, 110, -90, -106, -79, + 0, -102, 97, 102, -19, -18, -84, -20, -113, 120, -30, 47, -58, -111, -67, 102, -72, -63, -54, + -70, 25, -121, 48, -67, -91, 116, 117, 126, 116, 91, 20, 14, 106, -2, -37, -65, -32, -6, + 50, 122, 109, -1, 44, 80, 42, -79, -72, -22, -127, 121, 51, -100, -71, 1, -24, 104, 46, + 88, 6, -123, 75, 115, -36, -21, 69, -36, 86, 92, 84, 13, 97, 114, 127, 42, -8, -14, + 38, 79, 14, -107, 127, 78, -84, 72, -44, -30, 93, -101, -106, 7, -126, -54, -79, 99, -13, + -122, -115, -98, -108, 89, 14, -34, -38, 101, 78, 109, 114, -24, -36, -40, 49, -98, 65, -85, + 105, 17, 104, 50, -55, 115, -11, -113, -95, -85, -62, -69, 96, 16, 10, -2, 87, -72, -83, + -70, -94, -98, -13, -113, -103, -57, -106, -14, -72, -49, -24, -120, -97, -62, 2, -10, 47, -12, + 23, 86, -31, 113, 72, -119, 57, -45, 35, -55, 86, -83, -95, -25, -18, -45, 74, 4, -59, + -78, 80, 94, -73, -18, 106, 55, -55, 33, -90, -88, -99, -116, -83, -12, 127, 98, 72, 89, + 68, 117, -122, 75, 3, 39, -73, 70, -88, -58, 91, -44, -95, 79, -23, 18, 61, 89, -77, + -77, 6, 29, 58, -107, -73, 48, -115, 89, 107, 103, 1, 109, 60, -67, -3, -56, -5, -114, + -106, 97, 46, -32, 50, 67, -4, -121, -44, -52, -4, 81, -53, -110, -50, -52, 73, 111, -48, + 20, -110, 50, -11, 23, 125, 118, -6, 75, 18, 116, 93, 71, -87, 16, -80, 102, -22, -28, + 3, -24, -87, -41, 12, -1, 7, -48, 116, 68, 24, -118, 50, -26, -77, -113, -22, -103, 108, + 51, -128, 82, 75, 103, -33, -13, 26, 56, -6, 75, 58, -93, -42, 98, -12, -103, -34, 32, + -125, 106, -58, -77, -74, -26, 13, 90, -85, 118, 82, 119, 47, -113, 55, -100, -114, -64, 16, + -83, 83, -56, -5, -43, -88, -12, 0, 115, 3, 72, -36, -9, 124, 68, 110, -121, 0, -56, + -26, -127, 9, -96, 39, -76, -26, -47, 45, 28, 119, -40, -71, -119, -90, -34, 74, -59, -4, + 87, -31, -102, 39, -78, -76, 94, 27, 43, -34, 82, -55, -29, 13, 62, 75, 42, 125, 46, + -88, 50, -121, 121, 108, 79, 102, -33, -97, 110, 8, 83, 68, -103, -5, -30, 101, 19, -88, + -82, 4, -65, 69, 37, -20, -90, 94, -41, 64, 127, -91, 107, 82, -94, 21, 11, -21, -16, + -42, -48, -28, 61, 59, -102, 105, -79, -92, 83, 96, 27, -94, 123, 103, -73, -23, -8, -37, + 99, 81, 120, 89, 16, -112, -107, 83, -88, 104, -51, 24, 87, 83, -3, 91, 13, -90, -62, + -26, 88, -12, -24, -121, -127, -24, -15, 110, -68, 86, 37, 57, 9, 22, 106, 92, -95, 86, + 76, -29, 14, 126, -117, 123, 74, 38, -61, -97, 29, -127, -59, 50, -3, 69, 38, 0, -36, + 30, -93, -77, -51, 121, 6, 94, 112, -95, 74, -97, -41, 40, -81, -22, 50, -12, 81, -53, + 103, 38, 78, 8, 82, -121, 23, -65, 36, 61, 57, 109, -88, 29, -26, 119, -127, -28, 114, + 58, 47, 59, 1, -19, 15, -81, -39, 67, 50, 125, -114, 70, -83, -99, 23, 68, -41, -66, + 13, -101, -43, 38, -78, -127, 58, -31, 79, -14, 81, -20, -63, -16, -99, 42, -6, -36, 70, + -127, -81, -5, -27, -118, 103, 60, 3, 24, -11, -109, 19, 6, 19, 20, 100, -83, -125, -116, + -44, 42, 108, -57, 8, -14, 46, 48, 57, 112, -91, 40, -60, -55, 99, -45, -36, -21, -74, + 110, -112, 111, -31, -38, -29, 89, -106, -11, 51, 0, 45, -79, -109, 107, -31, -45, 47, 37, + 47, -20, -115, 35, -88, 101, -95, 43, 0, -18, -81, 123, -119, 78, -118, 10, 83, -6, 52, + -4, 44, 19, 92, -9, -20, -49, -94, 100, -67, -92, -86, 103, -18, -42, -10, -13, -72, 92, + -99, 2, 114, 111, 99, 20, 77, 25, -39, -74, 83, -79, -126, -80, -85, -72, -29, -53, 115, + 45, 89, 117, 4, -51, 16, -89, -19, -39, 43, -77, -53, -89, 21, 121, 40, -22, 13, 116, + -26, 106, 57, -32, 52, -81, -85, -97, 73, -100, 18, -59, -77, 62, 33, 41, 61, -74, 119, + -120, -113, -96, -15, 30, 22, 62, -61, 0, 101, -75, -93, -113, -49, 25, -11, -38, 110, -120, + 36, -13, -34, 85, -64, 9, -18, 114, -76, 112, -67, -119, -45, -81, -104, 71, -43, -44, 11, + 25, -93, -111, -92, 56, -122, -20, -120, -122, -68, 79, -55, 68, 41, 60, 115, -62, 116, -32, + 92, 71, 53, 54, 19, 9, 21, -101, 55, 14, 73, -20, 49, 122, 71, -8, -125, -43, -83, + 112, -43, -50, 32, 29, 15, 113, -94, 69, 90, -45, 33, 70, -76, 42, 31, -109, -120, 15, + 120, -107, -73, -8, -101, 127, 98, 33, 1, 85, 100, 117, -33, -29, -91, -75, -55, 2, -127, + -92, -59, 7, 66, -2, -47, 109, 49, -95, -122, -29, 52, -46, -76, -2, 87, -118, -56, -88, + 81, 112, 35, 53, -89, 126, 58, 26, 120, 78, 115, 22, 52, -19, 27, -30, 9, -120, 83, + 55, 13, -101, -126, -121, -88, -92, 94, -51, -118, -95, -108, -73, -110, -25, -9, 91, 9, 23, + 113, -124, 107, 54, -70, 74, 25, 10, 51, -15, -37, 10, -99, 61, 74, -115, 1, -107, 114, + -19, -88, -35, 18, 51, -84, 63, 27, 55, -110, -8, 79, -37, -100, 84, 79, 124, 67, -11, + 1, -62, -51, 120, -44, 44, 93, -56, -46, 56, 108, -57, -103, -26, 31, -98, 92, 28, 81, + 123, -66, 17, -114, -63, -26, 43, 55, -14, -70, -101, 32, 2, 116, 38, 36, -29, 89, 73, + -118, 54, -107, -63, 68, -36, 38, -31, -105, 45, -26, 13, -73, -97, -72, -18, 71, 83, 96, + 109, 0, 13, 83, 122, 71, -100, -38, 48, 92, -14, -109, 65, -35, -19, -110, 54, 59, 43, + 101, 54, 77, -2, -17, 101, 8, 98, 64, 107, 76, 38, 24, 12, 24, -38, -92, 13, 59, + 108, 126, 106, -26, -33, 22, -115, -83, 53, 43, 95, -20, 46, 84, 46, -59, -98, 112, -76, + 18, -17, 98, -92, 53, 48, -29, 110, 12, 94, 84, -7, -18, 66, 78, 88, 33, -23, -27, + 14, 96, -30, -10, -118, 64, 78, 18, -40, -94, 75, -111, -27, -3, 57, -11, 102, -110, -79, + 77, 117, 105, 64, -103, 11, 106, 24, -24, 27, -110, -8, 126, 11, -109, 63, 34, 78, -91, + -67, 76, -41, -46, 96, -48, -106, -1, -15, 0, -76, -87, 63, 87, 72, 102, -90, -103, -75, + 14, -101, 20, 47, -9, -2, 69, -10, -29, -24, -91, -15, -114, -105, -69, -25, -79, 110, 42, + -11, -96, -61, -104, -25, -121, 53, 12, -61, 18, -87, -103, 75, 2, 104, 92, -112, 109, 8, + 116, -87, -114, -52, -6, 59, -38, -102, 27, 102, -121, -34, 10, -118, 21, 10, 62, 63, -72, + -29, -110, -119, 105, 124, -91, -122, -4, -91, -56, 41, -53, 108, 103, 19, 101, -52, 7, -10, + 36, 101, 22, -100, -27, 8, -77, -48, -126, 1, 23, 31, -115, -75, -25, -73, -3, 121, -72, + -38, 109, -41, 23, -51, 126, 63, -2, 29, -6, -58, -68, 12, -47, 126, -26, -84, -42, 62, + 10, 123, -9, 104, 104, 86, -43, 112, -38, -116, -96, -10, -64, 34, -13, 96, -35, 36, 125, + 28, -23, 99, -42, -122, -100, 33, -100, 4, 105, 106, 113, -67, 85, -72, -20, 63, 34, 126, + 115, 86, -114, 55, 77, -77, -88, 46, 125, 96, 50, 82, -118, 42, -23, -118, 74, -67, -13, + -22, -46, 59, -58, -100, 95, 34, 73, -87, 33, 116, 28, -89, 34, 103, 45, -18, -72, -95, + 3, 123, 122, -96, -121, -107, 23, 107, 89, 39, 102, 89, -82, 89, 67, 109, 126, 82, 64, + 76, -126, 49, -2, 79, -92, 75, -107, -123, 72, 91, -115, 68, -44, 47, 113, -69, 96, 85, + -117, -118, -91, 46, 99, 100, -24, 72, -47, -86, -119, -73, 118, 95, -13, -58, -35, 53, 24, + 84, -100, -9, 64, -92, 15, 25, 21, -97, 94, -59, 107, 23, 57, 12, 78, -104, 90, 28, + -115, -37, -28, 69, 73, -127, 23, -83, -32, -58, -23, 47, -26, -31, -84, -54, -4, 97, -25, + -83, 56, 110, 49, -96, -16, -58, 23, -92, 31, -4, -23, 47, 35, -115, -118, 98, 10, 20, + -16, -24, -54, 92, 41, -58, -127, -66, -32, 51, -30, -85, -60, -14, -90, -109, -94, 104, 83, + -98, 46, 43, -29, -90, -28, -72, 33, 32, 108, -79, -41, -20, -28, 44, 67, -70, -102, -69, + 50, -110, -113, 14, -48, -47, 94, -115, -124, -39, -48, 63, 54, 107, -26, 108, 46, 32, 54, + 58, 42, -106, 49, 65, -121, -30, -43, -10, -36, -4, -61, 40, 65, -42, 65, 90, 99, -26, + -25, 26, -40, 30, -44, 121, 24, -115, 116, -103, -61, -2, -121, -74, 108, -19, -36, -25, -90, + -67, -21, -83, 32, -42, 6, -88, -25, -34, -7, -116, 20, -63, 91, 34, 18, -8, 120, -69, + -79, 122, 35, -58, 62, -46, -76, -122, 12, 19, 23, 14, -95, -36, -89, -111, 19, 59, 120, + 0, -47, -2, -81, -14, -74, 24, -123, -77, 80, 56, -88, -6, -16, -106, 112, -41, -93, 39, + 90, 104, 84, 78, 67, -26, -68, 11, -82, 5, -18, 67, -9, -96, 74, 37, 118, 108, -48, + -35, -104, 21, -119, -49, 73, -56, 109, 82, 79, 99, -5, 28, 47, 95, 89, -18, -109, -44, + 67, -112, -116, -77, -97, -114, 63, -32, -105, 87, 2, 32, -85, -80, -27, -79, -88, -53, -122, + -121, -84, 10, 40, -87, 74, 112, 31, -62, 30, -46, -94, -61, 125, 117, 108, -15, -28, 43, + -21, -84, -83, 99, -107, 115, 67, -53, 18, -61, -17, 67, -77, 16, 110, -84, -123, 108, -54, + -95, 37, 85, 45, 69, 115, 16, -128, -58, 31, -44, -88, 99, -104, -58, -65, 18, -93, 123, + 115, -93, 55, -43, 75, 36, 63, -23, -102, 43, -74, 124, -109, -113, -74, -10, 99, 11, -42, + -12, 39, -71, -23, 20, -55, -41, 19, 21, 45, -116, -38, 37, 44, 3, 101, 35, -79, -74, + 77, 98, 16, -26, 83, -104, 92, 45, -73, -10, -72, 52, -64, -29, -35, 8, 56, 94, 54, + 42, -73, -84, -104, -7, 104, -113, -66, -26, 99, -23, -25, -113, -82, -62, 8, 62, -23, -84, + -98, -44, 39, 84, -91, 56, -89, 4, 69, -86, -123, -107, -125, -37, -11, 39, -43, -88, 117, + 19, 4, 101, -52, 112, 12, -50, -122, -72, -10, -95, -127, -114, -74, -18, 92, -54, -90, -11, + -52, 119, -15, 25, 28, 94, 13, -88, 92, -16, 122, -68, -71, 111, -5, 1, 66, 79, -109, + -50, 5, -128, -25, 111, -15, 38, -51, -105, 84, -91, -102, 15, 75, 0, 28, -9, 69, -110, + 54, -11, -102, 104, -7, -120, 98, -10, 118, -77, -32, 16, 86, -107, -87, 33, 41, 68, -76, + -97, 14, 36, -65, 59, 101, -82, -55, 86, 78, -77, 9, 75, 113, 111, 62, -14, 61, -122, + -120, 89, 123, 41, -90, 96, -52, -9, 15, -26, 83, 60, 102, -123, -2, -65, 120, -35, -84, + 120, 6, 59, 46, 104, -84, -38, -7, -80, 51, -33, 125, -102, -18, -62, -23, -36, 117, 112, + -102, 4, 59, -127, 0, -101, -65, -33, 82, -85, 19, 99, 34, 3, 78, -71, -34, 92, 125, + -115, 38, -15, 106, 38, -105, -7, -51, 73, -46, 61, 108, 85, 107, 16, 40, -48, -19, 39, + 69, 114, -87, 102, -4, -16, 38, 115, -54, -87, -8, 97, -102, 46, -100, 53, 90, -41, -77, + 50, -9, -1, -123, 42, -104, 36, -6, -78, 75, 103, 78, -78, -50, -14, -84, -85, 31, 108, + 77, -80, 69, 8, 87, -75, -8, -92, -102, 3, 32, -62, -6, -95, 88, 39, 39, 96, 8, + -85, 34, 20, 22, -37, -126, 9, 30, -109, 65, 60, -85, -4, -14, -13, -91, -100, -114, -31, + 110, 88, -56, 44, 0, -95, -72, -15, -83, 59, 17, 0, 42, 100, -23, -34, 89, -125, 75, + 50, -70, -49, -61, -58, 16, -50, 13, -106, 19, 24, -69, -117, -12, 54, -14, 76, -33, 4, + -52, -16, -111, 17, 109, -35, 68, 23, 82, 98, 95, 3, -33, -29, -19, -54, -91, -30, -100, + 66, 71, 83, -94, -9, -62, -99, 32, -88, -43, -19, 96, 79, 30, -125, 86, -111, -58, -22, + -12, 107, 124, -117, -128, 29, -12, 127, 3, 62, 120, 31, -19, -50, -73, -36, -75, 35, -58, + 126, 58, 10, 116, 85, 20, -74, 125, 38, -26, -119, -58, -46, -27, 120, 77, 123, -88, -22, + 52, 105, -37, -51, -95, -41, 35, -107, 76, 38, -86, -102, -113, -102, 84, 98, -64, 96, -72, + 72, 125, 58, 54, 13, 99, 13, 53, -37, -26, -92, -107, -10, 112, -110, -69, -10, -8, 36, + 126, -74, 65, 16, -78, -61, -45, 68, 60, -26, 49, -72, -82, 60, 69, -28, 35, 59, 17, + 20, -128, 82, -103, 41, 83, 104, -120, -34, 88, 56, -120, 102, -114, 25, -41, -36, -10, 77, + 120, -103, -33, -1, -114, -63, 36, 95, -114, 86, -3, 108, 37, -73, 119, 94, 30, -51, 62, + -22, 104, 90, 26, 2, 39, 58, 66, -5, -68, 52, 125, 102, -52, 102, -49, 95, -34, -108, + -83, -118, 119, 93, 57, -86, 49, -92, -70, -81, -114, 68, -73, -42, 43, -85, 60, -93, 45, + -122, -121, -66, -107, -111, -78, -3, 16, -38, 63, 5, 99, 79, -104, 11, 127, -73, -65, -16, + 42, -6, -58, -16, -107, 82, 30, 124, -99, -8, 84, -76, 43, 86, -10, -49, -126, -84, 30, + -76, -2, -11, 40, 11, 13, -97, -83, 115, 67, 49, 26, 58, 69, 109, 93, 80, -109, -11, + -4, -53, 121, -32, 68, -85, 44, -6, 90, 35, 2, 71, 79, -36, -127, 29, -106, -124, 47, + -66, -90, -46, 25, 32, -65, -56, 88, 6, 118, 86, 32, -79, -7, 123, -97, 52, 40, 103, + -103, 31, 6, 106, -109, -20, -15, 114, -104, 103, -25, -79, -53, -112, 100, -86, -74, -45, -100, + 77, -114, -48, 117, -25, -88, 58, 2, -2, 17, 28, 19, 84, -78, 122, -95, 25, -45, 42, + 102, 99, -65, -32, 37, -35, 34, -100, -118, 38, 119, 56, -67, -74, 49, -30, 95, -32, 66, + -98, 56, -48, -50, -118, -49, 109, 16, 23, 117, -55, -100, -1, 103, 59, -37, -24, 97, 3, + -31, 116, -94, 85, -4, 13, -81, -105, -36, -79, -121, 8, 17, -5, -47, -70, -94, 38, 17, + -107, -39, 104, 25, -66, -83, 5, -126, 2, -53, 55, -3, 41, -13, -14, 114, -83, 14, 35, + -97, 28, -22, -27, -112, 8, -90, 17, 89, 84, -101, 17, -55, 113, 45, 115, 75, -123, -119, + 11, -39, -107, -82, -72, -25, 100, 40, -103, 123, -63, 100, -37, -90, 92, 107, -112, 11, 113, + 43, -33, 70, 5, -72, -102, 64, -48, 68, -25, -27, 62, 30, -16, -59, -70, -112, 87, -13, + -66, 14, 108, 107, 59, 84, 40, -108, 9, 61, -109, 12, -91, -2, -107, 74, 87, -71, -16, + 38, -93, 1, -107, -79, 55, -89, -97, -50, 4, 52, -85, -74, -75, 12, -23, -73, -14, 81, + 15, -20, -105, 97, -61, -125, 68, 55, -31, -100, -40, -121, -110, -113, -115, -96, 30, -102, -16, + 54, 60, -9, -113, -47, -30, -8, 90, 64, 21, 8, 44, -96, 12, -28, 16, 34, -89, -77, + -74, -29, -13, -68, -88, -103, 21, 16, -49, 0, -13, 44, -125, -5, 42, 114, 89, -19, 122, + -97, -48, -124, 9, 104, -107, 125, -84, 101, 40, 96, -81, 49, 125, -75, 33, 28, -22, 116, + -20, -8, -110, -51, -14, -93, 76, 125, -58, -62, -94, 59, 6, -111, -64, 46, 76, 125, 49, + 84, -32, -106, 40, -40, 83, 64, 74, -40, -43, -127, -103, 104, 12, -128, 90, 47, -110, 101, + 118, 61, -60, -93, 68, 100, 79, -120, 43, 101, 47, -23, 72, 51, -51, 17, -30, 35, -56, + -21, -82, -73, 36, 11, 4, -46, -17, 114, 108, -26, -91, 123, -55, 84, 88, 59, 12, 59, + -34, -98, 79, -55, 12, -126, -120, -126, 83, -58, -33, 97, 83, 6, -27, -22, -114, -65, -48, + -19, 122, 5, 43, 84, -29, -123, -25, 83, -91, 79, -86, -67, 64, 123, -122, 116, -23, 84, + -38, -101, -68, -72, -48, -100, -14, -55, 42, 13, 6, -14, -25, -47, -68, 108, -121, -61, 12, + -102, 27, 55, -71, -117, -33, 52, 26, 61, -38, 69, 90, -67, 59, -75, 75, -70, -71, 6, + 101, -28, -61, -15, -42, 40, -20, -38, -60, -87, 75, 12, 89, 50, -54, 118, -103, -93, 41, + 2, -22, 68, 53, 108, -65, 5, 99, 68, -72, 74, -95, -90, 16, 39, -16, -14, 26, -43, + -21, -25, 83, 38, 87, -127, 85, 81, -2, 88, 26, 126, -100, -17, 75, -54, -71, -48, -67, + -91, 74, -123, 73, 14, -115, -123, 17, 85, -16, 1, -52, -17, 113, -65, -91, -53, 24, -53, + -53, -5, 106, 1, -70, 54, 58, -92, 122, 106, -58, 83, 37, 4, -38, -80, 119, 87, 120, + 117, -127, -107, -47, -2, -121, 92, -14, -119, -74, 27, 42, 32, 103, 54, 111, 110, 22, -109, + 120, -111, -18, -49, -73, 78, -35, -7, 120, -125, -95, -28, 61, 21, -112, 92, 57, -93, 117, + -36, 13, 35, -88, 33, -123, -44, 15, -72, -100, 10, -42, -81, -110, -105, -31, 99, 98, 25, + 7, 96, 84, -104, -86, -28, 70, -30, 65, -63, 11, 4, 7, -36, 31, 64, 11, 88, 12, + 27, -46, 33, -108, -22, 60, -43, -81, -10, 3, 127, 0, 82, -127, 93, -108, -17, -45, -2, + -99, -92, -78, 56, 44, -119, 66, 6, -104, -113, 48, 27, -28, 42, 82, -122, -43, -37, 52, + -4, -120, -61, -42, 60, -101, 10, -73, -52, -68, 63, -62, -118, -77, 121, -17, 73, -66, 61, + 100, -109, -111, 32, -36, -29, 35, -15, 54, 113, 102, -67, -76, 80, 103, -48, 4, 124, -64, + 30, -31, 119, 117, 101, 40, -49, 79, 112, 3, -110, 47, -59, -21, -104, -49, 125, -65, 117, + 58, 1, -66, 66, 118, 103, -63, -95, -97, 9, -105, -23, -84, 20, -94, -87, 69, 101, -34, + -86, 18, 35, -118, -117, -66, -21, 82, -51, -106, -99, -14, -41, -28, -14, 31, -82, 100, 70, + -55, -53, 43, -5, 52, 108, 111, -84, 23, 16, 5, 97, -120, -43, 110, 34, -78, 49, 21, + -22, 69, -51, 43, -62, 112, -51, -18, -80, -29, -115, -76, -7, -66, -61, -116, 80, -112, -37, + 3, -36, -107, -93, -36, -105, -114, -70, -60, 13, -74, -65, 40, 58, 17, 84, 63, -64, 60, + 118, -38, 105, -9, -44, 66, 60, 50, -40, -5, 23, 80, -73, 52, 101, 80, 28, 16, -117, + 96, -84, 103, 20, 85, 18, -107, 11, -109, 78, 62, 50, -23, 46, -12, 95, -83, -21, -29, + 26, -43, 72, 53, -75, 107, 17, 117, 97, -35, 92, 77, 11, -46, -80, -39, 116, 17, 48, + -109, -61, -38, 13, -35, -107, -49, -26, 97, -126, 47, 14, 70, 126, 21, 105, 64, 35, 63, + -20, 108, 42, -22, -32, 22, -86, 8, 12, 115, -102, 82, 45, -13, -86, -40, -80, 63, 73, + -123, 86, 4, 27, -96, 2, -95, -59, 109, 105, 102, -78, 70, -1, 74, -74, -77, 98, -92, + -88, 98, -9, 98, 73, -69, 40, -27, 114, -27, 112, 42, -118, -113, -109, -104, 104, -94, -23, + 6, 103, 112, -33, -69, -36, -106, -93, -19, -57, -60, -72, 102, -36, 10, -2, -66, -76, -31, + 11, 46, 126, 126, 121, -32, 92, 70, 65, 50, 10, 115, -62, -18, -25, 13, -89, 35, -55, + 63, -127, -61, 126, -47, -96, 4, 47, -15, 70, -50, 35, 62, 60, -89, -71, -111, -107, -58, + -116, 88, 109, -31, -23, -17, 32, -64, 74, -111, 120, 69, -27, 24, 37, -88, -27, 2, 83, + 4, 2, 40, 5, -11, -74, 89, -73, -9, -95, -16, -58, 114, 14, 3, -45, -49, -113, 88, + -62, 66, 45, -19, -79, -83, -47, -106, -42, 83, 123, -40, 89, -5, -22, -120, -48, 79, 97, + -71, 121, -99, -23, 69, -33, 73, -75, -103, 46, -36, -45, 107, 64, -51, -35, -12, -33, 23, + 41, 34, -69, 42, 27, -71, 79, -36, -81, 95, 87, -55, 116, -57, -126, 92, 90, -107, -46, + 126, 27, -79, -84, -12, 112, 22, 124, -37, -16, 16, 115, -18, 33, 52, -76, 14, -53, 66, + 6, -61, -89, -39, -85, -89, -15, -58, 15, -116, -58, -115, 14, 46, 86, -15, 72, 47, -78, + 17, -84, -4, 35, -1, 18, -104, 16, -86, 39, -20, -59, 60, 5, 73, -19, -59, -89, -37, + 34, -64, 89, 26, 110, -127, 63, -53, 117, -126, 59, 2, -46, 26, 84, -45, -113, -113, 124, + 35, -80, 78, 61, 77, -48, 28, 52, 25, 70, -6, -100, 42, -69, -76, 33, -37, -98, -49, + 8, -89, 117, -32, 60, -74, 123, -56, 58, 117, -81, 32, -61, -37, -2, 43, -71, 97, 79, + -4, 45, 26, -76, -24, 86, 88, 50, -40, -92, -40, -69, 77, -9, 28, 41, 114, 33, -107, + -27, -22, 30, -44, -97, -56, 117, -96, 117, 16, -118, 100, 120, -85, 13, 71, 95, -26, 119, + 3, 13, 96, -109, 102, -61, -111, 54, 51, 12, 22, -17, -45, 5, 96, 11, 82, 34, 102, + -67, -2, 110, -61, -25, 103, 31, 7, 28, 113, 76, -85, 63, 67, -105, -60, 105, -127, -75, + 105, 117, -84, 19, -20, 35, -113, 90, -18, 124, 32, -35, -58, -25, 89, -98, 125, 87, 112, + -72, -113, -20, 31, -89, 85, 107, -14, -37, -107, 74, 118, 6, 65, -19, 112, 77, 84, -47, + 10, -95, 110, 52, 61, -41, -3, -36, 76, 17, 39, -106, 126, 14, 57, -81, -114, 40, -64, + -38, 124, 55, 96, -116, 46, 43, -57, -125, 33, -86, -38, 108, -106, 17, 40, 27, 51, -21, + -75, 87, -15, -69, 13, 24, -126, -17, -12, -77, -38, -17, -93, 46, -70, -63, -98, -66, 41, + 28, -18, 117, -122, -56, -121, 37, 127, -3, 24, -22, 70, -2, -120, -57, -120, 101, -97, -104, + 59, 102, -10, -111, 76, 79, 44, 67, -9, 116, -60, -38, 60, 59, 116, -125, 9, 60, 11, + 22, 26, -96, 69, -122, -110, 126, -82, -17, 86, -99, 59, -97, 87, 119, -112, -10, -19, 14, + -31, 7, -72, -55, -16, -116, -117, 60, -112, 16, 46, 62, -93, -128, 33, 13, -74, -95, -7, + 3, -88, -116, 111, 16, -58, 54, -109, -94, 115, 38, 60, -6, 75, 29, -113, 4, 87, 34, + 5, -27, 1, 98, 30, -82, -113, -29, 38, 37, -51, 28, 8, 79, 107, -62, -41, 102, -61, + -89, 120, 120, -100, 33, 14, -43, -57, 45, 54, -74, -81, 113, -125, -126, -77, 88, -15, -117, + 24, 35, 16, -88, -70, 119, -107, 76, 117, 43, -58, -7, 118, -16, 63, 110, -75, -87, -52, + -52, 119, -106, 89, 125, 42, 13, 72, -98, -104, -81, 56, 121, 114, -65, -83, -39, -77, 23, + -113, 62, 84, 124, -98, 79, 75, -53, -81, -121, -85, -68, -34, -7, -63, -40, -9, -102, 102, + -8, 47, -17, -29, 27, 58, 68, -91, -59, 42, -86, 59, 28, -119, 30, -71, -24, 91, 51, + 16, -43, 14, 80, -120, -49, -68, -66, 107, 76, -7, -53, -99, 124, -6, -78, -77, -15, 26, + 85, -67, 52, 80, 89, -56, 117, 125, -47, -40, 90, -29, -49, 43, -37, 115, 19, 19, -96, + -122, 103, 36, -23, -50, 55, -118, -117, 12, 120, 56, -16, 50, 117, -82, 42, 5, 9, 79, + 35, 46, -66, 73, 58, 82, 19, 68, -62, -115, -27, -2, 110, 57, 25, -29, 75, -41, -66, + 88, -111, 59, 65, -55, 96, 84, -1, 112, 35, 34, -83, 67, -124, -19, -47, 13, 32, 87, + 23, 36, 109, -27, 72, -63, -4, 66, 112, 80, 61, 108, 21, 108, 113, 31, -29, -76, -79, + 53, 52, -2, -73, 30, -29, 63, -56, -71, -27, -106, 122, -40, -111, 101, -116, -86, -36, 96, + 33, 99, -10, 98, 72, -111, -62, -74, -96, 82, -56, -81, 121, 29, 107, -30, 122, -69, 33, + -103, -100, -77, 41, -80, 39, 116, 41, 15, 6, 85, -121, 112, -59, 38, -13, -109, 44, 26, + -124, -113, -73, 37, -21, -84, -88, 96, 12, -70, -95, 108, -89, -27, 85, 75, -105, -90, -60, + -107, 96, 82, -95, -57, -14, -90, 73, 0, 84, -17, 89, -42, 51, -68, 117, 29, -60, 15, + 42, 54, 84, -77, 103, 92, 97, -101, 39, 83, 122, -13, -61, 12, 85, -74, 80, -38, 111, + -58, -71, 75, 54, -51, 107, -12, 107, 92, 19, -96, -124, 41, -3, 55, -109, 58, -13, 56, + -38, 80, -103, 118, 43, -95, -30, -18, -92, -115, 22, -48, -64, 110, -127, 53, 11, 110, 86, + -3, -45, 7, 57, -93, 90, -49, -44, -56, -23, 90, 118, -110, -127, 74, 100, -7, -121, -51, + -33, 73, 5, 101, -126, 8, 11, 116, 112, 4, -41, 38, 39, 28, -6, -13, 110, 121, 86, + -67, -86, -114, -12, 85, 57, 119, 89, 37, 68, 13, 87, 87, 29, 9, -92, -103, 40, 9, + 34, -58, 10, -119, 56, -43, -117, -25, 51, -47, 87, -71, 10, 26, -15, -36, 105, -1, 23, + 103, 119, 35, 103, -115, 120, 6, -40, -71, -22, -33, -122, 18, 103, -115, 61, -77, -84, 0, + 46, -116, 84, 126, -52, 110, -116, -25, -116, 76, 89, -116, 91, 116, 29, 103, -55, 118, 121, + 25, -24, 60, 72, -73, 122, 86, 118, 61, 112, -28, 82, 5, -20, -77, 123, -116, -121, 47, + 4, -119, -85, -81, -126, -89, -67, 117, 8, 100, -126, -89, 33, -107, 36, 79, 21, 15, -111, + -31, -63, 69, 94, -79, 100, -112, -77, -76, -90, -103, 74, -26, -26, 102, 10, 98, 84, -120, + -30, -5, -100, -86, -123, 66, 50, 99, 100, 51, 46, 57, 86, 40, -41, -57, -68, 17, -32, + -57, -75, -115, -31, -104, 43, 90, 14, 14, -14, 39, 85, -35, 79, 30, 28, 84, -115, -35, + -56, 51, 111, 43, 22, -11, 15, 118, 39, 90, -76, 42, -112, 58, -19, 105, 116, 56, 105, + 50, 119, -95, 120, 46, -11, -110, 78, 16, -83, 33, 21, 46, 111, 41, 26, -13, 69, 4, + -44, 75, 123, -89, 22, 73, 27, -116, -79, -59, 66, -98, -110, 84, 16, 48, -53, -5, -19, + -32, -120, -117, -58, 76, 8, 23, 70, -3, -58, 18, -32, -20, 125, -16, 18, -21, -34, 8, + -116, -88, 34, -94, -78, 12, -44, -13, -102, -107, -4, 93, -17, -121, 80, 73, 87, 22, -104, + 47, -30, -102, -109, 17, -83, -16, -31, -113, 97, -124, 54, -61, 4, -8, 30, -78, 57, 104, + -39, -122, -1, 92, -107, 46, -31, -79, -73, 126, 16, 21, 8, 89, 62, 7, -62, 110, -33, + -118, 65, 105, -92, 33, 8, 126, -74, -106, -108, -98, -25, -89, 124, 82, -28, -111, 34, -35, + -15, 66, -87, 90, -50, 83, -81, 126, -14, 100, -11, -125, -109, 31, -42, -21, -42, -18, 121, + -2, -43, -20, 89, -113, -64, -32, 113, -47, -86, -93, -54, 75, 26, 6, -126, -69, -51, 98, + -2, 58, 58, -114, 12, -62, -97, 93, -40, -74, -112, -29, -92, 45, 44, -52, -91, 52, -114, + -75, 120, -87, -113, -11, -124, 85, -82, 117, 107, -73, -76, -98, 101, 31, -24, -23, 92, 39, + 59, -9, 54, 74, 46, 91, -65, -14, -58, -16, 56, -90, 111, -94, 123, -112, 44, 11, -53, + -19, 29, 19, -79, 75, 86, 27, 37, -9, 69, 115, -68, -24, 40, -7, -8, -128, -36, 3, + -36, -55, 13, -94, 67, 10, 11, 33, -63, 117, -102, -59, -36, 110, 63, -81, -24, 45, -101, + 60, 64, 126, -21, -30, 3, 96, 101, 84, -120, 79, -20, -76, -21, -1, -104, -48, -95, 87, + 26, 119, 116, 18, -113, -118, 30, 119, 61, -81, 96, -85, -17, 38, -35, 3, -71, -127, 122, + 48, -79, 79, 27, -84, 54, 22, 96, 125, -69, -65, -4, 87, -95, 50, -48, 35, 68, 89, + -38, -56, -81, 60, 82, -108, 119, -109, 104, -99, -108, -24, 52, -66, -122, 37, -18, -12, -66, + 64, -44, 75, -88, -79, -34, 25, 104, -64, 65, -23, 0, -21, 119, 39, 8, 104, -77, -76, + -71, 87, -109, -120, 49, 65, -93, -5, 65, 125, 31, -106, 90, -111, 98, 63, 99, -16, -80, + -116, 26, 96, -111, 22, 19, -48, -88, 6, -1, -17, 30, -31, 117, -17, -51, -39, -118, -78, + -88, 10, 50, -118, 75, 125, 92, -4, 79, -117, 2, -86, -97, 117, -47, 94, 0, 40, -41, + -69, -19, 67, 22, -20, -72, 101, 85, 35, 106, -111, -26, -70, -53, -123, 21, -103, 88, 109, + 102, -72, -109, 73, -107, 8, 124, 36, -17, 80, 67, 119, -119, -116, -84, 73, 48, -14, 44, + 40, 71, 104, 119, 72, -24, -18, 121, 3, -15, 17, -54, -117, 10, 71, 0, 41, 33, 100, + -55, -87, 0, -28, 27, -18, 86, 87, -33, 2, -31, 58, -28, -120, 0, 17, 2, -36, 33, + 66, -52, 1, 13, -99, 25, 114, -91, -65, 9, 117, -120, -59, -4, -80, -53, 76, -19, 112, + -97, -116, 51, -108, 120, 17, -71, -57, 126, -48, 14, 123, -51, -23, -85, -88, -12, -120, 114, + -109, 6, 15, -36, -110, -8, -90, -36, -110, -107, -48, 87, 104, 2, 9, -3, 118, -115, 55, + 31, 3, 121, 44, 102, -31, 10, -7, 82, -17, -109, -54, -50, 45, 32, 39, -29, 92, -17, + 55, -34, -30, 18, 100, 85, -16, -58, -27, 53, -48, -34, -109, 23, -26, 69, -7, -3, 57, + 16, 10, 53, -49, -62, 85, -86, 36, 40, 63, -92, -82, 64, -55, 20, 67, -80, -104, -102, + -76, -10, -37, 40, 58, -91, 46, 81, 31, 74, -69, -100, 125, -103, 122, -53, -94, -22, 16, + -63, -1, 113, -27, 113, -95, -113, -50, 101, -39, -116, -10, -35, 72, 95, -108, -55, 69, -79, + -82, -26, 98, 48, -111, -88, -112, -127, 92, 101, -84, -67, 113, -106, -53, -51, -14, 38, -65, + 67, 17, -120, -67, -47, -76, -124, -91, 58, 72, 117, 50, 52, 7, -53, 58, -113, 15, -107, + 86, -105, -1, -81, -30, 35, -113, -14, 19, -66, 8, -12, -73, -115, 104, -34, -10, -3, 105, + 127, -51, 67, -6, 108, 65, -84, 42, 73, 21, -58, 59, -127, -2, 39, -74, -67, -67, -98, + -43, 0, 80, 11, -13, -29, 59, 110, -100, -30, -15, 118, -24, -68, 103, 36, 7, 79, 88, + 34, 109, 37, 41, 120, -36, -95, 125, 20, -80, -127, -9, -1, -54, -114, 50, 73, -98, -13, + 8, 94, -57, -45, -28, -45, 64, -90, 97, 62, -61, -117, 72, -101, -93, -83, -103, 95, 22, + -76, -84, -43, 69, 124, 28, 68, 64, 79, -85, 124, -87, 69, -32, -65, 8, -54, 82, -71, + -71, -68, 127, 71, -114, -23, 79, -68, 12, -96, 109, -12, -56, -109, -39, -83, 116, 59, 3, + -59, -3, 98, -70, 107, 112, 101, 111, -49, -92, 120, -56, -21, 1, -125, -27, -68, -106, 12, + -4, 47, -3, 90, 120, -86, 16, 20, 68, -92, 78, -39, 32, 36, -42, 10, 69, -40, -43, + -125, 8, 25, 38, 53, 58, 74, 22, 50, -126, 60, -71, -100, 78, -95, 87, 37, 112, 1, + -86, 10, -93, 48, 61, 38, 59, -34, -41, 98, -39, -72, -113, 24, -81, -54, 54, -59, 20, + 47, -10, -8, -47, 23, 87, 126, 116, 70, 64, -49, 113, -14, 100, -71, -54, 54, -89, 65, + 51, 88, 27, 7, 13, 42, -76, -65, -26, -124, 53, 120, 58, -102, -82, 35, -94, -85, -123, + -104, -47, -78, -28, 118, -114, -104, -2, -87, -76, 43, -64, -42, 3, -49, -10, 11, 91, 18, + -31, 9, 75, 42, -4, -99, -52, 55, 18, 42, 35, 13, -17, -89, 52, -47, 115, 112, 52, + 119, 37, 41, -116, -106, -8, -12, 11, 45, -39, -109, 80, 126, -55, 85, -45, -63, -94, -65, + -123, 75, -54, -81, -17, -60, -33, 67, -25, 108, 117, -103, 10, -71, -75, 95, 35, -77, 80, + 10, 67, -27, 57, -66, -24, 91, -125, 43, 10, -58, -93, 80, 23, 113, 112, 64, -27, -15, + 118, -22, 34, 2, -87, 105, -63, 17, -122, -14, -65, 32, -49, 117, -63, 39, 85, -16, 46, + 35, -105, -32, 102, -41, 121, 111, 83, -78, 100, 39, -114, -95, -33, -73, 97, 77, 6, -33, + 100, -20, -17, 24, 15, -110, 119, -2, 9, -44, -122, 73, 0, -33, 113, 30, -108, -77, -12, + -19, -60, -89, -22, 25, 58, -121, 52, 67, 12, 109, 74, -67, 40, -97, 114, 98, -39, -56, + -33, -68, -20, 11, 22, -74, -58, -12, -40, 80, -106, 5, 119, -11, -110, 57, -6, -58, -124, + -58, -100, -48, 27, 101, -9, -7, 92, 1, -121, -79, 31, -7, 98, 103, 112, -82, -44, 118, + -6, -16, 97, -61, 122, 45, 120, 92, 63, 10, -3, 94, -115, -124, 94, -48, 56, 80, 54, + 121, -40, 87, -1, 125, -2, 2, -17, -123, 93, -48, 122, 41, -42, 65, 64, 42, -85, -89, + 18, 43, -37, 108, 108, -1, 67, 108, -20, 95, 46, 115, -56, -96, -12, -6, 101, -69, -95, + -108, 122, -82, -20, -45, -106, -90, 119, 34, -122, -88, 86, 59, -55, 37, 2, -109, 18, -108, + -114, -55, -78, 99, 118, 106, -92, 48, 51, 20, 116, -78, 85, -100, -125, 66, -17, -123, -118, + 75, 33, -115, -119, 31, -51, -83, 63, 2, 36, 113, -51, 11, 62, -50, 50, -56, -51, -2, + 114, 71, -75, 19, -113, -55, -14, 108, -54, 41, -18, 40, 38, 11, 33, -103, 62, 71, -78, + 70, 127, 119, -70, -105, -42, -63, 99, 104, 125, 36, -126, 67, -104, 84, 82, 41, -29, 99, + 9, 11, -68, -20, -83, -17, 8, 108, 48, -101, 101, -119, 115, -116, 63, -101, 108, 7, -113, + 38, -95, 45, -70, -88, 15, 103, 108, 49, -95, -51, 39, -71, 93, 73, -105, -82, -31, -118, + -93, -125, -86, 114, 16, 37, -50, 19, -115, -36, 113, 112, -111, -53, 17, -107, 86, -37, 33, + -109, -122, 10, 41, -126, -96, -106, 10, -64, 106, 98, 70, 117, 78, -118, 70, 20, -84, -120, + 8, -89, -77, 14, 70, -20, -55, 110, 94, -4, 57, -115, 108, 102, 100, 123, -4, -99, -119, + 89, 111, 10, -126, 43, -76, -3, -123, 91, 97, -74, 29, 88, -30, 58, 54, 45, -123, 119, + -128, 85, -27, 56, -54, 72, -22, 27, -51, -20, 91, 84, 102, 40, -96, -126, -45, -42, -95, + -7, -19, 90, 68, 48, -124, -48, 13, 26, -107, -46, -62, 15, 35, -99, -38, -29, 86, 84, + -22, 9, 44, 74, -70, -48, 42, -70, 82, -44, 21, -48, -91, -41, 27, 12, -124, 63, 5, + 78, -34, 49, 62, -88, 90, -103, -7, 35, -56, -33, 3, -86, -25, -126, -47, 124, -16, 24, + -22, 95, 16, 110, 11, 6, 12, 116, 120, 13, -95, -13, 96, 125, 15, -105, 89, 49, 96, + 114, -44, -8, -97, -61, -33, -78, 24, -77, -39, -125, 23, -113, -31, -102, 22, -62, -97, 53, + -15, -91, -55, -87, -26, -54, -20, -30, 97, 105, -107, 68, 51, -117, -41, -52, -22, -55, 114, + -119, -60, 79, 78, -65, -2, -21, 113, 58, 61, 108, -92, -42, 65, -66, -41, -17, -48, 125, + 57, -77, 35, -103, -74, -40, -114, 116, 61, -115, -115, -63, -85, -60, -52, 117, -89, 34, 97, + -86, -74, -46, 120, -21, 70, 66, -58, 92, 68, -20, -29, 67, 32, 112, 13, -109, -84, -110, + 12, 30, -112, -2, -123, 32, 85, -20, -27, -31, -89, 18, -48, 109, 92, -8, 96, -81, -123, + -45, 71, -73, 50, 93, -43, -123, -71, -99, -65, 80, -37, -123, -57, 18, 102, 5, -8, -116, + -41, -39, -40, -68, -108, -107, -106, -27, 75, -41, 78, -106, -64, -53, -91, 86, -37, 45, -24, + 126, -88, 34, -118, 76, -103, -18, 61, 86, 10, -27, -83, -119, 51, 1, -88, 127, -101, 86, + 68, 53, -29, 120, 81, 37, -15, -76, -70, 20, -59, -49, -57, -45, 32, -13, -112, -7, 26, + 105, -128, 40, -72, 20, 115, -59, -29, 116, -103, 58, -74, 25, -12, 88, -56, 74, -68, -30, + 3, -8, 85, -126, 86, -22, 39, -57, -115, -9, 24, 81, -25, 93, -39, -19, -113, 109, -108, + 4, 98, -14, -74, 126, 4, 56, -70, 91, -87, -2, -112, 77, -70, -49, -22, 59, 97, 88, + -23, -18, 8, 80, 19, -46, -110, -87, 0, -6, -27, -35, 49, -119, 7, 76, 97, -66, -116, + 19, -4, 57, 100, 73, 59, 101, -35, 96, 0, 94, 3, 14, 41, -10, 87, -58, -99, -37, + 49, -78, 69, 51, 78, -105, -19, -8, -114, 21, -35, -36, 117, -118, -79, -6, -91, 28, -96, + -7, -15, -30, -71, -20, -77, 36, -26, 116, -56, 111, 6, -102, -11, 102, 16, 118, -34, 97, + 18, 117, 5, 124, 11, 77, -109, 99, 55, 54, -107, 73, 37, -104, -39, -40, -93, 93, -26, + -61, 2, 40, -89, -99, -16, -105, 6, -65, -39, 86, 78, 93, -117, -48, -49, -69, -114, 70, + -64, -62, -28, -95, 4, 50, -14, 85, 122, -14, 86, -41, 31, -119, -75, 105, -100, 50, 98, + -98, 119, -44, -15, 3, 84, -2, 36, -37, -18, 3, 70, 50, -97, -53, -76, -124, 103, -1, + 72, -110, 5, 2, -68, -25, 70, 68, -97, 47, 13, -96, 97, 122, -103, 100, 78, 24, -52, + -93, 44, -97, -70, 104, 7, -119, -104, 107, -124, -33, 73, -81, -54, -73, -69, -44, 70, -7, + -20, -77, -72, 64, 70, -80, -32, -63, 112, -64, 94, -67, 4, -119, 126, 95, -63, -126, -13, + 1, 69, -82, -94, 30, -59, 8, 36, -91, 91, 65, -23, 4, 89, -98, 41, -72, -119, -128, + 57, 16, -42, 81, -117, 31, -126, 9, 57, -8, 1, 116, -15, 25, 85, -123, -58, -19, -55, + 105, 39, 126, 115, -53, 13, 20, 4, -31, 46, 91, -40, 25, 106, -108, 39, 57, 108, -104, + -81, 94, 51, 55, -27, 76, 57, -107, 57, -69, -84, 16, -122, -82, 41, 67, 117, -105, -111, + -119, -39, -86, -102, -40, 105, -98, 39, 70, 52, 53, -31, -12, -38, -94, -53, -75, 11, 86, + 93, -121, -76, 48, -20, 63, -9, -68, -105, -119, 91, 90, 22, 45, 49, -75, 10, -68, -70, + -26, -20, -110, -51, -13, 101, 109, -45, 117, 85, 118, 121, -36, -57, 44, -24, -123, 25, -114, + 67, -23, 13, -35, -36, -50, 109, 54, 121, 52, -39, -33, 28, 4, -103, 11, -39, 93, 114, + -12, 64, 70, 39, -48, -30, -119, -41, 60, -49, -123, -96, 30, 93, -20, -14, 92, -78, 109, + -69, -97, 72, 122, 100, -11, -106, -3, -18, 16, 8, -37, 58, 109, 89, -44, -81, 18, -25, + 15, 67, -43, -106, -64, 61, -53, 21, 20, 105, -57, 36, -34, 30, -60, 115, -28, -110, -20, + -92, 36, 33, 120, 125, 70, 27, -33, -88, -28, -18, 83, -124, 55, 18, -77, 125, -36, 83, + 118, -60, 68, 8, 113, -88, 20, -17, -42, -23, 19, 42, -56, -16, -18, -85, -101, -18, -97, + -125, 67, -97, -100, -59, -11, -52, -52, -92, 24, -116, -21, -85, -73, 45, -126, 116, -74, 60, + -43, -97, -86, 25, -76, 81, -11, -91, 76, 57, 2, -6, 14, 105, -7, 7, 57, 21, 4, + -81, 9, -87, 98, 1, 34, -82, 107, -77, 87, 55, -126, -74, 95, 42, -102, -105, -79, -50, + -65, 23, -31, 53, 40, 93, -28, 109, 45, -76, -96, 110, 109, 2, 52, -77, -94, 112, -93, + -36, -127, -55, -55, -11, -50, -4, 75, -1, 56, -120, 57, 96, -34, -6, -61, 46, 75, 47, + 99, 55, -24, 57, -90, 114, 59, 124, 62, -124, -3, 72, 117, -126, 18, 12, 16, -28, 42, + 22, 8, -102, 71, 98, 107, 0, 69, 11, 18, -85, -50, 69, 19, -100, -99, -128, -48, -111, + 84, 122, 90, 42, -83, 2, 56, -47, 87, -25, -111, -34, 59, 89, -34, 59, -83, -106, 83, + 51, 113, -115, 121, -39, -62, 84, 119, 102, -50, -82, 88, 36, -24, -78, -61, -16, 127, 39, + -114, 79, 26, -66, 6, -45, 104, 30, -35, -43, -121, 46, -58, -118, -86, 118, -60, -18, 87, + 92, -101, 34, 87, 5, 97, -60, 89, -63, -45, -59, 67, 52, 40, 25, -8, -97, -11, 68, + 105, -21, -19, 89, -22, 28, -102, 124, 109, -68, 78, 91, 44, -74, -13, -8, -78, -112, -115, + -55, -18, -106, -125, -97, -22, -115, -68, -111, -59, 76, -73, 106, 89, 115, 0, -87, 76, 57, + -90, 71, -116, 10, -23, -73, 10, -8, 49, -1, -102, -119, 116, 42, 84, -116, 19, -29, -124, + -70, -42, 64, -10, 3, 112, 73, -104, -15, -67, -9, -9, -79, 112, -2, 118, 18, -118, 98, + 7, 107, 73, -88, -65, 109, -46, -4, 2, 88, 103, 66, 51, 123, -120, -92, -85, 97, -117, + -63, -73, 23, -31, -7, -58, 121, -105, -46, 1, -43, -76, 25, -47, 113, -10, -95, 47, -97, + -42, -22, 11, -106, 86, 36, -127, -26, 28, -123, -3, 18, 5, -126, 107, 109, -13, -94, 36, + 62, -41, 66, 11, -119, -65, -69, 110, 45, 111, -91, -35, -47, 101, 83, 66, 36, -85, 82, + 69, -99, -3, 97, -91, 101, 116, -100, 83, 56, -55, -111, 57, 64, 57, 47, 118, 17, -101, + 48, 9, -115, 1, 83, -101, -45, -125, -67, -23, 100, 47, -114, 42, -26, 123, -61, 114, 40, + 57, 29, -64, -23, -74, 104, 25, -87, -34, 26, 49, 75, -34, -18, 44, -117, -3, -53, 12, + -5, 54, -55, 81, 68, -12, 51, 8, 56, -94, -120, -114, -28, -89, -37, 41, 115, 56, -11, + -121, -85, 112, -40, -28, 0, 109, -110, -87, -99, -29, -51, 3, 74, -13, 27, -102, -26, -102, + -69, -112, -15, -66, -84, 20, 100, -71, 98, -75, 45, -88, -41, 73, -66, 38, 59, 103, -17, + -26, 110, 60, 57, -2, 8, -102, 62, -75, -83, -32, -6, 38, -75, -45, -37, 25, 59, -97, + -95, 95, -89, -85, -35, -25, 10, 64, 95, -36, 69, 7, -112, 111, 113, -13, 55, 86, -73, + -36, 97, 52, 72, 87, 21, 106, 76, 80, 11, -77, -56, -75, -11, -115, -24, 5, 118, 37, + 118, -107, -109, 82, -76, -125, -20, -13, -23, 20, 29, -34, -27, 2, 50, -94, 14, -108, -106, + 102, 29, -79, -38, -69, -60, 107, 82, -59, -25, -13, -124, -106, 87, 96, -51, -42, -30, -33, + -85, -107, 24, -99, 93, -48, -69, 91, -8, -120, -94, 19, 14, 118, -41, -80, -1, -36, 12, + 68, 4, 114, -115, -84, -33, -113, -120, -80, 85, 30, -29, -59, -52, -57, 63, 106, -85, 30, + -76, -17, 25, 60, -69, -99, -93, 91, 50, -89, 114, 22, 120, 1, -77, 73, 23, 102, 50, + -14, 57, 120, 116, -64, 37, 93, 63, -26, -32, -41, -126, -15, -38, -128, -41, -58, -112, -55, + 19, -9, -35, 36, -1, 46, -95, 25, 103, 45, -59, 111, -72, 11, 96, -123, 57, -126, 15, + -41, 42, 77, 92, -6, 97, -92, 96, 45, -116, -67, 73, -53, 18, -47, 112, -106, 92, 105, + -83, -61, -59, -77, -59, -47, -48, 31, 47, -124, 20, 101, -120, -35, -56, 115, 110, 77, 4, + -10, -117, -41, 80, -112, 42, -104, -122, 93, -45, -100, 30, -66, 20, 111, 127, 49, 30, -2, + 25, -87, -61, 97, -96, 54, -85, -103, 118, -15, 121, 59, 125, -12, -104, -64, 122, -100, 72, + 98, -119, -15, -34, 87, -53, -55, -80, -55, -72, 101, -47, -93, 31, -20, 24, 70, 79, -72, + -68, -123, 81, -93, 7, 17, 90, 115, -66, -17, 68, 51, -7, -66, 98, 73, 109, -84, -4, + 92, -125, -3, 69, 122, 8, -29, -91, -87, -47, -67, -49, -95, 63, -106, -30, -51, -86, -81, + 20, 65, -118, -70, 6, -8, -75, 94, 96, 102, 28, 115, -48, 77, -50, -8, 54, 61, 75, + -98, 7, -105, -113, -83, -90, 7, -77, 59, -59, 16, -92, 53, -104, 68, 56, -90, -43, 39, + -74, 113, -61, 86, 119, -36, 8, 20, -77, -60, 106, 43, -102, -39, 65, -37, 70, -41, -44, + 7, 90, -11, 106, 23, 75, 121, 14, 126, -101, -121, -80, 68, 98, -57, 45, -54, -50, -58, + -123, 49, 100, 58, -40, 54, -17, 62, 65, 93, 106, 0, 72, -103, -33, -110, -16, -32, 122, + 49, -22, -120, -98, 38, -90, 48, 108, -83, -67, -5, 109, 103, 88, 80, 7, -2, -15, -115, + 75, -87, -123, 82, 6, -93, 32, -102, 13, 80, 114, -67, -102, -109, 22, -97, -93, -44, 33, + -82, 124, 16, 40, -30, -2, -42, -2, 101, 84, -18, -8, -31, -58, 81, 51, -42, -64, -59, + -83, -40, 97, 56, -109, 43, 59, -110, 82, -43, 76, 82, -118, 100, -107, -61, -80, 87, 81, + 74, 127, -41, -98, -96, 36, 67, -17, -121, 10, -48, 24, -69, -94, 95, -58, 32, -65, -83, + 68, -99, 67, -77, 54, 22, 10, -46, 14, -31, -50, -57, 61, 70, 25, 0, -6, 105, 60, + -37, -62, -122, 107, 102, 123, -35, 49, -89, -29, -90, 5, 32, -63, 69, -78, -62, 26, 108, + 25, -54, -118, 16, 33, -57, 43, 110, 24, -33, -50, -98, 2, -103, -122, 55, -50, -14, 65, + -11, 63, 59, -89, -51, 122, -88, 108, 68, -111, -123, -97, 27, 111, -109, -4, -3, -20, 11, + 61, -68, -33, -36, -14, -117, -101, -84, -50, 0, 26, -86, 123, 1, 125, -81, 70, -61, -95, + -106, 54, 19, 66, 116, 76, 39, 78, 5, -87, -113, -116, -46, 125, -80, 15, -91, 104, 76, + 72, 98, 48, 57, 4, 29, -41, -97, 84, -125, 48, -11, 68, -5, 15, 122, -72, -95, 9, + 11, 102, 24, -29, 83, -75, -109, 57, 62, 7, -53, 45, 2, -104, 115, 124, 39, 78, 23, + 36, 42, 113, -2, 41, 9, 105, 36, 22, 85, 33, 4, 27, -61, -40, 24, 100, -58, -96, + 89, 72, -1, -6, 22, -89, -3, 51, -81, 126, -114, -86, -108, -104, 18, -23, -18, -90, -29, + -109, 56, -127, -106, 24, 53, 48, -73, 122, 63, 56, 62, -103, -75, 79, -124, 22, 107, 11, + 25, 105, -105, -120, 97, -97, 82, 51, 30, -21, 113, -17, -103, -65, -33, 81, 108, 106, 36, + 41, 90, 121, -97, 112, 39, -36, -7, -4, 71, -85, 44, -39, -85, 101, -102, 84, -40, 17, + 62, -111, -34, 55, -114, 53, 27, -110, -108, 43, 20, -83, -56, -69, 49, -48, 87, -44, -63, + -34, 105, -110, 83, -74, -33, -112, -121, -30, 8, -83, -99, -39, -102, 29, -77, 104, -19, -28, + -57, -65, 58, -18, -22, -14, -38, -87, 54, 90, -51, 124, -19, -66, -57, -47, -63, 23, 124, + 5, -69, -15, -117, -120, -126, -79, 119, 25, 123, 121, 50, -20, -96, 74, 20, 49, -28, -90, + -45, 116, 91, -6, -28, 81, 20, 84, 90, 8, 125, 90, 87, -39, -74, -110, -125, 23, 17, + 83, 47, -67, 88, 120, 0, -9, -87, 76, 32, -108, 49, 10, 55, -64, -47, 119, -95, -91, + 63, 49, -88, -65, -97, -110, 110, 108, -100, -64, -126, 76, 64, 85, 76, -106, 53, 2, -31, + 104, -58, 37, 24, 117, 29, 3, 64, -85, 107, 26, -127, 65, 65, 71, -23, 37, -88, 0, + 85, -108, 127, -77, -26, -103, 54, -93, -12, -102, -1, 88, 111, -99, 79, 73, 102, -102, -77, + 114, 14, 101, -113, -106, -114, 36, 109, 55, -54, 104, -99, 89, -109, 56, -2, 83, 84, -118, + 2, -97, 74, 109, -4, 120, 10, -67, 77, -30, 62, -117, -21, 28, 3, -24, 110, 27, 0, + 48, -37, 14, 7, -34, -72, 11, -85, 68, -106, 91, -35, 20, 29, -2, -51, 10, 82, 25, + -59, 42, -66, -42, 113, 7, -7, -46, 109, -53, -15, -84, 63, -84, 55, 93, -14, -29, -38, + -86, -85, -60, -113, -2, 107, 87, -4, -22, 52, 88, 116, 52, -56, -86, 100, 103, 8, 119, + -78, 31, -105, 0, 28, -25, 85, -90, 85, 121, -15, -57, 49, 13, 120, -3, 4, 34, 7, + 107, 104, -69, -111, -56, 113, -98, 56, -90, -31, -120, 92, 27, 17, 21, -63, 19, 97, -9, + 37, -10, 83, -78, -109, -70, 127, -22, -58, -50, -44, -5, -46, -76, 63, -50, -26, -18, -19, + 54, -56, -58, -17, 86, 108, 2, -18, -124, 82, 23, 110, -116, 32, 20, -101, 42, 44, -123, + -106, -93, -59, 118, -2, -51, -52, -8, 90, -36, 37, 32, 120, -84, 102, 126, -113, 7, 15, + -6, -104, 53, -49, 14, 124, -67, -81, -61, 61, 40, -10, -1, 29, 5, -68, -70, 66, 17, + 58, -106, -48, 58, 94, 81, 60, -114, 50, 93, 16, 51, -78, 67, -109, 55, 47, 114, -83, + 1, 88, 113, 37, 10, 123, 70, 57, -20, 64, 87, 20, 119, 38, 67, -119, 37, 58, 72, + -88, -117, -4, 117, -68, -67, 21, -1, -72, 57, -1, 110, -51, 73, -9, 17, -75, 51, -13, + 96, 109, 120, 102, 1, -51, -75, 113, 96, 75, 61, 48, -87, -101, 10, 32, -111, 22, -48, + 127, -7, 37, 55, -76, -10}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_bias.h new file mode 100644 index 00000000..48fba9aa --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_5_int4_input_bias = NULL; + +const int32_t *const conv_5_int4_biases = conv_5_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_weights.h new file mode 100644 index 00000000..71407bfa --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/input_weights.h @@ -0,0 +1,34 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_5_int4_input_weights[576] = { + 158, 40, 245, 230, 53, 151, 52, 28, 7, 226, 156, 152, 59, 180, 194, 33, 82, 246, 6, 87, 74, 98, 158, + 116, 17, 17, 111, 98, 12, 75, 177, 142, 13, 26, 21, 117, 117, 115, 44, 249, 186, 37, 161, 13, 89, 240, + 25, 81, 115, 71, 39, 109, 215, 148, 232, 115, 66, 59, 112, 127, 213, 120, 254, 3, 232, 20, 106, 149, 66, + 178, 159, 214, 42, 7, 191, 9, 70, 119, 170, 1, 160, 174, 177, 103, 8, 227, 124, 46, 187, 27, 74, 140, + 160, 73, 91, 119, 39, 237, 219, 108, 74, 67, 220, 175, 9, 108, 156, 213, 57, 133, 103, 209, 225, 224, 109, + 239, 42, 192, 2, 200, 73, 85, 89, 169, 235, 99, 4, 107, 179, 155, 186, 207, 143, 188, 55, 49, 120, 242, + 28, 109, 49, 141, 56, 11, 193, 128, 147, 133, 233, 10, 69, 211, 65, 116, 139, 28, 236, 191, 239, 23, 151, + 190, 31, 12, 168, 198, 149, 11, 23, 178, 15, 76, 155, 234, 155, 255, 42, 233, 230, 139, 137, 160, 147, 146, + 127, 16, 152, 177, 138, 140, 138, 127, 113, 210, 68, 101, 226, 231, 5, 213, 135, 181, 197, 196, 234, 53, 194, + 224, 32, 86, 200, 193, 226, 91, 160, 17, 57, 139, 237, 222, 34, 45, 102, 106, 71, 163, 14, 190, 185, 175, + 15, 224, 7, 85, 233, 46, 249, 211, 51, 197, 20, 217, 141, 220, 231, 144, 237, 3, 79, 48, 75, 124, 65, + 189, 178, 54, 90, 73, 216, 64, 42, 209, 89, 93, 206, 51, 207, 177, 253, 70, 204, 31, 242, 52, 114, 237, + 252, 24, 106, 74, 24, 68, 71, 163, 166, 231, 208, 202, 67, 67, 62, 55, 217, 233, 234, 155, 206, 129, 101, + 100, 239, 175, 252, 238, 173, 50, 64, 30, 227, 114, 221, 96, 40, 211, 206, 158, 129, 153, 217, 148, 70, 43, + 8, 56, 6, 184, 74, 93, 13, 152, 16, 29, 222, 202, 93, 103, 209, 230, 10, 61, 241, 117, 195, 116, 122, + 122, 42, 186, 80, 80, 180, 104, 82, 186, 106, 122, 120, 71, 124, 190, 70, 140, 193, 36, 249, 186, 162, 57, + 140, 68, 43, 161, 199, 238, 239, 206, 62, 133, 189, 135, 135, 118, 41, 30, 187, 35, 99, 192, 248, 215, 213, + 251, 91, 13, 131, 114, 218, 65, 218, 185, 186, 24, 231, 236, 81, 10, 120, 201, 14, 177, 10, 129, 218, 184, + 110, 51, 255, 35, 127, 2, 208, 13, 121, 223, 143, 68, 157, 253, 163, 27, 148, 233, 172, 129, 158, 97, 3, + 255, 135, 193, 24, 39, 239, 114, 26, 158, 94, 46, 210, 39, 244, 7, 236, 158, 164, 218, 194, 70, 67, 89, + 166, 167, 170, 151, 167, 94, 210, 95, 115, 61, 241, 112, 242, 26, 61, 121, 153, 84, 18, 229, 159, 183, 176, + 216, 222, 173, 2, 100, 117, 190, 181, 38, 51, 247, 67, 222, 51, 77, 146, 245, 226, 222, 190, 170, 62, 60, + 220, 124, 113, 23, 214, 20, 158, 57, 46, 34, 188, 220, 68, 253, 171, 177, 15, 189, 207, 205, 85, 110, 196, + 13, 254, 35, 210, 177, 223, 35, 218, 76, 4, 180, 123, 26, 106, 26, 235, 226, 214, 238, 187, 24, 128, 147, + 161, 248, 247, 174, 62, 9, 232, 180, 215, 96, 76, 87, 45, 200, 35, 185, 128, 117, 234, 9, 208, 72, 223, + 129}; + +const int8_t *const conv_5_int4_weights = conv_5_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output.h new file mode 100644 index 00000000..c3bcefd8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_5_int4_output[32] = {-42, -82, -120, -76, -48, -106, -94, -38, -96, -89, -85, + -103, -114, -64, -83, -108, -78, -66, -85, -53, -94, -117, + -80, -121, -78, -81, -64, -117, -54, -104, -75, -35}; + +const int8_t *const conv_5_int4_output_ref = conv_5_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_multiplier.h new file mode 100644 index 00000000..8a6b3f3f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_5_int4_output_multiplier[1] = {1962710897}; + +const int32_t *const conv_5_int4_output_mult = conv_5_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_shift.h new file mode 100644 index 00000000..5d3cf699 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_5_int4_output_shift[1] = {-8}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_5_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_5_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_5_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_5_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/config_data.h index 3dfbe6b4..c5e98d42 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_DILATION_GOLDEN_INT4_OUT_CH 3 +#define CONV_DILATION_GOLDEN_INT4_INPUT_BATCHES 1 #define CONV_DILATION_GOLDEN_INT4_IN_CH 1 +#define CONV_DILATION_GOLDEN_INT4_OUT_CH 3 #define CONV_DILATION_GOLDEN_INT4_INPUT_W 6 #define CONV_DILATION_GOLDEN_INT4_INPUT_H 4 -#define CONV_DILATION_GOLDEN_INT4_DST_SIZE 144 -#define CONV_DILATION_GOLDEN_INT4_INPUT_SIZE 24 -#define CONV_DILATION_GOLDEN_INT4_OUT_ACTIVATION_MIN -128 -#define CONV_DILATION_GOLDEN_INT4_OUT_ACTIVATION_MAX 127 -#define CONV_DILATION_GOLDEN_INT4_INPUT_BATCHES 2 #define CONV_DILATION_GOLDEN_INT4_FILTER_X 2 #define CONV_DILATION_GOLDEN_INT4_FILTER_Y 2 #define CONV_DILATION_GOLDEN_INT4_STRIDE_X 1 #define CONV_DILATION_GOLDEN_INT4_STRIDE_Y 1 -#define CONV_DILATION_GOLDEN_INT4_PAD_X 1 -#define CONV_DILATION_GOLDEN_INT4_PAD_Y 1 -#define CONV_DILATION_GOLDEN_INT4_OUTPUT_W 6 -#define CONV_DILATION_GOLDEN_INT4_OUTPUT_H 4 -#define CONV_DILATION_GOLDEN_INT4_INPUT_OFFSET 0 -#define CONV_DILATION_GOLDEN_INT4_OUTPUT_OFFSET 0 #define CONV_DILATION_GOLDEN_INT4_DILATION_X 3 #define CONV_DILATION_GOLDEN_INT4_DILATION_Y 2 +#define CONV_DILATION_GOLDEN_INT4_PADDING SAME +#define CONV_DILATION_GOLDEN_INT4_BATCH_SIZE 1 +#define CONV_DILATION_GOLDEN_INT4_OUT_ACTIVATION_MIN -128 +#define CONV_DILATION_GOLDEN_INT4_OUT_ACTIVATION_MAX 127 +#define CONV_DILATION_GOLDEN_INT4_DST_SIZE 72 +#define CONV_DILATION_GOLDEN_INT4_OUTPUT_H 4 +#define CONV_DILATION_GOLDEN_INT4_OUTPUT_W 6 +#define CONV_DILATION_GOLDEN_INT4_INPUT_OFFSET 128 +#define CONV_DILATION_GOLDEN_INT4_OUTPUT_OFFSET 0 +#define CONV_DILATION_GOLDEN_INT4_PAD_X 1 +#define CONV_DILATION_GOLDEN_INT4_PAD_Y 1 diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input.h new file mode 100644 index 00000000..97bdc36a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input.h @@ -0,0 +1,7 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_dilation_golden_int4_input[24] = {-23, 36, 65, 71, 35, 84, 80, -118, 60, -106, -83, 22, + 71, 2, 48, -119, 73, 120, 26, -9, 108, -123, 110, -112}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_bias.h new file mode 100644 index 00000000..be07715e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_dilation_golden_int4_input_bias = NULL; + +const int32_t *const conv_dilation_golden_int4_biases = conv_dilation_golden_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_weights.h new file mode 100644 index 00000000..4bff05af --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/input_weights.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_dilation_golden_int4_input_weights[6] = {40, 178, 99, 157, 60, 124}; + +const int8_t *const conv_dilation_golden_int4_weights = conv_dilation_golden_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output.h new file mode 100644 index 00000000..7dc5e33b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_dilation_golden_int4_output[72] = { + -7, -10, 7, 2, -6, -4, -2, -3, 2, -3, -13, 2, 0, -1, 0, 1, -1, -1, -4, -1, 10, -1, 7, -3, + -13, -3, 4, -16, -3, 5, -12, 5, -5, -7, -1, -8, -6, -4, 12, -10, 2, -8, -7, -14, 7, -6, 5, -6, + -1, 0, -1, 1, -5, -6, 3, 8, 3, -12, 5, -4, -5, 13, 0, -7, 16, 0, -1, 0, 0, -12, 5, -5}; + +const int8_t *const conv_dilation_golden_int4_output_ref = conv_dilation_golden_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_multiplier.h new file mode 100644 index 00000000..b39ea426 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_dilation_golden_int4_output_multiplier[3] = {2127272028, 1085364869, 1538818073}; + +const int32_t *const conv_dilation_golden_int4_output_mult = conv_dilation_golden_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_shift.h new file mode 100644 index 00000000..ff4bc27e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_dilation_golden_int4_output_shift[3] = {-7, -6, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_dilation_golden_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/config_data.h index 9c42585b..18de1ee3 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define CONV_OUT_ACTIVATION_INT4_OUT_CH 2 +#define CONV_OUT_ACTIVATION_INT4_INPUT_BATCHES 1 #define CONV_OUT_ACTIVATION_INT4_IN_CH 4 +#define CONV_OUT_ACTIVATION_INT4_OUT_CH 2 #define CONV_OUT_ACTIVATION_INT4_INPUT_W 3 #define CONV_OUT_ACTIVATION_INT4_INPUT_H 3 -#define CONV_OUT_ACTIVATION_INT4_DST_SIZE 18 -#define CONV_OUT_ACTIVATION_INT4_INPUT_SIZE 36 -#define CONV_OUT_ACTIVATION_INT4_OUT_ACTIVATION_MIN -61 -#define CONV_OUT_ACTIVATION_INT4_OUT_ACTIVATION_MAX 107 -#define CONV_OUT_ACTIVATION_INT4_INPUT_BATCHES 1 #define CONV_OUT_ACTIVATION_INT4_FILTER_X 3 #define CONV_OUT_ACTIVATION_INT4_FILTER_Y 3 #define CONV_OUT_ACTIVATION_INT4_STRIDE_X 1 #define CONV_OUT_ACTIVATION_INT4_STRIDE_Y 1 -#define CONV_OUT_ACTIVATION_INT4_PAD_X 1 -#define CONV_OUT_ACTIVATION_INT4_PAD_Y 1 -#define CONV_OUT_ACTIVATION_INT4_OUTPUT_W 3 -#define CONV_OUT_ACTIVATION_INT4_OUTPUT_H 3 -#define CONV_OUT_ACTIVATION_INT4_INPUT_OFFSET 0 -#define CONV_OUT_ACTIVATION_INT4_OUTPUT_OFFSET 0 +#define CONV_OUT_ACTIVATION_INT4_OUT_ACTIVATION_MIN -61 +#define CONV_OUT_ACTIVATION_INT4_OUT_ACTIVATION_MAX 108 +#define CONV_OUT_ACTIVATION_INT4_PADDING SAME #define CONV_OUT_ACTIVATION_INT4_DILATION_X 1 #define CONV_OUT_ACTIVATION_INT4_DILATION_Y 1 +#define CONV_OUT_ACTIVATION_INT4_BATCH_SIZE 1 +#define CONV_OUT_ACTIVATION_INT4_DST_SIZE 18 +#define CONV_OUT_ACTIVATION_INT4_OUTPUT_H 3 +#define CONV_OUT_ACTIVATION_INT4_OUTPUT_W 3 +#define CONV_OUT_ACTIVATION_INT4_INPUT_OFFSET 128 +#define CONV_OUT_ACTIVATION_INT4_OUTPUT_OFFSET 0 +#define CONV_OUT_ACTIVATION_INT4_PAD_X 1 +#define CONV_OUT_ACTIVATION_INT4_PAD_Y 1 diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input.h new file mode 100644 index 00000000..0968b035 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_out_activation_int4_input[36] = {88, -63, -26, -98, 13, 12, 111, -41, -88, -36, 89, 62, + -60, -57, 1, 91, 86, 55, 25, -2, 38, -88, -55, -9, + 40, 96, 35, 48, 15, -28, -18, 70, -107, 15, -41, -66}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_bias.h new file mode 100644 index 00000000..36730c3d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const conv_out_activation_int4_input_bias = NULL; + +const int32_t *const conv_out_activation_int4_biases = conv_out_activation_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_weights.h new file mode 100644 index 00000000..48178a99 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/input_weights.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_out_activation_int4_input_weights[36] = {233, 19, 245, 136, 233, 163, 64, 136, 168, 157, 246, 16, + 250, 245, 179, 231, 62, 36, 98, 65, 198, 252, 107, 33, + 132, 190, 237, 42, 30, 219, 177, 106, 252, 68, 251, 154}; + +const int8_t *const conv_out_activation_int4_weights = conv_out_activation_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output.h new file mode 100644 index 00000000..6e41ca77 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t conv_out_activation_int4_output[18] = + {-2, -29, -12, -32, -20, -21, -7, -20, -37, -27, -34, -7, -32, -18, -33, -15, -23, 2}; + +const int8_t *const conv_out_activation_int4_output_ref = conv_out_activation_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_multiplier.h new file mode 100644 index 00000000..0320687b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_out_activation_int4_output_multiplier[2] = {1090846922, 1612892519}; + +const int32_t *const conv_out_activation_int4_output_mult = conv_out_activation_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_shift.h new file mode 100644 index 00000000..63932174 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t conv_out_activation_int4_output_shift[2] = {-7, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/conv_out_activation_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/bias.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/bias.h index 2f83b5bf..d7496b88 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/bias.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/bias.h @@ -4,6 +4,6 @@ #include const int64_t int16xint8_spill_bias[9] = - {-884417, 3945708, 3406942, 2133137, 3248303, 3305055, -1536011, -3483503, -3626630}; + {916276, -3598002, -602971, 2764017, -1194775, -583961, -1182959, 1777309, 4141893}; const int64_t *const int16xint8_spill_biases = int16xint8_spill_bias; diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h index 8d68e6e3..b10c7bc7 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/config_data.h @@ -8,9 +8,9 @@ #define INT16XINT8_SPILL_FILTER_X 9 #define INT16XINT8_SPILL_FILTER_Y 4 #define INT16XINT8_SPILL_PADDING VALID -#define INT16XINT8_SPILL_INPUT_MIN 32667 +#define INT16XINT8_SPILL_INPUT_MIN -32667 #define INT16XINT8_SPILL_INPUT_MAX 32767 -#define INT16XINT8_SPILL_OUT_ACTIVATION_MIN 32667 +#define INT16XINT8_SPILL_OUT_ACTIVATION_MIN -32667 #define INT16XINT8_SPILL_STRIDE_X 1 #define INT16XINT8_SPILL_STRIDE_Y 1 #define INT16XINT8_SPILL_DILATION_X 1 diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input.h index f802f4ab..e36cf6b5 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/input.h @@ -4,278 +4,318 @@ #include const int16_t int16xint8_spill_input[4400] = { - 32735, 32721, 32695, 32724, 32737, 32709, 32684, 32738, 32751, 32759, 32684, 32742, 32752, 32692, 32683, 32727, - 32752, 32696, 32765, 32724, 32730, 32757, 32685, 32715, 32748, 32743, 32700, 32669, 32755, 32752, 32764, 32671, - 32706, 32717, 32717, 32710, 32719, 32728, 32677, 32706, 32704, 32708, 32693, 32748, 32732, 32692, 32691, 32723, - 32733, 32743, 32670, 32722, 32724, 32706, 32764, 32693, 32679, 32762, 32726, 32756, 32675, 32765, 32722, 32723, - 32716, 32753, 32674, 32706, 32745, 32708, 32730, 32723, 32671, 32682, 32693, 32735, 32707, 32752, 32736, 32762, - 32732, 32742, 32746, 32677, 32729, 32764, 32722, 32695, 32710, 32680, 32762, 32695, 32670, 32690, 32718, 32730, - 32718, 32748, 32707, 32753, 32671, 32731, 32679, 32697, 32713, 32700, 32750, 32685, 32684, 32719, 32686, 32698, - 32708, 32739, 32715, 32708, 32673, 32739, 32678, 32763, 32755, 32672, 32739, 32760, 32687, 32667, 32738, 32688, - 32723, 32731, 32722, 32721, 32693, 32699, 32765, 32715, 32718, 32746, 32714, 32705, 32678, 32765, 32764, 32740, - 32710, 32680, 32764, 32667, 32692, 32722, 32747, 32703, 32716, 32757, 32718, 32674, 32676, 32675, 32691, 32755, - 32702, 32732, 32715, 32753, 32746, 32683, 32689, 32689, 32728, 32685, 32687, 32711, 32730, 32678, 32693, 32738, - 32727, 32706, 32672, 32745, 32699, 32758, 32755, 32669, 32737, 32740, 32748, 32766, 32737, 32763, 32740, 32698, - 32729, 32719, 32692, 32692, 32692, 32740, 32705, 32694, 32755, 32676, 32744, 32713, 32715, 32689, 32672, 32682, - 32678, 32724, 32748, 32669, 32730, 32689, 32751, 32683, 32701, 32767, 32705, 32732, 32688, 32703, 32751, 32758, - 32752, 32707, 32709, 32731, 32750, 32710, 32683, 32712, 32727, 32714, 32753, 32738, 32718, 32715, 32741, 32713, - 32690, 32741, 32670, 32737, 32729, 32713, 32674, 32715, 32745, 32713, 32716, 32689, 32685, 32732, 32739, 32754, - 32669, 32724, 32742, 32705, 32762, 32762, 32713, 32679, 32711, 32678, 32746, 32711, 32742, 32752, 32710, 32699, - 32706, 32761, 32767, 32675, 32723, 32680, 32744, 32676, 32671, 32739, 32686, 32729, 32752, 32718, 32722, 32764, - 32692, 32711, 32712, 32669, 32718, 32695, 32708, 32750, 32760, 32726, 32715, 32751, 32698, 32737, 32708, 32742, - 32753, 32746, 32701, 32733, 32691, 32721, 32714, 32759, 32764, 32678, 32759, 32692, 32730, 32699, 32755, 32714, - 32688, 32679, 32696, 32703, 32765, 32673, 32705, 32749, 32722, 32741, 32677, 32735, 32727, 32750, 32726, 32694, - 32730, 32710, 32765, 32672, 32765, 32706, 32765, 32707, 32728, 32760, 32744, 32724, 32741, 32710, 32744, 32748, - 32731, 32689, 32716, 32739, 32718, 32692, 32692, 32727, 32675, 32702, 32715, 32764, 32733, 32671, 32685, 32679, - 32708, 32766, 32720, 32697, 32715, 32679, 32727, 32683, 32754, 32672, 32744, 32706, 32691, 32695, 32681, 32719, - 32759, 32685, 32677, 32724, 32756, 32727, 32685, 32753, 32748, 32727, 32720, 32690, 32720, 32687, 32684, 32756, - 32717, 32682, 32720, 32674, 32749, 32708, 32681, 32684, 32724, 32760, 32741, 32709, 32678, 32757, 32751, 32687, - 32695, 32761, 32695, 32740, 32722, 32686, 32688, 32748, 32721, 32756, 32765, 32732, 32742, 32751, 32762, 32746, - 32727, 32746, 32737, 32728, 32724, 32675, 32702, 32718, 32697, 32683, 32736, 32674, 32680, 32737, 32716, 32683, - 32728, 32713, 32725, 32697, 32765, 32697, 32677, 32726, 32692, 32701, 32737, 32708, 32717, 32746, 32733, 32691, - 32730, 32734, 32728, 32704, 32708, 32727, 32749, 32764, 32695, 32692, 32749, 32695, 32731, 32738, 32715, 32714, - 32735, 32736, 32704, 32669, 32728, 32691, 32722, 32765, 32715, 32667, 32694, 32697, 32763, 32696, 32670, 32721, - 32762, 32725, 32758, 32681, 32675, 32742, 32758, 32713, 32753, 32680, 32701, 32672, 32683, 32762, 32763, 32744, - 32763, 32725, 32690, 32744, 32675, 32734, 32671, 32766, 32722, 32752, 32699, 32671, 32718, 32758, 32742, 32694, - 32766, 32717, 32696, 32747, 32682, 32727, 32694, 32762, 32765, 32698, 32737, 32728, 32756, 32744, 32670, 32706, - 32759, 32755, 32672, 32714, 32746, 32743, 32730, 32713, 32691, 32706, 32675, 32676, 32706, 32746, 32709, 32667, - 32708, 32750, 32679, 32728, 32755, 32756, 32729, 32737, 32694, 32700, 32713, 32756, 32741, 32733, 32730, 32715, - 32741, 32696, 32708, 32701, 32677, 32681, 32719, 32736, 32761, 32762, 32746, 32764, 32703, 32677, 32678, 32738, - 32670, 32710, 32692, 32765, 32691, 32758, 32733, 32719, 32754, 32760, 32697, 32760, 32714, 32672, 32681, 32680, - 32722, 32744, 32731, 32743, 32721, 32736, 32683, 32762, 32693, 32684, 32672, 32734, 32714, 32748, 32711, 32743, - 32677, 32726, 32713, 32685, 32681, 32720, 32763, 32715, 32752, 32749, 32713, 32700, 32681, 32730, 32755, 32699, - 32676, 32709, 32726, 32670, 32715, 32726, 32762, 32757, 32672, 32757, 32759, 32713, 32699, 32757, 32673, 32739, - 32673, 32712, 32680, 32678, 32751, 32705, 32750, 32766, 32681, 32759, 32709, 32674, 32735, 32744, 32762, 32724, - 32701, 32753, 32686, 32731, 32669, 32690, 32717, 32672, 32739, 32685, 32698, 32680, 32677, 32699, 32754, 32676, - 32704, 32682, 32732, 32719, 32749, 32686, 32746, 32686, 32726, 32692, 32698, 32758, 32704, 32723, 32667, 32708, - 32677, 32712, 32740, 32673, 32747, 32760, 32745, 32749, 32672, 32720, 32696, 32691, 32735, 32762, 32676, 32710, - 32766, 32751, 32710, 32712, 32742, 32732, 32695, 32737, 32695, 32732, 32765, 32734, 32668, 32734, 32723, 32695, - 32753, 32693, 32686, 32726, 32723, 32761, 32756, 32721, 32688, 32732, 32672, 32673, 32740, 32702, 32727, 32756, - 32680, 32687, 32717, 32725, 32737, 32746, 32671, 32710, 32750, 32764, 32751, 32741, 32677, 32713, 32762, 32680, - 32742, 32697, 32724, 32725, 32735, 32706, 32684, 32684, 32712, 32741, 32714, 32681, 32711, 32767, 32727, 32740, - 32709, 32758, 32722, 32755, 32740, 32694, 32755, 32739, 32734, 32748, 32668, 32735, 32742, 32700, 32703, 32720, - 32726, 32679, 32760, 32683, 32727, 32698, 32700, 32696, 32751, 32705, 32669, 32701, 32729, 32684, 32743, 32742, - 32695, 32709, 32698, 32730, 32733, 32694, 32732, 32710, 32732, 32728, 32762, 32692, 32675, 32672, 32743, 32762, - 32735, 32747, 32734, 32690, 32688, 32705, 32744, 32711, 32756, 32766, 32734, 32704, 32717, 32679, 32684, 32760, - 32711, 32733, 32708, 32698, 32673, 32720, 32671, 32702, 32673, 32710, 32689, 32763, 32722, 32717, 32726, 32705, - 32753, 32697, 32707, 32743, 32733, 32694, 32734, 32685, 32669, 32713, 32718, 32674, 32730, 32744, 32762, 32747, - 32762, 32767, 32692, 32723, 32676, 32682, 32737, 32749, 32757, 32715, 32680, 32672, 32678, 32753, 32749, 32754, - 32739, 32702, 32725, 32686, 32693, 32700, 32724, 32676, 32696, 32686, 32734, 32754, 32682, 32756, 32707, 32703, - 32764, 32755, 32704, 32764, 32685, 32718, 32725, 32707, 32729, 32695, 32744, 32756, 32701, 32729, 32734, 32692, - 32689, 32725, 32761, 32730, 32741, 32716, 32713, 32720, 32724, 32741, 32724, 32685, 32746, 32733, 32699, 32753, - 32672, 32729, 32755, 32675, 32748, 32677, 32673, 32667, 32670, 32743, 32673, 32701, 32687, 32699, 32701, 32742, - 32697, 32707, 32749, 32691, 32669, 32714, 32734, 32691, 32723, 32711, 32733, 32758, 32727, 32688, 32730, 32691, - 32710, 32704, 32689, 32758, 32756, 32753, 32721, 32688, 32680, 32752, 32686, 32749, 32735, 32698, 32707, 32757, - 32707, 32711, 32758, 32673, 32669, 32758, 32718, 32765, 32712, 32721, 32753, 32699, 32668, 32691, 32673, 32711, - 32692, 32744, 32764, 32745, 32723, 32688, 32744, 32730, 32709, 32687, 32747, 32743, 32724, 32737, 32677, 32722, - 32740, 32681, 32749, 32744, 32739, 32742, 32765, 32730, 32700, 32679, 32718, 32698, 32750, 32703, 32740, 32748, - 32702, 32702, 32717, 32757, 32728, 32716, 32763, 32679, 32755, 32715, 32725, 32765, 32714, 32734, 32749, 32743, - 32672, 32733, 32712, 32722, 32684, 32675, 32765, 32761, 32766, 32753, 32698, 32711, 32707, 32763, 32721, 32755, - 32700, 32694, 32705, 32694, 32690, 32718, 32728, 32761, 32703, 32711, 32724, 32673, 32763, 32722, 32712, 32726, - 32706, 32690, 32755, 32684, 32673, 32762, 32737, 32707, 32723, 32678, 32744, 32762, 32708, 32670, 32733, 32684, - 32757, 32756, 32708, 32751, 32717, 32738, 32706, 32698, 32736, 32675, 32710, 32755, 32713, 32714, 32684, 32760, - 32741, 32722, 32753, 32730, 32694, 32674, 32757, 32670, 32706, 32672, 32674, 32744, 32686, 32676, 32708, 32743, - 32668, 32750, 32765, 32750, 32738, 32737, 32701, 32720, 32707, 32689, 32767, 32726, 32691, 32690, 32719, 32708, - 32760, 32759, 32699, 32688, 32738, 32730, 32684, 32683, 32706, 32761, 32684, 32717, 32716, 32742, 32703, 32766, - 32693, 32679, 32668, 32763, 32765, 32761, 32706, 32704, 32669, 32707, 32764, 32721, 32752, 32676, 32756, 32720, - 32763, 32747, 32717, 32742, 32744, 32762, 32726, 32760, 32716, 32765, 32753, 32745, 32715, 32691, 32702, 32674, - 32756, 32739, 32745, 32703, 32701, 32720, 32672, 32728, 32670, 32745, 32670, 32765, 32681, 32742, 32697, 32750, - 32701, 32680, 32671, 32736, 32680, 32738, 32694, 32724, 32736, 32672, 32760, 32754, 32687, 32745, 32678, 32688, - 32767, 32692, 32729, 32748, 32760, 32709, 32763, 32752, 32715, 32756, 32712, 32758, 32746, 32685, 32732, 32670, - 32695, 32738, 32745, 32672, 32676, 32762, 32703, 32736, 32726, 32750, 32722, 32726, 32760, 32682, 32686, 32688, - 32760, 32704, 32692, 32690, 32711, 32706, 32729, 32744, 32668, 32695, 32737, 32675, 32726, 32688, 32733, 32680, - 32763, 32685, 32676, 32716, 32742, 32719, 32669, 32678, 32746, 32684, 32713, 32753, 32709, 32754, 32762, 32757, - 32717, 32727, 32669, 32747, 32668, 32723, 32766, 32736, 32695, 32685, 32711, 32729, 32715, 32727, 32673, 32675, - 32692, 32692, 32745, 32728, 32678, 32683, 32732, 32693, 32753, 32760, 32729, 32757, 32743, 32764, 32733, 32757, - 32714, 32680, 32762, 32704, 32757, 32686, 32735, 32717, 32676, 32711, 32713, 32744, 32737, 32699, 32742, 32714, - 32715, 32690, 32760, 32672, 32682, 32694, 32702, 32682, 32696, 32724, 32756, 32685, 32708, 32698, 32714, 32763, - 32755, 32737, 32726, 32729, 32671, 32736, 32698, 32699, 32702, 32683, 32766, 32687, 32757, 32729, 32732, 32682, - 32758, 32745, 32704, 32713, 32757, 32710, 32736, 32697, 32671, 32715, 32701, 32706, 32722, 32669, 32743, 32695, - 32688, 32674, 32721, 32686, 32713, 32701, 32694, 32722, 32672, 32681, 32716, 32723, 32691, 32748, 32712, 32688, - 32686, 32703, 32682, 32726, 32726, 32669, 32698, 32758, 32741, 32670, 32725, 32671, 32712, 32732, 32670, 32705, - 32678, 32727, 32705, 32676, 32701, 32708, 32714, 32758, 32764, 32701, 32752, 32674, 32709, 32701, 32741, 32698, - 32732, 32718, 32687, 32756, 32704, 32755, 32700, 32697, 32749, 32749, 32762, 32680, 32698, 32726, 32684, 32709, - 32742, 32668, 32765, 32731, 32765, 32685, 32750, 32668, 32734, 32749, 32727, 32715, 32717, 32685, 32714, 32698, - 32685, 32677, 32736, 32757, 32709, 32736, 32708, 32679, 32766, 32706, 32698, 32750, 32686, 32740, 32687, 32763, - 32725, 32744, 32716, 32765, 32687, 32704, 32707, 32695, 32761, 32721, 32673, 32737, 32719, 32704, 32707, 32709, - 32721, 32755, 32683, 32681, 32685, 32685, 32719, 32670, 32719, 32681, 32720, 32711, 32718, 32704, 32760, 32749, - 32747, 32717, 32761, 32736, 32705, 32672, 32723, 32717, 32757, 32710, 32765, 32720, 32700, 32752, 32753, 32757, - 32745, 32737, 32702, 32767, 32714, 32712, 32730, 32719, 32738, 32687, 32762, 32726, 32684, 32706, 32671, 32726, - 32693, 32728, 32694, 32688, 32690, 32682, 32703, 32719, 32742, 32713, 32758, 32687, 32684, 32714, 32711, 32671, - 32723, 32718, 32710, 32670, 32715, 32761, 32699, 32695, 32754, 32738, 32764, 32741, 32730, 32736, 32679, 32733, - 32694, 32675, 32733, 32748, 32734, 32734, 32718, 32761, 32668, 32687, 32716, 32721, 32669, 32758, 32686, 32738, - 32726, 32738, 32694, 32679, 32710, 32755, 32733, 32728, 32738, 32763, 32724, 32737, 32732, 32679, 32688, 32690, - 32740, 32750, 32744, 32677, 32726, 32710, 32739, 32762, 32719, 32736, 32718, 32675, 32723, 32762, 32763, 32751, - 32724, 32764, 32673, 32719, 32683, 32744, 32720, 32740, 32701, 32764, 32668, 32744, 32733, 32708, 32748, 32748, - 32764, 32693, 32701, 32756, 32711, 32752, 32730, 32675, 32721, 32728, 32735, 32748, 32702, 32711, 32758, 32695, - 32747, 32766, 32678, 32671, 32690, 32758, 32680, 32756, 32721, 32764, 32767, 32672, 32694, 32726, 32683, 32669, - 32740, 32766, 32756, 32690, 32741, 32709, 32695, 32757, 32693, 32722, 32670, 32722, 32766, 32669, 32743, 32734, - 32761, 32728, 32701, 32712, 32738, 32667, 32733, 32752, 32678, 32684, 32742, 32689, 32687, 32711, 32746, 32708, - 32714, 32756, 32733, 32740, 32687, 32680, 32727, 32738, 32719, 32764, 32710, 32681, 32726, 32757, 32690, 32691, - 32686, 32740, 32739, 32766, 32683, 32737, 32671, 32676, 32687, 32699, 32704, 32760, 32723, 32716, 32672, 32765, - 32709, 32758, 32692, 32743, 32752, 32747, 32697, 32731, 32689, 32767, 32721, 32766, 32692, 32669, 32686, 32694, - 32707, 32730, 32753, 32752, 32756, 32756, 32729, 32766, 32737, 32752, 32759, 32730, 32689, 32698, 32680, 32692, - 32733, 32672, 32688, 32757, 32694, 32721, 32710, 32692, 32748, 32726, 32714, 32746, 32743, 32758, 32752, 32682, - 32697, 32725, 32709, 32692, 32706, 32753, 32733, 32694, 32682, 32710, 32722, 32714, 32722, 32751, 32712, 32707, - 32761, 32671, 32697, 32749, 32740, 32737, 32684, 32727, 32755, 32690, 32732, 32729, 32733, 32676, 32715, 32695, - 32697, 32684, 32738, 32729, 32716, 32728, 32718, 32730, 32697, 32762, 32679, 32679, 32680, 32753, 32745, 32733, - 32732, 32721, 32732, 32715, 32731, 32697, 32765, 32693, 32734, 32750, 32764, 32737, 32724, 32680, 32766, 32739, - 32747, 32748, 32695, 32765, 32674, 32688, 32743, 32733, 32683, 32702, 32674, 32695, 32695, 32700, 32685, 32700, - 32677, 32749, 32751, 32726, 32667, 32715, 32749, 32701, 32687, 32766, 32697, 32699, 32706, 32730, 32670, 32756, - 32733, 32723, 32708, 32746, 32697, 32741, 32667, 32717, 32723, 32680, 32691, 32761, 32742, 32761, 32740, 32695, - 32756, 32746, 32706, 32706, 32673, 32670, 32754, 32753, 32704, 32674, 32756, 32754, 32703, 32706, 32752, 32731, - 32713, 32751, 32725, 32719, 32708, 32681, 32668, 32689, 32740, 32723, 32737, 32692, 32759, 32690, 32707, 32673, - 32759, 32748, 32685, 32679, 32682, 32730, 32710, 32721, 32691, 32676, 32751, 32711, 32703, 32736, 32723, 32750, - 32713, 32748, 32670, 32684, 32675, 32683, 32723, 32734, 32697, 32761, 32693, 32742, 32682, 32713, 32727, 32720, - 32677, 32670, 32762, 32670, 32748, 32764, 32721, 32738, 32681, 32740, 32765, 32709, 32728, 32717, 32673, 32680, - 32750, 32696, 32718, 32759, 32759, 32760, 32748, 32672, 32682, 32701, 32712, 32714, 32764, 32669, 32744, 32677, - 32701, 32763, 32698, 32701, 32748, 32671, 32674, 32738, 32694, 32700, 32703, 32734, 32732, 32730, 32720, 32729, - 32737, 32758, 32730, 32668, 32725, 32687, 32713, 32703, 32668, 32681, 32695, 32744, 32752, 32673, 32764, 32706, - 32764, 32676, 32697, 32720, 32712, 32702, 32717, 32705, 32702, 32759, 32706, 32730, 32692, 32694, 32731, 32674, - 32676, 32701, 32763, 32698, 32674, 32679, 32676, 32758, 32719, 32696, 32695, 32756, 32694, 32715, 32693, 32682, - 32718, 32749, 32680, 32761, 32728, 32755, 32742, 32761, 32698, 32762, 32748, 32740, 32671, 32677, 32695, 32743, - 32685, 32709, 32759, 32747, 32667, 32743, 32696, 32734, 32746, 32708, 32711, 32737, 32727, 32756, 32753, 32716, - 32751, 32686, 32668, 32751, 32692, 32749, 32673, 32763, 32739, 32742, 32738, 32676, 32682, 32736, 32705, 32723, - 32727, 32757, 32722, 32761, 32700, 32738, 32729, 32712, 32719, 32764, 32747, 32671, 32731, 32693, 32671, 32684, - 32752, 32694, 32739, 32738, 32736, 32754, 32766, 32758, 32672, 32731, 32717, 32681, 32713, 32723, 32750, 32685, - 32672, 32752, 32703, 32673, 32671, 32668, 32696, 32748, 32754, 32732, 32762, 32741, 32733, 32710, 32676, 32667, - 32737, 32680, 32757, 32719, 32753, 32733, 32687, 32714, 32725, 32713, 32691, 32724, 32731, 32696, 32674, 32683, - 32691, 32702, 32691, 32722, 32696, 32743, 32717, 32752, 32706, 32678, 32746, 32677, 32729, 32751, 32757, 32728, - 32707, 32711, 32693, 32674, 32704, 32743, 32679, 32735, 32737, 32702, 32755, 32765, 32682, 32710, 32680, 32751, - 32757, 32758, 32711, 32727, 32738, 32728, 32686, 32691, 32671, 32670, 32667, 32730, 32717, 32732, 32705, 32747, - 32679, 32696, 32681, 32732, 32695, 32711, 32680, 32675, 32708, 32708, 32748, 32762, 32738, 32703, 32710, 32706, - 32687, 32723, 32696, 32761, 32693, 32745, 32737, 32669, 32739, 32723, 32750, 32699, 32737, 32708, 32765, 32757, - 32731, 32723, 32735, 32707, 32757, 32764, 32733, 32762, 32749, 32708, 32708, 32742, 32721, 32668, 32679, 32674, - 32762, 32742, 32701, 32763, 32751, 32735, 32761, 32668, 32751, 32738, 32679, 32681, 32765, 32720, 32764, 32698, - 32684, 32743, 32723, 32675, 32687, 32751, 32675, 32691, 32724, 32670, 32749, 32684, 32719, 32704, 32766, 32703, - 32672, 32681, 32724, 32728, 32722, 32696, 32714, 32729, 32741, 32686, 32766, 32703, 32760, 32674, 32751, 32700, - 32766, 32716, 32676, 32691, 32756, 32715, 32766, 32736, 32765, 32694, 32765, 32672, 32738, 32721, 32749, 32679, - 32724, 32698, 32706, 32695, 32756, 32723, 32733, 32738, 32681, 32709, 32764, 32722, 32760, 32752, 32674, 32706, - 32741, 32766, 32745, 32670, 32759, 32732, 32767, 32678, 32762, 32684, 32670, 32715, 32674, 32688, 32732, 32749, - 32713, 32707, 32757, 32702, 32748, 32719, 32740, 32679, 32737, 32671, 32755, 32731, 32725, 32725, 32693, 32751, - 32733, 32687, 32706, 32670, 32726, 32753, 32742, 32715, 32761, 32724, 32672, 32757, 32742, 32747, 32747, 32689, - 32725, 32677, 32724, 32725, 32757, 32702, 32699, 32726, 32749, 32700, 32713, 32749, 32762, 32674, 32766, 32707, - 32725, 32765, 32685, 32699, 32694, 32761, 32699, 32677, 32687, 32698, 32677, 32767, 32714, 32752, 32692, 32724, - 32744, 32694, 32695, 32707, 32730, 32739, 32689, 32719, 32701, 32751, 32730, 32750, 32691, 32669, 32691, 32756, - 32731, 32674, 32689, 32743, 32686, 32718, 32681, 32695, 32672, 32750, 32724, 32679, 32708, 32699, 32759, 32715, - 32731, 32712, 32746, 32708, 32702, 32736, 32699, 32759, 32739, 32710, 32736, 32696, 32734, 32676, 32728, 32719, - 32703, 32725, 32678, 32703, 32756, 32677, 32668, 32726, 32754, 32761, 32739, 32767, 32755, 32700, 32679, 32753, - 32760, 32693, 32750, 32730, 32705, 32711, 32745, 32763, 32692, 32762, 32738, 32736, 32715, 32694, 32681, 32707, - 32684, 32748, 32695, 32763, 32705, 32669, 32696, 32707, 32701, 32680, 32676, 32669, 32746, 32668, 32670, 32689, - 32705, 32695, 32735, 32750, 32751, 32747, 32694, 32751, 32720, 32721, 32763, 32701, 32720, 32716, 32669, 32710, - 32694, 32731, 32715, 32727, 32732, 32761, 32747, 32694, 32727, 32679, 32735, 32696, 32717, 32709, 32731, 32706, - 32742, 32674, 32671, 32673, 32756, 32677, 32757, 32718, 32690, 32694, 32760, 32751, 32698, 32697, 32755, 32668, - 32691, 32713, 32700, 32741, 32683, 32759, 32680, 32690, 32723, 32751, 32711, 32740, 32722, 32700, 32692, 32677, - 32677, 32697, 32699, 32760, 32720, 32743, 32670, 32680, 32703, 32758, 32724, 32763, 32698, 32711, 32718, 32712, - 32756, 32759, 32669, 32736, 32727, 32667, 32714, 32740, 32741, 32706, 32684, 32707, 32759, 32676, 32725, 32685, - 32737, 32745, 32745, 32742, 32706, 32696, 32727, 32713, 32733, 32767, 32714, 32753, 32702, 32762, 32754, 32691, - 32756, 32718, 32691, 32678, 32749, 32717, 32730, 32693, 32764, 32711, 32714, 32679, 32679, 32712, 32677, 32712, - 32696, 32690, 32720, 32727, 32671, 32691, 32735, 32719, 32736, 32741, 32698, 32680, 32725, 32713, 32678, 32692, - 32717, 32685, 32695, 32690, 32676, 32668, 32713, 32732, 32754, 32714, 32693, 32745, 32671, 32727, 32743, 32757, - 32689, 32739, 32747, 32672, 32737, 32692, 32749, 32744, 32706, 32691, 32703, 32676, 32752, 32714, 32697, 32673, - 32752, 32688, 32721, 32714, 32679, 32730, 32743, 32734, 32764, 32739, 32722, 32762, 32671, 32729, 32764, 32731, - 32731, 32750, 32723, 32742, 32756, 32716, 32684, 32712, 32689, 32682, 32722, 32691, 32698, 32692, 32693, 32708, - 32725, 32710, 32688, 32707, 32714, 32711, 32743, 32733, 32763, 32692, 32715, 32726, 32677, 32764, 32756, 32713, - 32720, 32708, 32686, 32757, 32687, 32677, 32700, 32750, 32735, 32716, 32721, 32682, 32704, 32761, 32721, 32680, - 32743, 32714, 32699, 32720, 32725, 32685, 32736, 32749, 32754, 32740, 32702, 32734, 32715, 32694, 32690, 32749, - 32672, 32719, 32755, 32751, 32673, 32703, 32728, 32729, 32750, 32732, 32678, 32758, 32726, 32688, 32714, 32674, - 32733, 32748, 32707, 32670, 32761, 32762, 32704, 32719, 32753, 32740, 32733, 32677, 32704, 32746, 32694, 32704, - 32751, 32712, 32726, 32749, 32748, 32703, 32679, 32668, 32741, 32687, 32676, 32699, 32746, 32670, 32708, 32670, - 32676, 32723, 32692, 32752, 32702, 32724, 32751, 32711, 32754, 32712, 32722, 32712, 32671, 32708, 32746, 32671, - 32678, 32682, 32698, 32744, 32706, 32719, 32758, 32701, 32753, 32707, 32693, 32689, 32740, 32725, 32759, 32751, - 32752, 32760, 32702, 32764, 32727, 32707, 32680, 32727, 32726, 32693, 32704, 32716, 32718, 32699, 32711, 32767, - 32675, 32752, 32729, 32725, 32755, 32709, 32678, 32690, 32674, 32746, 32689, 32751, 32737, 32745, 32758, 32668, - 32726, 32678, 32698, 32681, 32748, 32727, 32747, 32756, 32674, 32672, 32761, 32728, 32694, 32704, 32764, 32671, - 32700, 32674, 32684, 32694, 32758, 32680, 32733, 32671, 32758, 32715, 32746, 32749, 32749, 32743, 32719, 32700, - 32708, 32740, 32732, 32704, 32717, 32706, 32723, 32690, 32700, 32673, 32730, 32760, 32728, 32673, 32693, 32716, - 32712, 32744, 32699, 32734, 32706, 32737, 32713, 32757, 32726, 32704, 32716, 32690, 32714, 32727, 32764, 32680, - 32761, 32681, 32757, 32672, 32675, 32681, 32758, 32712, 32681, 32721, 32742, 32667, 32711, 32726, 32722, 32693, - 32757, 32681, 32679, 32743, 32714, 32761, 32716, 32695, 32740, 32742, 32709, 32705, 32706, 32748, 32760, 32693, - 32714, 32764, 32719, 32718, 32736, 32743, 32685, 32750, 32762, 32713, 32704, 32703, 32765, 32707, 32737, 32689, - 32741, 32723, 32693, 32702, 32757, 32675, 32756, 32720, 32689, 32723, 32720, 32756, 32752, 32693, 32688, 32690, - 32739, 32670, 32671, 32690, 32759, 32669, 32761, 32728, 32728, 32721, 32708, 32679, 32757, 32687, 32759, 32729, - 32730, 32669, 32747, 32685, 32724, 32721, 32716, 32732, 32697, 32760, 32676, 32766, 32684, 32704, 32690, 32667, - 32750, 32668, 32669, 32676, 32764, 32739, 32716, 32739, 32700, 32763, 32764, 32761, 32693, 32750, 32749, 32681, - 32678, 32694, 32732, 32678, 32749, 32743, 32706, 32692, 32753, 32674, 32718, 32718, 32714, 32751, 32724, 32707, - 32672, 32741, 32745, 32764, 32701, 32685, 32674, 32734, 32705, 32763, 32704, 32697, 32763, 32688, 32678, 32759, - 32698, 32694, 32712, 32737, 32736, 32687, 32757, 32705, 32705, 32760, 32673, 32682, 32697, 32708, 32743, 32720, - 32669, 32688, 32668, 32679, 32742, 32749, 32731, 32684, 32721, 32756, 32755, 32694, 32686, 32699, 32716, 32695, - 32719, 32757, 32752, 32750, 32749, 32678, 32713, 32738, 32733, 32674, 32708, 32724, 32742, 32706, 32706, 32756, - 32680, 32683, 32753, 32734, 32703, 32756, 32716, 32701, 32758, 32719, 32763, 32681, 32740, 32672, 32762, 32702, - 32745, 32738, 32712, 32700, 32747, 32752, 32761, 32725, 32735, 32754, 32700, 32686, 32753, 32724, 32712, 32759, - 32677, 32762, 32672, 32762, 32759, 32755, 32731, 32707, 32688, 32691, 32738, 32760, 32672, 32744, 32707, 32718, - 32738, 32675, 32714, 32729, 32756, 32714, 32753, 32701, 32718, 32738, 32696, 32714, 32687, 32744, 32668, 32705, - 32725, 32710, 32754, 32711, 32682, 32719, 32693, 32669, 32708, 32709, 32669, 32691, 32705, 32729, 32672, 32718, - 32763, 32697, 32763, 32673, 32747, 32729, 32757, 32720, 32744, 32697, 32704, 32727, 32709, 32710, 32739, 32671, - 32705, 32724, 32743, 32688, 32713, 32691, 32733, 32668, 32761, 32753, 32733, 32747, 32685, 32754, 32679, 32732, - 32701, 32675, 32718, 32732, 32710, 32720, 32689, 32738, 32670, 32702, 32745, 32727, 32752, 32754, 32672, 32672, - 32762, 32742, 32691, 32731, 32760, 32750, 32710, 32759, 32692, 32743, 32707, 32728, 32725, 32753, 32712, 32717, - 32754, 32728, 32725, 32681, 32722, 32732, 32750, 32751, 32711, 32737, 32743, 32678, 32747, 32761, 32744, 32717, - 32721, 32738, 32682, 32701, 32681, 32754, 32677, 32725, 32753, 32728, 32724, 32740, 32731, 32758, 32699, 32699, - 32752, 32686, 32671, 32721, 32699, 32731, 32762, 32752, 32713, 32761, 32761, 32767, 32719, 32737, 32766, 32742, - 32687, 32746, 32737, 32760, 32685, 32699, 32701, 32722, 32684, 32683, 32678, 32675, 32710, 32741, 32764, 32706, - 32753, 32709, 32764, 32713, 32680, 32761, 32707, 32763, 32688, 32717, 32682, 32693, 32671, 32676, 32726, 32743, - 32694, 32705, 32742, 32685, 32700, 32714, 32672, 32744, 32755, 32714, 32742, 32765, 32757, 32763, 32734, 32716, - 32760, 32725, 32731, 32698, 32695, 32689, 32684, 32731, 32685, 32756, 32742, 32700, 32748, 32727, 32691, 32714, - 32748, 32677, 32719, 32721, 32761, 32704, 32717, 32761, 32686, 32739, 32741, 32717, 32729, 32671, 32689, 32738, - 32700, 32678, 32713, 32740, 32677, 32685, 32748, 32767, 32677, 32697, 32675, 32669, 32673, 32721, 32699, 32668, - 32705, 32691, 32743, 32697, 32706, 32674, 32740, 32704, 32714, 32733, 32687, 32711, 32697, 32679, 32759, 32766, - 32709, 32686, 32737, 32756, 32709, 32743, 32684, 32752, 32767, 32714, 32746, 32724, 32712, 32766, 32749, 32724, - 32738, 32756, 32751, 32749, 32685, 32697, 32725, 32723, 32765, 32702, 32692, 32701, 32722, 32689, 32744, 32749, - 32728, 32713, 32672, 32717, 32703, 32752, 32706, 32675, 32713, 32738, 32711, 32667, 32760, 32723, 32687, 32702, - 32747, 32713, 32735, 32703, 32676, 32671, 32691, 32707, 32730, 32683, 32696, 32720, 32763, 32696, 32731, 32737, - 32696, 32726, 32765, 32733, 32714, 32672, 32688, 32691, 32670, 32739, 32743, 32765, 32714, 32756, 32681, 32742, - 32755, 32692, 32730, 32690, 32738, 32680, 32692, 32696, 32719, 32680, 32732, 32671, 32673, 32709, 32763, 32731, - 32752, 32694, 32766, 32670, 32691, 32690, 32737, 32713, 32697, 32706, 32754, 32741, 32691, 32684, 32697, 32738, - 32746, 32734, 32730, 32735, 32738, 32671, 32755, 32670, 32719, 32705, 32725, 32702, 32708, 32722, 32706, 32721, - 32699, 32756, 32735, 32761, 32736, 32742, 32760, 32758, 32759, 32672, 32703, 32710, 32686, 32694, 32760, 32670, - 32758, 32741, 32693, 32668, 32757, 32742, 32747, 32761, 32706, 32697, 32703, 32764, 32756, 32673, 32745, 32724, - 32739, 32703, 32681, 32725, 32677, 32691, 32736, 32719, 32766, 32764, 32753, 32703, 32667, 32706, 32681, 32667, - 32669, 32765, 32681, 32727, 32758, 32750, 32729, 32767, 32731, 32716, 32703, 32675, 32719, 32669, 32712, 32755, - 32712, 32757, 32738, 32685, 32694, 32749, 32737, 32725, 32728, 32717, 32711, 32753, 32709, 32676, 32742, 32744, - 32669, 32752, 32709, 32704, 32751, 32679, 32750, 32712, 32677, 32721, 32720, 32746, 32714, 32733, 32750, 32752, - 32721, 32756, 32735, 32717, 32697, 32727, 32698, 32685, 32703, 32682, 32762, 32699, 32685, 32747, 32676, 32763, - 32680, 32708, 32734, 32677, 32714, 32701, 32719, 32730, 32675, 32731, 32721, 32680, 32667, 32669, 32705, 32675, - 32728, 32703, 32760, 32717, 32711, 32725, 32766, 32765, 32751, 32708, 32753, 32749, 32743, 32742, 32715, 32712, - 32711, 32717, 32749, 32681, 32686, 32678, 32717, 32675, 32757, 32723, 32743, 32721, 32753, 32699, 32718, 32757, - 32677, 32674, 32670, 32688, 32675, 32746, 32678, 32724, 32737, 32732, 32765, 32750, 32684, 32712, 32718, 32723, - 32715, 32680, 32696, 32766, 32748, 32728, 32692, 32688, 32756, 32752, 32760, 32668, 32671, 32707, 32748, 32670, - 32693, 32682, 32714, 32723, 32668, 32741, 32732, 32678, 32692, 32701, 32714, 32766, 32691, 32694, 32717, 32760, - 32751, 32713, 32725, 32739, 32739, 32731, 32673, 32720, 32715, 32713, 32708, 32747, 32711, 32714, 32742, 32695, - 32740, 32735, 32724, 32764, 32696, 32741, 32764, 32756, 32702, 32748, 32743, 32698, 32717, 32748, 32698, 32677, - 32745, 32748, 32672, 32685, 32698, 32686, 32722, 32754, 32693, 32683, 32710, 32737, 32749, 32695, 32713, 32672, - 32691, 32690, 32742, 32754, 32750, 32673, 32751, 32681, 32695, 32720, 32691, 32763, 32703, 32694, 32667, 32713, - 32729, 32693, 32764, 32766, 32669, 32699, 32679, 32725, 32725, 32723, 32673, 32698, 32741, 32743, 32707, 32764, - 32720, 32716, 32761, 32721, 32705, 32752, 32674, 32760, 32720, 32733, 32697, 32689, 32743, 32695, 32744, 32674, - 32722, 32685, 32721, 32733, 32699, 32718, 32699, 32748, 32684, 32739, 32690, 32734, 32727, 32721, 32735, 32761, - 32741, 32674, 32694, 32677, 32703, 32688, 32736, 32700, 32706, 32691, 32727, 32698, 32672, 32721, 32767, 32722, - 32713, 32678, 32740, 32688, 32694, 32759, 32720, 32739, 32754, 32691, 32698, 32760, 32696, 32758, 32746, 32676, - 32704, 32668, 32766, 32718, 32701, 32680, 32752, 32682, 32675, 32758, 32722, 32671, 32738, 32747, 32721, 32751, - 32713, 32764, 32682, 32758, 32766, 32688, 32712, 32707, 32694, 32747, 32691, 32713, 32740, 32683, 32697, 32706, - 32766, 32743, 32722, 32762, 32734, 32672, 32752, 32720, 32753, 32732, 32679, 32741, 32710, 32718, 32723, 32754, - 32752, 32701, 32671, 32760, 32755, 32744, 32725, 32717, 32676, 32713, 32756, 32746, 32765, 32736, 32676, 32735, - 32725, 32681, 32757, 32757, 32743, 32765, 32729, 32724, 32710, 32707, 32699, 32735, 32747, 32750, 32673, 32740, - 32728, 32745, 32761, 32761, 32680, 32693, 32693, 32728, 32717, 32701, 32688, 32742, 32736, 32715, 32716, 32715, - 32746, 32730, 32742, 32756, 32673, 32729, 32688, 32704, 32697, 32758, 32740, 32728, 32707, 32674, 32717, 32713, - 32735, 32696, 32676, 32699, 32737, 32706, 32710, 32667, 32723, 32740, 32715, 32673, 32674, 32690, 32766, 32759, - 32730, 32712, 32731, 32681, 32728, 32723, 32762, 32699, 32760, 32712, 32677, 32736, 32756, 32676, 32719, 32701, - 32750, 32763, 32684, 32700, 32708, 32753, 32691, 32727, 32686, 32766, 32704, 32725, 32680, 32738, 32721, 32688, - 32754, 32747, 32752, 32677, 32718, 32748, 32709, 32705, 32745, 32759, 32695, 32743, 32677, 32710, 32686, 32708, - 32762, 32726, 32686, 32739, 32731, 32670, 32669, 32672, 32686, 32760, 32696, 32724, 32681, 32706, 32714, 32693, - 32729, 32699, 32683, 32739, 32729, 32732, 32730, 32671, 32682, 32673, 32689, 32672, 32686, 32716, 32758, 32743, - 32720, 32699, 32713, 32718, 32682, 32689, 32753, 32726, 32764, 32680, 32710, 32755, 32719, 32756, 32736, 32709, - 32738, 32763, 32711, 32726, 32764, 32754, 32725, 32672, 32678, 32711, 32732, 32714, 32766, 32750, 32697, 32673, - 32760, 32755, 32717, 32670, 32670, 32679, 32716, 32715, 32704, 32758, 32755, 32681, 32705, 32758, 32754, 32729, - 32688, 32697, 32757, 32674, 32753, 32757, 32744, 32706, 32745, 32764, 32764, 32718, 32765, 32734, 32688, 32671, - 32729, 32737, 32762, 32731, 32693, 32735, 32667, 32707, 32710, 32730, 32745, 32668, 32703, 32752, 32669, 32675, - 32761, 32729, 32744, 32741, 32741, 32677, 32737, 32744, 32765, 32748, 32749, 32742, 32674, 32711, 32700, 32741, - 32673, 32693, 32694, 32691, 32721, 32748, 32711, 32705, 32676, 32705, 32679, 32733, 32699, 32766, 32693, 32734, - 32672, 32668, 32757, 32692, 32710, 32670, 32692, 32727, 32701, 32733, 32700, 32765, 32717, 32754, 32699, 32754, - 32752, 32752, 32701, 32723, 32762, 32730, 32744, 32724, 32765, 32718, 32763, 32695, 32731, 32673, 32742, 32668, - 32721, 32708, 32668, 32723, 32706, 32694, 32692, 32698, 32752, 32678, 32716, 32677, 32677, 32755, 32746, 32686, - 32684, 32737, 32708, 32721, 32706, 32746, 32738, 32754, 32741, 32699, 32755, 32714, 32763, 32764, 32753, 32757, - 32707, 32740, 32714, 32724, 32758, 32741, 32736, 32761, 32753, 32675, 32758, 32673, 32677, 32713, 32743, 32716, - 32756, 32679, 32754, 32729, 32728, 32729, 32669, 32721, 32764, 32724, 32722, 32688, 32699, 32722, 32739, 32700, - 32748, 32668, 32670, 32742, 32694, 32716, 32679, 32677, 32747, 32745, 32676, 32752, 32703, 32675, 32734, 32668, - 32756, 32742, 32713, 32730, 32735, 32686, 32711, 32686, 32676, 32756, 32766, 32668, 32746, 32749, 32706, 32676, - 32712, 32715, 32763, 32709, 32723, 32716, 32707, 32720, 32718, 32725, 32736, 32754, 32677, 32691, 32753, 32754}; + -17815, -21368, -27328, -13574, 10191, -32061, -16184, 1102, 26244, 24228, 23286, 5884, 290, -25441, + -29271, 18146, -24738, 14433, 13737, -26685, -14659, 26603, 4158, -28077, -16006, 18687, 4309, 8511, + 9845, -15997, -1330, 16489, 31328, -14784, -14373, -14206, 21972, 4648, -3786, 30544, 15660, -30417, + -8509, 13902, -16585, -30861, 160, -5320, -1656, -31124, -6366, -4742, 22189, 16932, -10556, -350, + 10679, 23605, -22042, -24948, -20173, -7099, -7775, -17288, -25903, -25262, 32699, 27711, 12608, 10942, + -23724, -26180, 26721, -4063, 31947, 16410, 21040, 8526, 16779, -6475, 27768, -5301, -18254, -25856, + -10649, 29843, 550, -23825, -5399, 7781, -16199, -18907, 13396, -5483, 30454, -32568, 20515, -27622, + 19589, 25230, 20424, 25898, -3093, -9801, -3336, -10554, 27368, -22800, -5885, 11579, 30895, 16875, + -17965, 15814, -10491, 23159, -5896, 15629, 16866, -5565, -24569, 1345, -18558, 23643, -18483, -28737, + 12336, 2161, -3222, -23115, 27478, 26997, -23097, 21937, -23268, 25813, -29593, -24538, -14414, -32123, + 11622, -32666, 20612, 30977, 16017, -3104, -853, 18810, -15804, -4984, 29311, 10386, 63, 29521, + 17348, -27133, 8097, -18258, 17735, -3555, 19603, 17174, 7269, 24288, -7765, -20338, -9224, 2306, + 13708, 26947, 27156, -27538, 16613, 12651, 22341, 20335, -5031, -18751, 28295, 272, 22665, -8436, + -22515, -31488, 23338, 19511, -2114, -28632, 19202, -1540, -14729, 32065, 8129, -21045, -25775, -25902, + -19020, 12116, 10434, 18325, -4834, 25813, -29276, -2711, -31885, -14268, -28511, 30977, -14621, 890, + 30818, -6436, -17903, -9769, 25230, -16302, 32428, 22847, -25071, 28916, 2656, 28419, 32384, 20671, + -15357, -11088, 11875, 6432, 27853, 27100, 27807, -13221, 11067, -27645, -30939, 14624, -1613, -14859, + -25128, 27025, -6432, -2294, -5231, -2396, -6465, 14850, -13477, -2072, -8331, -15201, 22587, -6932, + 17389, -26267, 31315, 4794, 641, 19587, -18000, -10175, -8816, -366, -358, 10741, 233, 5756, + 27110, 7700, -1670, 14360, 11107, 22196, 32190, -24273, -10091, 13540, 1349, 9069, -8644, 638, + -18709, 22174, 21254, -27893, -21013, -28467, -27078, -3785, -25224, 248, 1330, 32517, 7423, 31215, + 14499, -23945, 22691, -6722, 10356, 97, 31457, -8923, 25833, 20713, -7734, -28296, 9403, 2976, + -25895, 29944, -32474, 28655, -23990, 22547, 5676, -1187, 6766, -13047, -8430, 32002, -9225, -6230, + -1569, 7185, -30590, 5486, -7251, -19580, -16170, -17542, 22905, 11771, 3956, -26917, 20562, -642, + -24680, -7149, -22564, -11529, 21239, -21693, -32570, 27795, -3370, -10575, 24321, -13606, 16389, -24882, + -19094, 29945, -25341, 19014, -20192, -853, 26120, -14178, -14442, 20496, -13944, -28869, 7935, -17722, + -23399, 26131, 28945, -27557, 4254, -180, 27811, 4443, -27735, 13679, 2061, 19530, -1001, 20730, + -25951, 15327, -12955, -7941, -22886, 31004, -17841, -27158, -9876, 21277, 15202, 27981, 8382, -9071, + -23463, 8270, -23280, 18684, -298, -10302, -5165, 27576, 32155, 26119, 4805, -25421, -7060, 9556, + 11442, 17168, -657, -5921, 31382, 26021, -19073, 30544, -27660, 7004, 13546, -7965, -9214, 12467, + -32651, 29526, -8261, 10876, 23192, -20425, -5899, -15960, 32538, 16298, -26943, 23728, 26600, 20560, + -21969, -21738, 30294, -26638, -14360, 555, -25630, -16818, -10948, 17535, -4673, 1609, -12743, -12816, + 29461, -5646, -15038, 29659, -4558, 7893, -650, 7873, 24946, -2858, -6598, 20415, -511, 26219, + 22785, 26257, 27928, -26047, 20413, 11564, -1093, -21000, 4297, -21553, 3317, 18441, -17742, -11929, + -24531, 12204, -32065, -29194, 8215, 15397, 22835, 12405, -30438, -29153, -11521, -3549, 13615, -20773, + -6261, 15191, -26318, 17674, -27460, -10002, 27263, 14895, -6206, -30583, -25092, -23479, 9299, 27794, + -32040, 30214, -22273, 25652, -28796, 21735, -27813, -15826, -20651, 6865, 1851, 16467, -17443, 7183, + 2295, -28719, 7993, 18496, 3361, -29371, 20875, 27683, 27935, 5789, 25596, 9678, -25326, 2951, + -31429, -9734, -925, 12325, 9564, -14412, -6119, -12368, 9838, 25159, -13790, 59, 13986, -4379, + -14454, -16626, 18226, 12595, -19317, 9363, -26709, -19881, -23409, -14514, 18009, 32458, 5629, -12150, + 30777, 20404, -31851, -20905, -4059, -3259, -11826, 16439, 11993, -29343, 25067, 16867, -29243, 4916, + 12640, 28838, 25796, -28457, -21235, 30600, 255, 20167, 8513, 16929, -1964, -16059, 3096, 24569, + 29558, -4648, 13586, -23053, -13362, -9662, -4847, -32173, 7371, 2795, 8387, 9178, 21108, 32173, + -30824, -372, 6025, 3041, -12801, -527, -9193, 9628, -4413, -30918, 20556, 12780, 23771, -29356, + -18761, 13977, -30013, 20257, -17622, -22464, 19151, -27188, -17996, -26774, -30894, 9557, 3449, 23131, + -10287, -5463, -24729, -6810, 22091, -32124, 10132, 16139, 23188, -7710, 1190, 13757, -8269, 26092, + -23255, 903, -15425, 25372, 22369, 24192, 19937, -4775, 31777, -2228, 716, 17521, 8001, 42, + 1031, -20776, 21068, -25149, -25174, 21121, 23866, 31886, -9837, -16106, 16786, 2049, 7212, 12927, + -12843, 12759, -15559, -21245, 20665, -27022, 5426, 16695, -12914, 7045, 15052, -31613, 17379, 11259, + 14393, 12261, -31185, 18773, -9178, -12781, 22667, -16146, 6604, 14988, -5777, -1753, -22588, -19220, + 25399, 18713, 23226, 27440, 12518, -19811, 22294, 31161, 14314, 16749, 1146, -14186, 26714, -16519, + 28933, 12249, 28029, -26599, 4587, 1493, -2635, -11016, 26040, 13320, 29402, 17364, 22254, -60, + -4545, 28773, 6065, 4888, -29118, 31000, -14409, 26605, 4467, -26568, 15511, -12048, 1713, 2623, + -24904, -20454, -3602, -8970, -17117, 4891, 4777, 8018, -14944, 20292, -6015, -30133, -10904, -32054, + 2824, -12982, -26020, -28606, 5397, 15998, -31165, 21555, -11792, -15075, -15817, -12621, -14578, 10050, + 13575, -26411, -4598, -27115, 16966, -11104, 28681, -13557, 5740, -13918, 9534, -20583, 14192, 29743, + -11434, 28705, -26561, 16587, -7612, -18742, 25631, 30020, -31844, -32455, 3388, 31579, 16640, -16428, + -9927, 28484, -16681, 5510, -28117, 21958, 15334, 23922, -497, -17715, -29057, 30907, 28357, -30080, + -23775, 4318, -2171, -22924, -14840, 177, -651, -8907, 25332, -29080, 23661, -27874, -3542, 19707, + -1338, 30598, -16218, -6188, 8672, -32495, 178, 17357, 1760, 15814, -30135, -25173, -17645, 30908, + 15249, 14844, 4488, 18040, 1851, 21524, -1224, -31152, -30498, -17129, 29643, 9067, -7951, 9535, + 21444, -16302, 22840, -31061, -7773, 14802, 5165, -842, 24174, 26421, 16102, 5781, -31167, -23743, + -2476, 32432, -4125, 9245, 23120, 12603, -18, -16932, 17922, 23587, 31358, -32005, -16518, -5043, + 3800, 6268, 29565, 16673, -12252, -19191, 12400, -17448, -11606, -17654, -11158, 10382, 7645, 14521, + 5750, 4545, -9405, 18190, -18470, 2976, 2452, -8346, -18684, -10387, 18747, -20787, -31513, 26725, + 11984, -8356, -29894, 27970, 25520, -5396, -1172, -20395, 8519, 23657, -21791, 17625, -22948, -31237, + -15089, -22796, -17576, 21033, -13430, 5997, 10818, -28589, -25213, 18180, 24153, 11872, 13904, 19947, + -30813, 24622, 7829, 26586, -20899, 18510, -6490, -25473, 7173, -1035, 15750, 27442, 14396, -3917, + -11631, 24641, -14361, 25855, 15136, -22845, -4157, -15013, -9565, -13454, 8301, -27767, -29676, -22074, + 8509, -8017, -24972, 8309, 19236, 21821, 10869, -18909, -980, 6182, -9119, -12507, 16627, 32022, + 7247, 6099, 10652, 4587, -20576, 10538, 16482, 24438, 30055, 10228, -1051, -3587, 2883, 3707, + 20281, -3523, 18735, -28752, 22950, 14881, 32143, 10995, 12517, -21968, 5070, -25436, -8183, 30181, + 10791, -2448, 2558, -20137, -13951, -2836, -21692, -16524, 7108, -16385, 4269, 18929, -10910, 24655, + -20461, -2643, -22158, 8904, 25843, -985, 29098, 24314, 28593, -19947, -26059, -13006, -14584, -20462, + -10473, -6644, 15983, 21544, 22015, -13895, -15347, -27814, 25587, 2907, -18249, 24790, -28569, -21478, + 25230, 26688, 23751, -21013, 20365, -3461, 9308, 6724, 1580, 17239, 23317, -7058, -19359, -19058, + -10915, 22123, 15280, 31467, 29858, -4920, -21687, 3228, 14843, -15490, 29409, -11883, -5153, 23002, + -17847, -23900, -22858, 4443, -1135, -20164, 30991, -24190, -13619, 7560, -17517, -20511, -7204, 29172, + 27405, -23793, -11466, 20092, 4338, 10908, 30004, -30925, -11193, 31358, -20424, -11256, -19993, -12842, + 27654, -2393, 27803, 2835, 6287, 29165, -5217, 23801, 27033, 25792, 7370, 28876, 24331, -12843, + 21536, 14876, -22068, 25264, -13506, 11383, 8195, 14642, 27797, -1485, 29095, 22433, 14642, -27944, + 30354, 31269, -4051, 214, -7639, -19665, 17888, -11405, -30835, 21338, -9928, -31098, -26118, -5126, + 11105, -2516, -6674, 32079, 28294, 31660, 22475, -5206, 31506, -8198, 25349, -17474, 3269, 5716, + 5856, -2783, -10729, 13857, -24854, 12214, 2285, -19292, -14938, 14207, 7010, 19320, 8186, -2708, + -17214, 25555, 25897, -2470, -19140, -26920, 12912, 19688, 30097, -355, -31536, -30400, -16139, -10058, + -31024, 7147, -1741, -21584, -12374, -28509, -23972, -29644, -21442, 19076, 3216, 2417, 19557, -1059, + 9644, -18107, -25549, 4662, -442, -30177, -1621, -2620, -25036, 20339, 31486, 6780, 23251, 8321, + -8871, -28968, 22585, -32049, 2710, -722, -14187, 28068, 29509, -4388, 1532, -2595, -16912, -853, + 24039, 635, -23716, -11548, -17556, -32461, -17665, -25112, 319, 3739, -4793, 31397, 24935, 22593, + 25401, 28192, 5778, -4825, 5263, -25141, 27271, 24908, 25415, 23244, 14541, 7691, 23975, -19984, + -11670, -28864, 26792, 7380, 28931, 20009, 4012, -15451, 11606, 27997, -7515, -8780, 29302, -7568, + 32361, -11053, -7003, 31233, 4848, 23172, -22938, 3965, 3248, 4386, -4110, -15353, -32357, 28614, + 16993, 11201, -9883, -26106, -992, -29994, -19724, -10884, -18448, -28185, 5418, -9138, 5981, -27219, + -19640, 2461, -21285, -8371, -2917, 22886, -23733, -17745, -16067, -2094, -27514, -107, 29917, -19762, + -11523, 12007, -27282, -29472, -12294, 31028, -24128, -23754, 24290, 8511, -6110, 11844, -25433, 15241, + 1389, 17404, -4137, 9135, -1483, 783, -10517, -22753, 13520, -17619, 1577, 30214, 10577, -7605, + -13370, 3728, 24756, 25627, -18274, 24425, 8080, 22287, -13718, -18765, -24692, -2352, -26860, 2305, + 30003, -15851, 11342, 14400, -25245, -9327, -19138, 15128, 6949, 1452, 27399, 21193, 288, 15407, + -23622, -28656, -18308, -20401, -10345, -12408, -21310, -24451, -6008, -16393, -32455, -23521, 3889, -13262, + -31345, -17203, -12967, -21120, 6715, 11426, -31364, -4421, 22857, -14495, 13295, 22180, 12805, 26525, + -29758, -30145, 25764, 17810, 10405, -11322, -23886, 24385, 438, -1156, -3996, -5893, -20407, 6486, + -3160, 23661, -6403, 475, 23550, 14490, 10627, -9049, 3548, 16194, -3813, 21353, -14714, 11293, + 18720, -8190, -9986, 29643, -25437, -32647, 24426, 5509, -21909, -553, -27347, -8453, -32514, -24399, + -1237, 32733, 1672, -2621, 29775, -1172, 16901, -4142, -20963, -8402, -4292, 10208, 21090, 154, + 27968, -28326, 29434, -22060, -16504, 15227, -32306, -13195, -16691, 15150, -15226, -11472, -4857, -6175, + -20735, 274, -28557, -26427, -20052, 21382, -24008, 5528, 3882, -7576, -2376, 6370, -26487, -12509, + -11893, 32380, -29989, -22930, 30547, -16380, 2477, 4696, 24145, 19543, 2208, -22104, 9344, -32200, + 10438, 15077, 6320, -25877, -13937, 264, 30959, -19401, -12394, -13154, -13093, -23540, 27963, -32516, + -17304, -9311, 17751, -11959, -22621, 8962, -14455, 22714, -31186, 28967, 6011, -23086, -22619, -17716, + 4510, -15155, 3094, 28306, 1301, -25573, 1591, 26089, -3142, -15809, 5866, 20260, 6943, -27088, + -1074, -568, 12471, 26482, -14523, 22034, 17788, 13184, 18292, 13235, -7183, 30192, 20907, 22618, + -63, 23449, 20710, 1166, 2872, -10851, -18143, 16432, 6618, -1872, -13003, 23524, 12897, 11004, + 8160, 1384, 9748, -28727, 24192, 3950, -13282, 14138, 32461, -8761, 32639, 30500, 4906, 31086, + 3597, 6921, 15188, 25799, -29282, 21325, 28601, -17117, 27689, 32025, -67, -29409, 31176, -18366, + -29125, 24904, -3674, 10419, 4334, 10536, 30560, 11170, -24333, 13023, -18374, 21024, 22733, -6045, + -20750, 4851, -5450, -17264, 24501, 12251, 29, 18573, 22327, 8536, -9145, -20404, 7544, -31118, + -27521, 7221, 23396, 5310, 2660, -11532, 23520, -717, -23116, -4089, 32395, -16929, 29650, 8198, + 11511, -3963, -7226, -23122, 25594, 6373, -13483, 31428, -32007, -2013, 11738, -20410, -20883, 11875, + 9978, 13989, -26633, -30788, -3984, -9537, -31938, 27857, 28911, -22154, 22837, -3784, 15165, -7720, + -14638, 31548, 16360, 12631, -11172, 4325, 16218, 31558, 21190, -19656, 16065, -23946, -11916, 23405, + 19037, 26376, -24003, -13765, -16320, -9731, -29590, -30736, -22862, 21541, -25258, 31282, -11905, -26247, + 28471, 8692, -15628, -13725, 16621, -15814, -1067, 31831, 21629, -25249, 9709, 24568, 28795, -12491, + 15010, 23288, 8027, -14784, 21158, -18614, 5834, -13567, 7856, 32115, -27746, -2965, 24070, 26825, + 1629, 11874, -26594, -14115, 9343, 20336, 18178, -5138, -7450, -21010, 2664, -28682, -23858, -25276, + 22272, -21829, 3685, -26379, -21709, 21437, 24626, -14632, -24029, -16784, -1905, 22328, -13896, 21327, + 20760, -10181, 9854, 8531, 29097, -25521, -16557, 4904, -18510, 11042, -5539, 27083, 9071, -10289, + 4434, -14990, 14883, 16112, -11413, -31392, -1638, -6205, -7781, -22343, -23889, 10301, -2875, 3183, + 23959, -13468, -8895, -26416, 4280, 29915, -6149, 23383, 32345, -18892, 24489, -14799, -32519, -5154, + 25034, -557, 14373, 19183, 17109, 28048, 3625, -15003, 121, 3342, 17792, 25326, 32735, -28362, + 21749, 22523, 722, -18903, 5858, -23272, 9280, -24252, 6931, 2490, -20454, -16623, 25463, -25712, + -17236, -20127, -5185, -29346, 31562, 8774, -4326, 18499, 1914, 17205, -17766, 23500, 24554, -767, + 5310, -3206, -2678, 26665, -29990, 13823, -24352, -15648, -21263, -4663, 8373, 31958, -32624, -19700, + -20714, 1548, 28622, 9675, -26451, 10924, -13380, 23009, -27078, -16590, -8164, 25325, 26807, -21965, + -31089, 14931, 31651, -19709, -16883, 3132, -4868, -3310, 26114, 19705, -28613, 22252, 15028, -24771, + -17609, -7432, -14694, -6646, -4211, -13457, 13737, 20690, 19312, 10097, -29244, 22871, -21572, 31497, + -755, 3613, 31923, -15775, 2339, -9957, 28540, -10397, -29492, 14345, -10492, 3731, 25719, -6499, + -2708, -24223, 19243, 28777, -16089, -8998, 16094, -18763, 13266, 30587, -9031, 31952, -4421, -8630, + 20991, -18385, 7483, 11358, -26213, -14075, 11863, 6238, -8027, -25640, -22315, 18721, 8669, 17300, + 30093, 3194, -25865, -30890, 30812, -31267, -20726, 13936, -18305, -25101, 7031, 16593, 12573, -12889, + -19983, 4779, -1839, 1547, 4558, -17146, -28985, 25161, -21039, 9535, 23803, 28053, -21743, 28807, + 1990, -2090, -20912, 27952, -10550, -19057, -2446, -10047, -20403, 6832, 3954, 22312, -30584, 257, + 30193, 30421, -16211, -25227, -533, -12167, 2437, -10925, 3933, 31155, -25299, 23329, 19381, 1842, + 12642, 24098, 9062, 25788, 9358, 7560, 6172, 4024, -26671, -16506, 29242, 31051, 30007, 28777, + 18627, -28703, -20942, -23883, -20218, 23641, -16405, -7673, 28965, 16072, -7768, 19181, -16189, -15246, + -25691, -28919, -21036, 21015, -28406, -30542, 9057, 30018, 19319, 30623, -3447, 7987, 19703, -13099, + -30566, -5631, -25429, -2742, 18488, 7722, 12476, 25327, 25199, 19119, -10086, -22218, -20793, -219, + 1551, -29964, 2081, 6806, 7131, -4313, 14921, 10929, -8226, 21676, 26258, -25261, -1026, 13777, + -2561, -27014, -471, 16263, -16790, 16189, 10452, -3219, -19517, 17465, -27828, -8576, -26386, 11293, + -2740, 15397, 27144, -11251, 19785, -16162, 19439, -20342, -25431, -30732, -19862, 16453, 19727, 14077, + -15118, -11889, -29616, 10161, 10160, -1741, -8556, -19202, -18944, 20977, -9553, -14639, -966, -8893, + 4614, 7040, -8560, -13061, -23316, -24460, 20329, 3140, 6776, 14155, 18548, 27275, -5661, 15969, + -10826, -2194, -24237, 16892, 14823, 18756, 26469, -10946, 25083, 28997, -9570, 16691, 11388, 28801, + -26098, 17497, 28279, -31271, 6169, 19296, 4334, 23872, -21008, -8470, -90, -22061, -25296, 19092, + -4048, -13521, -30565, 16539, 7692, -23853, -14217, 32274, 27551, -20070, -2009, 20755, 22853, 3170, + -26620, 10089, -29878, 30321, 11621, 21363, -18803, -22364, -11349, -9523, -5321, 13863, -26035, 9993, + 12278, 26647, -25832, -1787, 15712, 27685, -21898, -1540, -17940, -2475, -15670, -28289, 18001, 13442, + -5474, -23620, -19768, -25787, 4279, 18807, -25258, -31482, -1190, -4749, 29477, 18639, 11907, -3344, + -28998, 12996, 20367, 7375, 1370, -12928, -6503, -818, -1443, 31428, 28633, 14773, -17875, -22647, + 8112, 13418, 18032, -6154, -26627, -29495, 28876, 20534, -27642, -20882, 10495, 13933, 14397, -5969, + 28228, 11477, -2934, 31584, -25982, -753, 11186, -29166, 6665, 9494, 25821, -3716, -31151, -31712, + -5543, 3408, 8284, -16944, 6158, 13401, -19816, 382, -80, -16689, 1929, 22974, -8570, 31439, + -7890, -24503, -3558, 15268, 27141, 3951, -26891, 5676, 23053, -1338, 23448, -6795, -24486, -23625, + 9252, 1301, -8283, 4340, -18774, -760, 23623, 15589, 30290, -2732, -9975, 12786, 5162, -32055, + 10017, 25815, -29353, -17878, -8300, -16558, 19124, 7068, -10362, 12262, 27804, -6631, 9447, 30298, + 25744, 24726, 7913, 29620, 29842, -18617, -8931, -27352, 2207, 1452, 10373, -15093, -7334, -896, + 20790, -10179, 9069, 26584, -27537, -130, -15403, -1190, 32549, -16138, -31955, -8191, 14101, -5581, + -22377, -12398, 32486, -22531, 11419, 18356, 12187, -19754, 13806, 20325, -14380, 28163, -26981, 7223, + 16626, 11906, -22100, 3025, 24139, 4805, 24219, 16319, 5170, -21063, 15839, -10708, -9248, 25370, + -13577, 29377, -365, 1430, -25971, -32103, -4572, -11042, -21109, -15504, 30062, 11278, 19233, -19327, + 24815, -25665, 22383, -7494, 17580, -17815, 32346, 7765, -13905, -14241, -17097, -25795, 7166, -19553, + 31647, 24215, 11875, 32295, 6084, -27480, -8450, 19553, -18982, 20457, -16237, -12392, -28167, -12165, + -21374, -16685, 802, 29920, -11953, -19992, -22364, -22339, 4986, -27401, -15908, -31694, 16807, 32541, + 8128, 950, -12098, 622, -21618, 28212, -13161, 3036, 9763, 2813, -31565, 9112, 6546, 571, + 20108, 3191, -5792, -12445, 1348, 17334, -2900, 29194, -28544, -17005, -4664, 20179, -26417, -14267, + 13916, -17600, 16758, 755, -18645, 12095, 3919, 8382, -30673, 12860, 19687, 26106, 18946, 4767, + -22367, -9620, 2853, 7410, -1394, 21069, -13236, -14597, 32457, 8102, -13492, 27669, -22882, 20984, + -32315, 7667, 13951, -644, -9856, 28930, 10362, -7855, 18228, 28550, -15989, 26945, 23560, 14200, + 1445, 23412, -5263, -16139, -26795, -13549, -8353, -11895, -20605, 20830, -23406, 22652, 28451, -11183, + -20466, -14715, 12683, -12737, 26508, 4591, 14868, 2957, -31660, 11863, -4751, 650, 31823, -27202, + 17708, -25623, 9622, -21986, 28163, -12156, 11660, 18690, -16253, -5316, 8119, 3999, -20307, -12594, + 27594, -21230, -9162, 23496, 27653, -27863, -6469, -25024, -26551, 32735, -27756, 32382, -11306, -19435, + 23247, 28029, 606, -11542, -18818, 18845, 13194, -3977, -23677, 31862, 26813, -30919, -9292, -29492, + -25696, 11771, 1245, -11214, 6087, 16710, 28718, -20317, 23761, 9107, 21277, 27512, -9441, -11204, + -29434, 11860, -846, -9204, -525, -20373, 3641, 6482, 23343, 18140, 16883, 22980, 3523, -21726, + -20990, 28114, -17807, -32589, 15183, 13213, 5661, 19880, 3722, -31791, 5910, -9800, 169, -21765, + -8405, -18327, -10655, 10938, 28081, 17771, 33, 2657, -21062, 11005, 29824, 6586, -4109, -23148, + 30171, 30573, 27373, 4005, 17773, -514, -31232, 449, 4722, 3507, 12642, 20020, 18568, -3784, + 24573, -3180, -30539, 23139, -15210, -19311, -16926, 21535, -3920, 23588, -22421, 2232, 18348, 7427, + 26802, 28922, 5664, -15396, -10644, -31649, 28487, -23427, 22350, 29146, 4417, 23805, 31981, -16972, + 21593, 8514, 3089, -12594, -21259, 9177, -245, 16916, 10517, -12886, 12412, 10580, -9298, 17116, + 29745, 12696, -13815, 6137, 4285, -13922, -30193, -6387, 10367, 15046, -29909, 20865, 26583, 6927, + 30033, 8828, -29053, -18666, 25891, 6838, -4490, 8727, -28605, 16576, 12833, 26511, 31416, -11835, + -13146, 7178, 10125, -23496, 7272, -17818, -10584, 15196, 23488, 20592, 17429, -18641, -21956, 24088, + 2302, 32666, 22673, -9283, -18869, 21181, -22306, -31743, 7024, -20823, 8990, 9918, 27534, 18838, + 28603, 7286, 18276, 1565, -3860, -22089, 9001, 3015, 20420, 888, 14933, -7769, -10250, -16406, + 24401, -27399, -15927, -15389, 10720, -23528, 7046, 20138, -22494, 14714, -22306, 6528, -16091, 5925, + -7809, -31473, -15861, -24151, -5904, 18006, -18462, 7164, -5383, 25977, -7977, 9774, 18484, -11817, + 29999, -16771, 32209, 20202, 8769, 8030, 15882, -15321, -11330, 18365, 7122, 26223, -29687, -23716, + 26664, 18629, 15727, 23716, -216, -6498, -6203, -26763, -26263, 18431, -23836, -17467, 6498, 17415, + -15288, -12798, 19011, 16771, 12922, -401, 15699, 18726, -20108, -26175, 9618, -17280, -14058, -2368, + 19864, -11998, -20007, 19448, -31461, -3789, 14074, -25530, 16370, -13537, -32526, 13317, 8221, 6308, + -29835, 2037, 1051, 12551, 8461, 26778, 10762, -23695, 22101, 32515, 27483, 2773, -1271, 8652, + -1927, 28493, 16922, -15976, 13404, 1432, -19827, 6516, -22103, 12667, 32388, -4819, 9273, 9277, + -28367, -19370, 26565, -25659, 12961, 11174, 21392, 15622, 29141, 32236, 30553, -31136, -6725, -11813, + 3342, 6667, -16498, 12549, 11858, 14404, -17581, -10218, -31463, 28091, -14219, 5794, 14992, -25487, + -5610, 15502, 10578, -17018, -21036, -30828, -6839, -24165, 23354, -18939, 1398, -11945, 32171, -17458, + 9412, -12496, 30883, 733, 3560, 20134, -8167, 19974, 17245, -23608, 17972, -25463, 19977, -14876, + -1768, -6866, 13184, -22039, 26488, -18223, -22661, 127, -4499, 23652, 6728, 713, 14536, -4471, + 11575, 5615, 8988, -12, -32017, 10042, -2262, 20201, -19517, -10354, -23298, -17776, 22428, -25884, + 26046, 19577, 26394, -19938, -26288, 22761, -12069, 5705, 11066, 441, 19729, 1996, 10606, 12623, + -30019, 12749, -8887, -1208, 31018, 22739, 18065, -5397, 14722, 14258, -21388, 17582, -28248, -2991, + -28798, 15979, -10386, 17900, -6367, -13973, -17035, -20884, -15704, 3091, -13567, -25071, -23325, -6642, + -27409, -20153, 26513, -9661, 12417, 16572, 25359, 8591, 26569, -28093, 11960, 4218, 13483, 16172, + -19237, -30236, -25246, 27183, 16491, 4373, -31432, 22482, 6973, -18012, 13669, 30801, -7474, -14442, + 5306, -290, -1588, -8220, -20481, -32404, -12567, 27087, 25593, 31308, -26285, -25185, 27044, -24344, + 14347, 19125, -26760, 22215, -15152, -1188, 30536, -16541, 9921, 26068, -31623, 31795, 16774, -9938, + -12346, -28556, -23427, -5751, -22332, 31796, 17283, -13552, 17715, 13843, 997, 2519, 8470, -30021, + -12606, -29787, 2436, -15819, 8080, -16663, 27902, -15176, -1083, 30349, -6668, 4565, 21601, -6985, + -30432, 28187, 31368, -2914, 19776, -24476, 32246, -1269, 14986, 14065, 26736, 9151, -25844, -3689, + -32581, -7335, 13949, -25211, 5948, -15001, 31531, -16748, -31681, 4797, 24378, -30996, -7056, -20123, + 4388, 19945, 3541, 9143, -14965, 17782, -27676, -8056, -19870, 3908, 26882, -6764, -16877, 10975, + 2629, -18008, -9661, 28723, 15331, -30904, 13337, -15063, 450, 23133, 15767, -8415, -4156, -11322, + 12201, 8755, 12596, -13964, -2608, -31762, -26096, -24274, 16010, 29782, -26561, 29045, 2545, 29672, + -20307, -27362, 14389, 1908, -17733, 15485, -31313, -18595, 8767, -13866, -12529, 1026, -24759, 29055, + -28956, 8793, -8318, -17889, 19914, -32142, 21188, 32643, 29191, 12350, -20602, -27351, -6177, 16292, + 19713, 32442, -12765, 16199, 18578, -10952, 16159, 26353, 24715, 1579, 28336, -29529, 15859, -30301, + 9417, 20984, -24445, 8166, -6810, 26985, 6336, -26986, 28452, -19058, -28587, -1183, 20413, -6581, + 8037, 19430, -14316, 21154, -4345, 32440, 13807, 28784, -5451, -28577, 8086, -21166, 8403, 21949, + 25274, -10652, -31370, 8576, 743, 20270, 18829, -2548, 30237, -17074, -12476, 27988, 18684, 2566, + -19592, 7075, 2541, 3101, -23083, 27124, -13347, -10073, -27564, 30165, -23628, 11788, -9059, -15932, + -6950, 2339, -16226, 2397, -26829, 16263, 14682, 6976, -25310, 15820, -425, -23802, -6137, 20562, + -24363, 1493, 22170, 19223, 18119, 3762, -26586, -16542, -25229, 11583, -25616, 30262, -19868, -10546, + -246, 7435, 19195, -29325, 25416, 12393, 27243, -2752, -17554, 21649, -18620, -24372, 10282, 16301, + 29297, -12594, -22933, 25332, -19542, 18126, 5829, -25657, -11115, -23872, 4302, 24020, -12102, 15098, + -2788, 32249, -29598, -30976, 31787, 22802, -11541, 11638, -15972, -9262, 28808, -12312, 1835, 8470, + -6530, -17316, -28943, 12501, -14364, -13933, 29473, -2919, -11833, -7824, -7418, -29392, -27823, -3321, + -24429, -6213, -12070, 19661, 1519, 289, -5855, -18598, 24043, -13525, 25471, 15619, 20684, 15250, + -30344, -8411, -27901, -26613, -32028, 20356, 22074, -16870, 3864, 8147, 25990, 9893, 19395, -28365, + -5471, -19485, 558, 16836, 26014, -10555, -1546, 2495, 22456, 21686, -18879, 21635, 26685, -4986, + 17237, 24217, 10365, -14085, 9857, -25683, 10820, 9817, 2614, -20431, 8217, 8809, -18041, 21665, + 21890, -5380, 4952, 22733, -31301, -7843, 15148, -5565, -31027, -30578, -5446, -6480, -14132, -31040, + 21496, -11238, 6587, -31829, 5125, -30644, -26296, 9117, 11577, 7748, 10751, 13473, -18653, 5834, + 26742, 22849, 17705, 25140, -29532, 2496, -7034, 15746, 23025, -4194, 20871, 22900, -29736, 15838, + -25817, -3734, -14295, 25499, -17835, 22395, 2579, -31116, -8303, 10545, 13610, -15738, 15335, -30759, + -25228, 8892, -30645, -29905, 6802, -29456, -23334, 18527, -6430, -9749, 25565, -10530, -3453, -23701, + -5892, -13568, -31446, 2597, -23308, -32044, 16402, 19361, 13362, -6300, -468, 21331, -27769, 18274, + -21819, 10646, -19365, 20358, -32371, -24378, -21046, 20578, -9669, 23842, 13638, 4377, -3368, 14740, + 29873, -1310, 775, -25615, -12091, -9820, -463, 22906, -23971, 19386, 28185, -16972, -19316, -6560, + 17661, 22853, -10561, 30797, 15049, -21237, 4179, -30829, 3557, -13990, 22651, 10456, 11172, -20497, + -18967, -22798, -4066, 23045, 26398, -1492, 7226, -29092, -17730, -23783, -16672, -28538, -1655, 32005, + -14871, 29473, -11079, 24263, 21654, 32467, 10061, 19461, 20255, 23025, -28190, -31269, 28998, -10396, + -20894, 23385, -28845, 31741, 8516, -31898, 29534, -3516, -400, -14638, -900, -68, 15214, -25348, + 10333, -16197, -7005, 25285, -17291, 23469, -5115, 14643, -18826, 14585, -23691, 6840, -11356, 3648, + 32515, -19755, 12868, 25181, 29747, 21172, 11986, 30449, -18630, 31983, 5879, -2700, -9876, 23577, + -17204, -80, -31971, -7715, -2010, -12254, -29115, 17261, 15777, 32046, -18489, -17746, -22726, 22061, + 9895, 18751, -12993, -2557, -27535, -6031, -8346, -16518, 17996, 3470, -264, -10513, 7557, 30364, + 6677, -20697, 29146, 4547, -8188, -19964, 21388, 11564, 19342, 15676, 32614, -11977, 12440, 4776, + -24345, -18854, 3189, 23802, -5622, 143, -15332, 1622, 5459, 27220, -13791, 8235, -4002, 23877, + -29514, 8311, -24051, -20462, -7788, -16167, -27842, 4119, -10560, 17773, 6075, -16642, 27981, -6320, + 29714, 1957, -24499, 30863, -9304, -6666, 32600, -9382, 5995, -6598, 24085, 14834, -23751, -19153, + 8362, -7328, 26477, 22521, -9034, 16668, -22376, 26588, -9501, -6100, 14240, 19547, -24006, -15766, + 21060, -18544, -2660, 137, 11350, -18310, -11887, -30633, 32592, 19213, 31856, 3187, -20555, 9948, + 15087, 3158, 13148, -15871, 27588, 9540, 7027, -28586, -21131, -16873, 25371, 11992, -3185, 11022, + 26466, -9084, -14433, 21935, 27071, -3029, -28666, 6606, -12679, 6263, 32420, 23521, 32544, -514, + 19819, 1839, -17662, -17983, 21461, 14277, 6560, -29213, 1466, 2410, -30411, 10322, 5680, 7760, + -8887, 19015, -11065, 2606, -6106, 31570, 3706, -1406, -15191, 24951, 13232, -28451, 19172, 8895, + 16304, -27770, -5892, 30399, -3637, -24451, 31252, 25539, 16314, 7630, 30804, -26341, 9625, -7361, + -9546, 11968, 10545, -13866, -5359, -412, 21709, 13283, -24848, 2404, 4245, -20616, -12168, 10511, + 8160, 26586, -10857, -20322, -1691, 7899, 24884, -27908, 11917, 12003, -23019, 14109, -6969, 29333, + -32220, -17676, 12989, -16266, -13990, 8134, 26852, 6001, 16759, -25257, -7534, -10190, 15041, 20217, + -29539, -26589, 8440, 10135, -3299, 10685, -26198, 22416, 7511, -31674, -514, 1726, -27707, 24604, + -1353, -8284, -31726, -28479, -15925, -11251, -19958, 10662, -4721, -7405, 30135, 29733, 24858, 27838, + 27951, 3511, -18713, -27563, -29407, -16643, -12947, -3420, 6505, -28890, -27936, -26280, 24561, -19481, + -653, 21306, -21880, 6906, 28990, -20776, 30014, 7267, -8792, -29427, 31392, -3433, 15130, 31416, + -15272, 13155, -9021, -13559, 25876, -24903, 30696, 1117, -5205, 4062, 13560, 27569, 26104, 23941, + -11991, 23983, -21939, 10347, -20299, 18285, 30825, 7075, -23370, -22598, 17759, -10713, 11944, -20343, + 8853, -4935, -13115, 11710, 18377, 19671, -5643, -12620, -26291, -25183, -9590, 29805, -15919, -14335, + -18576, 14093, -32204, -21559, -25625, -16401, -17314, 24372, 28297, 30891, -4311, 6230, 32733, -30335, + -773, -9807, 25771, -16052, 6540, -29022, 19431, -30069, -9172, 24565, 30436, -30832, 7728, -15329, + -26338, -24742, 13242, -20324, -4509, 21163, 17733, -10920, -23804, 25125, -6108, -1077, 25447, -12741, + -9295, 206, -20724, 24703, -21097, 4155, -4254, 18060, -19632, 24385, -25601, 9774, 25137, 5082, + -31682, -2088, -10302, 7968, 11877, 1841, -25951, 9202, 26651, 29278, 12372, 24994, -28585, -9371, + -7360, 24593, 6456, -27625, -8535, -9807, 769, 24595, 20091, 1586, -17737, -28093, -1411, -15838, + -22501, 27690, -20129, 12855, -25026, -5589, 22689, 18204, 19752, -30343, -11727, 25983, -9132, -12035, + 8972, -6245, 5514, -22628, -21339, 24384, -3329, 25334, -31785, -23393, -14096, 5850, 19974, 30628, + -30720, -28059, 24013, -8834, -1293, 8008, -4663, -8094, -25214, 6689, -16863, -30353, 20819, -25083, + 30497, -12960, -31398, 16783, -6076, 19634, -13970, 7344, -8526, -18318, -24610, 2210, 16148, -15918, + -29848, 6335, -6235, -30485, 13719, -7511, -5883, -22063, -4732, 6612, -16482, 12433, -10185, -20050, + 28026, -15342, -25439, -21011, -1579, -8355, -1635, -18527, 5023, -32106, -5163, -2544, 15932, 3514, + -19913, 21718, 14779, -25797, 17911, 2896, 11980, -15572, -12132, 3895, 26885, -8137, 20247, 5725, + -26631, -16464, -24012, 23473, 19697, 30173, 25726, -14854, 11033, -5955, -7425, -11928, 9659, 23563, + -15389, 21756, -11150, 11299, 18881, 4426, -5141, -18219, -3135, -2421, 5974, -16155, -2023, 26240, + -18162, -18957, -678, 3655, -22313, -21195, -12131, -32105, -14395, -19271, -29989, -2007, -20106, -31678, + -13818, 21464, -2514, 19155, -27938, -20689, 13084, -13532, 22758, -5561, 9816, 23935, -10390, -22201, + 9283, 26711, -31483, 2367, 10533, -16371, -9144, -4506, -19904, -30966, 17807, -17257, -28217, -7724, + -17915, 8283, 8199, -25433, -2127, -20693, 11963, -29927, -31906, 564, -1646, 11584, -29466, -5157, + 1196, -30017, -25334, 18730, 5642, 421, -1670, -13213, -31930, 10970, 29200, -24185, 282, 2046, + 32005, 10113, 5780, -3519, 7749, 7463, 5303, -4456, 131, 12512, 27306, 10234, -19451, 16298, + -20036, -27150, 23809, 21715, 10100, -2326, -26637, -28149, 22227, 19778, -27628, 25243, 28905, -23897, + 32374, 26062, -19944, 5055, -20301, -5537, -3504, 17955, 16897, -4241, 12886, -27871, -8576, -16820, + -6616, -11033, 6056, 18908, -2037, -31516, -16435, 25334, 3035, 18388, -20538, -5336, 15584, -14372, + 4181, 13418, -7371, 28197, 1820, 26845, -11379, -9269, -10904, 16891, 16991, 3328, 1497, 5645, + 25924, 16925, -9068, 29406, -8852, -3006, -19922, -24397, 6826, -28157, -13601, -27628, -4964, -8512, + 18277, -32367, -24491, -15642, -10847, 23417, -7514, 15693, 13700, 28620, 27890, 20116, 6456, 28464, + -32193, -21533, -25838, -21456, 2556, -22560, 24406, -23269, 10283, 28678, -10129, 17966, 31848, -22243, + -23816, -29777, 19341, 19956, 29233, 9356, -32134, 12876, 2979, 85, 31861, 2375, -15692, 25392, + -19048, -30934, 24650, 12842, -24168, -18237, -28589, -26492, -14909, 25649, -18151, 2328, 16170, 10488, + -667, -13344, -11974, -17722, 8279, 15424, -31537, -9889, 16200, -20163, -12063, 26890, -11059, 5177, + 12431, -26650, -9328, -19187, 27836, -16038, -6642, -21853, 29022, -1941, -18477, -15959, -15394, 537, + 2494, 10738, 13811, 10678, 25320, -2700, 5804, 2503, 16994, 27447, -22858, 22540, 3298, -6826, + -23760, 9479, 12267, 24447, -14590, -7158, -12912, -25391, 6870, -29475, -29731, 1289, -4961, 18505, + 15151, 8603, -18867, -4478, 28235, 22387, -17334, -8039, -26605, 1645, -13851, 3308, -16523, 13217, + 4136, -10784, 20376, -21962, -11358, -26028, -31851, -28816, 28355, -23567, 14658, -12843, -25353, -9917, + -7734, -23436, 1089, 467, 10620, 4383, -7601, -16420, 20041, -30763, 24419, -1769, 832, 3496, + -19798, 8445, -23876, -23697}; diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output.h index 56fd68c9..f78d0471 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output.h @@ -4,11 +4,12 @@ #include const int16_t int16xint8_spill_output[90] = { - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, - 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667, 32667}; + 32250, 12875, 13315, 28726, 16922, 12912, -24155, 7559, 11706, -7140, 17384, 22019, 5918, + -32667, 13644, -2060, -2121, -479, 15237, -10548, -5192, -2914, 19189, -32667, -18269, 8169, + 10624, -24078, -11480, 8274, -12409, -4450, -4782, -21937, -25694, -2501, -6838, 29746, -21776, + -20099, -7347, -1833, -28351, 6473, 1324, -6582, -26096, -17616, -32667, -32667, -7318, -16506, + -17857, -32667, -1823, 2013, -13724, 16892, 14500, -16560, 9300, -6675, 4057, -17379, -32667, + -25134, -32188, 13725, -6012, -26636, 12161, -15247, 31083, 24260, 6226, -20135, 8791, -3868, + -12604, -17270, 19100, 7445, -32667, 11647, -16185, -10980, -23575, 14219, 17317, -9160}; const int16_t *const int16xint8_spill_output_ref = int16xint8_spill_output; diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_multiplier.h index 50fec9ac..9086df51 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_multiplier.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_multiplier.h @@ -4,6 +4,6 @@ #include const int32_t int16xint8_spill_output_multiplier[9] = - {1922224780, 1923367059, 1923068806, 1922819466, 1922873839, 1922641561, 1921336846, 1922926391, 1922270735}; + {1178940149, 1179096029, 1179636237, 1178822367, 1179745786, 1177599050, 1179074678, 1177556487, 1179648378}; const int32_t *const int16xint8_spill_output_mult = int16xint8_spill_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift.h index beb068d3..50f74b09 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/output_shift.h @@ -3,4 +3,4 @@ #pragma once #include -const int32_t int16xint8_spill_output_shift[9] = {-12, -12, -12, -12, -12, -12, -12, -12, -12}; +const int32_t int16xint8_spill_output_shift[9] = {-11, -11, -11, -11, -11, -11, -11, -11, -11}; diff --git a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights.h b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights.h index 74e61f30..2166d686 100644 --- a/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights.h +++ b/Tests/UnitTest/TestCases/TestData/int16xint8_spill/weights.h @@ -4,941 +4,941 @@ #include const int8_t int16xint8_spill_weights[17820] = { - 2, -12, -10, -24, -104, -90, -5, -15, -45, 90, -90, 106, 98, -99, -122, -10, -103, 33, -78, - -108, 12, 28, -31, 125, 90, 7, 44, -52, -57, -31, 106, -87, -12, -115, -126, 90, -68, 36, - -31, -89, 65, 106, -43, -72, -80, -44, 124, 33, -76, -24, 41, 74, -6, -119, -35, -18, 32, - -44, 104, -42, 19, 46, 42, -19, -11, 38, 62, -17, 84, 4, 119, -120, -12, -39, -70, -5, - 63, -23, -77, -96, 82, -92, -26, -12, 38, -93, 26, -47, -101, 69, 21, -34, -34, 8, 90, - 106, 115, -96, 27, 22, -89, -38, 28, 7, -118, 52, -40, -67, -9, 92, -91, -66, 17, -99, - 106, 94, -121, 117, -55, -72, 107, -119, -18, -32, -2, 120, -120, -10, 30, 113, -75, 114, 17, - 126, 125, -35, -46, 109, -100, -57, 102, -50, 75, 28, -69, -93, 22, -120, 7, -16, 106, -47, - -29, -82, 26, 77, 54, 22, -122, 2, 16, -32, 41, 8, -86, -90, -77, -17, -40, -59, -118, - 110, -54, -50, 6, -126, 94, 101, -117, 37, -121, 2, -107, -108, -122, 2, 37, 70, -100, 108, - 123, 82, 76, -10, -29, 94, 87, -62, -117, -57, 40, 22, 39, 45, -1, 53, 109, -47, -24, - -51, -7, 114, 11, 103, 33, 27, 123, -106, 30, -45, -80, 106, 47, -27, 49, -87, 93, 52, - -111, 101, 59, 61, 39, -6, -109, 108, -10, 112, -126, 106, -28, -18, 96, -54, -75, -48, -63, - 24, -5, 3, 50, 62, 78, -22, 112, 7, -78, 31, 87, -5, -57, 12, 26, -95, -2, -102, - -105, 57, -14, 53, -47, -9, 80, -125, 94, 30, 83, 86, -80, 58, -125, -19, 41, 81, -11, - -49, -108, -37, 86, -20, 118, -105, 57, -121, -63, -109, -59, -58, -1, -107, -56, -65, 70, -53, - 7, -35, -81, -15, -61, -102, -64, -36, -20, -107, 115, -124, 30, -97, -14, 64, -47, 68, 50, - 21, 120, -24, -126, -14, 124, 36, -46, 50, -73, 24, -38, 36, -44, 88, -70, 92, 116, 63, - 102, 69, 2, 68, -35, 86, -71, 89, 20, 118, -18, 12, 46, 11, -25, -35, 118, 18, -65, - -45, -34, 14, -42, 95, 9, -98, 57, 44, 126, -122, 5, 84, 72, 23, 119, 113, -72, -110, - -83, 37, 100, -80, 111, 102, 14, 2, 98, -58, -109, 26, -44, 106, 126, -111, 23, -105, -78, - -118, 27, -109, 41, -72, 94, -116, -82, 82, -32, 115, -30, 0, 110, 63, -126, -55, 109, -67, - 58, 82, -47, -45, -47, -15, -114, 14, 94, -26, -43, 85, 96, 40, 90, -115, 24, -82, -99, - 124, 58, 121, 65, 24, -67, -61, -104, -118, -102, 97, -82, 10, 112, -29, 11, -18, -3, -117, - 69, 27, 28, -16, -87, 92, -99, 77, -22, 94, -119, -81, -84, -114, 8, -94, 122, -46, -54, - -22, -80, -125, -127, 35, 53, -124, 98, -115, -26, -33, -124, 102, 62, -70, -89, 45, 39, 4, - 81, 16, -30, 64, -45, 103, -23, -20, 85, 41, -107, 70, -77, 120, -113, 107, -29, -100, 40, - -115, 77, -65, 54, -112, 114, 16, 88, -70, 40, -13, -115, -112, -6, 107, 98, -81, 109, -103, - 3, 63, 110, -88, -113, 111, -31, -17, -79, 78, -121, -54, 31, 64, 93, 53, -73, -125, -14, - -15, 45, 22, 58, 65, 39, -16, 77, -86, -89, -113, 18, -53, -88, 95, -69, -91, -95, -4, - -95, 64, -43, -70, -100, -76, 56, 30, -85, -38, -118, 21, 108, -121, -118, -66, -25, 8, -14, - 43, -110, -12, 115, -103, -111, -43, -49, -47, -11, -34, -68, -53, -28, -86, 8, 125, -69, 6, - 89, -71, 14, 22, 50, -13, 114, 52, -27, -22, -73, -89, -88, 18, -56, -10, 89, -72, 78, - 100, 25, -125, -84, 49, -92, 117, 10, 47, 45, -120, -29, 57, 80, 80, -121, -105, -49, -97, - 11, 56, -6, -56, 78, -73, 115, 2, -99, -94, 107, 10, 113, 111, 96, 122, -112, -99, 14, - 101, -77, -71, -109, -15, 35, 117, -114, -74, 109, -84, 19, -49, -99, -66, -125, -8, -47, 106, - -87, 44, -20, 57, 74, 66, 119, -36, 122, 89, 24, 43, 34, -84, 75, 101, 107, 46, 103, - 103, -54, -25, 17, -22, 120, -28, 96, 62, -44, 45, 92, 50, -87, -113, -16, -4, -40, -30, - -36, -112, 1, 22, 81, -26, 38, -123, -116, 119, -41, -56, -68, -125, -22, -104, -70, -79, -46, - 118, 39, 90, -122, -21, -34, 46, 45, -50, 81, 100, 96, -101, -85, 108, -101, 80, -2, 42, - -76, 88, 90, -67, 43, -18, 70, -18, 27, 117, -40, -92, -87, -123, 125, -13, -25, 75, -95, - -126, -11, -65, -12, -39, -55, 121, -29, 124, -19, -56, 73, 5, 121, 25, -18, -65, -57, 118, - 43, -73, 26, -55, -19, -80, -12, 76, -66, 63, -45, 7, -13, -109, 27, 75, -1, -7, -76, - -87, -36, -58, 116, 39, 89, -71, -13, 1, 58, -30, -121, 93, 45, 92, 32, -100, -61, -39, - -86, 18, -20, -108, -71, -125, 85, 62, 114, -111, 84, 50, 115, 18, 34, 41, 79, 92, 114, - -45, -79, 107, 120, 69, 72, -16, 15, 90, -37, -37, 4, 78, 82, -75, 10, -114, 76, 2, - 45, 77, 97, 52, -99, -123, -58, -92, -71, 89, 104, 64, -42, -52, 96, 120, 85, -126, -6, - 94, -97, -111, -72, 119, -82, 55, -127, -72, -96, 78, -61, 9, -38, 94, -17, -57, 77, 98, - -39, -37, -47, 121, -84, -39, 52, -79, 90, -8, -108, 71, 1, -114, -32, -40, -83, -39, -35, - 118, -114, 15, 38, 114, -114, -67, 42, -102, -90, 1, -60, -27, -118, 47, 30, 41, -65, 57, - 6, 32, 74, 64, -5, -63, 7, 9, 106, 40, 7, -123, 26, 80, 60, -113, -112, 98, 124, - 89, 55, 77, 0, -106, 43, 119, 111, -100, -15, -63, 110, 98, 95, -72, -33, 12, 25, -109, - -15, -96, 17, -6, -84, -74, -105, -52, -51, -34, -119, 83, -69, 102, 19, -39, 0, 57, -111, - 101, 12, 58, 45, -74, -15, -62, 16, -78, 18, -59, 65, -5, 116, 64, 55, -39, 127, 93, - -99, 78, -42, 120, 0, 89, 103, -17, -125, -60, -63, 63, -16, 44, -93, -28, -5, 21, -74, - -76, -112, 48, 94, 110, 7, 113, 2, 9, -110, 33, 57, 30, -75, 21, -54, -21, -112, 45, - 77, -62, -119, -84, -114, -90, -105, 26, -20, 79, 94, 98, -61, 38, -86, -111, -29, 105, -119, - 50, -3, 110, -10, -5, -125, -123, 42, 5, 13, 105, 115, -31, 65, 45, -29, -49, 121, 80, - -33, -127, -116, -69, -68, -121, 114, 80, -2, -62, 8, 49, 32, 103, -37, -64, 47, 29, -90, - -62, -69, 13, -124, 32, -50, -66, -15, 38, 34, 35, -95, -113, -110, -29, -121, -70, -99, 29, - -17, 104, 64, -69, -108, 11, -64, -113, -72, 115, -22, -104, 103, 118, 42, 4, 105, -99, 82, - -3, 22, -63, 54, -21, 92, -34, -69, 31, -16, -77, 58, -108, -85, -28, 77, 31, 125, 8, - 13, 121, -118, 60, 126, -76, -56, -35, -70, 83, 21, 34, 126, 64, -113, -55, 90, -80, 102, - 73, -65, -64, -75, -69, 1, 119, 71, 76, 100, -102, -7, 101, 3, -55, 90, 12, 7, 49, - 59, 70, -111, 46, -49, 7, 111, -30, -79, 108, 37, 72, 36, -35, 2, 85, 91, 46, 8, - -99, 36, 17, 19, 115, 73, 89, 26, -23, 19, 121, -118, -39, -23, 111, -117, 89, 52, 63, - -3, -15, 48, -6, -76, 5, 28, 115, 120, 85, -29, -83, 26, 13, 88, -113, -56, 124, -1, - -120, -116, -20, 64, -90, -77, -60, -27, -90, 114, 68, 67, -110, -73, 114, 14, -1, 28, -112, - 106, -66, 41, -79, 108, 9, 76, -22, -99, -58, -78, -59, -122, -30, -103, -18, 92, -110, -46, - -32, -17, -116, 85, 65, -94, 32, -34, -38, 48, -92, 91, -8, 29, 9, -75, 43, -30, 59, - -1, 27, -103, 5, 36, 102, -116, -50, 37, 101, -20, -109, -21, -16, -93, -109, -74, 108, 110, - -20, 51, 20, -7, 76, 107, 38, 50, 125, -5, -101, -12, -64, 78, -84, 4, 80, -73, 123, - 106, 30, -88, -65, 35, 11, -120, 117, -9, -25, 107, 82, 1, 84, -97, -31, 59, -116, -12, - -94, 92, 96, -85, 28, 105, -24, -64, 42, 43, -97, 124, 16, -82, 127, -67, 88, 35, -10, - 58, -56, -68, -79, -23, -110, 30, -4, 104, 29, -36, 59, -30, 87, 41, -36, -76, -55, -79, - 74, -79, 23, -88, 124, -115, 26, 118, -11, -8, -95, 74, 24, -83, 115, 8, 115, -21, -75, - -61, 71, 55, 22, -16, 21, 119, 89, -126, -122, 14, 68, -7, -104, 37, -45, -88, -116, 82, - -64, 85, -12, -28, 62, 44, 95, -62, -39, 61, -46, -109, -57, -61, -92, 99, 91, 39, 83, - 110, 123, -17, -11, 64, 52, 25, -65, -27, 0, -62, 46, -42, -107, -2, 11, 52, -109, -82, - 95, -26, -122, 18, 115, 82, -20, -72, 32, 94, 31, -51, -55, -1, 100, -93, 39, -112, -58, - 54, -23, 62, 23, 104, 76, -39, 75, -16, 68, -3, -64, -34, -90, -64, 108, -5, 65, -33, - 6, -126, -112, -91, -34, 123, -89, 12, 117, 88, -29, -33, 62, 107, -114, -64, 51, -12, -115, - 34, -27, 114, 120, -112, 23, 98, 31, -3, -100, -116, -104, -112, 63, 80, 73, 33, 120, 100, - -122, 102, 114, 76, -96, -104, 59, -35, -36, -10, -68, -121, 110, -98, -77, 91, -29, -94, -48, - -97, 89, 58, 120, 40, -2, -43, 39, -125, -27, 22, 109, 57, 97, 63, -13, 120, 40, -88, - -10, 22, -40, -66, 63, 90, 67, 110, 21, 57, 31, -51, -11, -34, 116, 110, 12, 5, 94, - -88, 62, 91, -2, 25, -66, -100, -27, -1, -115, 120, -100, -71, 0, 12, -74, 70, 33, 46, - 99, 73, -9, 103, -113, -104, -31, -99, 44, -85, -107, 99, 104, -20, 122, -112, 86, -15, -103, - -67, 112, -74, -79, -100, 28, -106, 28, -94, 55, -51, 42, -6, 31, -114, -37, -18, -126, -61, - -95, 38, 119, 65, -54, -56, -123, 59, -7, 92, -42, 103, -100, 19, -8, -69, 40, -6, 78, - 48, 24, -62, 109, 4, -31, -44, -38, -76, 74, 30, -81, -90, 63, -89, 48, 113, -51, -41, - -113, 20, 21, 16, -18, -15, -115, -29, -102, 68, 31, -29, -5, -71, -3, 9, 103, 104, -96, - -106, 8, -3, 57, -48, -4, 28, 22, 36, 51, 103, 116, -113, -73, 112, -36, -33, -78, -121, - -64, 76, 75, -36, 86, 115, 59, -78, -70, -62, 87, 108, 54, 16, -108, -56, 95, -83, -59, - 77, 112, 99, -82, 77, 35, 19, 84, -10, -7, -42, 14, -125, -118, 46, 41, 79, 60, -57, - 78, 80, 75, -78, 76, -62, -71, 17, 93, -91, 37, 110, 27, 102, -72, 43, 111, 46, 78, - -60, -115, 116, -68, 20, 118, -50, 25, -7, -31, -28, -74, -64, -59, -61, -60, -42, 123, 116, - 71, -108, -20, -31, 62, 99, -82, -6, -93, -76, 33, 99, -77, 118, 51, 64, -5, -31, 1, - -44, 63, -73, -92, -60, 108, -124, 7, 47, 36, 23, 114, -125, -118, 115, 47, -47, -98, -66, - 113, 12, 66, 20, 72, -26, 103, 73, 42, -10, 117, -8, -62, -123, 71, -78, -29, -61, 75, - -120, -71, -40, -44, 103, 3, 112, -110, -124, 63, -61, -26, 18, 45, -88, 46, -104, -84, -105, - 19, -59, 56, 125, 27, -87, 51, 117, 22, -116, 125, 33, 91, 88, 113, -104, -101, 90, 86, - 10, -8, -69, -11, 112, -86, 113, 86, 92, 104, 97, -11, 1, -7, 46, 41, 80, 99, 99, - -92, 107, 46, 80, 108, -65, 32, 124, -55, 109, 44, 27, -9, -96, 81, -27, -48, -39, -6, - 84, 16, -105, -46, 52, 45, -88, -126, 53, 15, 93, -61, 5, -26, 70, -56, 16, -38, -52, - -13, 25, 109, -115, 64, -51, -75, 22, 23, -15, 31, 20, -75, -97, -8, -81, -82, 45, 98, - 52, -93, -92, 81, -102, -29, 12, 71, -2, -124, 73, 103, -122, 120, -104, 14, -17, -85, -28, - 47, -110, -50, 3, -4, 7, -88, 82, 60, -108, 43, -53, 93, 40, -77, -16, 53, -2, -82, - -106, -111, 92, -35, -89, 90, 66, -98, -116, 20, 113, 3, -26, 66, 59, 56, -116, 20, 59, - -23, 3, 21, -125, -60, 4, -55, -103, -120, 9, -99, -16, 37, -84, 98, -98, 31, 102, 99, - 43, -73, -85, -43, -58, 100, -107, -23, 83, 58, 93, 119, 86, -126, 44, 68, 96, -75, 126, - -67, -5, 97, 120, 125, 91, 90, -109, 22, 83, 117, 85, 85, -36, 91, 78, 77, 4, 75, - 84, -63, -39, 54, 118, 99, 54, 106, 6, -115, 114, -117, -1, 98, -93, -78, 28, -16, -126, - 55, -90, -23, -83, -53, -82, 117, -53, -125, -6, 44, 48, 77, -100, 15, 102, -84, 119, -124, - 19, 78, 100, -124, -79, -87, 68, -34, 78, 40, -56, -9, -102, -38, -15, -16, 114, 123, -82, - 102, -66, -37, 24, -5, 96, -26, 55, 23, 89, -116, -77, 15, 86, 28, 13, -2, -18, 104, - -91, 28, 85, -122, -30, 116, 96, 126, -113, 112, -64, -70, -86, 61, -127, -84, -84, -11, -85, - 117, -50, -80, -123, 51, 92, 80, -114, -57, 88, 99, 21, -18, 85, -66, 51, -119, -44, -56, - 48, 122, 119, 109, 18, -98, -102, 86, 82, -95, -76, 44, -22, 24, 77, 50, 119, 111, 37, - 106, 31, 80, -20, -16, 93, 84, -97, 97, -55, -24, 109, 9, 1, -18, -125, 118, -95, 79, - 59, -22, -38, -58, 26, 127, -113, 67, 19, -125, 116, -82, -68, 15, 11, 55, -60, 56, -119, - 32, 98, -119, -16, 51, 36, 6, -84, -14, 38, -17, 4, -55, -83, 7, 10, -22, -46, 116, - 20, -33, -19, -24, -44, 96, -3, -47, -111, 26, -74, 41, 63, -67, 22, -124, 112, -62, -92, - 33, -94, 1, 43, 19, -73, 60, -47, 97, 30, 103, -124, -117, -65, -77, -94, -17, 80, -91, - -53, -118, -107, -74, -16, -124, 96, -77, 2, 99, -28, -46, 70, -114, -47, -81, 53, -74, -110, - -42, 105, 50, 74, -56, -42, 94, 113, 39, -122, -8, 82, 78, -124, 9, -48, 91, 92, 28, - -36, -126, -95, 82, -110, 0, -64, 10, -74, -51, 49, 42, 95, -103, 53, 93, 76, -9, -42, - 107, 105, -3, 67, 48, -3, 73, 30, -57, 70, -81, -108, 124, -33, 18, 109, -82, -103, 83, - -105, -23, 43, -29, -70, -93, -112, -61, -100, -102, -89, -15, -110, 82, 101, -9, 25, 127, 95, - -75, 71, -6, 13, 78, -52, -40, 79, -111, 116, 75, 8, 117, 121, -39, -32, 107, 120, -52, - -25, -63, -81, -61, -124, -91, 119, 115, -24, -20, -77, 119, 41, 0, -119, 40, -109, -58, -78, - 0, -28, -60, 85, 100, -102, -111, 115, 9, 121, -37, -100, 60, -35, -115, 15, -69, 23, -62, - 80, -87, -89, -1, 107, 102, -118, -100, -33, -60, -44, -103, 123, 46, 67, 23, -11, 91, 28, - 16, -72, -109, 9, 109, -57, -53, 49, 121, -114, 51, -12, 125, 75, 63, -67, -53, 44, -45, - -106, -85, -82, -87, -117, -116, -126, 57, 47, 22, -35, -125, -55, 94, -120, -70, -18, -121, 61, - 107, 91, -123, 86, -61, 42, -94, 99, 104, 34, -69, 53, -10, -42, -72, -55, -105, -44, 65, - -9, 89, 36, 42, -10, 23, 63, 13, -52, 110, -60, -7, 11, 51, -116, -4, 1, 61, -23, - -114, 92, -54, -26, -125, 9, -25, 100, -51, 54, 56, 40, 37, 70, 61, 73, 53, 64, 55, - -18, -79, -117, 92, 83, -63, -25, 66, -23, 122, 46, 102, -46, -102, 29, 66, -76, -4, -34, - -69, -39, -118, -93, -63, 69, -95, 29, 54, 33, 27, -114, 69, -52, 51, -88, 0, 122, -44, - 29, 48, -93, 66, 97, -104, 36, 58, -127, 68, -93, -126, -13, 1, -46, 99, 100, 15, -79, - -79, 118, 120, 9, -32, 60, 123, 47, -97, 78, 54, 69, 4, 65, -62, -105, 44, -92, -46, - -88, -19, 42, -22, 110, 8, 106, 70, 28, -81, -19, -40, -114, -76, -119, 99, -62, -97, -98, - -24, -37, -15, -49, 26, 80, -76, -56, 100, -101, -45, -5, -35, 57, 25, -77, -17, -7, 108, - 119, -36, 21, 58, -118, 80, 62, 18, 54, -111, -26, -101, -67, 22, -29, 5, -31, -95, 103, - 70, -105, 47, 11, -123, -24, 105, 12, 123, -58, -60, -60, -74, 105, 106, -126, -97, 99, 0, - -10, -112, -14, 23, 91, 18, 114, 117, 3, 37, -52, 79, 122, 50, 58, -87, 52, 4, 110, - -116, -71, 33, -63, 104, 95, 77, 109, 68, -22, -23, -34, -65, -24, 17, -58, 120, 122, 67, - -18, 125, -104, -123, 26, 109, 97, -98, 101, 20, 69, -67, -69, -38, 120, -116, -85, -30, -58, - -22, 37, -98, -32, -119, 67, 119, 118, -15, 115, 56, -98, -63, -85, 47, 20, -13, -46, -4, - -37, -97, -86, 106, -117, 90, 24, -24, 1, 63, 40, -77, -108, -59, 27, -103, 14, 59, -47, - 18, -80, 120, -123, -120, -68, -64, -46, 58, -36, 117, -6, 23, -55, -65, 124, -119, 14, 101, - 106, 58, -10, -125, 63, -79, -97, -6, 71, 75, 120, 53, -33, 67, 96, -86, 66, 38, -100, - -28, 110, -24, 92, -127, -34, -67, -59, -37, -43, 88, -116, 28, 34, -124, 38, -100, 4, 34, - -4, -18, 19, 36, 121, -45, -52, 79, 66, 46, -41, 28, 13, -118, -89, 71, -103, 55, 31, - 89, -119, 126, -60, 116, 118, -88, -42, -57, -17, -10, -2, 71, -102, 64, -77, -82, 57, 114, - -63, 27, 82, 112, -123, 58, -109, 123, 7, 119, 8, 61, -72, -8, -42, 79, -58, 15, -42, - -62, -37, -14, 40, -100, 83, 25, 54, -61, -109, 107, -68, 22, 121, -15, 57, 32, -84, 102, - 59, -45, -115, -81, 118, -68, 74, 127, -87, 51, 120, -105, 87, 82, 19, -108, -21, 116, -97, - 99, -24, -104, 18, 10, -2, 107, 28, -28, 108, 67, -82, 64, -79, 104, 3, 2, -66, 93, - -46, -2, -38, -42, -101, -79, -82, -94, 101, -26, 70, -98, 4, 50, 121, 35, -4, -19, 71, - -116, 32, -114, 30, -32, -127, -34, 115, 79, -39, -58, -10, -98, -115, -47, -98, -72, 14, -68, - -104, 94, 6, 10, -25, 57, -20, -75, 75, -21, 112, -56, 112, 54, -73, -46, -68, 112, -37, - 111, -1, -81, 16, -56, -40, 50, -29, -78, 24, -15, -84, -120, 23, 86, 100, -23, -69, 40, - 95, -56, -27, -25, -32, -47, -27, 44, -117, 120, 43, 53, -114, -47, 60, -79, 23, -75, 37, - 86, -18, -28, -26, 113, -48, -125, 119, -37, 111, 39, -64, -96, 66, -10, -59, 98, -28, 87, - -104, 8, -103, 99, -14, -56, 31, 1, 79, 44, -41, 43, -106, -9, 58, 13, -94, -12, 33, - 13, -70, 90, -18, 17, 6, -55, 35, 26, -61, -16, -75, -44, -11, 113, 56, -29, 106, 68, - -76, -13, 85, 14, 62, -27, -78, -21, -57, -41, 74, 107, -1, -119, 95, -12, 122, 89, -50, - 96, 8, -124, -30, -11, 81, -87, -38, 39, -49, -95, 93, 42, -81, 27, -105, 94, 117, 69, - 88, 52, -10, 88, 64, -49, 99, -92, -31, -104, 48, 116, -60, -2, -117, -5, 92, 91, 97, - -13, 116, 110, -56, 122, 70, -36, 47, -74, -11, -40, -98, 30, 81, -62, -116, -110, 86, -94, - -39, 2, 104, 20, 103, 13, 93, 45, 31, -52, -111, -61, -18, -123, -27, -92, 67, 100, 37, - 66, 88, 26, 91, 76, -72, -121, -105, 76, 34, -65, 49, 44, -112, -111, -44, -49, -28, -33, - -70, -79, -71, -84, 97, -11, -105, 124, -104, 85, -61, -114, 28, 72, -39, -92, 119, -122, -116, - -68, 79, 58, 114, 60, -101, -32, 89, 105, -96, -73, -42, -73, -73, 5, -106, -46, -41, -16, - -107, -74, -73, -104, -54, 7, -99, -25, 65, 95, -14, -113, -42, 73, -51, 100, 81, 13, -33, - -16, -47, -89, -61, 116, 100, -85, -72, 89, -44, -65, 14, 91, 30, -12, -80, 63, 58, -101, - -12, -62, -14, -37, -21, 40, 96, 97, 91, -31, 75, 67, -85, -107, -78, 2, 79, 3, -73, - 32, 2, -4, -63, 113, -35, -17, 122, -48, 27, -59, 84, -92, 72, 18, -10, 20, -110, -18, - 45, 67, 39, 101, -44, 61, -57, -49, 33, 31, -92, -37, 96, 110, -12, -78, 75, 40, -70, - 73, 72, 50, 106, 34, 97, -70, -99, 74, -18, -103, 70, 66, -66, 106, 43, -68, 29, 111, - -71, -104, 114, -96, -39, -35, -58, 102, 104, 65, 63, -98, -64, 105, 18, -57, -55, -42, 114, - -96, -119, -2, 29, -94, 118, -62, -99, -41, 24, 105, -42, 23, 98, 51, -87, -76, -30, 115, - -86, -18, -126, 76, 10, -27, -2, -113, -43, -8, 87, -89, 126, 50, 104, -48, -123, -80, 69, - -106, -69, 71, -126, 56, 83, 86, 84, -106, 110, 11, -86, -48, 5, -85, 73, 82, 30, -50, - -54, -71, 15, -76, -91, 25, 59, -88, -74, 32, -115, 11, 5, 122, -123, 56, 47, 5, -78, - 5, 72, -126, 79, -49, 37, -108, 68, 8, 73, -13, 116, -64, 115, -20, -48, -41, 76, -53, - 51, -120, 10, -23, -28, 74, 89, -16, 17, 105, 60, -14, 52, -110, -32, 40, 2, 0, 107, - 110, -101, 63, -79, 33, -40, -57, -42, 91, 25, 106, 126, -115, -98, -14, 36, 53, -43, 49, - 21, 33, -73, 20, -124, 49, 52, 8, 72, 24, 53, 51, -69, -14, -38, 71, 116, -15, 21, - -46, -24, 124, 65, 43, 98, 80, -94, -118, 97, -66, 2, -59, 50, 110, -105, -6, 15, 79, - 117, -80, 58, 114, -44, 17, -102, 68, -123, -25, 38, -16, -81, -18, 95, 54, -4, 72, 121, - 32, -50, -31, 56, 75, -87, 34, 33, -93, 80, -101, -101, -92, -61, 124, 53, 105, 108, -23, - -57, -71, -15, 74, -87, -107, 77, -13, -102, 62, 113, -80, -93, -67, 112, 76, 104, -51, 17, - 36, -85, 67, 58, -39, 68, 0, -114, 80, -42, -91, 16, 76, 102, -123, 62, -16, -63, -111, - -104, -30, -51, 90, 87, 6, -10, -15, 3, 109, 113, -80, -65, -6, 58, 88, -108, 105, -27, - -78, 66, -88, -47, 33, -124, 80, -25, 99, 0, -16, 96, 58, -67, 97, 85, -64, 124, 18, - -124, 18, -6, -32, -1, -47, -103, 12, 46, 62, 36, 41, -105, 76, -32, -102, 5, 122, 10, - -32, -2, 98, 11, 25, 64, -50, -67, -69, -115, -101, 48, -15, 113, 50, -37, -47, -61, 96, - -106, 30, 79, 61, 13, 9, 123, -93, 98, -110, -111, 32, -103, -118, -106, 55, 15, 21, -101, - -90, -21, -7, 110, -12, 6, 16, -41, 96, -62, 61, -60, -18, -127, -18, 26, -27, -69, 116, - 88, 62, 40, -54, 26, 55, -48, 9, 35, 90, 109, -24, -4, -67, 61, -17, 15, 31, -107, - 44, -75, 49, -99, 110, -109, -124, -32, -122, -34, 50, 119, -81, 52, 115, -85, 35, -82, -69, - -117, -41, -5, 46, 61, -52, -60, -12, -23, -81, 32, 40, 76, -50, 97, -116, 84, -79, 26, - -7, 104, -77, -111, 89, 7, -104, 104, -21, 77, -118, 48, 91, -67, 65, 67, 89, -10, 19, - 109, -17, -62, -116, 100, -88, -107, 49, -49, -101, -56, -23, 61, -86, -70, 111, -47, 114, 84, - -110, 56, 48, -36, -39, 83, -94, -90, 3, -111, 117, -8, 35, 90, 29, 74, -24, 88, -57, - -1, -65, -83, 67, 27, 89, -42, 13, -12, 72, 4, 107, -120, -13, 25, -67, 125, 37, 10, - 70, -127, -28, -96, -45, -32, 19, -74, -2, -71, -71, -31, 40, -16, 67, 107, 47, 121, -94, - -113, -62, 113, -116, 59, 49, 125, -77, 26, -116, -81, 21, -41, 95, 33, 32, -85, 51, 96, - -83, 68, 40, -118, 81, 57, -46, -104, -77, 22, -48, -82, -68, -12, 120, 86, -54, 92, 75, - 66, -13, -30, -88, 58, -82, -81, 126, 24, -104, 63, -96, 69, 90, 22, 6, 79, -52, -120, - 126, -57, 111, -83, 53, 123, 73, -120, 16, 23, -41, -98, 65, -122, -48, -5, -95, 59, 72, - 66, -51, -63, -106, -112, 73, 39, -66, 67, -60, -102, -62, -49, 17, -10, 22, 67, 54, -48, - 87, -107, 38, 117, 103, -89, -124, 26, -112, 37, -102, 62, 69, -119, -69, -44, -8, 36, 28, - 31, 45, 69, 48, 39, 36, 119, 92, -33, -57, -80, 33, 83, -94, 9, -26, 86, -41, 126, - -113, 112, 83, -22, 37, -60, 84, 17, 110, -53, -55, -58, -53, 103, 112, 60, 36, 7, -44, - 94, 23, -114, 17, -60, 119, -39, 84, -43, -105, -74, 42, -13, -84, 92, 120, -29, -111, 29, - -93, 30, -77, -53, -17, 99, 91, 95, 33, 49, 12, 88, -40, 38, -120, -21, -54, -124, -28, - -46, -71, 25, 14, 118, -43, -37, -44, 117, 108, 56, -20, 92, 119, -80, 97, 38, 41, -55, - -46, 27, 81, -97, 56, -123, -73, 86, 119, -44, -9, 22, -117, 18, 102, -6, 25, -64, 124, - -91, 15, 113, 48, 126, 87, -57, -28, -12, -123, -45, 63, -122, 107, -30, -112, 91, -46, -25, - -64, -56, -37, -99, 68, -22, 42, 7, -43, -25, -26, -16, -102, 113, -57, -74, -40, -15, -61, - -124, 115, -74, 41, 104, -82, 38, -50, 39, -13, 82, 126, 48, -57, -88, -49, 7, 84, 4, - -29, -45, 25, 84, -38, 55, -114, 84, 114, -111, -103, -77, 20, 5, 55, 115, 92, 117, -53, - -7, -74, -70, -43, 27, 92, 24, -123, 14, -7, -24, -46, 11, 35, 107, -108, 3, 109, 26, - 36, -76, -67, 123, -54, -117, -97, 124, -121, -55, 71, -46, 50, -10, 57, 104, 1, 57, 29, - -63, -22, 111, 115, 40, 3, -106, -16, -67, -21, 114, 54, 123, 126, -95, -17, 26, -44, 73, - -92, -87, -14, 15, -115, 1, 13, 108, 13, 9, 97, -24, 112, -51, -64, -6, 113, -63, -59, - -107, -98, 14, -22, -39, 86, -72, -9, -95, -31, -32, 26, -120, -79, -127, -58, -124, -7, -108, - 79, 124, 50, 27, -93, -87, 102, 87, 32, 93, 31, -17, 36, 58, -46, 52, 74, 46, -122, - 37, -65, 99, 103, -14, 31, 41, -104, -48, -121, 102, -68, 10, -55, 92, -91, -80, 120, 103, - -80, -122, 56, -47, 126, 13, -30, -105, 111, 4, 6, 107, 27, 94, 77, 29, -53, -34, 13, - 107, -76, 16, 10, 109, 18, -125, -61, 42, -65, 67, -122, -91, 41, 75, -19, 34, 90, 91, - 118, 119, 8, -61, 32, 127, -111, -24, -58, 54, -117, -41, -37, -99, -120, 10, 107, -6, 21, - 45, -9, -27, 65, 18, 124, 106, -100, 94, 17, -2, -126, -64, 110, -54, -58, -21, 74, -110, - -70, -112, -10, 125, -18, 123, -25, 107, -63, 117, -50, -57, 20, -65, 21, -51, -117, -22, 44, - -55, -44, -71, 9, -33, 110, 87, 99, -111, 46, 123, 50, -40, 111, -49, 81, 65, 43, -30, - 69, -2, 28, 28, -49, 126, -118, 103, 71, 74, -63, -61, -64, 115, 76, -51, 63, 43, 106, - 9, -43, 113, 72, -92, 121, 94, -90, 72, -7, 56, -127, -86, -49, -104, 113, 110, -43, 77, - 55, -99, 112, -26, -35, -101, -79, 56, 95, -69, -92, -124, -43, -32, 62, -47, -58, -28, -127, - 65, 82, -65, -87, 74, 92, 81, -99, 102, -54, 10, -61, 121, 17, 105, -19, 91, -71, -52, - 49, -8, 57, 81, 123, 35, -62, 56, -39, -88, 80, 32, -25, -11, -71, -95, -25, 37, 119, - 98, -65, 49, -90, 40, -37, 26, -58, 25, 121, -63, -75, 30, -77, 58, 23, 23, -122, 47, - 88, -34, -1, 124, 45, -12, -77, 34, -57, -112, 20, 116, 125, 104, -79, 21, -38, 70, 77, - -94, -38, 6, -79, 96, 110, -108, 93, -44, -77, -36, 9, -41, 87, 41, 54, -44, -11, -41, - 86, 74, -102, 63, -61, -103, -52, -84, 83, 120, -103, 46, 91, -118, -68, -50, -122, 65, 108, - -39, 32, 72, 80, -30, -66, 72, 51, -79, 120, -6, 101, 109, -105, 50, 2, 76, -104, 89, - 33, -20, -110, 21, 26, -9, 71, 125, -93, -50, 114, -61, -40, -11, 106, -94, -15, -85, 115, - 28, 120, -14, -86, -20, 37, 89, 30, 2, -16, -93, 47, 85, 106, 47, -38, -26, 24, 107, - 26, -41, -100, 103, 105, -104, 76, -31, -89, 24, -64, 121, -55, 48, 71, 116, 106, -84, -78, - 20, 107, -25, 26, 18, 126, 107, 35, -82, -74, -100, -118, 118, -124, -46, 91, 64, -76, -41, - -9, -87, -44, 121, -42, 63, 33, -48, 55, -32, -22, 84, 4, 121, -101, 71, -23, 78, 80, - -42, -126, -21, 127, 2, -36, 50, 38, 16, 68, -121, 92, 8, -32, 53, -86, 52, 27, -126, - -17, -104, -92, -26, -96, -125, 61, -23, 20, 69, 84, -36, 40, 2, 29, -77, 58, -83, 105, - -96, 62, -112, 7, 1, -123, 51, 105, -124, 33, 28, -19, 42, 74, 33, 95, 7, -122, -108, - 124, 110, -69, -76, 43, 4, -55, -17, 68, 10, -21, 67, 67, 117, -8, -25, 46, 16, -27, - 4, 62, -101, -95, 64, -42, 26, 20, 66, -37, 17, -116, -41, -7, -42, -69, 124, 88, 45, - -14, -110, -45, -18, 55, -104, 86, 13, -121, -31, -22, 25, 39, 62, -12, 119, 34, -117, -81, - 123, 66, -2, 124, -112, 30, 74, 97, 85, 112, 69, 27, -72, -102, 46, 70, 30, -31, -44, - -110, -11, -67, 82, 32, 108, 90, 11, 32, -25, 47, 64, -121, -47, -113, -6, 75, -125, 120, - -9, 62, 46, 71, 120, -1, -36, -42, 9, 34, -122, 126, -91, 45, 90, 116, 112, -84, 101, - 96, -85, 34, -48, 69, -119, -20, 126, 68, -77, -112, 73, -80, -117, 7, 87, 55, -118, -102, - 34, 98, 65, -90, 50, -102, 74, -82, -15, 13, -24, 84, 25, -19, -123, 48, 38, 51, 33, - -17, -90, 15, -51, 64, 92, 45, 116, 14, 4, -122, 84, -28, -121, 127, 110, -80, 15, 18, - -50, -127, -41, 79, 120, -88, 53, -57, 108, -21, 125, -52, -19, 122, 23, 57, -22, 19, -38, - -97, -40, 47, -92, -52, 110, 111, 29, 4, -90, 92, -117, 9, -6, -90, -95, -4, -35, 118, - -8, 90, -44, -76, -122, 54, -14, -110, 43, 67, 5, 95, -15, -114, 109, 91, 44, -123, 29, - -76, 109, -56, 124, -8, -50, 37, -107, 65, 0, -107, 28, 27, -108, -43, -72, 4, -30, -15, - 120, 65, 85, -85, -100, 75, 52, -19, 110, 25, -52, 17, 65, 107, 112, -10, 94, -27, -18, - 108, -81, 6, 9, 114, -109, 12, 67, -118, -57, 75, -43, 26, 93, 57, 10, 82, -6, 69, - -12, -76, 60, -65, 39, -11, -59, 6, -92, 93, -68, 77, 65, 106, 81, -66, -32, 26, 2, - 28, -38, -115, -36, -51, -95, 114, -44, -103, 73, 114, -87, 58, 0, 82, -24, 26, -52, -50, - 49, -16, 62, -117, 57, -8, -76, 9, 119, -74, 44, 75, 117, -80, 77, -50, -34, 97, 13, - -75, 113, -126, -76, 81, 122, 71, -94, 84, -38, -11, 68, -100, 37, 118, -44, -72, -93, 43, - -116, 36, 8, -23, -115, 110, 67, 44, -35, -27, 45, 102, 46, -84, -95, -67, -87, 66, -68, - -2, -104, 22, 60, 94, 25, 27, 33, -40, -21, 41, -110, -34, 41, 96, 114, -51, -122, -116, - -18, -66, -80, -87, -17, 118, -67, -65, -94, 33, -80, 4, 40, -44, 79, 69, 83, -62, 83, - 41, 88, 111, -39, 78, 4, 5, 4, -94, -36, -89, 104, 4, 123, 76, 37, -35, 24, 79, - -91, 91, -98, -117, -60, 11, 86, 60, -126, -40, 101, -59, -67, 54, 23, 0, -68, 2, -104, - 10, -125, -121, 56, 1, 43, -96, -13, -32, 36, 34, 100, 34, 5, 37, -43, 33, 68, 9, - -103, 34, -10, 11, 67, 95, -100, -59, 61, -51, 7, 14, 86, 103, 12, 109, 45, -105, -121, - -114, -27, -30, 99, 1, 58, 2, -109, 14, -64, -93, -1, -44, -51, -57, 2, 16, 9, 22, - 11, -106, -56, -95, 81, 103, 34, 108, -123, 54, 113, -112, -71, -83, 10, -127, 8, 4, 13, - 82, -23, 36, 95, 8, -27, 83, -12, 19, 50, 49, -62, -73, -15, -108, 64, 88, 57, -37, - -119, -41, 106, 69, 96, -65, 89, 85, -62, 93, -2, 33, -108, -94, -47, -104, -15, -105, -93, - 55, -64, -115, -26, 3, 116, -114, -121, 72, -24, -104, -50, 98, -31, 33, -94, -35, 68, -79, - 109, -110, -109, 45, 109, -37, 125, -58, -39, -25, -89, -42, 109, 66, -100, -29, -74, -49, 119, - -105, 5, -49, -116, 22, 5, -80, 58, -89, 5, 94, 40, -19, 22, -25, -86, 80, -96, -120, - 17, 117, 110, -16, -44, 105, 53, -50, -4, -5, -40, 70, -50, 47, -66, 124, 43, 19, -72, - -100, 115, -73, -13, -69, -17, -1, 2, 54, 3, -56, 79, -75, 68, -118, 100, -16, 112, 88, - -10, -13, -25, -49, -29, 20, -75, 102, 117, 103, 0, -29, -26, 116, 25, -4, -112, 105, 41, - -83, 23, -60, -60, 6, -69, -44, -85, -108, 122, -65, 94, 12, 58, 86, -28, 19, -55, 121, - -26, -47, 98, -54, -98, 108, -117, -116, 11, 10, -123, 99, 21, 0, -30, 34, -113, -41, 50, - 99, -88, -88, -17, 37, -37, 91, -112, -87, 24, -33, 2, 43, -64, -77, -35, -10, -106, -109, - 65, 82, 67, 38, 34, -40, -108, 125, 123, -120, 68, -84, -65, 99, -126, -4, 98, -77, 59, - 71, 93, -71, 58, 45, 26, -31, -51, 34, 102, 57, -116, 115, 4, -33, 0, -75, -120, 100, - -73, 116, 4, -38, -102, -54, -67, 115, 109, 75, -121, -37, -55, -123, 116, -58, 30, -81, 67, - 78, -75, 92, 36, 59, -30, 44, 12, 89, -20, 121, -40, 41, -53, 25, 89, -113, 36, -60, - -61, -124, 31, -47, 21, -67, -53, -98, -101, 36, -127, -22, -75, 116, 32, -100, -120, 91, 36, - 49, -97, -50, 114, 48, -46, 92, -96, 98, 28, 99, -25, -116, -30, -123, -105, -29, 76, -81, - -98, -109, -113, -49, -50, -65, 76, 106, -120, 125, -111, -44, 99, -61, 57, 65, -101, -103, 63, - -121, -60, -56, -110, -62, -85, -82, 29, 36, -76, 15, 2, -53, -127, -51, -53, -30, 71, 66, - -39, 30, -14, -69, -45, 42, -47, -20, -22, -6, 123, -95, 101, -18, 22, 33, -82, 92, 43, - -114, -11, -79, 101, 9, 99, 31, -79, -74, 99, -77, 70, 10, -108, -48, -115, 98, -120, 86, - 93, -38, 55, -14, -18, 55, -119, -4, 35, -81, 34, -91, -83, -35, -65, -89, 21, -67, -20, - -8, 111, -63, -15, -29, 40, -104, -84, -59, 70, -64, -116, 42, -2, -96, 58, 103, 46, 81, - 67, -34, 58, 75, -125, 70, 24, 18, -121, -49, 105, -26, 41, -96, 100, -73, 65, 12, 89, - -58, -26, -103, -40, -61, -83, -3, 68, -22, 54, 84, 74, -65, 99, 10, 24, -17, 66, 90, - -76, -73, 84, 73, 31, 120, 41, -13, 107, -76, 41, 23, -20, -88, 121, 21, -3, -2, -14, - -88, -67, 124, -72, 72, 111, -86, 28, 21, -126, 127, 108, -73, -12, 29, -33, -48, -59, 43, - 75, 108, -121, 83, 33, 76, -93, -37, 23, -35, 84, -4, -106, 16, -108, 99, -48, 15, 26, - 7, -123, 81, 17, 55, 83, -23, -53, -119, -4, -21, 79, 1, 106, -35, 40, 78, -53, -80, - 12, 71, 57, -55, 36, 99, 37, 91, 67, -14, -58, -58, -72, 46, 72, 99, -124, -110, -10, - -114, 98, -104, 40, 126, -46, -53, 121, -91, 66, -2, -2, -46, 97, -64, 59, 59, 31, -37, - 16, -115, -83, 82, -16, -41, 41, -60, 23, 109, 74, 104, -81, 76, -3, -87, -81, 119, 30, - -44, 53, -19, -78, 7, 40, -17, 3, -7, 127, 42, -41, -38, 44, -116, 103, 11, -83, -113, - 31, -54, 29, -118, -5, -117, 4, -49, -98, -52, -1, 109, 69, -92, 118, 16, -113, 100, -95, - -107, 119, -41, -37, 12, 49, 66, -118, -54, -58, 108, 60, -44, -3, -30, -96, 54, -100, 122, - 50, -32, 46, 88, 0, 62, -56, -90, 19, -53, -112, -74, 57, 66, 42, -104, -105, 72, 42, - -104, -39, -26, 75, -117, -55, -94, 45, -36, 74, 42, 9, 52, 102, -46, -112, -30, -83, 81, - 94, 19, 53, -109, 1, 31, 65, -17, -71, -124, -58, -123, -66, -89, -69, -10, 59, -7, 110, - 106, -68, -84, -50, 9, 47, -20, -123, -36, 95, -87, 79, -68, -105, -94, -105, -36, -108, -69, - -124, 124, -9, -79, -86, 111, 124, -65, -33, 82, 113, -20, -35, -126, -35, -70, -108, 87, 101, - -2, -79, -52, -76, 35, 42, -117, 106, -21, -56, 91, -63, 104, -106, -39, 64, -83, 108, 127, - 87, -122, 66, 22, -52, -8, -54, 19, 120, 42, 44, 50, 1, 29, 97, 13, 106, 48, -66, - -100, -25, 1, -5, 63, -116, -3, 36, -114, -21, -22, -66, -99, -92, -47, 88, 21, 92, -53, - -13, 8, 96, 85, 39, -2, -65, 22, 66, -94, -34, -9, -126, 58, -70, 45, -40, -87, 10, - -66, 108, 89, 102, -55, -25, -58, -59, 66, 20, -106, -107, 120, -28, 110, -30, -41, -19, 49, - 19, -49, 105, 60, 21, 79, -2, 10, -59, 12, -104, 6, -24, -43, 3, -121, 36, -88, 20, - -25, 62, 114, -111, 52, -99, 119, 56, -62, 78, 43, 20, -23, 105, 71, 54, 109, 72, 97, - 89, -109, -1, -76, 33, -85, -92, 56, 14, 22, -49, -110, 68, 25, 44, 34, -44, 78, -99, - 126, 45, -119, -9, 36, -41, -24, 38, 1, 10, 6, -93, -114, 14, 115, 40, 117, -7, -94, - 42, 64, 35, 24, 108, -48, -125, -93, -101, 38, -104, -84, 24, -58, -124, 69, 64, 15, -71, - 80, -21, 102, 116, -53, -110, -117, 127, 78, -113, -1, -64, -123, 65, 126, -36, -44, 41, 76, - -94, -111, 108, 24, 20, 56, -98, 66, -2, 11, 75, 69, -5, -34, 119, 73, -125, 77, 106, - -93, -13, -18, 85, -1, -109, 103, 57, -74, 17, -8, 110, -114, -120, -72, -38, -10, -100, -3, - 90, -32, 24, 16, -127, -69, 1, -108, -47, 68, 70, 86, 21, 18, 2, 124, 77, -50, -47, - -100, 43, 8, 53, 10, 25, 40, 3, -98, 110, 0, 26, -48, 92, 2, -37, -33, 65, 106, - -54, 75, -39, 20, 91, -23, -38, -18, -5, 58, -105, 8, -84, 94, -49, -111, 66, -79, -39, - 51, 28, -37, 75, -37, -79, 27, 87, 5, -118, -56, -98, 76, 122, 42, -48, 122, 126, -20, - -41, -126, -93, 85, -24, 45, -60, 80, -34, -35, 51, -32, 34, 33, -41, -47, 5, 63, 1, - 84, -10, -37, 27, -115, 73, -27, 46, -96, -44, 14, 16, 112, 83, 123, -71, 39, 21, -37, - 6, 44, -10, -52, -86, 97, 0, -112, 36, -78, 88, 112, 26, 0, -42, 50, -45, -110, -50, - -97, 120, -94, 25, 93, 35, 22, 67, 109, 12, 108, -103, 64, -96, -39, 67, 82, -102, 97, - 14, -8, -86, 72, -99, -52, -54, -63, 34, -86, 5, 75, -118, -6, 73, 104, -75, -22, 36, - -62, -62, 58, 122, 83, 75, 66, -35, 66, -45, -37, -56, -9, -78, 53, -19, -15, -40, -51, - 43, -96, 120, 92, 106, 104, 97, 7, -104, 28, 12, 39, -113, -69, 62, 112, 117, 96, -115, - 126, 64, 67, 39, -42, -30, 70, -122, -44, -77, 111, -87, -30, 124, -49, 66, 92, 64, 72, - -39, 126, 12, 1, -108, -118, -91, -125, 112, -123, -113, -111, 83, -42, -107, -32, -55, 60, 16, - 38, -59, 33, 68, 52, -97, 79, -88, -74, -102, -117, -18, 123, -28, 9, -23, 117, -4, 122, - 94, 124, -109, -79, -91, -57, -81, 73, 126, -63, -58, -83, -43, 89, -97, 86, 96, -64, 123, - 118, -16, 91, 81, 74, -102, -91, 60, 53, -107, 126, -75, -46, 61, -61, -3, -83, -54, 10, - -26, 78, 118, 96, 63, 121, 90, -89, 110, 93, -24, -101, 86, -89, -40, 87, -35, 34, 36, - -97, 126, -99, 22, 108, -55, 94, -21, 75, -75, 38, 31, -115, 31, -40, 102, -37, 33, -46, - -31, 0, -62, 4, 125, 66, 118, 37, 105, -16, -117, 6, 101, 4, 73, -56, -51, 30, -36, - -106, 20, -29, -33, 44, 3, -56, -18, -100, 62, -59, 108, -57, -119, -65, 25, -66, 36, 45, - -121, 67, -31, 33, 95, 9, 102, 54, 66, -34, 93, -68, -111, -74, -3, 9, -41, -113, 27, - 41, 85, -49, -72, 72, 51, 42, 109, -65, -13, -21, -36, 102, 66, -7, 14, -108, -98, 101, - -46, -99, 77, 120, -33, 33, -1, -74, 66, -24, -120, 8, 37, -103, 70, -127, -101, 32, -79, - 52, 69, -90, -20, 17, 27, -55, -49, 77, -64, 27, -27, 111, -43, -99, 75, 21, -44, -91, - -70, 91, 24, 27, -17, -97, 106, 59, -117, -5, 76, -25, -98, 100, 24, 52, -77, -1, 11, - 49, 5, 122, 58, -40, -112, -18, -63, -124, 53, 37, -9, 2, 39, -64, 29, 60, -120, -55, - -45, 70, 97, -84, 1, -39, -49, 101, 50, 35, -60, 11, 120, 91, -117, 50, 111, 49, 103, - 36, 12, 48, -89, 22, 58, -39, -26, -36, 88, -15, -10, 19, 117, 108, -55, 60, -47, -87, - 61, 112, -77, 107, -36, -67, -79, -39, 83, -18, 113, -116, 44, 31, -83, -1, 65, -109, -18, - 119, -124, 21, -71, 62, 74, -52, -44, -44, 37, -46, 116, -58, 118, -15, 51, -56, 39, -102, - -47, -50, -60, -97, -31, 43, -72, -109, 82, -100, 27, 60, 15, 111, -105, -98, -116, 104, 94, - -101, -1, 47, 36, -21, 40, 42, -57, -97, -58, 47, 102, -102, 125, 96, 100, -95, 116, 95, - 9, 56, 13, 34, 93, 60, -81, 19, 124, -1, -61, 33, 43, 42, -8, -106, -100, 12, 98, - 58, -34, 126, -63, 108, 16, 79, 69, 39, -56, 72, -70, 10, -28, 82, -63, 116, -30, -65, - 100, -31, -34, 88, -10, 28, 120, 112, 114, -97, 43, 52, 48, -54, 77, -99, 97, -22, -15, - -21, -52, -62, 75, 5, 100, -95, -34, -40, 16, 59, 19, 7, -78, 93, 48, 83, 9, 74, - -15, -91, -79, 117, -2, 40, -109, 60, 27, -60, -79, -55, 78, -93, -115, 29, 96, 117, 101, - 14, -42, 56, -7, -84, 65, -58, -89, 13, 93, -13, 53, -112, -25, -13, 105, 81, 29, -102, - -111, -120, -43, -87, -111, 19, 58, 71, 117, -18, -44, 26, 74, 48, -40, 90, -106, -27, -30, - 67, -107, -3, -97, -125, -67, 41, 33, -52, 22, -1, -4, 59, 84, -69, 92, 89, -56, -51, - -121, 81, -49, 82, 125, 120, -1, 60, 106, 38, -37, 112, -73, -72, 47, -48, -56, 81, 3, - -63, -108, -27, 35, -2, 66, -12, 79, -40, -10, 93, 60, 114, -108, -78, 55, -43, 5, -100, - 16, 18, 93, 113, -62, 64, -54, 93, -1, 38, 33, -73, -105, 0, -71, -61, 16, -62, -72, - -52, 81, 13, -24, 33, 9, 100, -127, 27, -3, 43, -16, -12, -105, -68, -107, -19, 78, -124, - 71, 8, 36, 18, -58, 1, 87, 10, -94, 120, 81, -85, 67, 53, 2, -13, -12, -3, 77, - 59, 26, 99, 100, -57, -82, -63, -123, 85, -83, 49, -14, -109, -96, -121, 88, 112, -94, 44, - 102, -59, -57, 51, -80, -94, 63, -31, -53, -124, -56, -9, 44, -14, -13, 125, -35, 13, 124, - 18, 39, -41, -95, 7, 80, 109, -124, -44, 69, 24, 92, 46, 89, 17, 83, -78, -61, 107, - 125, -90, 113, -50, -32, 3, -124, -108, -111, -71, -70, -51, -23, 67, -116, -107, 22, 85, -125, - -15, 126, 106, -81, 104, -28, 37, -45, 77, 81, 13, 120, -24, -41, -3, -45, 79, -16, -6, - -94, 62, -83, -70, 16, 22, 39, 106, 61, -17, 88, 62, 22, -98, -64, 21, 87, -3, 99, - -56, -2, -34, -121, -10, 63, -72, 13, -87, -61, -121, -20, 58, 43, -13, -46, 21, 9, 49, - 4, -1, -16, -91, 54, -126, -86, -88, -104, -16, -84, -45, 39, -46, -75, 42, -126, 61, 118, - -105, -85, 57, 57, -59, 94, 105, 102, -17, 17, -75, 65, 102, -34, -67, -66, 62, -116, 121, - 53, 110, -120, -124, -6, -87, -73, 65, -13, -114, 58, -80, 22, -70, 59, 120, 70, -92, 23, - -67, -10, 106, -108, -67, 83, -46, 124, -2, -56, 28, 35, -106, 125, 112, -16, 26, -106, -52, - 90, 34, 95, 40, 85, -42, -90, 90, -90, 93, 99, 72, -55, -9, 78, -91, 109, -79, -64, - -4, 48, 4, 99, 65, -101, 39, -47, 32, -45, -86, 105, 120, -95, 0, -116, 18, -80, 45, - 53, -84, -112, 102, 72, 93, 8, -25, -121, 72, 106, 53, 125, 44, -2, 74, 120, 101, 35, - 42, -37, 85, 62, 33, -43, 102, -122, 9, 69, 40, -72, 18, 16, -95, -33, 66, 68, -105, - -91, -40, -64, -93, -19, -122, 56, -64, 47, 82, 12, 59, 9, 0, 14, -25, -22, -115, -34, - 113, -9, -2, -43, -22, -36, 89, -60, 102, -68, 74, -113, 12, 92, 47, -31, -23, 97, 26, - -94, -31, -108, -73, -62, 80, 23, -70, 34, 36, -75, 75, -7, 15, -122, 83, 32, -57, 83, - -42, -93, 48, 61, 65, -6, -55, -14, -118, -82, -98, -97, 41, 60, 71, 55, -89, -95, -59, - -32, 85, 29, -63, 110, 87, -125, -57, 69, 107, -113, -96, -43, -40, -17, 67, 103, 95, -104, - -39, 45, 16, -40, -28, 113, 31, -95, -87, 69, -39, 3, 25, -81, -47, 122, 68, -57, 37, - -115, -44, 120, -17, -78, -103, -95, 89, 77, -75, 52, -19, -94, -94, 115, 53, 97, 54, -77, - 51, 26, 10, 82, -93, -45, -120, -93, 10, 25, -11, 122, -48, 16, 39, 42, 46, 102, 88, - -39, -101, -103, 68, 120, -62, 7, -36, 12, -92, -30, 64, -25, -12, 30, 85, -10, 30, -76, - -3, 40, 70, -119, 32, 3, 17, 38, -66, -100, -11, 54, -37, -104, 29, -74, -65, -122, -26, - 120, -91, 110, 121, -59, 87, -65, 82, -106, 11, 106, 19, -23, -73, 37, 120, 55, -83, 91, - -94, -37, 38, 54, -33, 63, -64, -82, -41, 103, -57, -107, -14, 81, 3, -9, -32, 103, 87, - 124, 77, 64, -62, -62, 14, 55, -60, 79, 79, 9, -91, -46, 1, -17, -82, 30, 51, -36, - -89, 121, 66, 1, 72, 84, -50, -69, -84, 90, -106, 98, 87, 25, 115, 3, 82, -106, -17, - 105, 60, 20, -47, -59, 62, -83, -58, -113, 95, -21, 5, -22, 19, -103, -23, -67, 93, 31, - -38, -103, 103, -125, 97, 75, -62, 125, 0, -110, 2, -43, 13, 117, 85, -41, 107, 64, 74, - -79, -12, -20, -70, -14, 93, -116, 83, -69, 123, 102, 91, 35, -42, -91, 24, -68, -84, 24, - -83, -22, -84, 50, 127, -105, 87, 31, -91, 11, 102, -88, 114, -34, 5, 105, -20, -66, -26, - -16, -78, 67, -22, -7, -114, 35, 92, -108, -7, -107, 122, -91, 112, -28, -43, -106, -87, -102, - -77, 46, 122, 45, 47, 78, 123, -79, -29, 31, 46, -84, 42, -28, -16, 90, 82, -91, 124, - -14, 8, 31, 46, 75, 91, 119, 57, -96, -28, -80, -26, -119, 44, -69, -61, -123, -95, 10, - -3, 108, 112, 12, -119, -31, 18, -59, 89, 35, -5, -52, -125, 96, 50, 105, 48, 36, -117, - 21, -114, 42, -65, -9, 16, -29, 4, 107, 80, -81, -94, -92, -33, 86, 103, 61, -98, -31, - -64, -97, -21, -3, 45, -41, -51, 118, -96, -63, 33, 114, 6, -61, -73, -69, -121, 42, -46, - -120, 12, -9, -59, -55, -93, 4, -24, -107, 22, 22, -53, -100, 101, -18, 43, -89, -99, -33, - 22, 29, 41, 5, 52, 80, 0, -81, -37, -113, -47, -84, -86, 6, 2, -117, -121, 20, 113, - 94, -104, 93, 37, -4, -20, -82, 121, -94, -93, 0, -58, 15, -67, 10, 117, 0, -47, 97, - -5, -80, 104, -63, 126, 21, 88, 31, -107, -98, 125, -17, 0, 91, -15, 100, -50, 64, 17, - 120, 10, 18, 50, -70, 86, 76, -78, 55, -95, 38, -50, -3, -22, 43, -26, -36, -68, 30, - -47, -125, 38, 111, 19, -39, -96, 6, -69, -34, -8, 123, -120, -115, 98, -45, -52, -107, -33, - -25, -91, -94, 9, -122, 43, -86, 0, 32, 84, 18, 116, -6, -48, -97, -48, -57, 92, 40, - -57, -127, -103, 123, 55, 39, -10, 15, -64, 48, -121, 20, -17, -66, -104, -121, -125, -97, 9, - 70, -96, 53, 65, 104, -8, 7, -43, 66, 11, 102, 56, 33, 37, -105, -60, 51, -67, -42, - -52, 85, -23, -124, 27, -76, 113, -39, 17, -63, 105, -75, -89, 63, 114, -1, -8, 26, -80, - -36, -81, -19, -30, -15, 73, 62, 84, 3, -40, 120, -103, 97, 85, -17, 34, 84, 43, -109, - -125, 31, -102, -36, 51, -23, 107, -119, -126, 45, 62, -4, -36, -104, 10, -37, 92, -102, 26, - 109, 78, 55, 29, 103, -12, -85, -87, 55, 74, -11, 96, 64, 42, -33, -76, -84, 32, -66, - 19, -123, -23, 63, 91, 82, 122, -44, 119, 118, 98, -96, -20, -126, -28, -88, 97, 69, -2, - 60, -16, -116, -62, -104, 22, 52, 5, 64, 24, -94, 7, -19, -74, -75, 70, -6, 8, -5, - -8, -87, -22, -120, -114, 49, -121, 80, -9, 111, 51, 60, 63, -64, 47, -108, -17, -52, -59, - -42, 104, 47, 115, 10, 119, -56, 1, -87, -50, -108, 113, 103, -124, 83, -63, -111, 63, -16, - -13, -110, -84, 16, -18, -110, 81, 117, -104, 98, 110, 50, 108, -29, 29, -18, -72, 29, -60, - -115, 73, 51, 96, 102, -11, -76, -43, 88, -26, 85, -90, 75, 86, 80, 22, 90, -10, -33, - 94, 82, -46, -55, 37, -59, 127, -3, 27, -39, 3, -111, -107, -55, 46, 110, 57, -39, 47, - -36, 126, 100, 66, 8, 45, -110, 53, 77, 116, 117, 54, 52, 11, 78, -78, -55, -35, -20, - -23, -5, -26, -8, -31, 108, -79, 2, -64, 107, 99, -63, -48, 111, 37, 19, 74, 18, -24, - -70, -59, 13, 78, -70, 121, 84, 78, -90, 121, -111, -90, -63, 117, -30, 6, -30, -35, -116, - 108, 50, -14, 61, 67, 11, -24, -122, -84, -64, 37, -50, 79, -9, 101, -109, 68, -22, -79, - -118, 108, 26, 69, -80, -29, -120, -56, 94, 108, 14, -71, -72, -88, -103, 85, 64, 75, 124, - -70, -106, 41, 42, -43, 106, -84, 25, 49, -94, 62, 51, -77, 5, 60, 9, 58, 82, 27, - 2, -88, 70, -24, 3, -126, -43, 65, 45, 25, 34, -98, 13, 80, -52, -48, -100, -120, 113, - -60, 23, 110, -58, 80, 7, -24, -86, 32, 83, -110, -100, 103, -7, -69, -42, -95, -6, 29, - 105, -33, -46, 69, -26, 23, -117, 87, -72, -117, -32, 24, -103, 115, -103, 50, -1, -48, 25, - 80, -8, -41, -65, -54, -80, -33, 116, -124, -92, -98, 44, -21, -58, -21, 29, -62, 26, -120, - 40, 0, 30, 70, 121, 20, -110, -87, 17, 44, 79, 86, -107, 38, -49, -16, 0, -57, 47, - 55, 25, 31, -46, -94, -51, -127, 82, -98, -97, -80, -98, -84, 97, -100, -90, 54, -23, -73, - 42, 51, -93, -40, -99, -28, 63, -35, 6, -74, 9, 81, -74, 75, 29, 37, -47, -93, -46, - 75, -6, 125, 30, -71, -100, -26, -103, -110, -103, -26, -41, -75, 96, 103, -122, 107, 63, -2, - 79, -91, -26, 34, 86, -63, 121, -92, 70, 41, -14, -46, -12, 94, -9, -127, 76, -58, 24, - -16, -59, -58, 113, -17, 4, 54, -107, 3, -118, 33, 117, -107, -67, 106, 108, -38, 109, 24, - -107, 88, -38, -45, -16, -105, 106, -93, -124, 93, 106, -42, -40, -18, -3, -19, 47, 112, -124, - -40, 29, 6, -117, -71, 47, 126, -10, 29, 74, 97, 7, 2, -54, 82, 58, -16, -41, -26, - 1, 10, 22, 109, 84, 54, 29, 7, -38, 109, -123, -15, -37, -51, -24, 8, -13, -32, 72, - -20, 25, -108, 75, -52, 122, -57, 75, -85, -98, 92, -56, -61, -19, -97, 16, 97, 125, 24, - 118, -89, 59, -63, 124, 84, -2, -106, -73, 91, 43, 3, 9, 109, 7, -102, -1, -84, 114, - 53, -92, -72, 73, 98, -24, 66, 103, 48, -23, 119, 55, 48, 2, -97, -20, -7, -96, -89, - -48, 1, 101, -96, -57, -22, -122, 9, -47, -20, 62, -57, 105, 69, 83, -70, 50, 117, -112, - -52, -15, 80, 10, 114, -59, 51, -89, 90, -24, 61, -37, -38, 78, 110, -73, -115, -50, -111, - 99, 68, -44, -78, 4, 18, -54, 90, -25, -90, 86, 93, -47, -70, 119, 54, -115, 99, -60, - -118, 7, 37, 17, 123, -5, 98, -53, -108, -33, -126, 126, -50, -36, 46, -119, -55, -11, 109, - -104, 107, -47, -35, -49, -96, -3, -75, -92, -18, 7, -101, -122, 107, 39, 15, 73, -96, -113, - -110, -101, 19, -65, -76, 35, 10, 8, -106, -38, -54, 119, -87, -39, 73, 17, -97, 43, -29, - 6, -1, 103, 90, -82, -88, 63, 45, -12, -58, -13, 126, 106, 37, 74, 7, -90, -14, -113, - 77, -16, 125, -57, -117, 115, -60, 80, -79, -33, 54, 102, 12, 62, 70, 89, 106, 92, -38, - 41, -110, 99, -102, -73, -48, -48, -33, 47, -40, 57, -69, -71, -63, -116, -80, -54, -58, -118, - 33, -56, 64, 90, -91, 27, 95, -117, 27, 92, -2, 94, 93, 39, 71, -3, 45, -77, -67, - 112, 126, 100, 78, -88, -52, 21, -9, -40, -103, 90, -28, 126, -124, -124, 80, 99, 108, 25, - -9, 87, -63, -71, 66, 8, 34, 119, -63, 41, -33, 121, 90, 107, 50, -110, -34, -4, 65, - -74, -88, 126, -78, -17, -52, 19, -64, 122, 7, -77, -46, 59, 9, 23, -59, 126, 59, -82, - -76, -40, 50, -64, -4, 51, -100, 37, -88, 25, 56, 102, -14, 123, -102, 55, 54, -38, -58, - 15, -4, -59, -23, 95, 112, 85, 56, 3, 35, 20, 35, 100, -16, -5, 103, -50, 122, 95, - -79, 65, 21, 36, 15, 32, 119, 72, 66, -42, -122, 123, -91, 64, -70, -102, 43, -72, -34, - 3, 33, 127, -4, 49, 64, -57, 1, 109, -17, -55, 45, 57, 24, 15, -126, 1, 21, -122, - 25, -47, 65, 96, 115, -57, 39, -34, -8, -85, 44, 123, 36, -90, -97, 41, 86, -116, 71, - -38, 79, -37, 99, -51, 125, 4, 1, 89, 105, -48, -79, -107, -27, 56, -33, -33, 117, 22, - -103, 107, -55, 72, -5, 96, 16, -26, 76, 113, 71, -123, 38, 26, -112, -106, -1, 69, 83, - -99, -55, 112, 48, -107, 36, 124, -5, -99, 88, -120, -53, -121, -37, 47, -69, -38, -2, -1, - -60, -99, 63, 108, -69, -1, -18, -2, -110, 27, -109, 11, 98, 25, 85, -118, -76, -36, -39, - 40, -49, -61, 70, -116, 107, -79, 35, -7, 113, -81, 23, -82, 59, 78, -13, 115, 85, 1, - 89, -83, 26, 13, -54, 87, -102, -52, -33, -32, 6, 47, 73, -12, 91, -6, 68, 102, -43, - -74, -61, 21, -114, -120, -123, 55, -4, 65, 64, 101, 33, 102, -120, 127, 121, -76, -114, -15, - 94, 57, -21, -4, -61, -22, -66, -64, 7, -84, -1, 51, -71, -41, 81, -85, -61, 12, 65, - -67, 19, 12, 59, 65, -67, -78, -78, 51, -121, 105, -62, -35, -116, 35, -106, 71, 126, 104, - 40, 123, -43, 122, 34, -42, -12, -124, -82, -45, 38, 76, -29, 60, -97, -49, 7, -46, 54, - -10, 72, 59, -69, 0, -65, -89, -11, 68, -16, 88, -3, -121, -23, -13, -34, 28, 28, -69, - -99, 45, -80, 56, -8, 18, -105, 95, 86, 14, 40, 30, -79, 71, -81, -92, -44, -50, -2, - -13, 37, -120, -115, -97, -61, 43, 4, -49, -75, -88, -36, -20, 73, -79, -75, -122, 25, 47, - 0, 21, 30, 30, -35, 76, -44, 36, -80, -13, -91, 28, -77, -76, -79, -79, -17, 15, 77, - 58, -119, -109, 57, -77, -25, -121, -27, 38, -109, -74, 105, -91, 36, 86, 18, 67, 24, -106, - -62, 43, -42, -42, 66, -123, 25, -41, 86, 122, -53, 80, -121, 14, -104, -86, 114, -76, 116, - 56, 51, 58, -71, -119, -49, -53, 98, -67, -45, 16, -4, -31, -64, -27, -119, -63, 54, 88, - 95, 120, -119, -57, 98, 32, 89, -43, -113, 5, -53, 81, -46, 33, -14, 95, 91, 40, 45, - -4, 32, -121, 35, -16, 20, 83, 82, -7, 28, 96, 26, -54, -121, -92, 45, -95, 7, -113, - -44, -79, -68, 45, -1, 66, 64, 67, 26, -109, 69, -110, 125, -106, -71, -62, 63, -35, -21, - -58, 50, 23, -53, 85, -84, 34, -66, 65, 96, 110, -48, 107, -77, 35, 102, -12, 37, -69, - 76, -50, -106, 91, 36, -15, 12, 9, -24, -81, -8, -104, 56, -72, 16, 100, 76, 127, 47, - 92, -25, 69, -76, -1, -78, -8, -126, 85, 23, 14, -72, 20, -120, -88, -93, 23, -112, -45, - -39, -91, -62, 121, 67, 39, 34, 101, 108, 104, 110, -126, 91, -3, 45, 94, 94, -82, -108, - -85, -61, 54, -44, -98, -64, 29, 73, 65, -121, -59, 31, 40, -86, 2, 109, 42, 65, -88, - -116, -80, -98, -102, -24, -29, -67, 102, -38, -103, -57, -87, 52, -43, 6, -126, 65, 86, -91, - -57, 34, -62, -27, 106, -45, -23, 107, -94, -75, -111, -23, -85, -125, 92, 67, -66, 25, -32, - -94, 79, -54, -19, -65, -13, -105, -65, -33, 59, 24, -101, 36, -113, -124, 48, -85, -50, -116, - -8, 87, -86, -118, 40, 107, 82, 10, -124, 67, -10, 102, -126, 12, 102, 81, -21, 62, -1, - -19, -36, 20, -10, -22, 13, 40, -20, 69, -5, 106, -38, -8, -27, 88, 116, -51, -53, 62, - 83, -104, 99, -53, -115, 43, -94, 119, -75, 91, 82, -50, 41, 18, -102, -58, -37, 65, -92, - 118, -95, -25, -60, 35, -91, -11, -4, 60, -70, -122, 89, -12, -89, -61, -22, 4, 17, 59, - 72, -61, -35, -15, 67, -37, 125, -82, 44, -10, 92, 47, -87, -110, 10, -29, 29, 54, 27, - 64, 47, 60, -91, 18, -95, -65, -14, 118, -17, -85, -15, -17, 32, 2, 81, 18, 10, 78, - -5, 101, 76, -32, 9, -39, 92, -22, 71, -56, -25, 20, -24, -78, -124, 124, -14, 58, 43, - 80, -73, -44, 4, -88, -52, 107, 104, 54, 115, -109, 103, 24, 106, -12, 21, -105, 5, 55, - 120, 5, -70, -75, -119, -51, 74, -43, -66, -68, -4, 18, 35, 51, 87, 84, -68, 69, 122, - 20, -30, 123, -93, -57, -89, -97, -9, 20, -71, -61, -78, -70, 56, 107, -57, -2, -101, -98, - -26, 74, -5, -102, -120, 41, 114, -61, 99, 25, 67, -108, -117, -47, 118, -56, -107, 5, -85, - 52, 100, -41, 63, -34, 24, 48, 26, -104, 95, 116, -93, 74, 16, 65, 37, 11, 28, -108, - 99, 57, -71, 84, 76, -52, -111, 112, -27, 21, 126, -62, -116, -4, -44, -125, -1, -43, 56, - 31, -11, 120, 87, -17, -14, -19, 56, 47, -92, 99, 77, 96, -23, 66, 83, 71, -108, -9, - -80, 23, 4, 125, -35, -120, 37, 43, 109, 50, -117, 110, 34, 96, -67, -102, 76, -65, -39, - -36, -78, -76, -85, -97, 68, -107, -119, -41, 106, 72, 56, 12, -87, -55, 50, -83, 0, -67, - -9, 63, 111, -79, 42, -112, 73, -109, -95, 15, 47, -57, -59, -9, 33, -62, -40, 119, 119, - -1, 91, 14, -66, -40, -19, -86, -89, -10, -122, 82, 93, 1, -109, -73, 54, -16, 84, 75, - 69, 18, 125, 110, 116, -72, -67, -123, 73, -4, 45, 27, 5, -52, 41, 43, -116, 83, 29, - 46, -48, 91, -78, -4, -88, -112, 25, 90, 101, 47, -94, -102, 95, -32, -69, -118, -121, -40, - 98, -68, 28, 54, 27, 113, 124, 119, -69, -86, -56, 25, -30, 111, -30, -36, -60, -92, 103, - 90, -11, 50, -73, 98, 82, 28, -34, 15, 85, -108, 72, 83, 31, -26, 15, -60, -79, -94, - 92, 67, -87, 76, 100, -67, 89, 7, -116, -39, 109, -75, 94, 54, -124, -112, -51, -39, 17, - 0, 66, 39, -92, -77, 92, -55, -102, -107, 76, 105, -113, 116, 49, -95, 43, -99, 126, 102, - 111, -98, 44, 23, 104, -111, -15, -43, -76, 103, 121, -12, 38, 25, 45, -30, 103, -22, -3, - -82, 26, 28, -127, -38, -106, 103, -71, 120, -12, 81, -10, -52, 54, -100, -104, 62, -15, -108, - -71, 110, -60, 25, 102, 110, 121, -114, 90, 104, -97, -48, -28, 73, 22, 114, -69, 77, 83, - -82, -79, -90, 82, -48, 11, -86, -96, 35, 2, -98, 23, -58, 10, -52, 12, -39, 66, -53, - 66, -41, -10, -8, -43, 63, -19, -53, 65, 61, -97, 106, 114, -39, -51, 49, -119, -105, 6, - -76, 40, 118, 97, -34, -109, 43, -12, -16, 92, 17, -125, -81, 47, -40, -105, 92, 95, 123, - 43, 91, 27, -81, -5, 11, 27, 59, 45, 9, -78, -113, -108, -75, -61, 17, -121, 69, -38, - 34, -120, 5, 100, -9, 97, 58, -85, -121, 36, -56, 6, 112, 80, 7, -116, 100, 105, -80, - -104, 121, -113, -63, -39, -18, 114, 6, 65, -3, 41, -35, -42, 125, 4, 124, -41, 99, 2, - -3, -105, -117, 34, -94, -82, -79, -78, -55, 71, 114, -29, 5, 94, -16, -80, 124, -81, 25, - -112, -45, 26, 66, 44, 20, -34, -68, 55, 0, 87, -31, 74, 123, -88, 56, 123, 101, 53, - -98, -20, 14, -49, -11, -14, 100, 7, -66, -54, 117, 100, -17, 38, 111, 77, -71, -86, 102, - 94, 45, 94, 60, 94, 85, 97, 30, 11, -100, -74, 14, -4, 114, 106, 47, 121, -22, -78, - -124, -20, -92, 85, -90, 57, -53, -15, 105, -73, 63, 40, -52, -19, 92, -120, -115, -4, -125, - -68, -92, -33, -61, -58, -126, 112, -83, 25, -24, -47, 68, 19, -65, 125, 70, 3, 120, 57, - 107, -16, -82, -35, -59, -124, -60, -72, -101, -20, -63, 41, 121, -80, -27, -104, -91, -47, 83, - -58, -107, -104, -57, -82, 14, 31, -2, 55, -24, 116, -2, -12, -28, -37, 31, -95, -104, 86, - 80, -41, 97, 55, -120, -107, -45, 122, 100, 63, -98, -80, -9, 115, 76, 124, 3, -39, 9, - 92, -25, -41, 116, -105, -67, -97, 7, -71, -72, -115, -37, 12, 3, -53, 49, -38, -45, -111, - -50, -8, -15, -99, 102, 9, -61, -99, -18, -101, 61, -87, -126, 7, -122, 77, 103, 112, -125, - -112, -76, -1, 116, 86, -116, 50, -51, 110, 18, 70, 112, 105, -10, 28, 23, 52, -41, -47, - -8, 121, 49, 118, 120, 101, -61, 51, -126, -39, 46, -7, -82, -114, -63, 108, -4, 68, -33, - -25, 107, 48, -76, -48, 87, 49, 33, 57, -61, -123, -47, -57, -38, -93, -17, -80, -29, -64, - 41, 7, -89, 16, 9, -65, 5, -43, 39, 75, 3, 85, 38, 49, -3, 2, -100, -15, 57, - -18, 116, -72, -44, -32, 89, 43, 53, 109, 21, 22, -118, 108, 9, 31, -45, -82, -63, 73, - -95, -108, -110, 71, 102, -10, 24, -28, -60, -57, 48, 31, 98, 67, 47, -81, 10, 7, 12, - 27, -39, 31, 82, 120, 21, 49, -114, -1, -42, -39, 6, -72, 21, -124, 7, 100, -124, -92, - -32, -77, 42, -13, 116, 87, -82, -84, 22, -1, 57, 112, 27, 73, -9, 79, -24, -87, -38, - 93, 93, -18, -51, -71, 95, -124, 64, -99, 61, -35, 8, -79, -60, 29, -80, -49, -126, -6, - -81, 45, -22, -77, 61, -5, 93, -23, -106, 50, 88, -23, -98, 11, -94, -125, 72, 93, 47, - -88, -72, -1, -26, 90, 49, -63, -55, 113, -38, 48, 97, -87, 83, -85, 24, 44, -33, 25, - -84, -38, 10, -53, -121, -111, 121, -84, 104, -22, -114, 124, -89, 48, -102, -88, 92, -81, 127, - -52, 83, -95, -98, -27, -110, 109, 70, -21, 96, -41, 14, -126, -9, 125, 62, 103, -74, -51, - -5, -110, 55, 30, 7, 64, -100, -69, 118, 54, 92, 26, 50, -13, -19, 122, 117, -22, -7, - -23, -36, 6, -122, -20, -51, -81, 75, 68, 82, 69, -26, 35, 22, -8, 22, 2, -78, 76, - 111, 62, -84, 125, -78, -34, 34, -42, 37, 1, 89, -7, 46, -1, 122, -105, -58, -58, 11, - -98, 87, -92, -6, -31, 117, -28, 15, 60, -48, 64, -82, 25, -51, 95, 63, -104, 92, 99, - -126, 97, -81, 108, 15, -94, 21, 118, -125, 29, 63, 66, -49, -118, -49, 28, -34, -74, -105, - -60, -81, -57, -123, -76, -35, -127, 62, -15, 55, 104, -122, -93, 106, 43, -26, -77, -87, 25, - 120, -107, -30, -116, -6, 125, -114, 95, -69, -56, 113, 45, -32, -78, 99, 75, -123, -125, -77, - -55, -14, 55, -104, -35, 120, 10, -63, -60, -8, 4, -84, 47, 57, -53, 99, -113, 21, 20, - 125, 26, -79, 86, -63, 26, -57, 110, -69, 91, 91, 2, 95, -77, -99, -73, 37, -79, -125, - -70, -36, -1, -35, 53, 120, -67, -110, -5, -30, -75, 110, 31, 33, -72, -58, 6, -23, 119, - 54, -14, -8, -52, 103, 85, 102, 116, 97, -43, 53, 1, 75, -26, -99, -72, 49, 95, -7, - 16, 23, -42, 72, -109, -30, -49, 21, -93, -38, 52, 32, 106, 13, -98, 114, 75, 99, 75, - -28, 123, 114, -97, -121, 27, -1, -70, 64, 119, 109, 39, -98, 60, -54, 108, 48, -28, -106, - -75, -88, -1, -82, -88, 87, 109, 118, 80, -97, 24, -86, 94, -47, 5, 55, 5, -72, 75, - 104, -109, 84, -36, 87, 118, -17, -77, 8, -12, -26, 102, -50, 124, -15, -86, 68, 2, 90, - -11, 108, 77, -81, 117, -80, -5, 10, 69, 114, 66, -83, -9, 59, -124, 16, 60, -16, 80, - 34, 18, 63, 44, 20, 88, -113, -114, 88, 78, 27, 123, 111, -43, -121, 40, 24, -55, 106, - 14, -82, 78, 22, -77, -26, 30, 104, 115, -57, -53, 12, -119, -73, -42, -27, -18, 81, 55, - 1, -77, -6, 22, -122, 74, -2, 46, 85, 91, 53, 14, 92, 14, 4, -74, 107, -80, -70, - 96, -96, -24, -45, -2, -28, 55, -89, 61, 125, -112, -6, 100, -43, -61, 117, 59, 8, 60, - 126, 15, -78, -35, 4, -38, -100, -35, 13, 121, -111, 39, 33, 101, -54, 48, 120, 88, -127, - 23, -56, 43, 14, 13, -2, -89, 10, 127, -73, 101, 87, -104, 45, 11, 5, -88, -46, 14, - 2, -61, 114, 19, 18, 5, 15, -4, -39, -1, 53, -42, -54, -76, -114, 83, 17, 102, -7, - 9, -31, -75, -64, 118, -110, 115, -33, 19, 85, 83, 62, -54, -50, -103, -83, 68, -102, 41, - -45, -51, 78, 29, -48, 1, -98, -35, 79, 90, 83, -4, -61, 29, 119, -8, 56, -94, -65, - -15, -44, -98, 65, -69, 33, 90, -66, 30, -61, 59, -30, 11, -108, 54, -4, -93, -47, -28, - 47, 92, -103, 66, -12, 69, 56, -76, 22, 106, -99, -64, 55, -2, 52, -108, 43, 106, 121, - 68, 118, 115, -99, 87, 83, -57, 97, -26, -56, 62, 80, 40, 21, -5, -80, 1, -67, -103, - -7, 113, 40, -123, 115, -104, -30, 27, -66, -89, 112, 90, 48, -9, -77, 36, 47, -27, -99, - 29, 54, -12, -79, 57, -27, -42, 37, 67, 74, 35, 55, 8, 37, -68, -14, -108, -9, 57, - -23, 32, 24, 20, 50, -48, -94, -19, 60, 92, 34, 113, 56, 99, -76, 73, 81, -33, -90, - -57, -121, 27, 10, 32, 8, -99, -65, 80, 115, -61, 68, -15, 103, -53, 61, -69, -120, 40, - 5, 50, -8, 104, -26, -19, -1, 50, -13, -82, 2, -17, 100, 48, 21, -46, 94, -95, -81, - 68, -103, -27, -66, -74, 52, -15, -35, 26, 37, -41, 51, 94, 97, 98, 75, -14, 98, -28, - 52, -30, 105, 56, -9, -25, 30, 31, 61, 65, -31, -9, -55, -18, 34, -88, 101, 121, -34, - 58, 47, 44, 16, -25, 54, 68, 75, 65, 92, 109, -93, -79, -109, 111, 66, 101, 56, -123, - -7, -119, 84, -57, -19, 39, -20, 80, -106, 114, -20, -127, -104, 120, 36, -8, -10, 126, 31, - 114, -44, 10, 98, -42, -44, 28, 101, -31, -2, -32, -77, 38, 42, 30, -98, 115, -92, -59, - 80, -96, -108, 45, -76, 62, -76, 117, 94, 124, 14, 53, -85, -35, 60, 109, 36, -63, -89, - 67, 70, -29, 119, -41, 100, -20, -105, 30, 73, -110, 43, -90, -43, -34, 63, 76, -89, -94, - 44, 109, -110, 31, 6, 6, -88, 61, 116, -42, -126, 42, 95, -13, -11, -44, 69, -54, 126, - -85, -91, -64, 4, -69, -48, 111, -102, -43, -57, -107, 25, -120, -116, 110, -24, -35, -107, 17, - -5, -26, -32, -18, 21, -30, -120, 104, 20, 115, -77, -110, 39, 19, 76, -99, 92, -14, 64, - -90, 50, -19, 60, -89, -107, -10, 13, 85, -23, -91, -124, 13, 54, 89, 40, 4, -77, 36, - 55, 42, 99, -121, 27, -103, -79, 22, -90, 67, 34, 27, -47, -81, 52, 52, -126, 96, -82, - 2, -3, -81, 11, -15, 4, -39, -11, -47, -74, 126, 78, 5, 26, 78, 0, 49, -22, 38, - 76, -112, 4, 102, 101, 16, -66, -126, 51, -2, 90, 92, 30, 13, 10, -70, -18, -51, 50, - 87, 36, -98, -123, -55, 94, 32, -65, 52, 38, -74, 72, -90, -1, 84, -116, -103, 20, 91, - -37, -11, 98, 97, 19, -18, -35, -92, -103, -45, -111, -22, -116, 24, -84, 9, 14, 101, -86, - 8, -74, 117, -107, -38, 69, -32, 122, 46, -23, -72, 48, 41, 81, 12, -48, -113, -5, -109, - 59, 45, 29, -124, 36, -4, 20, 9, -121, 41, -122, 4, -5, 30, -91, -83, 20, 52, -76, - 5, 64, 27, -119, 108, -82, 50, -97, -75, 79, -46, 105, 0, -55, 81, 38, 3, 80, -39, - -2, -71, 81, 66, 87, 59, 87, -18, 79, 59, -114, 51, -102, -75, -11, -7, 20, 91, -6, - -101, -111, -60, 112, 118, -94, -37, 17, 113, 58, 71, -99, 89, -59, 2, 41, 116, -83, 75, - -103, -74, 126, -102, 14, 79, 44, 99, -25, -116, 0, 79, -120, -120, -54, -13, -90, 27, 114, - 87, -46, -101, 62, -62, 95, -103, -53, -61, 66, 94, 74, -89, 119, 59, -24, 22, 45, 117, - 106, -47, 52, 64, -120, 96, 90, -23, 89, 44, -9, -17, 51, -63, -68, -125, 23, -41, -8, - 80, 105, -20, 3, 24, 109, -115, 11, -51, -97, -14, -33, -53, -81, -67, 67, 55, 68, 125, - 57, 30, -9, 107, 75, 67, 69, -88, 22, 121, -102, 15, -121, -12, -115, -19, -113, -105, -125, - -112, 42, 2, -84, 49, -67, 45, -82, 67, -107, -95, -62, -58, 9, 99, 34, 90, -29, 40, - 23, 75, -125, 112, 121, -61, 17, -68, -62, -125, -55, 96, -118, 120, -93, -95, -106, 44, -96, - -36, -108, -39, 10, 69, -85, 66, 93, -87, -36, 110, 18, 65, -28, -118, -120, -58, -36, -124, - 79, 83, -62, 37, -6, -53, 36, -126, -112, -22, 47, 123, -117, -18, 69, 122, 95, 101, 33, - 9, 83, 68, -12, -29, -15, 77, -84, -91, -108, 29, 121, 97, -63, -21, -46, -70, 41, 75, - -107, 22, -7, -1, 72, 12, -2, -121, -103, 86, 65, -19, 95, -32, 40, -65, -67, 79, 35, - -90, 118, 73, -5, -77, -99, -82, -59, -123, -112, 51, 74, 98, 108, -59, 88, 57, 27, -7, - 46, -123, -28, 55, -112, 11, 37, 84, -23, 62, 91, -115, 9, 109, -76, -95, -117, 116, -126, - -46, 47, 15, -61, 26, 91, -93, 37, -2, -115, -77, -110, 113, 42, 51, 97, -114, 14, 41, - -88, -30, 102, 4, -70, 65, 22, 5, 110, -13, -57, 24, 58, -66, 96, -39, 56, -71, -125, - -35, 45, 106, -122, 48, -107, -39, -84, 1, 28, -25, -100, 50, -114, -52, 76, -64, -3, 71, - 81, -118, 75, 67, 102, -113, 46, 1, -61, 120, 30, -29, -26, 1, 109, 67, 120, 4, 100, - -32, 16, -102, 80, 112, 54, -101, 117, -52, 93, 13, 102, -24, -125, -115, 111, 58, -124, -111, - 38, 19, 2, 53, 95, 90, 50, -1, 18, -62, 72, 96, 7, 25, 63, 68, -87, 16, -26, - 126, -113, -24, 30, -108, 51, -60, 53, -90, 67, -73, 53, -47, -105, 38, 101, 11, -37, 18, - 108, 26, 100, 83, 81, -90, 28, 103, 115, 35, -86, 33, -39, -19, 88, -69, 33, -93, 62, - 124, 95, 39, 22, 4, 24, 71, -107, -92, 75, -46, 54, 31, -17, 63, 29, -85, -108, 101, - -37, -115, -126, -125, -85, -125, -59, 12, 83, -18, 71, -8, -39, 71, 2, 103, -111, -65, -35, - -93, 27, -13, -1, 55, -81, -127, 102, -13, 111, -40, 24, -84, -26, 91, -108, -77, -55, -56, - 86, 44, -103, -115, 107, -115, 26, -48, 102, -34, -17, 56, 53, -57, -97, 7, -101, 66, 28, - -42, 13, 32, 74, 85, -26, -80, -120, -72, 49, -64, -58, -69, -89, 126, 121, 8, -88, -106, - 125, 96, 38, -17, 87, 113, -10, -57, -54, 83, -95, 20, -84, 44, 99, -84, 63, -80, 85, - -10, 114, -20, -44, -51, 110, -16, -101, -84, 115, 59, 24, -67, 108, 112, -18, 60, 114, -69, - -40, -84, 127, 16, 44, -41, 34, -35, 47, 7, 105, 67, 119, -85, 6, 37, 117, -19, -113, - -51, 56, 43, -123, 15, 96, 49, -37, 44, -103, -105, 80, 55, -49, -123, 12, -82, 121, 44, - 33, 127, -60, -92, 28, 28, -87, -127, 116, -8, 66, 119, -42, -112, -44, 43, 19, -79, -55, - 18, 53, -39, -25, 43, 29, -7, 103, -69, 84, -43, 23, -21, 109, -76, -8, 115, 28, -95, - -14, 107, 60, -86, 31, 8, -59, -8, -91, -45, 115, 51, -121, -17, -81, -35, -42, 23, -37, - 105, -5, -76, -72, 42, 11, 92, -5, -13, 34, 112, -2, -42, 47, 47, 116, 35, -117, -52, - 60, 111, -117, 127, 20, 71, 42, 70, -22, 31, 53, 45, -86, -103, 93, -106, 101, 47, 86, - 71, -110, 115, 50, -125, 63, 118, -52, -41, 43, -71, 113, -82, -6, -39, 28, -102, -13, 70, - 28, 22, -47, 68, -98, -84, -103, 41, -87, -42, -77, -67, 121, 106, 71, -23, -121, 65, -106, - -121, -94, 95, -94, 113, -54, -93, -61, 90, -36, -97, 104, -46, 56, 24, -126, 109, 121, -31, - 37, 49, 35, -27, 108, -44, -58, 79, -53, 17, -64, -77, 4, 115, -39, 90, -13, -88, -47, - 20, 64, 34, -47, 7, -103, 0, -124, 10, -100, -113, 24, 85, 4, -40, -69, 33, 80, 40, - -40, -41, -109, -93, -44, -95, 22, 60, -99, -110, 7, -40, -12, -95, 122, -82, -106, 70, 118, - 26, 116, -62, 50, 8, -69, -111, -113, -68, -5, 55, -18, -20, 102, 71, -83, 109, -62, 2, - 88, -74, -110, 88, 25, 82, -31, 17, -75, -19, -25, -58, -4, 103, 75, 41, -74, -116, 119, - -32, -83, 32, -76, -23, -54, -38, 98, 12, -20, -117, 51, 123, -100, -11, 71, 29, 93, -56, - -80, 120, -7, 83, -11, 89, -39, 3, 7, -122, -38, -68, 120, 16, -51, 8, -9, -31, 6, - 29, 105, -5, -26, 8, 92, -56, -41, -54, 16, 64, 92, 124, -120, -97, 47, 86, 12, -94, - -46, 58, 42, -81, 71, 118, -71, -66, 31, 20, 25, 25, -15, -107, 76, 17, -97, -118, 75, - 99, -8, 48, -67, -45, 104, 38, 45, -27, -38, 14, 49, -97, 21, -51, 121, 84, 15, -31, - 3, -2, 88, -110, 5, 106, 9, -56, -78, 24, -115, -112, -1, -121, -114, -100, -39, -45, -64, - 102, -3, 86, -24, 25, 89, -86, -14, 34, -35, 15, 58, -125, 108, -59, -94, 86, 122, -91, - 27, -22, 56, 81, -74, 126, 114, 35, 51, -3, 82, -31, 7, 116, -121, -33, -48, -120, -100, - 63, -65, 122, -68, 84, 85, 1, 79, -8, -32, -69, -58, -52, 21, 76, -109, 62, -124, -89, - -77, 46, -81, 122, -93, 45, -86, -110, 123, -77, 12, -51, 100, -11, -127, 13, -38, 35, 38, - -125, 20, -104, -63, 85, -52, 97, -43, -40, -119, -106, 3, 51, -72, 104, 51, 52, 49, -30, - 65, -107, 72, -28, 64, -89, -115, -20, 67, -100, -45, -89, -121, -61, -124, -18, 93, -108, -69, - 9, -95, -89, -24, 53, 119, 88, 52, 56, -54, 85, -43, 88, -18, 122, -8, 75, 31, -113, - 77, 74, -79, 26, -78, -87, 9, 44, -32, 61, -55, 123, -53, -41, 42, 83, -66, -75, 63, - 62, 108, 115, -34, -52, 38, -44, 88, 50, -51, 24, 26, -108, 100, -113, -73, -124, -40, -3, - -114, 10, 21, -75, 0, 17, -59, -59, -36, -61, -27, 65, 14, 62, 95, 61, 66, 27, -62, - 12, 78, -91, -113, -28, -56, 59, 53, 54, 102, 54, 76, -36, 19, 119, 87, 28, -67, 44, - -98, 4, -15, -64, 80, -68, -24, 27, -48, 63, 9, -54, 105, -113, -114, 8, 48, 51, 14, - -94, 3, -114, 28, -77, -40, 67, 71, -44, 91, 39, 77, 39, 21, 2, -54, -77, -27, -7, - 17, -10, -53, -51, -107, -33, 90, 113, -97, -118, 41, -122, -113, -106, -44, 9, 101, -18, -71, - 41, 98, 58, 36, -84, -22, 104, -43, 101, 29, 74, -63, -19, -58, -13, -16, -78, -56, 22, - 103, 5, 91, 61, -126, 71, 11, -8, -108, -65, 64, -30, 49, -5, -6, 21, 44, 114, -113, - 38, 121, 112, 39, -7, -9, -56, -16, 38, -104, -100, 56, -123, 120, -71, -54, -105, -73, -16, - -16, 117, -70, -67, 45, -72, 104, 69, 1, 78, 10, 95, 52, -122, -39, -21, 107, 3, -80, - 28, -12, -65, -116, 5, 84, -38, -34, 102, -48, -26, 10, -79, 86, -77, -75, -59, -74, 43, - 54, -65, -16, 82, -76, -103, 30, 98, -105, -52, 120, -46, 38, -33, 44, -17, 123, 79, 2, - 55, 118, -30, 20, -59, -52, -55, 32, -28, 96, 53, -115, 11, -59, 92, 51, -111, 0, -24, - 69, 126, 63, 82, 20, 20, -122, 45, -78, -93, -14, -46, -70, 61, 61, 121, 47, -1, -11, - 35, 93, -77, 76, 73, -47, -36, -110, 82, 24, 112, -115, 58, -11, -29, -94, -53, 40, 30, - -67, -49, 88, -99, 124, 97, -64, -53, -59, -47, -63, -14, -35, 7, 47, 60, -69, 60, 30, - -80, -61, -12, -83, 118, -39, -29, 37, 56, -36, 13, 62, -51, 26, 15, 62, -123, -35, 101, - -25, 90, -33, 83, 94, -73, -86, 69, 1, 6, 122, -124, 3, -109, 103, 28, 49, 114, 19, - -27, 120, 32, -56, -69, -77, 100, -38, 48, -17, 10, 7, -107, 31, 64, -86, 19, -22, 108, - -74, 101, -124, -41, -34, 37, -107, 71, 65, 79, 34, 96, 79, -101, -117, 84, 49, 29, -67, - 9, -102, 86, 97, -35, 80, 2, -21, 73, 126, -46, -67, -69, 125, -74, 39, -111, -74, 12, - -6, 74, 54, 90, -105, -73, -5, -115, 13, -14, 94, 14, 103, -106, 54, -56, -57, -84, -84, - -94, -55, 6, 67, -100, 110, -101, 73, 24, -6, -78, -38, -66, 10, 45, -114, -13, -112, -26, - 18, 69, -61, 35, 90, -57, -106, 66, 75, -100, 47, 72, -117, -68, -52, 80, 83, 42, 105, - 34, -35, 51, -122, 35, 36, 44, 66, -41, -82, -34, -32, 13, 62, 89, 88, 117, -57, 45, - -57, 68, 121, -99, 112, 21, 85, 84, 79, 86, 30, -59, -121, -46, -73, -23, 24, 63, -44, - 22, 60, -27, -46, 20, 119, -127, 52, 96, -30, 88, 16, -46, 111, -95, -30, -125, -3, -5, - 44, -94, -70, 91, 23, 41, 63, -65, -29, -107, -124, -77, -54, -124, -54, 43, 73, 93, -9, - -110, 31, -87, 32, -53, 69, 99, 67, -81, 4, 6, -56, -3, 42, 6, 98, 8, -1, -63, - 74, -52, 45, -56, -124, -18, -16, -101, -12, 60, -16, -125, 59, 109, 15, 84, 6, 70, -100, - -22, 52, -110, -22, -6, -47, 123, 5, -117, 87, -21, -7, -107, 23, -56, -100, 91, -69, 5, - -68, 47, -88, -78, 52, 53, 26, 48, 98, 59, 18, -36, 46, -90, 110, 113, -51, 56, -116, - 5, 5, 48, -107, -8, -64, -74, -58, 89, 102, 94, -92, -55, -31, 35, 31, 55, 37, -115, - -5, -17, 42, 4, 56, 55, 10, -50, 2, -117, 112, -123, 33, 122, -17, -41, -12, 52, -79, - 40, -88, -13, 10, -92, 72, 81, 27, 77, 0, -116, 43, -75, -120, -10, 38, -100, 95, 104, - 3, 52, -116, 19, -94, 67, -2, 61, 96, 102, 12, 23, -23, 29, 91, -1, 100, -118, 58, - 49, -108, 94, 70, -73, -50, 122, -15, -16, -68, 101, -11, 47, -53, -109, -105, 0, 25, 13, - -114, -3, -86, 127, 82, 126, -16, 115, -102, 106, -72, 90, 25, -51, -95, -112, 89, -52, 56, - 72, -33, 114, -2, 98, 78, -48, -28, -113, -32, -85, 117, 18, -12, 63, 70, -31, -117, -20, - -77, -41, 59, -65, -80, -82, 111, 47, 4, -107, 32, 118, 108, -125, 115, 47, -98, 106, 42, - -119, -38, -72, -43, -80, -111, 93, -84, -25, 54, 39, 65, -36, 56, -121, -25, -105, -108, -113, - -70, 32, 118, -46, 5, -18, 63, 11, -22, -112, 63, -29, 122, 38, 120, 13, 15, -71, 94, - -26, -42, 90, 39, -113, -20, 103, -13, 19, 19, 95, 3, 30, 100, -27, -67, -39, -56, -118, - 8, -47, -47, -33, -62, -97, 123, 112, -29, 84, 102, 60, -27, 60, 45, -35, -63, 39, -41, - -51, 26, 84, -109, 32, 21, 41, -100, 112, -48, -92, 83, -117, -121, 104, -47, -43, -57, -91, - 91, 8, -86, -29, 50, -68, 76, 125, -88, -89, 77, -108, -38, 70, 102, 40, 8, 39, 45, - -21, 109, -4, 18, 79, -125, -55, -62, 67, -26, 46, 55, -49, 3, 5, -81, -40, -67, 27, - -86, 27, 87, 106, -14, 38, -5, 6, 110, -117, 29, 9, -7, 117, -22, 20, 74, 77, -82, - -26, -121, -58, 8, -38, -54, -113, 43, 64, -120, 10, -26, -9, -86, 95, 110, 46, 68, -72, - 41, 51, 85, 95, 43, -37, 102, -115, 62, 39, -82, -53, -78, -104, -28, 93, 75, -13, 11, - 68, -82, 56, -4, 73, -39, -44, 22, 126, -111, 61, -54, -65, 50, -97, 78, -92, 97, 48, - 125, 122, 41, -19, -48, 119, 18, -45, 32, 14, 119, 118, -95, -80, 103, 95, -85, 116, 75, - -34, 81, -122, -37, 46, -58, 11, -27, 103, -62, 70, -50, 63, -44, 0, 78, -29, -13, -89, - 103, -108, -37, -100, 12, -84, -37, -20, -11, 0, -110, 42, 5, -77, 126, 62, 55, 0, -81, - 81, -122, -34, 102, 18, 82, -96, 65, 122, -61, 0, -54, 46, 106, -79, 19, -35, -100, -121, - 32, 115, 104, 30, 47, -110, -78, 27, 9, -26, -62, 62, 49, 55, 99, -17, -121, 113, -11, - -87, -88, 6, -56, 75, -59, 28, 13, -82, 51, -55, 65, 47, 21, 97, 29, 109, -33, -81, - -96, -71, 73, -105, -124, 10, 41, -84, 9, -8, 104, 95, -5, 93, 42, -76, -96, 48, -9, - 2, 102, -48, 21, -95, 26, -22, -51, 58, 40, -98, 87, 125, 25, 124, -29, 0, -61, -16, - -17, 69, -91, -34, -118, 43, 28, -116, -87, -22, -122, 100, 119, -127, 32, 20, -47, -28, 3, - 72, -111, 110, -21, 123, -7, -78, 4, -63, -48, -86, -125, 62, -99, -21, 127, 42, -64, 21, - -91, -104, -103, 108, 24, -76, -104, 62, 8, 70, -83, 35, 97, -1, -100, 103, -73, 125, 7, - -25, 4, -4, 49, -33, -52, 53, 116, -100, 45, 54, -81, -109, -41, -53, -99, 21, -83, -41, - -3, 14, -113, 121, 37, -50, -125, -6, -65, 13, -11, 88, 24, -117, -46, -65, -72, -89, -48, - -84, 101, 96, -22, -119, -27, 50, 58, -25, -80, -104, 66, 124, -71, 62, -120, -94, 63, -87, - -114, 53, -8, 39, 30, 63, 41, 33, 26, -33, -108, -48, -42, 5, 31, -39, -81, -100, 1, - -123, 11, 69, 86, 108, -4, -118, -52, 99, -35, -117, 11, -59, -68, -95, 11, 21, -13, -64, - 20, 90, 97, -30, -58, 31, 86, -90, 95, -104, -16, 74, -52, 108, 85, -44, -111, -80, 28, - 11, 88, 87, 125, 59, 57, 7, -22, 126, -99, 75, 123, 122, 124, 103, 14, 56, 103, -96, - -108, 64, -5, 50, -37, 106, -62, 82, 76, 11, -65, -115, 125, 60, 23, -57, -24, -97, -101, - 70, 50, -106, 59, -123, -60, -108, -25, 46, 61, -108, 27, -115, -15, 107, 118, 126, -124, 49, - -10, 85, -90, -58, -52, -89, -68, 33, 36, 5, 78, -2, 102, 67, -43, -57, -116, 61, 23, - -95, -104, 4, 15, 16, -123, 55, -105, -24, 64, 25, 93, 104, -11, 91, -119, 4, -87, 94, - 69, 60, -56, 15, 93, 1, 0, -80, 21, 17, 54, 55, 34, -16, 112, 33, -36, 76, 25, - -2, -86, 59, 16, -80, -34, -39, 57, 35, -7, -111, 69, 49, 126, 6, 67, -36, 63, 92, - -108, 99, -12, 44, -5, -98, 127, -119, 114, -31, 47, -96, -21, -125, 26, -110, -24, 72, -21, - -124, -78, 109, -9, 94, 49, -61, -56, 115, 123, 31, 124, -65, 80, 118, -32, 64, 58, -54, - -62, 21, 101, 127, 49, -54, -99, 84, 44, 124, -73, -11, -49, -108, 25, -97, -80, 48, -10, - -4, 89, 119, -7, -82, -97, 17, -40, 57, -24, 62, -84, 37, -114, -62, 56, -18, -52, -60, - 62, 114, -37, 48, 127, 43, -122, 13, -79, -70, -34, -46, -126, 105, 14, 54, -100, 57, -23, - 119, -65, -61, -94, -54, 72, -64, -13, -125, -61, 10, 1, 8, -30, 34, 41, 62, 18, 32, - -88, -81, -109, -57, -75, 103, 62, 2, -101, 29, -23, -125, 92, 104, 18, -3, -79, -58, -103, - 89, 29, 75, -39, -117, 87, 48, 45, -89, -101, -57, -67, -103, -53, 70, 68, -3, 88, 72, - -62, 16, -14, -105, -50, 28, 6, 103, -110, -13, 65, -114, -44, 90, -119, -14, -117, -63, -88, - 68, 100, -99, -58, -51, -74, 66, -121, 97, 96, 96, -117, 7, 103, 96, 24, 62, -34, -24, - -63, 39, -52, 66, 62, -57, 71, 125, 1, -99, -122, 52, -119, 50, 73, 110, 99, -76, -41, - -12, -67, -11, -36, 62, 51, 97, -93, -106, -87, 126, -51, 16, 50, -3, -94, -67, 13, 62, - 14, 13, -94, 46, 83, 22, 123, 76, 49, 124, -1, -56, 14, -41, 53, 91, -119, 79, -50, - -110, 15, -119, -89, -58, -22, 90, 115, 125, -79, 121, 8, -29, -90, -20, 65, -49, 117, 35, - -110, -27, 53, 88, -75, 1, -38, -85, 102, -73, -72, -51, 52, 27, -78, -63, -6, 124, 13, - -127, 7, 95, 63, -85, -46, 18, 68, 40, -48, 43, -48, -114, 68, 24, 102, 64, -72, -74, - -3, 77, 62, -36, 95, -107, -34, -120, -49, -110, -73, -55, -11, 24, -115, 85, 5, 102, -58, - 71, 105, 66, -120, 99, 126, -123, 98, -115, 100, 126, -74, 54, -90, -10, 90, 12, -61, 23, - 120, 32, 85, -91, 24, 53, 88, -4, 25, 43, 39, -107, -86, -75, 1, -18, 40, 83, -26, - -107, 7, 126, 66, 29, -88, 77, 21, 55, -68, -117, -5, 93, -8, -100, 24, -14, -14, 55, - 77, 72, -111, -65, -85, -75, 81, 123, -9, -102, -74, -114, 83, -36, 33, -41, 77, 6, 62, - -3, -34, 66, 2, 52, 71, 86, -91, -100, 14, -67, 100, -44, -45, -73, 63, 122, 49, 121, - -32, -97, -43, 55, 5, -72, 60, 15, 125, -117, 72, -79, 126, -102, 93, 6, -74, -123, 84, - 26, -49, 51, 121, -95, -37, -20, 4, 15, 35, -124, -87, 86, 71, -73, -63, 31, 62, -77, - 55, -86, 25, -107, 103, 111, -126, -87, 29, 41, 112, 63, 6, -20, -57, 8, 32, 52, -77, - -12, 89, -24, 22, -36, 41, 88, 13, -71, -18, -82, 3, -6, -51, 44, -70, 94, 86, 86, - -47, 66, 55, 71, 8, -37, 96, -94, -23, -21, -55, -97, 27, -95, -60, -28, 103, 66, -18, - -23, -83, 1, -44, -77, 66, -56, -73, 20, 101, -71, 96, -60, 57, 15, 97, 74, -78, 58, - -38, 64, 97, 125, -28, -47, 0, 24, -119, -81, 56, -70, -108, -29, -33, 85, 122, -3, -70, - 39, 37, -81, 25, 75, 101, 16, 34, 1, -117, 47, 117, 85, -14, -101, 108, 0, -89, -119, - -74, 108, -66, 38, 104, -39, 112, 70, -15, -76, -29, 47, 22, -40, -51, 84, -99, 61, -96, - -48, -45, 121, 20, 51, 104, -3, 99, 14, 109, 71, 108, 104, 30, 49, -94, -33, 26, -7, - 115, 68, 41, 64, 39, -88, -74, 27, 4, 40, -28, -71, 35, -10, -99, 14, 62, -60, 34, - 115, 13, 60, 97, -36, 114, -121, -92, 52, 29, -52, 10, 78, -118, 37, 53, -78, -38, 100, - -50, -101, 42, -78, 35, -97, -79, -38, -80, 1, -33, -52, -24, 92, 103, 40, -114, 57, -66, - 78, -75, 81, 115, 47, -26, 53, -110, 11, -45, 30, 22, 70, 103, 73, 18, 102, 65, -109, - -102, 24, -79, 19, -71, -28, -45, 107, 115, -121, 119, -108, -88, 22, 62, 87, 37, -15, -85, - 89, -82, 78, -100, 43, 68, 98, 33, -111, 61, 69, -15, -28, 57, -40, 11, -16, 7, 126, - -75, -16, 55, 61, 122, -67, -91, 33, -28, 10, 84, -109, -24, -97, -100, -101, -14, 124, -122, - -54, -27, -119, -109, -29, -78, -109, -70, 53, 65, 119, 40, 77, -90, 103, 57, -69, -51, 23, - 109, 17, 9, -26, -101, -85, -3, 72, 59, -74, 68, -124, 52, -52, -63, -103, -19, 7, -16, - 83, -55, -56, 98, -38, -49, -96, 53, 111, 13, 87, 0, 80, 100, -107, 78, 63, 75, 17, - 7, -52, 115, 87, 51, -39, -96, -80, 65, -97, -123, 76, -121, -58, 86, -68, 89, 36, -51, - 41, -46, 89, -21, -15, -34, 45, -81, 23, 117, 49, 39, -71, 12, -51, 82, -111, -63, -125, - -44, -74, 126, -101, -111, -67, 45, 60, 77, -12, -50, -75, -50, -100, 54, -6, -7, 57, 58, - -63, 33, 56, -59, 86, 113, -34, 103, -112, -33, 82, -96, -30, -124, 119, -123, 7, 14, -20, - 108, -21, 127, -75, 18, 112, -69, 31, 79, -55, 96, 99, 125, -6, -104, 70, -119, 70, -41, - 125, -12, 89, -111, 112, 8, 97, -124, -113, -86, -68, -115, 9, -56, -111, 32, -16, -91, 29, - -66, 53, 69, 53, 94, -38, 27, -104, 58, -35, -62, -24, -74, 11, 109, -32, -89, 30, -70, - -75, 57, 110, -86, -94, -115, -72, 82, -77, 53, 41, -85, -31, 16, -51, 72, -15, 40, 38, - 27, 120, -118, 97, 74, -93, -18, 9, -35, 72, 34, 45, 77, -116, 99, 80, -80, 15, -83, - 25, -75, -48, -74, -15, -78, -118, 84, 15, -112, -103, 24, -42, -108, 93, 116, 44, 56, 124, - 45, 6, 30, -28, 63, 23, 25, -19, -109, -2, -103, 105, -70, -9, -126, 51, 115, -106, 25, - 38, 66, 48, 83, -92, -84, 16, 29, 109, 33, -17, 108, 81, 8, 60, 50, 125, 126, 11, - 80, -91, 26, 58, 103, 53, -53, 20, 19, 118, -82, -100, -69, 99, -127, -88, -90, -120, 119, - -25, -5, -103, 116, -42, -4, -99, 57, -61, 118, 108, 125, 14, 90, -29, -24, -99, -78, 103, - -103, 47, -45, -42, -88, 34, -1, -121, 15, 109, 5, 126, -126, -26, 75, 32, 1, 52, 3, - 72, 75, 92, -102, 22, -123, -49, -28, 56, 55, 21, 20, -89, 70, -65, 123, -52, -38, -56, - 13, 89, -35, 113, 36, -50, 19, 12, -20, -5, -65, -60, -66, 39, 17, 75, 51, -105, -23, - 53, 85, 109, -123, -39, 21, 15, 83, -4, 64, 125, -64, -40, 72, 94, -117, 9, -83, -35, - 33, -122, -101, 37, 110, 52, 0, -26, -119, 113, -93, -54, 91, -58, -83, -54, 34, -113, 67, - 70, 23, 6, 120, -31, 57, -119, 38, 25, 34, -23, -30, 106, 22, -23, 47, -101, 9, -37, - -96, 8, 69, -77, 108, 1, 42, -36, 119, -5, -65, 29, 66, -119, -94, 64, 92, -95, -49, - 125, 13, -94, 81, 5, 123, -21, 97, -86, -32, -121, -92, -30, -45, -124, 42, -45, -118, 116, - -120, -15, -40, 62, -76, 100, -97, 34, -44, -49, -16, -87, -95, -116, -24, 12, -73, -98, 123, - -25, -9, 112, 57, -104, 102, 72, 100, 118, 53, 67, -32, -64, 82, -47, 81, 127, 74, -59, - -76, 120, -71, 4, 72, 62, 47, 0, 118, 66, -120, -50, 108, -117, -34, -59, 47, 25, -2, - -109, 86, -32, 80, -75, -43, 50, 88, -113, 111, -101, 103, -91, -19, -77, 58, 1, 124, -107, - 59, -73, -91, -122, 80, 33, -20, 1, 97, 101, 28, 5, 30, 60, -39, -41, -68, 82, 59, - 21, 61, -99, 22, -123, -14, -73, -108, -99, 62, -51, 17, 41, 89, 88, -22, -28, -20, 123, - 17, -125, 72, 83, -113, 76, 73, 113, 108, 27, -54, -29, -52, -121, -22, -126, -44, 46, -89, - 127, -29, 120, -87, -73, -55, 98, 21, 15, 4, 126, 111, -5, 105, -20, 73, 41, 97, 119, - 33, -20, 88, 88, -44, 58, -93, -116, -116, -9, -85, 85, 109, -121, 90, -86, -109, 15, -51, - 50, 24, 57, 27, 2, -68, 83, -82, 110, 80, -120, 85, -87, -106, 120, 4, -60, 81, -81, - -53, 36, -16, 34, -91, 40, -88, 37, -105, 95, 0, 70, -94, 54, 51, 34, 100, -48, -105, - -44, 39, 63, -81, -9, 119, 1, -63, -94, -122, 14, -87, -68, 5, 57, -100, 63, -69, 108, - 83, -22, -61, 32, 103, 91, -69, 121, 71, -28, -100, 122, 27, -77, -33, 11, 64, -95, -103, - -17, 108, -44, 7, 75, -5, 76, -51, 18, 42, 62, 23, -9, 103, 82, 20, -86, -35, -102, - -19, -66, -71, -80, -126, -73, 118, -118, -108, 27, -79, -68, 120, 60, 81, -2, -43, -52, -39, - 87, 39, -63, 93, -28, -106, 110, -48, 18, 43, -87, -23, 116, -63, 32, 24, -107, -122, -122, - 75, -25, -43, 124, -87, 98, -68, -121, -7, -106, -12, 72, 73, 58, -63, 104, -64, -35, 77, - -119, -91, -3, -124, -94, 92, 74, -31, 33, 70, 53, 81, 69, 105, -94, -28, 86, -91, -41, - 39, 25, 27, 0, 118, -38, 43, -95, 19, 43, -66, 92, 65, -122, -23, 68, -96, -111, -65, - 64, -20, -62, -76, -60, -36, 65, 100, -126, -60, 27, -35, 53, -2, -98, 100, -54, -85, -42, - 60, -93, 112, -12, 48, -109, 10, 76, 57, -82, 34, 110, -7, -102, -60, 76, -101, 109, 48, - 0, 81, 123, -31, 103, -51, -101, -20, 59, -39, 104, 126, 36, -15, -35, -76, 18, 25, -82, - 89, -61, 15, -22, 108, -86, 44, 106, 29, 34, -117, 16, -7, 53, -113, 59, -91, -126, 123, - 114, -14, -116, 91, 115, -15, 119, 73, 69, -99, -103, 69, -115, 118, 43, -24, 83, -108, -101, - 114, -18, -117, 15, -103, -29, 118, 51, -115, 119, 81, 4, -55, -96, 59, 6, 50, 64, 21, - 54, 124, -19, -108, 39, -119, -123, 9, 124, -94, -2, 13, 3, -96, -110, -11, -8, 30, -42, - -24, 42, 112, -21, -37, 47, -106, 25, -50, 17, 56, -75, -58, -70, 77, -88, 91, 100, 51, - -12, 55, -3, -114, -55, -68, -46, -3, -38, 108, 15, -117, 61, -31, -29, -72, -24, -79, -37, - -81, 0, -7, 96, 109, 75, -127, 90, 88, 125, -11, 110, -6, -81, 63, -121, 48, 94, -36, - 82, -17, -87, -29, -60, 12, -33, -40, 23, 21, -58, 1, -73, 48, -6, -110, -55, -65, 120, - 109, -46, 105, 71, -111, -16, 32, -45, -96, -93, -89, 112, 89, -39, -47, 59, 33, 125, 108, - -86, -124, -53, 45, 117, -23, 67, 10, -124, 57, -107, 51, -77, -54, -98, 20, -81, -28, 41, - -56, -87, 49, 51, 103, 80, 13, 22, -28, -26, 105, -107, 36, 74, 85, -47, 19, -43, 14, - -126, -101, 118, -94, 120, 71, 120, -60, -122, -122, 24, -35, -113, 122, -87, -84, 11, 53, -38, - 82, 32, 7, 37, 119, 80, -4, 49, -34, 15, -127, 74, -30, 99, 19, -78, -27, 7, 30, - -15, -29, -46, 50, -15, -61, -97, -31, -111, -97, 127, -98, 29, -126, 22, 20, -91, 117, 126, - 89, -17, -46, -76, -86, 107, -123, -82, 8, 26, 18, -112, -2, 28, 120, -96, -76, -95, 49, - -61, -23, -69, 113, 1, -122, 52, -4, 122, 78, -91, 81, -74, -63, 62, -113, -78, -25, -66, - 68, -66, 127, 110, 118, -70, 110, 88, 88, -98, -109, 6, -10, -98, -90, -108, 84, 124, -27, - -60, 8, 59, 29, -27, -27, 22, -71, 5, 9, 73, 120, 114, 98, 4, 92, -84, -108, -42, - -120, -28, -111, -85, 7, 5, -62, -121, -81, 3, 26, 99, 106, -15, -84, -103, -52, 55, 93, - 47, -89, 58, -24, -98, -26, -84, -62, 6, 88, 87, -48, 97, -86, 17, 73, 12, 73, 65, - -104, 47, -111, -30, 84, 38, 67, -7, -51, 91, -114, 2, 33, 126, 4, 28, -51, -113, 77, - 67, -88, 70, 31, 95, 14, -94, 89, -3, -109, -88, 65, 77, -101, 71, 83, 13, 68, 68, - 115, -69, -16, 49, -96, 28, 35, 32, 69, -41, -36, 95, -52, -89, 87, 73, 80, -108, -76, - 70, -73, -53, 65, -42, 20, 39, 8, 11, -46, 13, -101, -86, -106, 80, 110, -10, -53, -54, - -29, -76, -101, 12, -38, -94, 53, -90, 81, -86, -29, 89, -77, 73, 91, -22, 101, -107, -43, - -38, -88, -27, 25, 85, 99, -99, 30, -38, 114, -18, 33, -73, -122, 29, 30, 29, -84, -5, - -15, -66, 10, -60, -116, 45, 16, 35, -113, -12, 7, 4, 55, 40, -28, 42, 83, 81, -21, - 106, 41, -125, -67, -44, -32, 26, -66, 113, -24, -29, -127, -58, -65, -122, -13, -85, 103, 81, - -1, 98, -89, -74, 25, 118, 45, 45, 91, -101, -60, 122, 0, 88, 19, -53, 47, -81, -25, - -79, 93, 103, 32, 32, -122, -61, 127, -1, -108, 69, -51, -66, -114, -22, 106, -105, 55, 65, - -94, 114, 24, -52, -38, -112, -57, 65, -36, -1, 81, 27, -60, -112, -44, -48, 22, 118, -104, - 13, -83, 15, -4, -3, 68, 64, 64, 52, -52, -57, 95, -31, 33, 78, -57, 51, -62, -72, - -86, -22, 68, -55, 115, -35, 92, 118, 80, 80, 93, 12, -6, -70, -50, -56, -119, -31, -65, - 16, 52, 75, 116, 15, -32, -103, -79, -39, 27, 43, -63, 37, 45, 11, 15, 73, -40, 106, - 0, -60, 116, -50, 106, 3, -123, -40, -102, 69, 91, 7, -42, 43, -104, -36, 122, -99, 105, - 41, 52, 10, 88, -6, -82, -80, -17, -65, 106, -109, 79, 73, -4, -51, -52, -35, -70, 14, - -89, 125, 99, -85, -32, 22, 34, 18, 122, 15, -64, 110, 56, 81, -120, 48, -50, -31, 110, - 3, -12, 41, -17, 24, 91, 22, -44, -73, 92, -8, 48, -124, -2, -65, 36, 52, 29, 35, - 75, -97, 59, -18, 11, 1, -87, 33, -125, 80, 11, -66, 33, 44, -68, -112, 99, 20, 25, - 43, 95, 53, -119, -48, -36, 15, 39, 101, 44, 37, -102, -116, 110, -50, -80, 36, 83, -60, - -60, -115, -73, -124, 51, 3, -83, -71, -103, -46, -110, 21, 100, 68, -30, 108, 99, -83, -77, - -50, -88, 35, -57, 91, -37, 45, 33, 29, -45, -16, -54, 52, 120, 107, 71, 95, -20, -118, - 113, -48, -78, -21, 61, 28, -59, 38, -45, 97, 53, -43, 63, 45, 69, -121, -11, 20, -57, - -124, -18, 101, 77, -38, 122, 19, -91, 68, -39, -42, 91, 115, -73, -7, -15, 34, -102, -122, - -1, -102, 29, 67, 43, -117, 94, 47, -2, -103, -77, 60, -81, -12, -49, -58, 12, 77, 76, - -76, -114, -32, 112, -5, -61, -95, -88, 82, -120, -24, -81, 83, -76, 67, 54, 37, 28, -11, - 2, -82, -23, -48, 7, -111, -31, -33, 85, -83, -23, -35, 33, 53, 2, -38, -3, -35, -72, - -127, 69, 58, -11, 42, -35, -35, -71, 108, 114, 29, -50, -44, 68, 33, -126, -105, 65, -42, - -57, 15, -98, -86, 27, -81, 117, -63, -82, 74, -113, 54, -32, 121, 41, 4, -22, -50, -63, - 103, -61, 116, -98, -23, -126, -46, 6, -41, 115, 125, -70, -28, -29, 98, -105, -51, 26, -25, - -108, 31, -16, 40, -117, 78, -31, 114, -85, 114, -118, 80, -88, 43, -117, -41, 89, 22, -109, - 98, 127, 48, -29, -59, 97, -43, 14, 97, -118, 80, -34, -116, 118, 116, -73, -27, -99, 115, - 39, -101, -99, -88, -57, 16, -96, -73, 53, -114, 78, -36, 110, 81, -49, 112, -41, 82, -42, - -24, -59, -25, 89, -58, 118, -72, 113, -66, 44, 93, -86, 66, -110, 33, -61, 121, -53, 4, - 61, 63, -112, -109, -57, -99, 83, 57, 87, -105, -22, -27, -91, -111, -91, 124, 46, -50, 83, - 112, -122, -42, 13, 103, 101, 1, 26, 84, 82, 67, 121, -84, -110, 77, -18, -37, 54, -58, - -39, -68, -23, -117, -114, -62, 91, -33, -63, 71, -1, 4, -1, 46, -60, 6, -39, 2, -9, - 29, 111, 3, -89, 15, 68, 98, 98, 9, -76, 115, 5, 9, 81, 38, -46, -118, 68, -116, - 96, -98, 37, 70, -102, -6, 30, -117, 44, 65, 107, 101, -36, 65, 105, 48, 32, -84, -40, - 118, -77, 47, -97, 12, 63, 0, 125, 94, 109, 53, 74, -51, 28, -33, -53, 33, -33, -42, - -99, 100, 116, -110, 107, -90, 101, -28, 44, 61, 13, -29, 123, 85, -117, -99, -93, -57, 106, - 67, 102, -62, 64, -86, 43, 63, -3, -59, -5, -28, -42, 19, -19, 115, -53, -7, 15, -27, - 118, -27, -42, -102, -30, -27, -14, -48, -99, 102, 73, 49, 86, -16, -52, 74, -42, 39, 103, - 37, 108, -42, 17, -118, -105, 109, -117, 18, 74, -22, 80, 77, -8, -26, 99, -48, -47, -21, - -31, 4, 86, 122, 20, 55, 32, 118, -124, 74, -45, -42, 56, -96, -11, -33, 8, 116, 104, - 125, 78, -118, 111, -92, 79, 106, -65, -70, -109, -89, 93, -35, -8, 97, -37, 47, 75, -97, - 90, -62, 113, -77, 70, -82, -109, -111, 13, 120, -9, 62, 72, -3, -98, -89, 60, -115, 35, - 56, -116, 83, 119, 75, -125, 105, 41, 109, -105, 115, -26, 45, -109, -25, 69, -91, 81, 43, - -33, 127, 25, 14, -44, -65, -30, -106, 42, -78, 31, -98, -64, -80, 63, 44, -121, -10, 100, - -65, 55, -36, -85, -21, -124, 88, -26, 36, -30, 110, 127, -61, 29, -72, -114, 114, -76, 30, - -53, 72, 39, -60, -49, -44, 99, -26, 70, 22, 67, -89, -127, 66, -80, 45, 32, 42, 40, - 3, 19, -21, -116, 105, -62, 23, 122, -7, -5, 16, 104, 96, -75, 86, 53, -34, -21, 118, - -52, 1, 78, -1, 60, -26, 76, 63, -25, 103, 10, 22, 54, 25, -65, -41, -72, 45, -107, - -4, -117, 40, -7, 91, 45, -13, 36, -90, 5, -70, -38, 19, -98, 49, -125, -15, -92, 67, - -13, -87, -30, -67, 118, 69, -65, -102, 39, -47, -61, -62, 77, 63, -18, -82, 36, -85, 25, - -14, -17, 58, -75, -10, -4, 2, 42, -41, 42, -101, 116, -116, -102, -120, 32, 34, -50, -51, - -47, -80, 49, 37, -9, -90, 24, 66, 49, -3, 97, 41, -57, 122, -85, 96, 90, 76, -27, - 99, -102, 122, -44, 76, 114, 10, -81, -101, 94, 123, 69, 59, -19, 33, -96, -93, 22, -55, - 52, -35, 14, -14, -71, -85, -93, -7, 74, -4, 100, 112, -20, -107, 115, -49, -34, -78, 83, - -96, -48, 110, -76, -79, 62, -91, 48, 26, -80, -73, 63, 31, 88, 26, -20, -115, -40, 100, - -75, -17, 98, 51, -51, 48, -66, 23, 122, -38, -12, 123, -19, -95, -10, 57, -57, -48, 70, - 83, 16, 41, -104, 48, -71, 20, 110, -7, 84, 105, -56, -42, 104, 117, -15, 61, -69, 25, - -66, -104, -26, -98, -86, -112, 52, -111, -85, 72, -34, 8, 94, 106, -12, -53, 94, 126, 7, - 76, -13, 90, -58, 86, 28, 42, -71, -89, 27, -72, 42, 7, 102, -43, 68, -7, 1, -101, - -49, 100, 39, 64, 8, 44, -68, 16, -92, 31, 100, 6, 49, -89, 14, 90, -113, 95, 87, - 122, 27, 34, -107, 96, -6, 81, 14, 42, 0, -124, -85, 38, 84, -6, 91, -61, -87, -68, - -16, -45, 126, -104, -36, -35, -25, -36, -92, -124, 6, 41, -41, -25, -75, 34, -35, 76, 15, - 13, 127, -99, 30, 22, 28, -20, -10, -77, -48, 61, 73, -90, 34, 116, -80, -4, -45, -18, - 36, -4, 109, 42, 92, -48, 121, -13, -71, -95, 57, -22, 105, 117, -65, -90, -70, -123, 91, - -22, -90, -110, -107, -113, -40, 71, 60, -95, -72, 95, -106, 76, 43, 48, -44, -105, -112, -64, - 100, -59, -87, -64, 56, -118, 89, -15, 79, 63, 99, 107, -84, -113, -26, 121, -50, 14, -123, - 76, 49, -84, 90, -108, -22, 56, -4, -99, 28, 83, -39, -35, -34, -25, -13, 46, 28, 124, - 57, 19, 1, -52, -49, 93, 80, 12, -108, 110, 45, -56, 35, 76, -35, 2, -5, -101, -76, - -7, -37, -100, 70, -92, 123, -74, 102, -9, -19, -37, -70, -4, 126, -43, -58, -65, 59, -101, - -19, 11, -118, 76, 48, 6, -122, 116, -125, -105, 2, 6, 125, -27, -61, -119, 98, -1, -25, - -120, -70, -16, -27, 55, 82, 121, -28, 47, 27, -64, 105, 19, 62, 15, -38, 66, 17, 101, - -21, 111, 66, -29, 101, 43, 20, -70, 91, -72, 45, -22, -12, -64, 73, 75, 59, -77, -75, - -19, 51, 94, -105, 62, 114, 95, -125, -42, 104, 44, -117, -76, 74, 62, -32, -10, 33, -43, - 73, 101, -40, 101, -7, 88, -103, 49, -104, -76, -84, -94, 52, 31, -68, -127, -93}; + -30, 38, 31, -117, -44, -11, 115, -1, 50, -4, 41, -123, -95, 67, -15, 120, -108, 45, 74, + -58, -116, 66, -121, 48, 34, -12, 82, -12, 32, -105, -61, 34, 125, 89, 11, -66, -54, 27, + -38, -21, -111, 97, -125, 68, -14, 84, -121, 3, -10, 97, -41, -53, -119, -28, -73, 117, -6, + -16, -85, -120, -39, 33, 126, -81, 31, -123, -17, 18, -24, -95, -11, -119, -127, 124, 117, -1, + 117, 86, 25, -73, -86, 57, -37, 86, -102, 52, -85, -50, -56, 118, 52, 67, 61, -100, -20, + 11, -57, 119, 66, -76, -21, -62, -75, 26, 0, -95, 49, -86, 45, 99, 15, -117, 36, -70, + -121, -19, -23, -20, -29, -124, -40, 125, -30, -103, -52, 97, 89, -102, 24, -101, -44, 123, -28, + 99, 107, 46, 8, 60, -1, 26, -78, -19, 70, -124, 53, 17, 64, -36, 31, 117, -26, 92, + -32, -71, 124, -9, -78, -13, -1, 109, -38, 9, 47, -127, 78, -15, -76, -21, 5, 106, 124, + -103, 75, -107, 81, -64, 75, 55, 73, 86, -4, 82, -31, -81, 28, 6, -55, -67, -15, 85, + 42, -57, 68, -2, 117, 38, 10, 11, -98, -127, -122, 81, -83, 15, 59, -122, -77, 98, -119, + -85, -19, -78, 110, -36, 104, -44, -75, -98, 91, 74, 111, 105, 10, -26, -84, 110, 126, 54, + -57, 77, -121, 76, -68, -12, 72, -26, 123, 126, 124, -104, 79, 59, -58, 8, -48, 112, -28, + 125, 24, -97, 52, -106, 85, 115, 62, -121, -75, 109, -28, 5, 40, 112, 29, 126, -50, -119, + -104, -73, -32, 123, -79, 3, -57, 122, 19, 101, 24, 86, 57, -100, 8, 123, -123, 18, 74, + 30, -12, -88, 74, 1, 116, 12, -84, -115, -80, -108, -124, -60, 88, -111, 50, 14, -6, -19, + 81, 66, 105, 93, 17, -29, 33, -49, 45, -1, -24, 114, 125, -46, 120, 117, -121, -99, -80, + -87, 96, -49, 91, 122, 80, -108, 50, 31, 106, -83, 122, -115, -122, -126, -102, -50, 47, -26, + -66, -98, -71, 79, 38, 2, 54, -46, -103, 97, -2, 127, 85, 34, -119, 102, -80, 47, -15, + -68, 0, 57, 103, -22, 12, 9, 88, -5, 58, 44, -105, 88, -24, 49, 110, -32, -74, -60, + 124, -31, -65, -17, -120, 21, 67, -111, 112, 56, -5, 40, 65, 21, -90, -125, -3, -76, -69, + 120, 20, 98, 71, -88, 55, 83, -105, 91, -111, 22, 62, 86, 112, -102, -5, -90, -43, 108, + 20, 14, 83, -43, 42, 40, -33, 10, -7, -76, -77, 18, 63, 126, -66, 96, -49, -19, 34, + -86, 49, -69, -89, -104, -96, 82, -108, 103, 79, -52, 102, 79, -29, 71, 22, 0, 122, -100, + 46, 62, -114, 82, 72, 81, -55, 99, 108, 39, -29, -95, 84, -9, -36, 19, 0, -65, 105, + 27, 95, -81, -28, -37, -51, 82, -78, -63, -122, -15, -13, 16, 27, -38, -18, 4, -15, -95, + 67, -43, 62, -98, -97, 32, 98, 64, -125, 107, -83, -84, 83, -88, 36, 114, 51, -48, 118, + -48, 4, -112, -43, 32, 120, 90, -72, -32, -97, 64, 35, -81, -41, -76, -43, 82, 124, 52, + -8, -94, -62, 110, -53, -33, -126, -20, -43, 110, -91, 26, 3, -56, -20, -47, 92, -19, -42, + 120, -111, -119, 52, -35, -89, -94, 94, 77, -55, -5, 20, 24, -113, -125, -26, -66, -36, -28, + 12, -70, 66, 25, -62, 109, 83, -82, -37, -71, 12, 0, -89, 101, -23, 14, 82, 47, -65, + 122, -7, 93, -115, -75, 122, 42, -53, -39, 32, 85, -124, -62, -60, 25, -2, -39, 77, -103, + 20, 38, -82, -39, 53, 33, -64, -29, 8, -114, 4, -10, -19, 56, -95, 110, 34, -98, -31, + -72, -29, -26, 88, 57, -42, -10, -106, -70, 57, 6, 123, 27, 28, -121, 107, 5, -58, 34, + -124, -109, -16, -112, 113, -91, 37, -102, -122, 89, -70, 101, 89, 8, 41, 114, 38, 118, -63, + 78, 7, -71, -67, 124, -55, -40, -88, -68, 61, -13, -81, 83, -111, 100, 100, 102, -119, -83, + 13, -10, -104, 8, 1, 112, 82, 54, -67, -15, -102, -112, 116, 21, 56, 7, -122, 2, 113, + -79, -71, 39, -70, 47, 107, -66, -44, 57, -117, 85, 82, -67, 74, -101, 42, 17, -15, -53, + 80, -50, 70, -48, 31, 88, -60, 61, 46, 76, -22, -64, 95, 58, 73, -30, 111, 61, -86, + 90, 36, 38, -121, -69, 31, 80, 46, 48, 12, 12, 4, -109, -126, 7, -111, -117, 75, 11, + -39, 78, -59, -86, -83, 23, 100, -116, -49, -52, 88, -31, -108, -38, -33, 5, -2, 123, 32, + 39, -88, 13, -13, 61, -98, -109, -29, 11, 11, -122, 44, -4, -29, -74, -86, -123, 65, 6, + 60, -6, 62, 9, -72, -61, 72, -3, 22, 11, -106, -6, -69, -36, -12, 117, 114, 71, 93, + -55, 88, 41, 11, 9, 34, -85, 40, -120, 54, 35, -50, 57, 12, -60, 112, 32, 11, 107, + 36, 45, -20, -68, 114, 96, -32, -53, -56, -79, -1, -72, 30, -72, 59, 52, -3, 120, 90, + 15, 96, 97, 27, 11, -53, 79, -104, -125, 83, 109, 110, -88, -122, 55, 90, 99, -108, 32, + 13, 117, 22, 31, -70, -80, -69, 124, -59, 14, 76, 124, -49, 56, 109, 58, -16, -54, 17, + -95, 81, 74, -65, 14, 7, 85, 41, -40, 8, -58, -113, 61, -42, -15, 13, 34, -118, 61, + -49, -18, -112, -36, 54, 82, 74, 0, 15, 78, -117, 38, -119, 2, 30, -114, 49, -93, -78, + -69, 104, 21, 14, -51, -22, -14, 127, 21, -12, -98, -122, -73, 93, -33, 45, -32, 56, -124, + -94, 27, -1, -58, -6, -1, -34, 66, -64, -97, -78, 82, 103, 59, 75, -30, -6, -36, 11, + 54, 59, -3, 3, -89, -84, 47, -24, -64, 35, -17, -93, -65, -99, 8, 65, 76, -117, 20, + -93, -110, -105, -23, -21, -18, 69, 36, -46, -78, 119, -34, -84, -51, 74, -78, -5, -24, -53, + 117, -120, -22, -116, 7, -83, -45, -93, 58, 36, -119, -84, 39, 58, 97, 108, 54, 35, -19, + -50, -79, 31, 114, 2, 83, 81, 16, 118, 28, 30, -117, 39, 64, 110, 2, -13, -6, -70, + -6, 65, -29, 55, -51, 121, 67, 45, 115, 81, 50, -26, 58, 83, 30, -108, 115, -39, 89, + -38, -92, -21, -106, -80, 4, 17, 111, -24, 34, -34, 36, 30, -7, -55, 117, -96, 81, 119, + -2, -120, 17, 41, -79, -99, -45, 8, 94, 80, -25, 69, 9, 85, -88, -96, -119, 22, 90, + 32, -87, 43, 40, -26, -87, -7, 82, 103, 51, 73, 57, 1, -105, 12, 82, -89, 76, -51, + -26, -104, -49, 1, 111, 53, 73, -109, -37, -72, 56, -119, -49, -63, -90, -12, 57, -85, 21, + -103, 22, -14, 2, -53, 104, 28, 74, -114, 83, 43, -100, -41, 13, 108, 25, 22, 7, -3, + 33, -122, 7, -76, -98, -13, 37, -98, -46, 127, -126, -124, -71, -56, 112, 51, -6, 70, 15, + 126, 38, 19, -85, 103, -65, 2, -57, -124, 111, 91, 4, 97, -10, -52, 73, -53, -37, -63, + -14, -51, -80, -56, -111, 67, 24, -1, 74, -12, -15, 49, -69, -115, 37, -14, 1, 35, 116, + 90, 60, 79, 38, 50, 118, -26, 101, 41, -87, -114, -23, 44, -8, 21, 46, 29, -48, -118, + 15, -56, 13, -5, 20, 83, 22, 63, -96, -47, -18, -72, 21, -99, 42, -97, 19, 99, 94, + -7, 96, -77, 78, -43, 56, -37, 120, -63, -60, 8, -22, 87, -96, 102, 82, -5, 95, 91, + -94, -53, 21, -55, 60, -96, 123, -102, 96, 8, -14, -87, -95, -77, -55, 50, -119, 92, 37, + -17, 47, 7, 0, 66, -21, 117, -60, 59, 111, 102, 127, 119, 105, 97, -94, 48, -63, 42, + -8, -10, -70, 83, -119, 112, 10, -99, -102, -21, -57, 35, 18, -85, 26, -28, -41, 85, 32, + -54, 84, 12, 121, -17, 21, -51, 34, -31, 116, -62, -111, -37, -59, 6, 64, -27, -85, 87, + -71, -42, -104, 90, -126, -103, 79, 91, -60, -75, -99, -72, -65, 74, 108, 69, 87, -78, 20, + -28, -68, 15, 6, 108, -37, 61, -25, -62, 69, -108, -12, -14, 74, -37, -113, 105, 5, -49, + 92, 37, -41, 75, -121, 71, 58, -68, -116, 26, -37, -15, -80, 82, 90, -118, 27, 108, 114, + 60, 110, -65, 71, 89, -2, -106, 113, -19, 3, 68, -44, 95, 80, 121, 65, 127, -52, -33, + 108, 16, 97, 125, 4, -71, -96, -115, -46, 101, 17, -57, 99, 36, 43, 19, 48, 43, 79, + 76, 60, 91, 66, -102, 119, -53, -121, 16, -91, -34, 51, -45, 90, -86, 118, -60, -98, 76, + -15, -66, 57, -19, -22, 6, -50, -50, -51, -122, 4, 9, -103, 12, 70, -111, 9, -121, 23, + -16, 30, -124, 73, 79, -110, -33, -46, -111, -97, -49, 15, 100, 79, -65, 22, -65, -17, 65, + 96, 0, 36, -43, 14, -39, -68, -35, 79, 31, -55, 3, -61, 38, -61, -25, 102, -96, -61, + -54, 116, -38, -1, -27, -32, 84, -38, 17, -17, 123, -114, 57, -95, -11, -122, -63, 97, -64, + 80, 22, 47, 86, -47, -23, 35, 100, 35, 40, -61, -53, 25, 5, -79, -23, 48, 35, -41, + 78, -79, -51, 123, 86, -38, 92, 7, -86, -37, 23, 36, -104, 98, 42, -83, -84, -66, -90, + 91, -12, 50, -103, 2, 71, -6, -71, -89, 28, 43, 40, 56, 105, -15, 103, 76, 20, -116, + 111, 12, -7, -117, -58, 17, 18, 9, -5, -118, 100, -10, 53, -121, -48, -48, -94, -72, -7, + -21, -22, 27, -49, 72, -57, 79, -110, 70, -65, -80, 14, -119, -38, -96, -124, -51, -77, -42, + 21, -102, -105, 38, 38, 100, 63, -77, 46, -27, 44, -63, 118, -22, 81, -106, -41, -101, -27, + 32, -45, -50, 66, 40, -94, 65, 103, 21, -5, -51, -18, 98, 46, -97, 87, -113, 77, 72, + -26, 27, 114, -61, -107, 31, -64, -89, -124, 29, -24, 64, -38, 107, 95, -3, -69, -69, -75, + -2, -27, 50, -9, -60, 97, -19, 46, -119, -100, -106, 103, 52, -39, 94, -63, 6, -82, -12, + -84, 47, 85, -15, -77, -105, -95, 86, 115, -8, -79, -114, -36, 83, 99, -95, -70, 66, 118, + -61, 34, 85, 125, -105, 49, 4, 119, 107, -59, 106, 51, 46, -65, -120, -45, -107, -120, 56, + 95, -121, 28, -43, -69, -10, -94, -19, -66, -16, 70, 9, 76, 67, 63, -33, 38, -46, -94, + -45, -53, -51, -69, 90, -5, 10, -37, -68, 58, 46, -29, -1, -26, -70, 74, 116, -15, -52, + -98, -71, 28, -107, 62, 52, 107, 110, -11, -6, -13, 56, -91, 17, -15, -16, 29, 16, -97, + -107, 14, -100, -76, 45, 69, 96, -54, -110, -41, -2, -11, -102, -127, 55, 24, 113, -47, -49, + -101, 101, -100, -127, 57, -75, 4, 24, -8, 52, 71, 104, -37, 45, -26, -5, 94, -86, 116, + -93, 64, -124, -53, 22, 111, -34, -13, 50, -109, -63, 79, -92, -86, 108, 125, 82, 91, -12, + -99, 41, -123, -65, 87, 98, -25, 89, 120, 75, 72, -35, -81, -97, -57, -21, 117, -98, -82, + 70, -38, 28, -13, -117, 50, -94, 42, 81, -7, -111, 92, -48, -85, 119, 66, -36, 52, 79, + 44, 104, 5, 117, -104, 37, -97, 4, -4, 66, -108, -86, 38, 1, -24, 6, 104, 5, 44, + 64, -38, -108, 114, 47, -27, 79, -55, -104, -51, 36, -63, -57, -51, 118, -59, 105, -92, -63, + -69, -54, -15, 51, -95, 68, 113, 70, -99, 44, -104, -57, -12, 73, -32, 86, -29, 32, 102, + -119, -102, 68, 126, 19, -78, -127, 74, 68, -6, 59, 109, 27, 18, -38, -113, 45, -120, 71, + 107, 94, 54, -37, 102, -13, 94, -111, -64, 71, -112, -51, 38, 111, 30, 75, -6, 64, 15, + 47, -24, 114, 3, -25, 42, -44, 115, 39, 86, -113, 88, 116, 104, -49, 89, 123, -26, -29, + 62, 89, -28, -4, -120, 97, 96, -82, 28, -124, -125, 114, -29, -105, 91, -110, -90, -33, -93, + -18, 115, -58, -5, 71, 20, -123, -67, 41, 98, -87, -20, 124, 1, -110, -23, -46, -107, -78, + 10, 104, 27, 0, 100, 43, -30, -105, -52, 82, 106, -101, -56, 18, 80, -65, 26, -38, -50, + -125, -96, 82, 121, -37, 45, -22, -79, -47, -3, 87, -10, -93, 117, -56, 98, 89, -115, 110, + 82, -94, 92, 6, -61, -106, -125, 125, 73, 101, -32, -87, 0, -27, 25, 96, 6, -125, 77, + 126, -24, -51, -96, 87, 47, -127, 97, 26, -72, -69, 104, -37, 115, -124, -120, -68, 35, 17, + 55, 126, 82, 62, -123, -105, -15, -116, 104, 70, 19, -48, 26, -40, 36, -108, 14, -71, -71, + -38, -1, -33, -35, 119, 52, -54, 16, 79, 19, -39, -124, 49, 13, 86, 20, -44, 39, -117, + 2, 26, -51, 123, 5, -94, -33, -65, 72, 40, -124, -40, 7, 72, 15, -81, -123, -60, 67, + 26, -114, 109, 121, 83, -114, -10, 95, 106, -35, -103, 42, -22, -12, 43, 76, -57, -101, 26, + -57, -124, 65, -113, -46, 111, 12, -93, 8, -110, 87, -101, 57, -20, 54, 41, 21, 11, 73, + -105, -39, 89, -106, -3, 98, -30, -81, -72, -101, -73, 40, -28, 117, -16, 97, -36, -2, 16, + -95, -105, 69, -22, -110, 84, 71, -97, 81, -42, -121, -123, -12, -41, 11, 27, -50, 10, 90, + -102, -103, 15, -109, -80, 124, 38, 112, 25, -69, 7, -85, 10, -17, 95, -82, -72, 74, 26, + 106, -3, 96, -83, -127, 100, 35, 38, -9, -116, -115, 86, -39, 88, 93, -4, -82, 46, -105, + 122, -35, 90, 120, 57, -13, -85, 85, -112, -53, 63, -23, 99, -50, -115, 43, 66, -103, -70, + -125, -21, 24, 44, -55, -96, -85, -92, -37, -86, 75, 0, -39, 105, 126, 62, 61, -40, -88, + -84, -85, -46, -37, 61, -119, -50, 52, 74, -52, -127, 70, 72, -11, -22, 82, -120, -23, -81, + -124, -53, 70, 113, 72, -12, -79, 84, -36, -28, -105, 41, 119, -14, 81, -23, -88, 33, 57, + -61, -125, 114, 68, -110, -34, -90, 43, -95, -24, 117, -79, -81, 60, -107, -30, 60, -68, 14, + 76, -20, 12, -2, -117, -108, 56, -21, -122, -12, -68, 61, 65, 17, -75, 65, -101, -27, 10, + 112, 21, -81, 11, -5, 26, 24, -87, 50, -22, -96, 37, 47, -4, -36, 83, -79, 8, 105, + 10, -98, -62, -68, -123, 58, 39, 44, -87, 49, -105, 47, 123, -15, -102, -71, -82, -85, -60, + 42, -105, 93, 14, -80, 62, -10, -108, 85, 82, -26, -12, -79, 22, -100, -116, 92, 26, -118, + 116, -45, 28, 53, 86, -11, -37, 56, 63, -90, -15, 95, -80, -48, 123, 125, 59, 45, 23, + -67, 88, 117, -36, -8, -73, -62, -57, 10, 42, 8, 87, 51, -84, -75, -103, 119, -26, 36, + -121, 59, 110, -36, -59, 50, -41, 55, 31, -6, 0, -30, -35, -106, 120, -1, 77, -4, -106, + -11, 31, 95, -97, 96, -18, -10, 116, -44, 32, 26, -24, -79, -105, 109, -41, 15, 36, 62, + -65, 17, -124, 105, -62, -21, -66, -62, 95, 77, 89, 41, -23, 125, 28, 61, -71, -23, 77, + 5, 43, -111, -44, -48, -9, -79, -72, -81, 8, 14, 32, -71, -93, 20, 83, 66, -48, -62, + 63, 125, -114, -6, 83, -91, 37, 122, -66, 50, -26, -75, 28, -64, -55, -96, 37, -88, 0, + -72, 43, 90, -55, 79, -2, -85, -14, 98, 119, 37, -64, 103, -46, 124, 11, 53, 55, 23, + 102, -98, 0, 118, -96, 39, -107, -113, 46, 91, -123, -94, -31, 125, 10, -121, 8, 27, 32, + -71, -75, -34, -115, -104, -32, 117, -111, -5, 7, -7, -100, -79, -55, -20, -30, 69, -51, 96, + -19, -114, -78, 52, -42, 110, -108, -7, -13, 76, 99, -104, 69, -55, 120, 50, 17, -48, -70, + 93, -30, 18, 67, -112, -3, 62, 112, -90, 52, 33, -78, 80, 41, 18, -122, -16, -123, 19, + -69, -89, -25, 0, -5, 26, 98, 53, -100, -7, -106, -5, 86, -101, 4, -61, 110, 73, -85, + -55, -106, -71, 9, 37, 72, 15, -4, 116, 58, -62, -118, 74, 3, 18, -49, 75, -40, 4, + 27, -118, -82, -7, 112, -83, -75, -61, 32, 70, 15, -78, 81, -9, -71, 110, 53, 15, 96, + -121, -52, 90, -40, -57, 18, 41, 46, 68, 64, -10, 105, -53, 108, 73, 1, -50, -101, -113, + 25, -65, 0, 113, 103, 30, 86, 60, 50, 2, 36, -21, -69, -57, 25, -4, 69, -110, -111, + -6, -8, -83, 104, -52, 73, 120, -17, 104, -112, 80, -43, 56, 27, -10, 90, 100, -101, -100, + -89, 115, -45, -112, -21, 29, 85, -97, 30, -40, -7, 54, -76, 102, 3, 71, -94, -62, 19, + -78, -76, 64, -74, -82, -92, -86, 16, -124, -28, -98, 94, 64, -79, -70, -38, 56, 51, 58, + -55, -118, 125, 39, -43, -5, -78, 99, 5, 2, 47, -82, 6, -19, -50, 21, 15, 90, 55, + 53, -112, 99, 109, -117, 72, 103, 86, -54, 127, 69, 114, 109, -101, 98, -115, -107, 93, 6, + -58, -12, -55, -39, -41, -107, -82, 19, 40, 17, 65, -114, -93, 99, 73, -6, -66, -30, 40, + 104, -103, 100, 123, -83, -82, -120, 88, -96, -1, -120, 69, 52, 118, 109, 68, 79, 102, 120, + 46, -92, 110, 49, 51, 110, 57, -47, -107, 124, 105, -117, -58, 55, 120, 38, 92, 75, 19, + 63, -83, 99, 58, 42, 55, 63, 33, -58, -17, 69, -49, 35, -80, 80, -100, -46, 4, 111, + -80, 108, -82, -85, 112, -86, -106, 18, 6, 10, 33, 95, -68, -114, -19, 43, 18, 37, -30, + -46, -5, -118, -78, 97, 45, -56, -61, 17, 48, -72, 32, -91, 35, 125, 37, 59, 73, 107, + 0, -97, -25, 85, -63, -126, 23, -56, 29, -43, 103, 121, 56, -1, -84, 102, -95, 122, -71, + -6, -63, 32, -3, -45, -76, -102, 24, -29, 118, -79, 96, -11, 124, -116, -31, -55, 6, -39, + -77, -81, 43, -89, 92, -55, -2, -92, 94, -99, -22, -11, 76, -76, -74, -21, -37, 113, -47, + -76, 17, 79, 62, -115, 38, 113, -32, -96, 70, -17, 72, -18, 105, 47, -4, -96, 88, 33, + 0, 36, -72, 71, 81, -97, -10, 2, -107, -121, -59, 105, 41, -15, -81, -92, 96, 61, 112, + -68, -100, 85, 53, -68, 23, 21, 69, -89, -19, 4, 62, -82, -73, 86, 60, -124, 42, 2, + -113, 46, -81, -126, -16, 32, -82, -27, 95, -21, 8, 52, 31, -38, 76, -113, 31, 102, -68, + 23, -7, -73, 15, -40, 74, -122, 95, -10, -9, -91, -105, -18, -41, -120, 67, 53, -98, -10, + 48, -32, -82, -26, -95, 107, 9, 60, 95, -61, -61, 97, -74, 21, -68, 18, -121, 31, 31, + 22, 61, -105, 16, -81, -81, 16, -42, -89, -19, -93, -120, 96, 97, 92, 125, 114, -87, -63, + -4, -4, -115, -77, 67, -100, -117, 95, -81, 5, 95, 7, -39, 18, 9, 90, -41, -13, -125, + 46, 22, -27, 59, -72, 47, 102, -47, -115, 108, -48, 101, -91, -23, -19, -50, -122, 23, -118, + -79, 104, 21, -79, -17, -126, -37, -115, 26, -91, -118, 101, -34, -71, -111, -104, -48, 74, 110, + -100, -59, 19, 35, 36, 108, 48, -99, 60, -124, 92, 0, -31, -24, -59, 14, -78, -111, -98, + 108, 86, 8, 55, -15, -73, 67, -33, -71, 14, -126, 125, 125, 78, 125, 102, 127, -15, -76, + 59, -114, -73, 34, -90, -30, -7, 66, -88, -67, -87, 34, -97, -79, -44, -61, 117, -14, 33, + 13, -37, -97, 90, 67, 126, -1, -30, 63, -21, 11, -35, 84, 17, -84, 62, 99, 52, 8, + 38, -99, -112, 87, -14, -69, -1, -35, 84, 11, 40, -51, 68, -21, 27, 121, -48, -121, 81, + 27, 79, -89, 76, -16, 91, 72, -56, 62, -25, -53, 47, 124, 14, 97, 126, -8, -16, -33, + 42, -109, 127, -115, -71, -124, 91, 122, -10, 46, 28, -86, -108, 105, 122, 95, -80, -117, 126, + 118, -79, 82, 36, 51, -60, -36, -10, 44, -96, -26, -51, 20, 59, 96, 113, 20, 34, -110, + 105, 43, -83, 7, -33, -40, -65, 32, -74, 32, 2, -93, 116, 21, 90, 92, -51, 47, 1, + -98, 49, 76, 53, -96, 67, -24, 127, -4, -42, 80, -40, -30, -24, 29, 124, -12, -105, -12, + 10, 2, -27, -28, 26, 121, -125, -117, 101, 59, 118, 12, 22, -11, 67, -40, 95, -122, 26, + 76, 100, -69, -116, -112, -22, -45, 58, 57, 60, 104, 67, 98, 19, -55, -126, -78, -49, -21, + -116, -30, -23, 13, 24, -14, 125, -100, 11, 48, 42, 66, -14, 23, 15, -48, -34, -65, 8, + -96, -69, 63, -115, -48, 77, 9, 22, -126, 67, 126, 66, -15, 2, -38, 4, 22, -54, 124, + -28, 32, -45, 11, 112, -56, 91, -91, 101, 5, 83, 112, -10, -27, 107, -11, 101, 77, 64, + 3, 117, 105, 49, -39, 15, -30, 23, 57, -38, 113, -21, 104, -9, 73, -23, 109, 125, 65, + 102, -66, -10, 89, -4, -26, 5, 87, 22, -56, -36, -27, -77, -35, 28, 21, -109, 70, -109, + -1, -124, -24, -99, 125, 13, 91, 14, 81, 85, -24, -87, 68, -118, 12, -51, -98, 30, -17, + 15, 25, 51, -95, 35, -75, -4, -84, -52, 42, 29, -84, 41, -70, 23, -41, -79, -80, -97, + -114, -1, 33, 40, -24, 79, -40, 10, 29, 104, -58, -112, 51, 76, 75, -41, 56, -63, 21, + 50, -9, 67, -1, 36, 25, 36, 58, -105, -33, 87, -105, 18, 91, -115, -125, 76, -82, 33, + 16, 4, -25, 90, -28, 91, -85, 84, -38, -89, 0, 94, 12, -90, 5, 101, -33, -120, 120, + 76, 48, -122, -43, -66, 10, -107, -76, 117, -63, 0, -93, -59, -90, -114, -39, 49, 62, -50, + 33, 45, 104, 2, 35, -101, 23, -54, 126, 34, 104, 54, 109, -6, -7, -116, 114, -68, -70, + 122, -126, -66, -109, 111, -69, -93, -117, 3, 25, 90, -100, -106, 49, -98, -100, 6, 56, -118, + -100, 2, 27, 26, -114, 93, 15, 115, 76, 51, 28, 50, 76, 48, 21, 99, -26, -53, -43, + 96, 39, 72, -52, 73, -50, 46, -66, 2, 116, 13, -20, -62, 33, -81, 103, 123, 117, -102, + 92, -119, -103, -83, 25, -45, 112, 122, -56, 2, -72, -17, 10, 114, -121, 44, -14, 55, 5, + -75, -85, -110, 116, 26, 103, -80, -71, 74, 61, 89, 28, 43, -50, -90, -123, 119, 87, 41, + 11, -40, -121, 9, 42, 81, -115, 85, 7, -43, -66, -123, 78, 118, 125, -41, -78, 84, 68, + 54, -24, -18, -75, 84, 69, -19, 40, -51, 79, -3, -64, 12, -7, 91, 86, -88, 116, 122, + 27, -119, -100, -12, 62, -110, 106, 12, -17, 118, -75, -3, 3, -47, -103, 44, 32, 64, 99, + 119, 56, -2, -2, -22, 77, -117, -55, 7, 34, -12, -17, 17, -76, 52, -95, -94, 94, -4, + 18, -31, 126, 107, 96, -80, 103, -47, -105, 79, 72, -114, 48, 100, 67, 19, -56, 86, 114, + -60, -16, -118, 127, -43, 24, -47, -76, -126, -104, -19, -21, -67, 94, -63, 125, -84, -64, -102, + -13, -69, 36, 40, -101, -48, 97, -33, -79, 123, 111, 47, 101, 10, -30, 20, -3, -40, -88, + -123, 27, -101, -63, 15, 97, 113, -55, 91, -47, 17, 75, -102, -50, 106, -125, 38, -110, -66, + 113, -70, -80, 107, 23, 118, -6, 76, 69, -57, -20, -111, -96, 102, 65, 113, -47, -51, 22, + 45, 12, -76, 34, 16, -15, -62, -30, 51, -122, 4, -7, -85, -86, 101, 114, -51, -102, -2, + 101, -90, -105, -40, 97, 59, 27, -50, 6, 51, 21, -119, -31, -118, 34, -114, 121, -52, 83, + -110, -47, -51, -53, 127, 50, -55, -43, 7, -114, -29, 96, -39, -108, -9, 110, 107, 66, 59, + 62, -17, 80, 87, -117, -71, -44, 48, 12, 126, 49, -54, -34, -32, -86, -29, -101, 23, -92, + 109, 60, 19, 24, 85, 108, 110, 2, 46, -58, -28, -15, 57, -36, -18, -30, -25, 7, 9, + -122, 31, -57, -66, -121, 11, 79, 21, -18, 74, 98, 19, 5, -66, -27, -96, -123, 29, -33, + -109, 85, 121, 61, -116, 27, 112, 1, 105, -110, -94, 40, -27, -81, 61, -36, -62, -88, -121, + -2, -39, 88, -105, 52, -96, 121, 110, 22, 40, 47, -14, 25, -95, 20, 18, -67, -20, -112, + 20, -48, -74, -75, 114, 98, -88, -110, 64, -106, 49, 5, -39, 35, 97, -49, 25, 67, -91, + 56, 3, 79, -86, -44, -126, 30, 125, -1, -107, 71, -60, 14, 119, 43, -83, 52, -24, 88, + -109, -105, -51, 109, -117, 112, -48, -53, 62, -108, -114, 107, -33, -69, 9, 113, 101, 124, -95, + -97, 76, 86, -109, -36, -60, 1, 67, 123, 97, -26, 70, 62, -15, -126, 124, 47, -90, 86, + 28, -80, -108, -65, -14, 30, 60, -17, 12, -37, -38, 49, 93, 69, 21, -60, -49, 22, -5, + -52, -25, 67, 32, -6, 120, 51, 82, 35, 112, -72, 123, -74, 12, -95, 5, -115, -92, -47, + 4, -18, -82, 10, 37, -20, -8, 44, -6, -42, -65, -21, -49, 49, -91, -93, -17, -96, -59, + 41, 46, -77, 107, -80, 62, 7, 118, 113, -75, 67, 66, 30, 108, 106, 65, -34, -89, 73, + 89, 123, 69, 91, 50, -8, 44, 22, -104, -114, 76, -33, 4, 125, -116, 40, -113, 111, 65, + -52, -65, 8, -62, -52, -31, 95, 101, -37, 62, 99, -4, 80, -82, 103, -48, 55, -61, -2, + -54, -16, 92, 119, 9, 118, -8, 23, 99, 25, 41, 65, 82, -43, 27, -38, 75, -29, -41, + 3, -4, 102, 125, 42, 114, -29, 121, -36, -26, 106, -27, 9, 17, 42, 107, 122, -94, -65, + -66, 125, -46, -56, -24, 126, -80, -90, -35, -76, -63, -17, 46, -14, 10, -22, 33, -30, 115, + -21, 102, 116, -69, -20, -38, -125, 68, 65, 78, -40, -104, -6, -114, -40, 66, -14, -40, -31, + 2, -45, 18, -33, 112, -96, 36, -47, -14, -32, 72, -21, 8, -55, -46, 107, -88, 45, -11, + -64, 5, 73, 41, -95, -92, -83, -59, 116, -13, -107, 91, 115, 14, 53, -92, 97, -39, 11, + -28, 68, -18, 16, 65, -99, 45, 121, -63, 120, -82, -79, 122, -40, 101, 11, -77, 17, -31, + 22, -9, -16, -10, -4, 114, 119, 16, -85, -10, 18, 122, 92, 88, -107, -116, -18, -79, 15, + 42, 10, 75, 12, 122, -55, -9, -12, 115, -57, 16, -47, 28, 119, -55, -21, -30, 103, 122, + 83, 116, -29, -126, -15, 127, 17, -55, -29, 56, -58, 40, 53, -55, -23, -66, 51, -49, 102, + -76, 4, 65, 76, 16, 25, -43, -72, -19, 44, -115, -37, 59, -96, 50, 100, 109, -126, 50, + -84, 80, 119, 15, 86, 109, -39, -42, -54, -97, 12, 46, -105, 19, 101, 55, -77, -16, 6, + -65, 50, -56, 95, -58, 22, 99, 117, 5, -34, -82, -34, -34, 29, 109, 74, -12, 28, -62, + -27, 13, 17, 86, -59, 103, 24, -93, 105, -13, -22, -88, 125, -65, 56, 95, 53, 90, -71, + -12, 42, -97, 16, 73, -42, -9, 112, -118, 99, -55, -65, -13, -13, -44, 79, -15, 86, -44, + -114, -97, -93, -85, 104, 77, -35, -36, 3, 106, -16, 46, -22, 31, -38, 124, 3, 8, 7, + -107, 100, 3, 123, 17, 53, 93, 34, 82, -76, 13, 74, -120, -73, -112, 10, 66, 4, -12, + 117, 112, -18, -110, 49, 71, -48, 18, -19, -123, -111, -15, -105, 109, 16, 4, 112, -20, -75, + -79, 15, 127, -6, -55, -77, -39, -36, -109, 81, 52, -39, 57, 91, 3, 123, -38, -96, -115, + 37, 107, 61, -66, -16, 2, -13, 85, -85, 43, 106, 107, 86, -104, -118, -115, -91, 62, -109, + 123, 32, -47, -44, -76, 73, -54, -73, -75, 125, -84, -10, -125, 13, -41, -102, 2, -30, 38, + 13, -63, -120, 125, 60, -40, 85, -37, 105, 32, 36, 65, -54, -103, 51, -124, -27, -120, 119, + -4, -24, 51, 42, -21, -91, -105, -97, -109, -44, -82, 33, 13, -104, 45, 10, 117, -32, -127, + -110, -37, 115, -61, 51, -63, 104, -20, 2, 73, -57, -35, 51, 61, -26, 37, -51, 77, 52, + -107, 116, 112, -81, -57, 72, -39, 121, -45, 82, 114, 43, 107, 17, -86, 32, 5, 106, -123, + -33, 95, -39, -72, 7, 44, 109, -91, 97, 16, 24, -57, 124, -14, 22, 42, 19, -64, -22, + 23, -32, -64, -38, 31, -41, -84, -29, 53, 69, -83, 55, 62, 22, 59, 119, 102, 15, -17, + -122, -74, 33, -92, 48, 24, -101, 41, 60, -70, -109, -118, 97, -59, 76, 98, 120, 126, -89, + -65, 48, 111, 24, -16, 22, 82, -38, 16, 62, 116, 15, 33, -78, -112, 98, 29, -96, -40, + -26, 21, 113, 37, 0, -91, -91, 124, -69, -119, -13, -46, -31, 63, 37, -60, -94, -84, -45, + 93, 95, -110, -14, -103, 98, -44, -54, 2, 89, 71, 16, -84, 50, 40, -122, -124, 41, -48, + 24, 106, -48, 27, -110, 45, -7, -112, -65, -22, -88, -40, -107, 72, -94, 114, -12, 53, -116, + 66, -119, -100, 17, -31, -83, -107, -89, -77, 98, -100, -24, 111, -107, 18, 8, -76, 31, 81, + -102, 122, 105, 86, 120, -79, 36, 89, 23, -94, -101, -12, 2, 124, 43, 106, 117, 108, -64, + 89, 32, -77, -42, -57, 85, 107, 47, 11, -122, -4, 47, 121, -52, 18, -56, -90, -36, -10, + 123, -87, -74, 122, 21, 37, -64, 56, -68, -110, 83, -48, -50, -103, 36, 78, 98, 108, 110, + -47, 59, 32, -72, -24, 96, 12, 97, -100, -56, -7, -56, -13, 88, -97, 71, -47, -43, 121, + 40, -33, -56, 3, 56, -98, -65, 92, 86, 60, -2, -127, -46, 127, -63, 66, -4, 30, 33, + -46, 17, -38, 32, 95, 59, 46, -48, -33, 109, -17, 23, 64, -9, -37, 76, 64, 64, -63, + 91, 125, -108, -74, 118, -108, 41, 33, -114, 70, 103, 8, 74, -13, 14, -24, 95, 48, 21, + -98, 76, -27, 78, 63, 55, -114, -117, 39, 103, -4, 125, -111, -118, -70, -67, -22, 70, 51, + -49, 53, 85, 20, 88, 51, 96, 105, 22, -74, -100, -112, 51, 27, 125, -35, -13, 67, -32, + 91, -16, 30, -68, 2, -45, -11, -49, -9, -63, -7, 100, -70, -47, -52, -62, 46, -98, -34, + 42, -29, -55, 58, -101, -74, -23, 24, -24, 98, 71, -62, 103, 125, -76, 22, -52, -96, -70, + 87, 72, -99, 10, -120, 108, 15, -77, -97, -28, 46, -28, -59, 54, 3, -40, 39, 46, -39, + 113, -20, -97, -33, -106, -25, 2, -17, 89, -34, -60, 84, -23, -8, -112, 98, -35, 88, -38, + -76, 36, -18, -11, 12, 116, -101, 46, 54, -109, -115, -125, -98, 17, -64, -36, 49, -19, -81, + -92, -47, 109, -109, 8, 83, -88, -104, 125, -47, 80, 32, -17, -69, -63, -21, -43, -52, -54, + 32, 63, -59, -85, -54, 34, 7, 93, -116, -35, 28, 84, 29, 75, -6, 32, 42, -4, -105, + -79, 109, -78, -123, -67, 113, 72, -2, -124, -122, -80, 4, -14, 16, 118, 19, -7, 116, 82, + 19, -38, 99, -27, 96, 97, -75, -119, 52, -124, 56, -91, 94, -92, 1, 30, 52, -15, -25, + 115, 18, -68, -59, -91, 22, -41, -45, 33, -46, 126, 50, -35, 36, 13, 50, -70, 47, 48, + 77, 126, -19, 21, -56, -105, 45, 26, 66, 2, 21, 57, -109, 102, 106, -108, -86, -78, -72, + -22, -114, -79, 60, 28, -101, -57, -99, 32, 28, 106, 49, 119, 99, 99, 67, -24, -112, -16, + 6, 75, 115, 80, 79, 88, 13, -46, -57, 7, 59, 113, -87, 30, 78, 22, -15, -67, -70, + 122, -59, 56, 37, -1, 101, -57, -11, 35, 30, 45, -59, -62, -31, 69, 8, -14, -41, -120, + 51, -43, 79, -99, 12, -78, -13, 105, 5, 7, -2, 50, -108, -92, -53, 43, -107, -78, -17, + 27, 51, 96, -89, 2, -88, 126, 102, -11, 24, -126, -92, 64, -18, -80, 104, -59, 23, 70, + 48, -22, -113, 27, 18, -67, 26, -20, 53, -25, -83, 49, -8, -1, 100, -25, 83, -84, -45, + -45, 85, -15, 21, 118, -66, -29, 22, 127, -118, -110, 19, -23, 85, -42, -27, -91, -122, -65, + 10, -11, -18, -33, 75, 91, 79, 89, -123, -89, -56, 66, 35, 114, 42, 17, 41, -66, 33, + -85, -121, -57, 30, 18, -41, -126, -92, -80, -20, -11, -22, -14, 106, 9, 17, -72, 75, -8, + 51, 98, -39, 0, 14, 83, -35, 87, 78, -102, 93, -72, 84, -35, -7, 40, 113, -110, -75, + -21, -76, -111, 31, 124, -58, 66, 33, -57, -68, -10, 48, -117, -87, 57, 11, -119, -90, -86, + -15, 116, -90, 49, 17, 4, -5, 91, -94, 24, 2, -120, 43, 89, -59, -8, -91, -16, 9, + 111, 54, 74, -35, 94, 31, 95, 99, 76, -25, -66, -6, 86, 92, 63, -19, 71, -115, -43, + 39, 126, 116, 91, -4, -40, -19, -46, 72, -127, 74, 47, 47, -87, 14, -55, -118, 44, -31, + 114, 79, -104, -24, -71, -79, 35, 27, 66, 15, 126, 67, -15, -93, -38, 83, -81, 105, 84, + -14, 123, -10, 79, -81, -105, 76, -29, 59, -53, -71, -104, -126, 86, 22, -113, 122, 31, -89, + 19, 54, -23, 119, -42, -112, -80, 123, -56, 87, 112, -91, -4, 68, -19, 124, 79, -67, 123, + 9, -105, -5, 67, 75, 125, -117, -60, 113, -107, 84, -7, 104, -5, 126, 67, -113, -51, 94, + 99, 88, -81, -56, -75, -47, 110, 82, -31, 29, 77, 50, -6, -117, -124, 70, -23, -85, -72, + 100, -110, -52, -85, -36, -79, 119, 25, -74, 18, -109, -87, 106, -80, -100, 102, -71, 67, -41, + -90, 68, 96, -39, 25, -113, 126, -37, 70, -91, -19, 125, -2, -29, -33, 127, -70, 45, -78, + 55, -59, 114, -123, 104, -79, 110, 85, 53, 60, 90, -95, 116, -18, -127, 39, 24, -102, 96, + -9, -102, -3, 91, 66, -26, 90, -62, -32, -75, 44, 9, -63, -18, -97, -77, -95, -30, 18, + -37, -93, -68, -124, -85, 33, -58, 79, -63, -114, 13, -70, 47, -15, 125, 59, -21, -5, 122, + 84, -19, 75, -88, -29, 55, 11, -51, 2, -93, 35, -1, -53, -36, -43, 19, -45, 28, 22, + -15, 86, 75, 44, -92, 42, 79, -97, 90, 99, -92, 126, -74, 117, -44, -5, -24, -100, 91, + 2, 73, 46, -85, -120, -30, 117, -98, -101, -65, 91, -37, 70, -70, 16, -100, -94, 30, -40, + -104, 70, -122, 78, 31, -89, 30, 109, 70, 44, 54, 124, 43, 69, 115, -2, 107, -14, -77, + -95, -50, -95, -73, 93, 39, -74, -78, 122, 17, -91, 14, -107, 9, 35, -86, 80, 35, -79, + 117, -2, -66, 117, 71, -72, 21, 57, -115, -77, 1, 6, 25, -22, 41, 50, -70, -101, -122, + 115, 73, -77, 2, -103, -122, 44, 21, -85, -18, 3, -50, -19, -88, -34, 104, -79, 43, -121, + -92, -54, 95, -4, -56, -90, 8, -5, 18, 37, 98, -13, 0, 67, 95, -46, 57, -49, -35, + -14, -4, -121, 50, -115, 103, -59, -19, -43, 73, -83, 31, 32, -7, 69, 50, -21, 14, -123, + -118, -85, 93, -49, -119, -96, 70, -51, 33, 58, 81, -93, -25, -52, -33, -126, -9, 120, -24, + 84, -7, -78, -103, -77, -90, -103, -49, 98, -108, 52, -6, -92, 25, 65, 95, 29, 116, -50, + -22, 36, -46, -103, -124, 113, 92, -48, 30, 69, 21, 80, -114, 63, 89, 121, 40, 44, 59, + -105, -31, -96, -18, -123, 112, -36, 31, -120, -15, 15, -69, 86, -66, 73, -80, -74, -2, 59, + -101, -73, -93, -22, 79, 34, -55, 86, -112, -106, -52, -107, 45, -81, -91, -106, -76, 126, -74, + 35, 63, 47, -91, -2, 53, -81, -127, -20, -71, -57, -61, -101, -90, -10, -93, 75, 25, 9, + 25, -17, 109, -104, -9, -79, 90, -88, -121, -30, -48, -22, 41, 73, -61, -51, -52, 38, -116, + 15, 62, 125, -94, 41, -17, 103, 119, 45, -108, -83, 32, -30, -75, 51, -28, -75, -126, 109, + 24, 85, 39, 30, -120, -76, -122, 22, -41, -6, -19, 63, 79, 0, 127, -111, -14, 12, -15, + 50, 110, 53, 98, 105, 96, -89, 0, 103, -14, -34, -118, -119, -105, -113, 74, -46, -57, -2, + 44, 7, -15, -93, -120, -60, -12, -32, -57, -111, -31, -14, 52, 80, -54, -8, -87, -11, -22, + -16, -7, 86, 92, 67, 29, 11, 86, -103, -51, -55, -24, 40, -14, 0, 18, 87, -38, -114, + 41, -31, -22, 20, 87, -17, 0, -34, -61, 48, -26, 5, -74, -114, 94, 28, -114, 67, -108, + 103, 45, 98, -1, -89, -23, 58, 5, 106, -101, 100, -39, 49, -41, -63, -41, 2, 108, 88, + 105, 92, -102, 18, -89, -55, 23, -19, -64, 36, 17, 71, 19, -20, -47, 101, 59, 19, 121, + 119, -51, -45, -71, 93, 98, 67, -26, 120, -82, 100, -2, 19, -54, 74, 92, -30, 125, -8, + -60, -88, -92, 78, 37, 122, -69, 21, 103, -25, -26, -126, 1, -106, 51, -50, -56, 25, -69, + 1, 80, -93, 78, 35, 51, -57, 21, 90, -110, -1, 46, 88, 115, 78, -62, -93, -56, -126, + -61, 68, -83, 78, -28, 109, 72, 95, -45, 44, -104, -124, 11, 93, 5, -53, 14, 83, -59, + -5, 56, 87, -5, 33, 109, -115, 100, 10, -60, 123, 67, 84, -34, 49, 63, -86, -41, -62, + 106, -15, 16, -13, -73, -45, 94, 107, -9, -78, 14, -28, -5, -47, -20, 25, -47, 105, -65, + 56, 59, 13, -5, 41, -7, -73, -62, 11, 91, 34, -122, -44, -24, -74, 22, 86, -31, 0, + 62, -112, -50, -70, 117, 48, 21, -53, 24, -112, -124, -86, 46, 105, -53, 84, -54, -125, 25, + 108, -28, 13, 84, -107, -110, 23, 43, 9, -127, -120, -110, -21, -86, 108, -50, 4, -20, -59, + -14, 117, 15, -115, -51, 123, 54, -68, -2, 2, 33, -15, 102, -14, 22, -12, -53, -89, -97, + 59, 90, 36, 78, 106, 35, -13, -112, 30, -30, 59, 103, -11, -22, 112, 109, -42, -94, -71, + 40, 57, 49, 76, 87, -45, -22, -75, -119, 23, -75, 95, 112, -47, 54, 54, -71, -64, -12, + 115, 43, -71, 103, 30, 114, -89, -100, -30, 59, 113, -127, 71, 53, -86, -32, 37, -45, -104, + -98, 44, -8, 108, 18, 54, 14, 31, -59, 17, 90, -88, -60, -39, -104, 109, -122, 99, 17, + 111, 34, 82, -31, -59, -9, 82, -85, 89, 88, 29, 65, -36, 29, -125, 76, -124, -43, 29, + 25, 105, 19, 30, 113, -18, 65, -37, 62, -87, -66, -120, -40, 109, -9, -126, 109, 60, 33, + -46, 54, 112, -75, 53, 95, -45, -103, -98, 103, 94, 104, 44, 47, 28, 82, 10, -60, 81, + -14, -15, -58, -21, -1, 90, -74, -72, -98, 94, 91, -11, -34, 45, 86, 21, -57, 30, -119, + -40, 0, -98, -21, -34, -87, 25, 108, -38, -123, -13, 84, -55, -20, 87, 52, -57, 86, 11, + -112, -112, -20, -56, -108, 42, 57, -96, -24, 47, 72, -78, -42, -121, -93, 79, 56, 44, 16, + 46, 83, -79, 62, -81, -108, 27, 62, -10, 62, 22, 91, -31, 93, 26, -114, 83, -77, -71, + 22, -63, 15, 102, 88, -123, -126, 38, 77, 11, 105, 122, -95, 60, -127, -119, 88, -69, -101, + -102, -53, -41, 111, -36, -79, -19, 25, -68, 99, -50, 12, 89, 88, -31, -25, 98, -2, -75, + -36, -111, -43, 97, 96, -118, -83, 45, 78, -70, 95, -44, 28, 90, 45, -61, -20, 6, -12, + -19, 56, 88, 72, 36, -99, -87, 45, -4, -119, 33, -112, -26, 9, 53, 50, -92, -30, -101, + 92, -27, -30, 103, 19, 6, 85, 83, -10, -31, 48, -62, 112, -69, -26, -3, 21, -44, -64, + -36, -66, 72, 91, 2, 16, -4, -94, 49, 54, 10, -63, 21, 65, 17, -23, 120, -27, -20, + -1, -90, -45, 118, -121, -21, -56, -99, 59, 17, 79, 107, 27, 111, -35, 118, 63, -89, -20, + -92, -62, -109, 116, -99, 98, 95, 114, -18, -106, 64, 21, -123, 114, 12, 89, -58, 45, 116, + -124, 126, -85, -6, -61, -60, -123, 1, 25, -26, 3, 47, -88, 97, -20, -41, -83, -68, -32, + 66, 38, 13, -54, 25, 93, 82, 56, 76, 46, -51, 114, -21, 1, -3, 23, 30, 103, -30, + -52, 72, -38, 18, -59, 95, 15, -60, 107, 13, -90, -119, -15, 95, 5, -62, -42, -36, -95, + 21, 80, 7, -83, -15, -43, 81, 50, 23, 75, 3, -87, 62, 101, 86, -69, 71, -26, -2, + -66, -94, 6, 21, 61, -110, -42, 108, 74, -46, -28, 9, 125, -116, 101, -91, -124, 8, -122, + -24, 10, 109, 21, 85, -81, 57, -27, -45, 61, 126, -61, -69, -42, 118, -107, -48, -93, -31, + 13, 84, -75, -45, 40, 15, -98, -61, -49, 28, 37, -63, -27, -67, -67, 68, -90, 114, -45, + 3, 35, 16, -42, 0, -60, 58, 94, 92, -65, -102, -29, 36, -57, -1, -114, 107, -63, -33, + 28, 106, -37, -23, -21, 23, 35, 12, -70, 10, -71, 77, -62, 105, -63, 31, -42, -90, -55, + 111, -7, -17, 17, 108, -101, -47, 126, 122, 55, -102, -21, 126, -45, 21, 44, 48, -17, 37, + 24, 120, -113, -3, -107, -51, -93, 51, 50, 22, -20, 105, 76, -67, -17, -61, -96, -80, 93, + 69, 50, -101, -54, 64, -72, -76, -91, -3, -98, 120, 21, -64, 33, 31, -108, -103, 119, 125, + -85, -39, -85, -92, -109, 20, -56, -112, -112, 17, -3, -75, 69, -72, -39, 59, -100, -64, 14, + 37, 44, -91, 37, 82, 61, -58, -123, -88, -55, 24, 22, -86, 8, 83, -13, 80, 54, 61, + -12, 114, 82, -21, 60, -63, -84, -120, 122, -107, 11, 114, -32, -17, 23, -82, 13, -2, -37, + 89, -60, 34, -76, -117, -44, -73, -18, 92, 97, -6, 113, 119, 127, 17, 52, -78, 68, 13, + 83, -74, 76, -115, 79, 21, 76, 24, -87, -3, 106, 67, 103, -82, 86, 98, -124, -88, -73, + 16, 59, -21, 123, 31, -25, -42, -104, -8, -95, -86, 27, 51, 65, 50, -52, 41, -119, -7, + 17, -8, -13, -60, -26, -102, -107, 112, 51, -78, -7, 75, -52, -78, -40, -43, 36, 117, 116, + -40, 69, 96, 16, -70, 35, -106, -80, -93, 10, -43, 100, -114, -72, -8, -80, 66, 93, 101, + 119, -41, -72, -90, 7, 46, 25, -53, -126, 1, -54, -25, -30, -118, 96, 56, 36, -61, 115, + -62, -25, -118, 6, 73, 13, 97, -19, 16, 117, -112, -55, -42, -121, -107, -32, 12, 117, 15, + 115, -117, 100, 0, -68, 99, -75, 2, 93, -67, 33, -36, -7, -17, -13, -48, -72, 59, 102, + 93, -8, -96, -45, 97, -25, 78, -32, 83, 19, 1, -122, 2, -118, 74, -44, 76, 14, -112, + -22, 123, 66, -10, -26, 1, -1, -16, -116, -55, 37, 24, -101, 2, -107, -37, 8, 0, -55, + -74, -54, -37, 62, -52, 71, -49, -46, 74, -119, -114, 82, 106, 110, 81, 111, -116, -24, 25, + -119, 109, -37, -81, -64, 121, 99, -60, 62, -105, -21, -106, -33, 63, 0, -106, -72, -83, -92, + 106, 86, 60, 93, -59, -123, 39, 76, -4, -59, 7, 57, 100, 103, -117, 70, 100, 20, -57, + -27, -8, -79, -64, -61, 25, 32, 100, -71, 65, -54, 32, 36, -28, 126, 111, 124, -23, 85, + 91, 28, -13, 32, 98, -45, 111, 17, -74, -13, 35, 3, -124, -117, -75, -113, 65, 127, -66, + -50, -38, 4, 32, 54, 50, -28, 118, 22, -29, 72, 97, 67, -105, 4, -3, 97, -23, 59, + 118, -38, -58, 21, 106, -8, -74, -88, 90, 97, -114, 64, -44, 27, -71, 126, 3, -19, -40, + 101, -80, 93, -3, 54, -27, -76, -122, -75, 74, -23, -120, -53, -26, -41, 28, -109, -59, -22, + 15, 72, 35, 11, -108, 37, 32, -97, 120, 3, 43, -42, -31, -16, 100, 77, 6, 95, -27, + 103, 127, -99, -41, -12, -117, -99, -56, -68, 91, -23, 60, 59, 53, 84, 8, 124, 53, -70, + 17, 109, -25, 69, 85, -9, 113, 106, 76, 21, 24, 97, -8, 59, 4, 42, -122, 91, -103, + -89, -2, -96, 49, -116, -3, -36, -11, 73, 42, 98, 60, -78, -65, 87, 76, -88, 14, -34, + -73, 118, 106, 88, 100, -78, -71, 13, -72, 57, 38, 95, 75, -53, -121, 3, -109, 1, 50, + 21, -36, 13, -118, 78, -108, 44, -44, -52, 53, 14, -100, -68, -49, 59, -71, -31, -55, 70, + -34, -9, 85, 119, -72, -30, -119, 65, -70, -37, 93, -70, -123, -126, 54, 90, -62, -38, 30, + -21, -118, -68, 14, 14, 23, -110, -126, -122, -111, 57, -116, -5, 125, 98, -117, 123, 9, -87, + -88, -103, -65, 0, -78, -41, -109, 47, 42, 42, -115, -27, -67, -56, -111, 66, -114, -53, 95, + 45, 17, 69, -54, -4, -50, -1, 42, 116, -66, -5, -43, -3, 72, -105, -21, 56, 103, 60, + 17, 33, -88, 86, 29, 61, 56, 5, 24, 43, 60, -21, 41, 14, 7, -33, -66, 51, 31, + 113, -71, 91, 69, -70, 21, -57, -4, 12, -30, -27, 9, -94, 11, 52, -18, 24, 14, 4, + 28, -34, -22, -81, 101, -12, -63, 30, 90, -92, -85, -8, 84, -45, 2, 63, -65, -25, -1, + -8, -126, -45, 19, -99, -73, 56, 6, 86, 26, 37, -108, 14, -115, 24, -38, -8, 13, 123, + 10, 16, -23, -8, -126, -76, -39, 81, 15, 103, 41, 24, 4, -30, 90, -111, 35, -37, -2, + 64, -51, 125, 125, 34, 126, 127, 81, -18, -107, 107, -99, -104, 118, -51, -11, 101, 120, 118, + 105, -97, 70, 24, 50, 95, -86, 121, 65, 12, -75, -121, -28, -71, -31, -50, 67, 122, 62, + -82, -16, -47, 86, 1, -72, 62, -87, 96, 103, -100, -111, 2, -80, 39, 47, 30, 35, -38, + -13, -100, 109, -3, -69, -21, 40, 69, -31, -33, -106, 126, 30, -70, 50, 111, -45, -69, 46, + -70, 104, -3, -78, -60, 102, -112, -103, 67, -119, 20, 61, 54, 120, 82, 88, -6, -33, 5, + -107, -38, -121, -121, 109, -11, -71, -50, 9, 65, 97, -29, -20, -66, -30, -104, 61, -20, -12, + 47, -44, -65, -84, 120, -77, -5, -62, 46, 41, -33, -91, 36, -22, -20, -108, -48, -33, -37, + 125, -33, 47, -34, 59, -85, 122, -29, 64, -100, 77, 31, -29, 84, -18, -36, -104, 30, -69, + 105, -31, -45, 101, 101, 51, -106, -105, -2, 46, -21, -95, 40, -90, -37, -118, 34, 71, -106, + -31, 28, -6, 95, 94, -69, -78, 7, -24, -35, 123, -53, -51, 81, -111, 77, 45, 115, -39, + 97, 29, 7, 22, 80, -101, 87, 27, 111, 59, 24, 41, 22, 1, 32, -58, 13, 118, 47, + -74, -123, 100, 120, -32, 75, 46, -63, -106, -17, 32, -62, -66, 85, -5, -23, -82, 37, -7, + 118, 52, -50, -112, 91, 110, 29, 103, 86, -41, -25, 35, 58, 72, -89, 57, 26, -51, 83, + -37, -51, -57, 88, 98, 45, -31, -27, -102, 123, 11, -73, 102, 102, -18, -17, 10, -52, -70, + -18, -45, -66, -88, 51, 21, 55, 32, -14, 41, -94, 32, 121, -88, 12, -25, 49, -39, -17, + 42, 11, -82, 117, 18, 73, 17, -81, 119, -94, -16, 13, -3, -7, -29, -52, 29, -90, 36, + 80, -113, 72, -72, 50, 50, 9, -59, -94, 38, -18, -51, 53, -63, 70, -62, -122, -14, -58, + 36, 48, 49, -113, -53, -124, 115, 66, -102, -23, -40, -97, -85, -83, 59, -28, -113, 89, 16, + -125, -114, -103, 11, 19, -71, 27, -25, -78, -20, 107, 76, 75, 59, 74, -72, 103, 21, -4, + 106, -118, -81, -85, -24, -43, 59, 100, -72, 1, 37, -95, -1, -17, -113, -83, 30, -63, 19, + -36, 29, 23, -122, 27, -82, 38, -91, 69, -108, 21, -28, 68, -53, 10, 36, 17, 124, -16, + -60, -3, 72, 46, 87, -24, 23, 53, 105, -100, -32, 38, -62, 62, 12, -116, 47, 46, 6, + -122, 87, 119, -52, -2, 84, -13, 58, 53, -66, -80, -6, -99, -36, -70, -84, 81, 104, 20, + 87, -72, 125, 102, 2, -35, 6, -93, 47, 10, 71, -114, -71, 11, 108, -41, 5, 115, 13, + -95, 120, -103, -45, 19, 75, 61, -67, -75, 40, -66, -37, -91, 0, 65, 25, 4, 121, -79, + -110, 123, -20, -34, -37, -113, 112, 117, 12, -105, -11, 36, -49, -112, 49, 114, -26, -98, -36, + -86, 96, -120, 108, -47, -62, 29, 15, -80, 108, -24, 0, -99, -107, 82, 47, 98, 85, -16, + 59, -28, -111, 100, 51, -109, -113, 97, -48, 71, -46, -20, -102, 98, 124, -61, -113, -74, -119, + 121, -59, 20, -3, -93, -13, -57, 37, -34, 5, -26, -121, 46, -37, 34, 31, 103, -5, 42, + -52, -17, 28, 73, -51, 120, 21, 41, -7, -30, 121, -86, 122, -3, 87, 71, 58, 6, -26, + -81, -33, 43, -32, -44, 32, 79, 86, 46, 67, -18, 31, -65, 28, 73, 43, -77, -37, -18, + 12, 0, -86, 78, 124, 104, -44, -25, 93, 10, 6, -94, 50, -8, -81, -69, -79, -124, 97, + -53, -95, -18, 18, 83, 14, 38, -80, -4, -122, -83, -89, 95, -71, 50, -7, -124, -19, 58, + 48, 77, 102, 8, 116, -44, -65, -30, 81, 52, 0, 23, -55, 85, -121, -97, 54, -120, -103, + -93, 79, -71, 41, 29, -80, -63, -119, -56, -119, -14, -109, 115, -54, 109, 55, 5, 100, -70, + 1, -100, 43, 95, 50, -42, 23, -49, -55, 3, 30, 40, 71, -126, 45, -17, -31, -67, -22, + 78, 16, 72, -121, 68, 28, -74, 73, -100, -104, 50, 22, -87, -57, 109, 114, 114, 82, 51, + -102, 34, -27, -16, -3, -18, 3, 106, 19, 72, 10, -69, 127, 4, 38, -76, -44, -118, 13, + 33, 10, 94, -73, -3, -63, 46, -31, 26, 68, -31, 92, 123, -40, 25, 96, -78, -112, 87, + -29, -109, -61, -101, -46, -104, -16, -105, -32, 95, 78, 79, -117, 68, 104, 124, -8, -114, 42, + -42, 92, 73, 80, 85, 123, 102, -127, 25, 19, 43, 25, -34, 44, -60, 96, -35, 0, 11, + 88, 91, -123, -36, -100, 44, -92, 56, -95, -67, 88, 59, 83, -96, 98, -82, -52, -4, -50, + -50, -6, -94, 20, 64, -61, 8, -11, 75, -104, 6, -29, 18, 103, 21, 39, -29, -89, -67, + 48, 120, 64, -120, -39, 7, -53, 23, -61, 91, 19, -60, -12, -64, -71, -105, 77, 45, -77, + 66, 53, 37, -64, 120, -8, 15, -8, -44, -61, 71, -118, 23, 81, -4, 123, 20, -18, -75, + 107, -74, 15, 79, 45, -106, -82, 14, -42, -110, 15, -66, -66, -13, 76, 72, 17, -72, 59, + 51, -31, -56, 76, -24, -41, -107, -43, -64, -8, -18, -40, 34, -81, 110, 36, 125, 57, 9, + 12, -103, 100, 100, -87, 109, -63, 38, 108, 115, 20, 42, -86, 60, 1, 80, 102, 1, 75, + -2, -100, 27, -91, -78, 5, -73, -67, 46, -2, -109, -33, -51, -115, 78, -71, -56, -96, 39, + 69, -25, 99, 34, 23, 37, 48, 23, 26, 47, 125, -81, -25, 11, -20, 36, 9, -26, -19, + 103, -68, 123, 88, 9, 15, -99, 30, 113, 70, -127, 33, -25, 24, -35, 1, -6, 101, -121, + 113, -36, -112, 7, -8, 6, 21, -42, -89, -109, -63, -110, 47, -80, 88, 38, -24, 106, -13, + 72, 63, -118, -78, -36, -17, 106, -71, 47, -61, -119, 48, 59, 43, -6, -101, 103, -11, 0, + 22, -82, 57, 71, -60, -54, -91, -101, 120, 69, 107, -39, -70, 46, -44, 100, -56, 70, -67, + 51, 11, -9, -64, 42, -21, -119, -37, 36, 28, 10, 37, -45, 127, 113, 92, -56, -118, -111, + -93, -14, -15, -69, 16, 81, -94, 49, -95, 47, 97, 39, 16, -41, 63, -85, 107, 89, -4, + 49, 78, 103, 8, -8, 5, -29, -88, -2, -119, -6, 88, 97, 40, -21, 67, 57, 16, -26, + -78, -86, -108, 121, -14, 70, 83, -88, 44, -16, -12, -67, -74, 117, 30, -32, -31, 20, 6, + -25, -85, -82, 47, -113, -112, 76, 68, -125, 27, 54, -24, -84, -82, -46, -58, -104, -46, 102, + -80, -88, -123, 95, 36, -120, 30, 86, 21, 24, 110, -20, -41, -78, 11, -124, -73, 31, 92, + -23, -107, -1, -12, 117, -35, -21, 74, -38, 76, -121, 86, 67, -126, -59, -91, -97, -114, 96, + -116, -125, -83, -3, 62, 13, 96, 33, -8, 28, -99, 71, -79, 12, 95, -87, -52, -65, 107, + 38, 106, -41, 100, 27, -96, -68, 89, -80, 20, -61, -119, 71, -34, -46, -100, 14, 79, 10, + -98, -110, 110, 19, 52, -85, 24, 91, -70, -125, -88, 58, 124, 87, 124, -90, -48, 114, 36, + 118, -38, -10, 54, 71, -72, -68, -23, -115, 13, -118, 76, 34, 29, 32, -26, 18, 98, 13, + -41, -57, -122, -35, -106, 112, -91, -111, 70, -63, 83, 18, 51, -70, 71, -116, -3, 62, 38, + 119, 26, -71, 124, -127, 48, 96, -30, -61, -27, 72, 11, 111, 43, 36, 78, -65, 45, 37, + 22, -95, -109, -115, 115, -74, 31, 7, 7, 54, -104, 70, 102, 24, -127, -38, -59, -59, 101, + -93, 47, 17, -89, 99, 123, 16, 102, 72, -114, 12, 101, 74, -52, 126, -57, 12, 76, -80, + -95, -85, 50, 87, -26, 21, -75, 53, -21, 87, 36, 21, -123, -30, 15, 21, 66, -33, -76, + 50, 108, -10, -121, -73, -87, 95, 26, 124, -38, 7, -43, -81, -29, -13, -117, 63, -91, 49, + 48, -103, 7, 91, 97, 109, 104, -119, 126, 23, 31, -86, 54, 15, 77, 69, 28, 121, 100, + 93, -40, 91, 71, 109, -99, -117, 92, 119, 118, 72, 32, 83, -111, 22, -85, 67, -68, 46, + 30, 82, -75, -28, 100, -11, -68, -51, -116, -47, 89, 118, -56, -51, -20, 123, 10, -57, -79, + -45, 94, -70, -92, 102, -44, -83, 21, -67, 46, -82, 44, -40, -46, -102, -47, -11, 111, 60, + 0, 25, -124, -35, -40, -75, 79, 54, 60, -101, 20, -45, 42, -104, 62, -54, 49, -55, -84, + 111, 54, -52, -11, 25, 54, -1, -24, -60, 36, 41, 37, 20, 114, -99, 15, 78, 86, 11, + -124, -99, 25, 102, 0, 113, 44, -106, 26, -79, -96, 15, -47, -6, -97, 118, 116, -1, 54, + -56, -41, 43, 111, 71, 100, -36, -60, -109, -78, -42, 107, -52, -68, 68, 59, -32, -85, 9, + -24, -83, -92, -49, -64, -30, 100, -84, 11, 33, 104, -118, 84, -4, -70, -13, 110, -33, 17, + -28, 21, 75, -71, -125, 111, 55, 59, -69, 36, -23, -25, 40, 123, -4, -70, -105, -102, -3, + -85, 124, -76, -24, -42, -15, 36, -31, -19, -43, -67, -22, -36, -21, -122, 25, -4, -25, -3, + -60, 77, 56, 18, -58, -126, -45, -4, 106, -108, -72, 114, -20, 56, 117, -39, 94, 9, -43, + -15, 17, -51, 90, -88, 47, 13, 54, -10, 122, -2, -48, 95, 117, 2, -36, -66, -113, -103, + -36, -12, 47, -31, 21, -26, -52, -25, 58, -22, 5, 2, -29, 22, -20, 5, 10, 91, 80, + 9, 10, -25, 62, -98, 24, 13, 104, -46, -9, -83, 14, -107, 63, -57, -80, -126, -100, -92, + 9, -84, 117, 66, 3, -106, 49, -110, 11, 53, -25, -101, 120, -85, -12, -6, 6, 37, 61, + 117, 88, -94, 111, 41, -120, 62, -36, -81, -86, 42, -15, -18, 12, -4, 7, 87, 13, 93, + -112, -46, -59, -78, 118, 74, 80, -110, -62, -54, 70, 70, 121, 121, 113, 88, 38, 119, 49, + 83, -15, 47, 109, 56, -24, 89, 87, 74, 4, -69, 60, 20, 113, -14, 36, -4, 102, -6, + -106, -31, -10, -82, -42, -30, 95, -118, 101, 92, -81, 126, -44, -64, 33, 85, -61, -61, -38, + -79, -101, -74, 119, -62, -58, -105, -23, -99, 85, 46, -109, -62, -99, 69, -126, -89, 29, -52, + -38, -87, -60, -51, 41, -84, 35, 87, 87, 40, 104, 114, 86, -43, 83, -87, -96, 24, -113, + 53, -94, -22, -97, 54, -108, 113, -72, 87, -89, -34, -114, -7, -12, -4, -94, -127, 99, 79, + -60, 92, -61, 20, 15, 54, -34, 112, 103, 44, -62, -96, -29, -13, 68, 2, 92, -26, -45, + 73, 84, -122, 91, 63, -17, -27, 87, 89, -43, 121, 20, 0, 80, -10, 70, 81, 36, 101, + 70, -102, -85, 48, 64, 114, 102, -46, 24, 72, -113, 75, 72, -3, -118, -52, -56, 39, -76, + -17, -108, 80, 21, 97, -32, -97, 63, 82, 117, -117, 105, 96, -115, -49, 12, -44, 39, 112, + -103, -69, 53, -63, 44, -26, -28, 26, -69, -55, 93, 78, -111, -5, -45, -72, -117, 76, -98, + 76, 112, -45, -84, -32, -65, 56, 102, 42, -18, 119, -36, -80, 50, 72, 91, 107, -102, -118, + -108, 2, 84, 76, 37, -44, 55, -35, 99, -106, 103, -67, 42, -75, 24, -57, -97, 51, -16, + 82, -83, -25, -69, 93, 45, 112, -86, -41, 17, 38, 115, -54, 109, -48, -21, 80, -114, 94, + -5, -106, 3, 75, 120, -5, 81, 20, 7, 65, -56, -81, -79, 14, 29, -74, 115, -34, -105, + 15, -124, 19, 63, -109, -92, -22, -122, 110, -60, 17, -107, -114, -92, -30, 3, 105, -60, 55, + 14, -110, 110, -125, 97, -72, 17, -118, -14, 92, -10, 91, 102, 76, 114, -85, 10, -52, 84, + 43, -63, 70, -77, 35, -105, 97, 36, -33, 5, -97, 70, 57, -15, -80, -7, 104, -5, -49, + 86, 102, -78, -116, -92, -9, 64, -79, 84, -28, 28, -34, 83, 50, -50, -101, -61, -52, 46, + -12, -113, 36, -65, 99, -87, 70, 99, -13, -38, 91, -32, 51, 90, 24, 6, -59, -11, 120, + 74, -47, 58, 94, 101, 49, 108, -74, -37, 54, -91, -44, -1, 51, -80, -18, -36, -72, -98, + 105, 93, 117, 25, -29, 112, 74, 22, 120, -3, -84, -42, 81, -124, -55, 33, 103, 27, -83, + -82, 90, -59, -61, -1, 42, 67, -20, -78, -12, 85, 46, -44, -75, -99, 98, 47, -50, -4, + 68, -97, -75, 62, -77, -90, 1, -13, -100, 67, -43, -87, -75, 96, -18, -99, 10, 118, 114, + -124, 1, -114, -100, 40, 83, 21, -78, 104, -42, -44, 12, 29, 67, 18, 109, 9, 108, 37, + 100, -83, -110, -67, 33, 13, 60, -26, -85, 49, -103, 83, -104, -84, -22, 121, 18, 13, -48, + 39, 97, -4, 103, -105, 114, -105, 121, -100, 85, 90, -36, 22, 7, -13, 123, 72, -1, -114, + -27, -120, 88, 39, 108, 68, -15, 48, -108, -110, -34, 99, -40, 83, -112, -113, -62, -90, -29, + -53, -113, 22, 58, -6, 59, 83, -40, -15, 106, -27, 91, 64, -123, 76, 86, -90, -13, 19, + -119, -32, 124, -24, -122, -82, -86, -83, -84, 90, 107, 34, -85, 47, 119, -67, 8, 7, 120, + -7, -66, 59, -28, -92, 77, -78, 94, 23, 118, -89, 48, 95, -92, 63, 118, -58, 85, -106, + -20, 45, -95, -12, 103, 16, 30, -45, -62, 64, 16, -97, 122, 37, -11, -90, 123, -108, -125, + 119, 51, 63, -60, -2, -19, -107, -99, 27, -47, -32, -76, 47, -107, 12, 67, 111, 83, -10, + 100, -64, 11, 100, 7, -119, 10, -76, 59, 113, -57, 105, -79, 61, 55, -98, 47, -33, 40, + 113, 97, 119, 21, -111, -55, 76, -13, -79, -124, -69, -76, 24, -68, -81, 96, 108, -104, 107, + 17, 85, 52, 113, -118, -98, -107, 72, 12, 48, -58, 21, -73, -17, 124, 39, -14, -126, -45, + 76, 18, -7, -127, -66, 8, -84, 110, -68, 20, -69, 82, -104, -125, 89, -60, -80, 8, -106, + 7, -41, -17, 37, 52, 47, 36, -119, -88, 51, 122, -43, 51, -3, 79, -63, 33, -121, 106, + -44, -44, -46, -80, 119, 68, -74, 42, -61, -20, -57, 23, -114, 61, -116, -101, -51, 2, 97, + -25, 127, -103, 94, -34, -68, -55, 83, 46, 25, 8, -13, -47, -103, 114, 63, 126, -8, -18, + 112, 111, 8, -98, -4, -97, -14, -114, -60, 88, -76, 120, -38, 122, -13, -91, 108, -21, -102, + -99, 127, -108, 36, -30, 33, -43, 9, -119, -72, 106, -111, -74, -76, -47, 96, -98, 43, 53, + -48, 95, 81, 2, 30, -92, -27, -61, 32, -30, 60, 61, -69, -53, -42, 98, -37, -116, -52, + -98, -55, -54, 68, -126, -5, 111, -66, 47, -92, 23, 19, 113, 125, 8, 71, 46, 4, -59, + 45, -61, -92, 82, 13, -55, -113, 110, -39, -86, -117, 17, -93, 62, -18, 121, -42, -56, -1, + 105, 59, 34, 90, 7, 9, 126, 32, -52, 119, -81, 58, 121, -47, -89, 121, -98, 23, -77, + -2, -30, -9, -73, -103, -119, 49, 109, 1, -50, 107, 69, -58, -37, 111, 119, 91, -67, -120, + -30, -35, 121, 78, 35, -119, 110, 122, 65, -11, 21, 90, 68, 15, 100, -109, 109, -105, -82, + -20, 9, -41, -23, -95, -44, -46, 113, 112, -115, -110, -38, 11, -106, -85, 62, 80, -123, 106, + -20, 73, 79, 1, 119, -7, -101, 51, -121, 48, 86, 44, -92, 21, 2, 27, 66, 112, -75, + 39, 25, -79, 33, 38, -69, 90, -2, 59, 73, 24, -57, -53, -37, 36, 36, -62, 98, 72, + 101, 122, -103, -47, -114, -76, -59, 52, 6, 47, -27, -5, -64, -66, 98, 0, 8, 71, 56, + 22, -87, -95, -63, 22, 118, 29, 111, -81, 39, 69, 19, -72, 65, 51, -106, 1, -53, 80, + 67, 76, -27, 87, 68, 67, 1, -114, 75, 86, 75, -56, -110, 34, 106, -93, 38, 5, -88, + -113, 75, 115, -21, -76, -118, 111, -65, -75, 56, 5, 24, -33, -22, 108, -74, -16, 113, 18, + -110, -107, 10, 81, 70, 18, 123, 81, 8, 120, 94, -49, 10, -27, -2, 56, 92, -4, 116, + -67, 89, 119, -10, 123, 74, -49, -61, 54, 69, 17, -2, 104, -39, 108, -66, -14, 87, -117, + -120, 10, 72, 58, 112, 2, -45, -102, -67, 37, -33, 125, 99, -43, -66, 60, 19, 26, -30, + 4, 49, -96, -36, 88, -60, -7, -56, -96, -8, -44, 15, -126, -91, 107, 37, -127, -97, 70, + -89, -77, 29, 48, 3, 46, 37, 70, 105, -31, -46, 73, -85, -9, -6, -106, 6, -19, 92, + -124, -80, 46, 102, -115, -1, 39, -39, -98, 42, 40, -83, -89, 67, -67, -93, -6, -38, 25, + -2, -45, 91, -28, 34, 98, -62, -95, -8, -61, 57, 115, -109, 119, -115, -106, -41, -61, 53, + 16, -60, 7, -22, -74, -97, -36, 32, -111, 60, -92, 71, -93, -100, -10, 16, 123, -87, 33, + 12, 98, 1, 119, -1, 55, 91, 38, -11, 110, -104, 30, 105, 78, 92, -9, -28, -23, 105, + -39, 94, 106, -66, 7, -58, 38, 86, -76, -50, -35, 124, 74, 81, 84, 7, 71, -55, 116, + 53, 43, 58, -26, 116, -22, 18, -82, 98, -1, 6, -49, -69, -87, 109, 108, -32, -103, 126, + 11, 40, -9, 75, 9, -45, -94, 43, -80, 9, 61, 123, 54, -119, 108, 85, -70, 19, 10, + -15, -29, -32, 12, -1, -91, -105, 95, 1, 58, 29, 67, -6, -45, 78, 42, -104, 51, 92, + 42, -63, -8, -48, 1, -101, -6, -118, 44, 14, -9, 102, -122, -28, -54, -34, -15, -91, 39, + 5, 74, -80, 106, -118, -22, 45, 96, -60, -82, 61, 60, 116, -63, 24, -115, -113, 63, 9, + -22, -77, -85, -115, -58, 71, 8, -38, 109, -16, -106, -64, 108, -127, 108, 84, 14, 63, -52, + 80, -42, -9, -41, -94, -60, 13, 21, 127, 44, 102, -1, 45, 38, -35, -102, 48, -80, -6, + -125, 30, 99, 80, 108, -94, 108, -118, 102, 104, 30, 59, 88, -69, -51, 5, -3, 72, -58, + -24, -39, -123, -102, -35, -48, -83, -39, 32, -35, 15, 88, 15, -56, -62, -9, -49, 74, 82, + 110, 74, 93, -60, 42, 60, 40, -67, -28, -126, -76, -13, 120, -82, 62, -111, 54, 61, 120, + -95, 28, -65, 53, 107, 4, -27, -123, 92, 101, 35, -93, 63, 40, 5, 118, -14, 17, -42, + 90, 14, 90, 80, -86, 110, -43, -50, 97, 30, -79, 99, -116, 81, 98, 15, 62, 49, -6, + -7, -22, 113, 59, 126, 42, 29, -46, -121, 77, -45, -115, 60, 40, 40, -18, 66, 44, 19, + 100, 19, -49, 115, 123, -25, -80, -118, -31, 114, -35, -51, 10, 71, 82, -96, 98, -103, 25, + -25, -122, 77, -58, -65, -118, -118, 51, 118, -101, -79, 116, -104, -101, -64, -68, -15, 77, 43, + -117, 8, -94, -11, 88, -5, -125, 23, 18, -76, 39, -22, 83, -61, -49, -93, -108, -116, 122, + 106, -109, 114, 28, -14, 107, 44, -15, -68, 44, -16, -29, 32, 59, -61, 19, -87, -81, 27, + -48, -4, 70, 105, -33, -77, -68, 24, -69, -28, -20, 34, 108, 110, 3, 111, -76, 7, 49, + 62, -83, 116, -44, 53, -24, -71, -51, 50, 91, 122, 34, -11, -37, 30, -3, 63, 42, 126, + -63, -65, 77, -18, 104, -59, 101, -24, -108, 85, -122, -4, 70, -97, -49, 57, -93, -84, -31, + -22, 5, 86, 106, 77, -121, -81, 21, 101, -2, 49, 42, -126, -47, -81, -63, 61, 39, 23, + -88, -20, -109, 62, -84, -79, 27, 106, -31, 62, 108, 45, 91, 32, -63, 110, 61, -99, 102, + -69, 116, -118, 68, 80, -38, -73, -89, 113, 76, 61, -113, -64, -62, -15, -122, -45, -113, 58, + -54, 26, 72, 27, 78, -66, 39, -102, -19, 124, -46, -121, -52, 115, -96, -71, 112, -5, -107, + -102, -68, -67, -87, 66, -34, -112, -21, -83, 6, 99, -62, 62, 57, -49, 56, -23, -23, -18, + -87, 20, 74, 17, 28, -115, -31, 32, -55, 71, 49, -60, -80, 111, -29, -76, 30, -48, 46, + -90, -125, -55, 106, -93, 12, 16, -35, 53, 49, -32, -76, 79, 11, -123, 109, 100, -64, -15, + 70, 83, 34, -111, -27, -40, -19, 112, 33, -41, -74, 50, -106, -66, -23, 85, 93, 95, -126, + 2, -102, 40, 10, 61, 24, -95, 62, -104, 63, -77, -100, -64, 4, 32, -48, -113, -15, 125, + 71, 69, 110, 56, 68, -10, -87, 38, -95, -46, 113, 76, 41, -97, 6, -103, -65, -119, 2, + -75, 8, -21, -36, 67, 116, 101, 75, 86, 112, -68, 40, -6, 21, 77, 25, -15, 19, 14, + 72, 38, -10, 37, 49, -22, -97, 14, -15, -1, 64, 18, -92, 30, 5, 42, 15, -65, -84, + -9, 93, -122, 54, 57, -50, -52, 102, 65, -96, 8, 70, 16, -66, 97, 5, 78, 54, 109, + 29, 57, 21, -108, -68, -120, 14, -93, -6, 109, 29, -24, -79, 86, -44, 62, 101, 78, -84, + -31, -65, 78, -50, 61, -111, -124, 14, -49, 121, 82, 71, 45, 17, -80, -34, -17, -50, 7, + -7, 64, -112, -37, 55, -74, 101, 20, 125, -28, 102, 61, 17, -39, -18, 118, 8, -105, 114, + -55, 111, -95, 101, 62, -74, 16, -41, 12, 93, 35, -10, 121, 69, -58, 0, 60, 84, -93, + -6, -19, -31, -126, -23, 10, 99, -115, 105, -66, -90, -58, -50, -74, 58, -115, 31, -108, 44, + -70, 6, -9, -12, 67, -41, -62, -13, -8, 79, 95, 18, -39, -91, 26, 13, 52, -108, -73, + 81, 118, 1, -32, -20, -109, 23, -97, -46, -29, 28, 69, 38, -3, 113, -88, -107, -60, -111, + 82, 3, 33, 124, -102, -84, 63, -106, 11, -54, -12, 48, 66, 48, 52, 50, 100, 8, 119, + 74, 12, -66, -125, -51, -117, 64, 95, 125, 110, -68, -67, 22, 95, -18, -117, 16, 50, -21, + 103, 115, 49, -126, 43, -104, 115, -43, 21, -103, 126, -48, 66, 22, 62, 69, -55, -20, -6, + -20, 89, 31, -86, -91, -87, -7, 48, -77, 7, -119, 126, -42, -53, 104, -90, -44, 55, 122, + -65, 114, 68, 14, 24, 64, 94, -71, 79, 51, -42, -5, 81, 4, 6, 98, -107, 89, -125, + -3, 18, -64, 16, 68, -76, 122, -110, 79, 102, 24, -79, 120, 29, 14, -92, -118, -52, 80, + 107, -34, 30, 78, -50, -8, -15, 127, -101, 13, -35, 71, 56, 60, 39, -26, 11, -92, -64, + 95, 15, -32, 5, 99, -12, -85, 22, 40, -12, -6, -72, 33, 13, -59, 112, -28, 74, -113, + -23, 76, 7, 62, 13, 126, -108, -19, 67, 107, -35, -100, 104, -33, -73, 98, 47, -34, -48, + 61, -12, -45, -50, -57, 89, 60, 5, -107, -68, -104, 56, 14, -42, -80, 121, 37, -25, 108, + 10, -90, 3, 21, -36, -31, 40, 72, 60, 107, -32, 114, -115, -81, -88, 35, -115, -34, -111, + 23, -89, 42, -42, -12, -124, 17, -26, -44, 69, 111, 69, 63, 2, 37, -90, 111, -64, 3, + -125, 9, 50, -108, -91, 110, 16, 25, 13, 108, -93, 39, 99, 119, -114, -96, 20, 36, 69, + 46, -115, -67, 72, -70, 99, -12, 55, 74, -120, 22, -124, -121, 123, -41, 66, 46, -27, -49, + -112, -35, -94, 10, -59, -76, -16, 46, -120, -29, -110, -74, -102, 119, -97, -24, -117, 51, -30, + 44, 75, -37, 18, 111, -5, 42, -74, 35, 90, -12, 88, 88, -94, 105, 116, -69, -54, 106, + -87, -27, -23, -76, -61, -65, -8, 38, 12, 64, -98, -70, 126, 111, 51, -96, -12, -26, -41, + 44, -86, 61, 118, 45, 28, -115, -4, 8, 61, -118, 83, 57, -126, -21, 114, 81, 104, 111, + -64, 66, -94, 92, 88, 104, 15, -25, -60, 29, 59, 82, -125, 25, 120, 50, -17, -1, -47, + 59, -21, 99, -26, 64, -12, -94, -43, -84, 35, -61, 114, 47, 113, -122, 113, -76, -48, 78, + 124, 84, -48, 24, -51, 116, 63, -76, 11, 99, -32, 81, -89, 96, -13, 13, -103, 5, 67, + -115, -112, 84, -109, -14, 37, -77, -47, -19, -125, 34, -40, -43, -103, -66, -13, 62, -27, 32, + -4, 97, 35, 124, -80, 124, 92, -31, 94, 9, -22, -125, -6, -41, 63, 125, -73, -71, 56, + -112, 124, -23, 11, -70, 124, 32, -83, 71, 73, 36, 109, 40, 80, -63, 118, -72, -10, 48, + -125, 52, 49, -5, 69, 18, 24, -43, -27, -55, 35, 90, 97, 27, -58, 79, -125, -68, 75, + 28, 14, -79, -86, -57, -84, -90, -38, 117, -106, -7, -104, 75, 68, 68, 111, -13, 27, -121, + 120, -40, 79, -1, -47, 28, -18, 75, -81, 82, -7, 7, -2, 55, 8, -123, -16, 82, 41, + 90, -91, -113, 115, -43, 70, 6, -91, 13, 29, 42, -16, 17, -79, -77, 66, 109, -58, 3, + -103, 108, -50, -58, -81, 123, -67, -31, -20, 24, 26, 69, -88, 11, 85, 72, 112, 57, 6, + -70, -12, -96, -6, 75, 51, -109, 119, 104, -83, -9, -65, 84, 66, -23, -87, 79, -55, -96, + -76, 47, 62, -10, -59, -118, -70, 62, 29, -78, 77, -92, 116, 71, -47, -91, -114, 51, -25, + 38, -103, -115, -122, -7, -72, 123, 82, -79, -59, 105, -16, 106, -53, -79, 94, 122, 33, -70, + -117, -75, 67, 8, -13, -101, 71, 55, -2, -124, -62, -51, -96, -49, -60, -14, -113, -18, 16, + -83, -104, -22, 8, 57, 45, 5, -26, 32, -32, -87, 24, -93, -49, -48, 14, -108, -25, -103, + 4, -101, -82, 82, 33, 26, 55, 0, 123, 61, -47, -13, -60, 110, 20, -110, -80, 124, -76, + 33, -25, -116, -2, 30, 113, -102, 61, -107, 81, -94, -110, -65, 79, -86, -31, -112, 8, -104, + 5, -84, 1, -76, -83, -114, 102, -115, -114, 109, -44, 83, 13, -64, 44, 67, -28, -47, -22, + 37, -46, 79, 70, -21, 66, -8, -1, 108, -42, -59, -69, -17, -13, -11, -1, -98, 19, 125, + 12, 15, 55, 25, 100, -8, 55, 9, -119, -38, -107, -35, -105, -22, -49, 90, 86, -109, 61, + -56, 48, 112, -29, -52, -101, 67, 76, 59, 119, -113, -9, 26, -100, 119, 104, 78, -26, -31, + -106, 71, 0, 102, 83, -95, -37, -103, 95, 86, -19, 127, 79, -98, -55, -23, 42, 86, 85, + -25, 79, -62, -76, -43, -112, -74, 30, -82, -121, -84, -29, 77, -29, -17, 99, 81, 123, -80, + 7, 86, -4, -105, 38, -13, -57, -111, 14, -3, -90, -94, -77, 53, 123, 84, 44, 56, -60, + -38, 12, -105, 104, 50, -31, 8, 127, -28, -32, -2, -57, -29, 21, 81, -47, -55, -24, -61, + -62, 116, 19, 74, -64, 9, 38, -126, -104, 119, 127, -52, -102, -70, 54, -42, -113, -48, 127, + 50, -56, 107, -75, 80, 28, 20, 119, -89, -40, -91, 0, 109, -38, -119, 5, -1, 70, -9, + -92, 78, 120, -118, -47, 102, 66, -78, 92, 40, -81, -13, -119, -81, 7, -13, 126, 95, 67, + 78, 127, -89, 117, 119, 62, 6, 97, -88, 55, -80, -65, -81, 59, -47, 83, -37, 33, 126, + -67, 17, 106, 2, -77, -91, 32, 91, -22, -104, 27, 63, -97, 29, 53, 86, -77, 100, -83, + 101, -119, 69, -20, -30, -126, 20, 58, -125, -124, -126, 37, 105, 39, -40, 11, 54, 56, 50, + -73, -101, -71, 50, 35, -16, 104, -52, 59, 37, -100, -102, -126, 65, 103, -13, 70, 123, -126, + 119, 10, 24, -81, 28, 100, -36, 4, -108, 98, -104, -24, -85, 41, 40, -100, -22, 71, -37, + 1, -37, 118, -36, -22, 78, 101, -33, -74, -101, 69, -55, -56, -91, -6, -110, -77, 87, -52, + -21, 43, -66, -110, 8, 102, 39, -78, -17, 99, -68, -38, -109, -64, 75, 32, -36, -91, 122, + 90, -11, -95, -32, -59, -51, 52, -17, -83, -5, -107, -42, 88, 41, -80, -123, 42, -97, 48, + 97, 90, -22, -9, 40, 84, -123, 81, -104, 82, 52, -18, -18, 113, 53, -23, 105, 53, -113, + 44, -119, -4, -31, -12, 117, -93, 24, -82, 117, -103, -92, -15, 26, -71, -68, -27, 38, 86, + -76, -29, 44, -124, 20, -42, -123, -38, -82, 122, -32, -28, 2, 61, -97, -88, 2, -27, -124, + -123, -105, 63, 123, 2, -65, -3, 0, 35, -59, 64, -8, -30, 93, -82, -100, 95, 54, -35, + 102, -72, -24, 110, 34, -80, -100, 121, -10, -83, -9, 112, 50, 15, 7, -45, -106, 99, -87, + 43, -74, 72, -6, 64, -74, -120, 102, -110, -22, -84, 100, 85, 93, -72, -75, 73, 62, 71, + -26, -48, 37, -97, 96, -24, 37, -83, 84, -117, 65, 103, -17, 84, -67, -100, 100, -92, 104, + 73, -62, -90, -95, -109, -14, -120, -82, 23, 118, -9, -14, 42, 98, 35, 95, 11, 77, -75, + 123, 73, 122, -60, -34, 103, 119, 65, 16, -104, 111, -109, -114, 41, 79, -49, -62, -103, -121, + 26, 70, -67, -98, -37, 68, -115, -38, 50, 3, -119, 44, 92, 57, 123, 117, -60, -67, -68, + -118, 19, -83, 103, -37, 98, -71, 66, -82, -110, -92, 72, -58, -63, 111, -122, -47, -62, -97, + -124, -99, -30, -108, -120, -18, 23, 64, -120, 108, 4, -30, 40, -75, 69, -50, 79, 93, 80, + 23, -28, 5, 60, 38, -63, 76, 125, -82, 55, 77, -104, 19, -32, -124, 88, -99, 79, -73, + -3, 92, -50, 97, -51, 67, -19, -45, -15, 86, -65, 71, 82, 95, 109, -92, 93, -78, -112, + 10, 14, -103, 51, 114, -6, -106, 90, -80, 115, -3, 15, -105, 0, 108, -24, -120, 112, 16, + 22, 125, 12, -126, 57, 60, -47, 31, 55, 120, -121, -20, 22, 126, -81, 122, -63, -127, -34, + -5, -8, 51, 45, 124, -91, 6, -71, -114, 63, -82, -106, -84, 19, 31, -111, 100, 82, 2, + -85, -34, -49, -125, -122, 67, -56, 118, -30, 84, 2, -6, 107, 100, -36, -115, 77, 80, -32, + -64, 97, 36, 8, -117, -19, -74, 85, 87, -65, -86, 92, -100, -107, -27, -11, 83, 19, 14, + -65, -3, 83, -9, 95, -5, -46, 59, 84, 123, 42, 72, 64, 88, -29, -91, 40, -15, 88, + -52, 111, -87, 54, 17, 56, -42, -21, -106, 52, -36, -38, 120, 34, -17, 51, 89, -118, -58, + -23, -32, 12, 97, -36, -1, -84, 63, -31, -63, 101, -20, -85, 13, -54, 85, -56, -92, 38, + -60, -49, -16, -100, 50, 90, 1, 37, 11, -124, 38, -121, 8, 28, -96, 57, -36, 90, -5, + 4, -24, -107, 27, 12, 94, -76, -100, 16, 94, 18, 9, -57, 27, 11, -71, 63, -54, -51, + 81, 80, 34, 121, 105, 125, -109, -88, -109, -66, 117, -9, 111, 0, -96, -20, -19, 28, -25, + -7, -88, -42, -112, -6, 41, -53, -94, 53, -84, -36, 110, -112, 86, 112, -80, 126, 13, -46, + -85, 67, -90, 27, -65, -95, 102, -89, -25, -83, -48, -84, 125, -96, -12, 77, 122, 121, 121, + 54, -3, 61, -33, 12, 94, -8, -58, -14, 96, -100, -78, 15, -6, 19, 35, -93, -106, -29, + 66, 119, -91, -72, -28, 119, 43, -112, -35, -27, 7, -47, 37, -42, 87, -65, 124, 46, -52, + 17, -104, -25, -107, -39, 10, 68, -22, 25, 74, -54, 17, -12, 34, 110, -61, 127, -81, 57, + 101, -113, -14, -74, -91, -81, -82, -49, -119, -41, -102, 72, -117, 3, -127, 57, -50, -98, 96, + -76, -25, 98, -71, -32, -119, 21, 120, -40, 112, -25, 117, -59, -78, 113, 118, -16, 52, -38, + -1, -71, -17, 70, -7, 15, -59, 119, 23, -22, -3, -49, -85, -75, -108, -65, -1, 110, 33, + -54, -38, 105, 51, 108, 87, -109, -68, -126, -8, -33, 30, -112, 47, 89, 81, -123, -69, -8, + -20, -42, -23, -35, 14, -77, 55, 110, -103, -45, 22, 33, -18, 65, -101, -52, -54, -20, -94, + -60, 21, 81, -15, -64, -123, -33, -76, -4, -14, -56, -19, 75, 78, -89, 123, -61, -63, -69, + 119, -72, 24, 68, 30, 84, -20, 8, 87, 17, -92, -99, -96, 42, 91, 22, 93, 64, -58, + -98, 43, 73, -109, 124, 25, 30, 63, 20, -72, -115, -76, 15, 28, -44, -30, 108, -56, 51, + -82, 2, 31, 14, -89, 50, -124, 19, -21, 84, 25, 11, 23, 79, 81, 83, 45, -43, 100, + -105, -64, 102, 110, 49, 101, -10, 78, -88, 87, -65, -18, -1, 107, -32, -114, 8, 64, -121, + 4, -53, -9, 76, 103, 20, -15, 52, -6, -67, 44, -58, 96, -81, -27, 28, 91, -63, -35, + -72, 43, 20, 84, -1, 48, 86, 107, 67, 36, 25, -118, -117, -50, 52, -11, 103, 43, -90, + 125, 77, 101, 36, -99, -31, -75, 124, -82, 93, 66, -70, -86, 123, 81, 24, 96, 69, 116, + 2, 66, 68, 75, 10, -58, 15, 75, 31, 37, 69, -55, 40, -25, -124, -3, 0, 11, -61, + -45, -26, 5, 29, 87, -60, 24, -9, -8, 11, 75, 85, 93, -22, -108, -113, -73, 6, 32, + 120, -67, 29, 110, -18, -100, 86, -3, 77, 23, 30, -1, -15, -72, 106, -91, 70, 36, 105, + 3, 34, 124, 69, 40, 90, -80, -44, 35, 116, -39, -67, -123, -13, 77, 43, -62, 107, 75, + -28, -16, -20, -51, -74, 94, 70, -74, -125, 7, 8, 7, 47, 28, 20, 5, 109, -96, -107, + 51, -56, 122, -23, -94, -91, 110, 43, -22, -47, 76, -95, 8, 0, 81, -52, 6, -126, -112, + 18, -78, -57, -102, -57, -112, -91, -28, 27, -68, -15, 109, -118, 99, 82, 116, 86, -24, 83, + 93, -84, -52, -122, -101, -68, -34, 84, -75, -65, 109, -14, -51, 120, 92, 29, -70, 4, 121, + 52, -91, -6, 38, -16, 99, 78, -90, 16, 16, 21, 38, 20, -1, 71, -18, -45, 66, 28, + 64, 54, 52, -69, 114, -96, 94, -71, -7, -74, 10, -123, 33, 8, -85, 16, -4, 83, -46, + -104, 124, -69, 73, -73, 31, -30, 92, -118, -18, 55, 55, -38, 54, 72, -38, -101, 127, 76, + 107, 34, 10, 105, -102, -58, 107, -32, 1, 22, 111, -42, -64, 25, 42, -76, -91, -112, 109, + 18, -53, 25, 99, 55, 3, 88, 61, 117, -90, -39, -38, -115, 122, -78, 17, 93, -127, -117, + 24, -78, -30, -108, -32, 94, 67, -23, 6, -12, -52, 88, -39, 90, 122, -113, 17, 79, 98, + -78, -93, -4, -126, -100, 49, 60, -58, -77, 66, 68, 3, -85, -31, 15, 53, 82, -47, -34, + -125, -108, 37, -70, 99, 79, 90, 71, -97, -74, 105, 104, 44, -19, 59, -94, 11, -16, -42, + 67, 10, 86, -90, -82, -109, -26, 61, -28, -39, 20, 98, -37, -35, 101, -26, -13, -3, 66, + -85, 40, 66, -9, -89, -79, 23, 18, 118, -11, 74, 54, -48, -39, 110, 46, 3, -8, -69, + 100, 93, 0, -112, 106, 96, 9, -3, -36, 111, -83, -105, 37, -108, -8, -45, 87, 61, -2, + 43, 59, 78, 42, -63, -107, -63, -126, -124, 31, 26, -59, 126, -48, 97, -91, 81, 20, 81, + -54, 65, 45, 40, -112, 17, -122, 4, -73, -127, -54, -2, -80, -109, -30, -98, -106, 103, 52, + 59, 52, -65, -75, 24, 80, 112, -100, -112, 104, -73, 104, 72, -5, -94, 51, 123, -23, -42, + -56, -110, 101, 3, -3, 16, -76, 39, 96, 63, -110, 95, 45, 39, 12, -33, -42, 41, -47, + -118, -7, -20, -58, 25, 13, -108, -46, -18, 44, -55, -27, 106, 106, -64, 8, -112, 104, 60, + 56, 78, 92, 89, -71, -66, 107, -70, -14, 70, 88, 118, -48, 92, 99, 97, -28, -86, 24, + 1, 101, -59, -64, -40, 48, -114, 100, -86, 52, 8, -127, 22, -79, 44, -4, -23, -75, -12, + 23, 63, 111, -115, 28, 67, -36, -119, -30, -13, -59, 115, 79, -36, -113, 126, -52, 90, 110, + -54, -22, 58, -2, -69, -57, -1, -105, -63, 61, -34, 71, -99, 57, -5, -74, 44, 10, -73, + -117, 124, 17, -31, 31, -12, -90, -93, -36, -124, 37, -13, -81, 62, 78, 82, -37, 52, -55, + -74, 34, -125, 67, 30, -31, 99, 78, 114, -34, 97, -39, -21, 45, -77, 3, 18, -102, -79, + -39, 36, 33, -46, -91, -81, -12, 111, 116, 76, -45, -11, 115, 39, 103, -113, 124, 7, -77, + 114, -84, -11, 15, 101, 7, -119, 20, 68, -66, 72, -19, 91, -83, -45, 44, -18, -74, 124, + 68, -74, 64, 58, -4, 115, -2, 18, -66, -42, 69, -1, 37, -100, 94, -64, -48, -2, -27, + 123, -11, 69, -126, 60, 92, 108, -64, 56, -16, -104, -7, 120, 56, 55, 106, 97, -82, -6, + -94, -108, -114, 77, 14, 122, -38, 49, 58, 107, 103, -94, -93, -78, -109, -9, 37, -16, -6, + -82, 43, -61, 48, 102, 83, -10, 97, 99, 23, 71, 96, -105, -3, -108, -90, 24, -92, 70, + -106, 84, -121, 73, -109, 12, 57, 3, -39, 58, 82, -123, 70, 79, -19, 78, -38, 87, -21, + 72, 106, 106, 78, -97, 62, 35, 98, -73, 23, -74, -11, -95, -13, -55, 120, 99, -42, 21, + -36, -58, -116, 14, -17, 124, -13, 38, -1, -124, 3, -6, -14, 65, 28, 32, -27, 120, 91, + 19, 32, -99, 80, -114, -48, -54, -65, 87, -3, -125, -11, -106, 56, -52, 92, 33, -80, -50, + -99, -119, -57, -48, -100, -1, -57, 16, 108, -95, 75, 43, 96, -19, -81, -22, 116, -117, -121, + -19, -103, -59, 103, -29, 118, 13, -62, -46, -32, 85, -85, -107, 11, -64, -45, -88, -120, -12, + 112, -123, 78, -79, 100, -13, -86, 51, 17, -54, -17, -85, 40, -77, -55, 12, -11, 99, -65, + 36, 52, 124, -100, -106, -46, 124, 119, -61, 63, -90, 116, -43, -114, 65, -22, -71, -126, -66, + 15, 117, -56, -23, 22, 127, 107, -71, 46, 90, -67, 34, -86, -94, 97, -49, 60, 21, 28, + -65, -50, -98, 14, 6, 117, -8, 79, -15, -37, -3, -46, -86, -90, -56, 66, -121, 8, -52, + -14, -94, 86, 77, 99, 118, 82, -6, -28, 102, 108, -1, -29, 126, -19, -111, -120, -83, 28, + 109, -102, 27, 37, 99, 63, 55, -77, 48, 19, -17, -67, -41, -22, 6, 56, 30, 75, 51, + 18, -105, 86, 5, -49, -42, -24, -78, -101, 32, 31, -5, -4, 64, 70, -84, 63, 56, 34, + 121, -34, -82, 84, -57, -108, -42, 71, -39, 63, 10, -86, -71, -103, -84, 66, 40, -56, -104, + 105, 66, -71, -81, 61, -55, 52, -126, -86, -26, -36, 96, 22, 56, 58, -70, -55, 96, 77, + -12, 3, -87, 108, -11, -97, -17, -76, 68, 49, -48, 124, -52, -108, 42, 123, -64, -90, 2, + -123, -71, 6, 3, 102, 28, -4, 109, -35, 25, -24, 127, 14, 109, 11, -123, 7, -69, 78, + 36, -14, 90, -21, 115, 65, 69, 83, 122, -79, 87, 74, 68, 6, 87, -122, -26, -123, -47, + 36, -19, -101, -16, -8, 99, -61, 94, 75, 37, -95, 110, 37, -2, 92, 125, 123, 80, -77, + 109, 78, 39, -19, 10, -99, -25, 44, 118, -105, 6, 19, -59, -55, 51, -92, 72, 69, 50, + 105, 109, 55, 40, -112, -116, 108, 9, 114, 52, 103, 104, -27, -19, 32, -93, -44, -7, -118, + -113, 80, -64, 7, 69, 92, -13, 28, 61, 101, -22, -19, 6, -84, 45, 50, 4, -37, 7, + -81, 118, 45, 104, -15, -24, -47, 43, 12, -100, -11, -30, -89, 44, -102, -30, 102, -20, -63, + 4, -53, -62, -54, -34, -47, -106, 90, -73, 55, -107, -51, 71, -63, -81, -112, -110, -114, 87, + 13, 70, -114, 89, 65, -80, -8, 44, -44, 123, 67, 113, -46, -95, -115, 60, 52, -60, 33, + 55, 35, 13, -118, 107, -66, -109, -73, 19, 74, 54, 117, -75, 1, -15, -106, 106, 14, -125, + 76, 40, 109, 66, 103, -50, -90, -30, 44, 92, 53, -68, -99, -75, -35, -1, -21, 113, -1, + 61, -25, 37, -96, 119, 126, 97, -4, 58, -101, -31, 28, -50, -15, 20, -105, -46, 122, 36, + -99, -89, -52, -66, 97, -4, -116, 17, -54, 36, 90, 71, 22, 98, 85, 81, -50, 30, -11, + -118, 62, 104, 84, -70, 14, -59, -101, -15, 74, -19, 10, 43, 19, -105, -88, -41, 51, 57, + 0, 13, 51, -102, -102, -112, 22, -29, -5, -35, 107, 13, 121, 73, 122, -85, 16, 123, -91, + -102, 100, 30, 33, -38, 46, -105, -45, 55, -77, 91, 21, 36, 116, -34, 71, 63, -53, 12, + -44, -97, 50, 74, 119, -104, -81, 105, -109, -103, 7, -70, 18, 118, 107, 101, -31, -87, -34, + 50, 84, 125, -75, 33, 94, -63, -38, 39, -55, -112, -30, 110, 47, 12, 40, 0, 28, -110, + -26, 98, -61, -70, -52, 91, 77, 89, -74, 74, -5, 87, 45, -20, -75, -87, -19, 89, 122, + -76, 28, -116, 74, -117, -64, 64, 88, -121, 122, -20, 65, -103, -88, -103, 75, 107, 103, 36, + 113, 8, 3, -24, 50, 3, 58, 76, -63, 21, -27, 54, -120, -56, -61, -70, 100, -46, 62, + -119, -111, -23, -104, 55, 44, -54, -67, 86, 27, -123, -4, 125, -86, 88, -116, 10, 77, 64, + 25, 31, 69, -127, 12, -83, 114, 35, 48, -38, -4, -104, -91, -16, 33, -99, 10, 106, -53, + 3, -117, 76, 50, -117, 67, 83, 42, 72, -111, -32, -46, 3, -106, 30, -68, 98, -4, -61, + 90, -61, -99, -75, 35, 104, 72, -29, 2, -22, -2, 115, -8, -89, -93, 63, -29, 48, 103, + 44, -112, -98, -37, 102, 88, -91, -91, -95, 111, -96, -115, 51, 110, 83, 0, 79, 105, -83, + -72, 72, 49, -76, -71, -127, -17, -61, -85, 22, 48, -127, -69, 48, -104, -90, -86, -31, -59, + 54, -86, -94, -86, 9, 81, 64, 77, 33, -32, 32, -11, 70, -64, 61, 7, -115, -115, 17, + 107, 91, 65, -71, -125, 69, -30, 34, 61, -77, -106, -35, 119, 81, 109, 24, 51, -76, -88, + 97, -41, 9, 59, -33, 23, -88, -13, 21, 82, 68, 29, -117, 17, -6, -47, -33, -27, -86, + -19, -66, -36, 56, -21, 9, 114, 100, 79, -100, 52, 45, -53, 113, 127, 8, -104, 43, -125, + 124, 123, -8, 80, 76, 88, -58, -118, 87, -125, 38, 82, -46, 14, -25, 66, 65, -44, -4, + -79, -88, 106, -81, -58, 102, -97, 1, 56, 32, 16, 12, -91, 75, -121, 54, 38, 79, -103, + -112, 93, 99, 91, 43, -22, 45, -22, -115, -126, -97, 42, 54, 104, -76, -99, 48, 0, 122, + -50, -75, -126, -66, 98, 49, 3, 61, 101, -27, 99, 3, -14, -48, 72, -14, -39, -55, 66, + -106, 30, -112, 108, 82, 118, -37, -79, -122, -96, -106, 105, -91, -33, 91, 59, 72, 118, -21, + 81, 60, -121, -118, 125, 58, -92, -86, -62, -4, -95, 102, -87, -115, -11, -5, 89, -82, -108, + -125, 84, 63, 113, -14, -91, 82, 105, -22, 28, 93, -94, 32, -29, 78, -104, 67, 8, -86, + 4, 92, -92, 3, -1, -21, 61, -85, -67, -29, -100, -120, 61, 96, -18, -26, 122, -23, -7, + 50, 104, 72, 80, -54, -70, 34, 13, -26, -11, -63, 116, -95, -49, -40, -2, 2, -4, 113, + -107, -9, 34, -74, -124, 42, 66, 2, 93, 74, -38, -42, -27, -79, 12, -30, -80, -108, -99, + 26, -10, -57, -52, -63, -79, 88, 21, 120, 45, 123, 33, 28, -102, -104, 36, 126, -58, -86, + 117, -96, -67, 41, -53, -70, 70, 30, 63, 116, -73, -54, 56, -122, -8, -55, 85, -97, 11, + -114, 99, 19, -13, -49, -73, -122, -44, 29, 24, -6, -63, -61, 96, 74, -108, -85, 63, 85, + 10, 77, 9, -80, 97, -43, 9, -95, -89, 102, 34, 24, -93, 99, -53, -59, 44, 18, 79, + -89, -127, 36, -80, 91, 37, -79, 59, 123, -35, -66, -71, -30, -11, 17, 37, 103, 13, -126, + -43, -93, 25, -1, 122, 103, 57, -121, 36, -74, -118, 109, -47, -112, -82, -47, 93, 48, -70, + 55, 66, 56, -16, 5, -77, -102, -117, 104, -56, -73, -79, -32, -50, 107, 101, 69, 88, 27, + -44, 126, -17, 30, 22, 67, 74, -44, 85, -6, 25, -70, 70, -126, 95, -88, -118, -23, 90, + -31, -15, -33, 120, 75, 97, -78, 23, 120, 79, -68, -48, 101, -31, -90, -87, 23, 42, 23, + -12, 104, 16, -39, 56, 10, 35, -104, 85, -87, -92, -12, -104, 85, 91, 105, -57, 13, 114, + -126, 11, 125, -19, 42, -124, 4, -40, -120, 17, 7, -1, 12, 49, -33, -4, -99, 100, -77, + -97, -113, -107, 20, 64, 4, 66, -19, 26, -118, -87, -108, 17, -90, -28, -117, -26, -20, 45, + -48, -79, 45, -79, -48, 63, -120, -46, 72, 26, 109, -10, -100, 100, 114, 116, 108, -33, -15, + 123, 110, 61, -8, -70, 114, 121, 2, -57, -51, 17, -9, -100, -14, 10, 46, -118, 22, 4, + 105, -42, -49, 95, -98, -91, -4, 113, -10, 18, -86, -1, -17, -36, 38, 95, 45, 110, -119, + 12, -43, -65, 4, -26, -64, 48, -86, -107, -11, 73, -58, 124, -93, -87, 90, -126, 122, 21, + -105, 42, 22, -29, -46, -107, -90, 76, -38, -23, -110, -31, -21, -119, 21, -30, -107, 120, -18, + -59, 110, 47, 44, 84, 122, -28, -57, 108, -14, 54, 74, 85, -58, -94, 14, 80, -13, 69, + 38, 40, -90, -111, 99, -66, -10, -3, -96, -78, -70, 47, 89, -17, -96, -58, -71, 100, 25, + -77, 2, 47, -67, -118, -105, -50, 56, 12, -107, 8, 7, -118, 22, -122, -89, -87, 106, -81, + 122, 53, -125, 74, 34, -69, -103, 127, 122, -81, 66, -60, -27, -92, 10, -97, 79, 83, 35, + 91, -82, 111, 53, 7, -79, 76, -42, -76, -70, 46, 76, -96, -69, 40, 26, -73, -117, 19, + 82, -102, 41, -98, 12, 25, -106, -5, 54, 119, 63, -58, 124, -62, -48, 36, 80, -57, 125, + -12, -73, 42, 38, -79, -31, -110, -25, -111, -10, -49, 25, -90, -79, 115, 25, 100, -58, -24, + -114, 5, -60, -24, 118, 2, -12, -52, 14, 47, 83, -5, 48, 33, 74, -80, -90, -85, -28, + -76, -36, -66, 16, -106, 122, 87, -46, -83, 54, 70, 54, 103, -6, 90, -27, 15, 82, -73, + -17, -95, 105, 45, -22, 88, -18, -27, 88, -49, 27, -21, -56, -70, 3, -71, 76, 61, -90, + -118, 108, -109, 77, 6, 63, 23, -120, -95, -13, 2, -93, -83, 113, -39, 76, -68, 56, -7, + 40, 34, -2, -119, -12, 62, -90, -94, -58, 82, -30, 65, -66, 116, -11, -7, 22, 11, -31, + -101, 95, 60, 108, 71, -29, -28, -52, -102, 103, -86, -30, 64, 14, -94, 64, 41, -89, -32, + 48, 78, 112, 68, -90, -119, -53, 81, -100, 3, -88, 86, -57, -81, 116, 24, -103, 103, -74, + -10, 104, 127, 82, 105, 11, -72, 41, -46, -85, 43, 120, 16, 38, -13, -61, -73, 116, -95, + -115, -80, 33, -8, -103, -74, -95, 30, -20, 53, 102, 90, -60, 94, 105, 57, -66, -1, -16, + -14, 62, 15, 26, -39, 112, -71, 89, -44, -82, -127, 5, 11, -30, -15, -69, -21, -62, 124, + 80, 95, -28, -123, 98, -57, 124, 64, -78, 86, 82, -94, 16, -107, -78, -93, 115, -85, 85, + -15, 67, 121, -19, -64, -110, 93, 62, -49, 111, -119, -89, -126, -67, 50, -99, -34, -35, -17, + -108, -66, 81, -17, 105, 48, 24, 77, 110, 72, 68, -100, 106, 12, -34, 7, 125, -77, -54, + 58, -88, -104, 0, -56, 63, -42, -37, -83, -72, -126, 84, 40, -74, -64, -60, -100, 68, -85, + 94, -69, 54, -32, 123, 36, 35, -112, 53, -96, 74, 11, -113, -47, 29, -41, 55, -118, -114, + 106, 104, 49, -77, 111, -32, 52, 43, 63, 64, -93, 4, -63, 87, 3, 12, 65, -87, 51, + -98, 85, -86, 124, -27, 67, 97, -114, -82, -121, 6, -47, -15, -57, 71, 89, -91, -85, 55, + 26, -2, 48, -92, -13, -56, -3, -67, 114, -85, -47, 70, -34, -14, 12, 80, 28, -23, 5, + -118, -83, 88, 10, -100, -32, 63, -63, 93, -111, -73, -120, -30, -78, 79, 41, 50, -63, -13, + -22, 25, 0, 53, 6, -53, 105, 119, 107, -37, -1, -65, 8, 99, -6, 78, 99, 47, -105, + 72, 67, -99, -100, 103, -50, 58, 53, 105, -88, 92, 95, 61, 115, -38, -58, -96, 37, 62, + -34, -94, 57, 122, 46, -69, 85, -46, 126, -110, 33, -53, 91, 117, -14, -39, 25, 67, 121, + -23, 95, 96, 32, -55, 35, 65, 116, 90, -92, -103, 66, -36, -64, 61, 87, -112, -18, -36, + 30, -127, -95, -24, -105, -45, -36, 126, -62, -60, -25, -3, 58, 76, -74, -20, -28, 68, 8, + -61, 19, 110, 29, -122, 66, -107, 27, 24, 56, -72, -67, 32, -99, -15, 88, -7, -4, -27, + 26, 59, 101, 67, -29, -60, -44, -26, 76, -62, 89, 57, 81, -116, -53, 30, 26, 90, 96, + -89, -21, -3, 56, -19, 5, -28, 77, 75, -69, -58, 65, -78, -63, -29, 74, 21, -107, 83, + 8, -105, -74, 45, 38, -103, 103, -116, 97, -112, -117, 90, 70, 31, 110, -68, -80, -75, -25, + 120, 20, -107, -12, -108, 12, -24, 124, 41, -100, 4, 34, -5, -51, 58, 7, -59, -100, 55, + 74, -88, -118, 45, 83, -92, -93, 93, 26, -24, 43, -27, -51, 35, 100, -38, 25, 92, -100, + -9, -81, -94, 60, 118, -88, 49, -58, 12, 35, 18, -83, 76, -18, -119, 37, 90, 46, 68, + -71, 68, -3, -75, 25, 19, -72, 26, -88, 59, 53, -115, 21, 101, 68, 75, -90, -31, -46, + 97, -22, 105, 69, 105, -33, 38, 0, -105, 98, -58, -4, 120, 28, 3, -29, -52, -99, -20, + -62, -65, 47, -9, -73, -17, -16, -107, 42, 94, 79, 59, 68, -116, 67, -32, -103, 64, -114, + 90, 0, 33, 7, 61, 76, -37, -41, -47, 63, -35, 10, -108, 3, 11, -105, -96, -89, -114, + 43, 89, -59, -5, 8, -13, 63, 17, -28, 86, 58, -36, -92, 13, -118, 89, -55, 116, 34, + -48, -43, 50, -64, 70, 97, -38, 23, 12, 36, -26, -108, 123, -30, 52, -35, 71, -87, 65, + -104, -113, -90, -24, 117, -94, -30, 10, 77, 16, 34, 104, -39, -112, -35, 42, 109, -93, -22, + 7, -70, -63, 121, -24, 9, 110, 78, -74, -14, -5, 90, 125, 43, 39, 104, 120, 103, -52, + 107, -51, -73, -30, 122, -50, 126, 78, 107, 103, 98, -82, 54, -57, -60, 105, -72, 63, -118, + 111, 41, -70, -54, -24, 2, -124, 19, 49, 33, -27, 41, -53, -7, -109, -120, 104, 78, 64, + -57, 53, -15, -27, -126, -67, -115, -5, 47, 2, 4, -123, -96, 38, 39, 72, 26, -71, 42, + 68, -75, -13, 99, -112, 8, -5, 116, -110, 56, 41, 12, -86, 37, 74, 50, 44, 58, 69, + -8, 100, -98, -36, 15, 122, -28, 60, 24, 23, -83, -35, -63, -92, 65, -89, 95, 10, 80, + -127, -45, 119, 121, -84, -127, -14, 16, -105, 37, -107, 65, -96, -79, 78, -125, 30, 17, -106, + -54, -104, 78, 65, -88, 54, 39, -29, -36, 79, 23, -116, -83, -118, 50, -29, 98, -76, -19, + 49, -63, 15, -110, -112, 63, 70, 67, -73, 43, 95, -47, 92, 28, -82, -116, 50, 31, 55, + -82, -120, 101, 46, 24, 117, -24, -20, -126, 37, 13, 97, -105, -90, 22, -126, 115, -48, 67, + 52, 32, 13, -37, -125, 75, -40, 119, 78, 101, -100, 94, 120, -101, -7, -94, -69, -124, -41, + 38, -18, 86, 88, -32, 121, -77, -1, -92, 62, -32, -69, 50, 59, -88, -115, -121, -49, 26, + 2, 73, 119, 93, -112, 88, 48, 106, -17, -123, 38, -111, 8, 3, -112, 28, -107, 81, -112, + -90, -47, -35, -29, -20, 117, -93, -76, 96, -51, 81, -92, -28, 17, -28, -28, 37, -31, -61, + -103, 10, 53, -61, 77, 64, 70, -98, -83, 55, 107, -115, 37, 108, -56, 87, -77, 95, 35, + -93, 93, -84, 2, 61, -23, -51, -19, -34, 127, 120, 18, 31, -57, -8, 57, 70, 116, 19, + 30, -115, -89, 55, 1, -78, 91, 29, 108, 74, 39, -126, 70, 0, -67, 61, 7, 64, 7, + 58, -118, -95, -81, -66, -89, 40, -95, -53, -19, -97, -53, 39, 48, 120, 117, -112, -62, -55, + -95, -124, -123, -96, -78, -6, -11, -45, -64, 33, -51, -116, 15, 21, 22, -113, 114, -92, -23, + -90, -20, -94, -121, 83, 56, 53, -97, -121, -99, -60, 32, -119, 23, 27, 42, 67, -36, -29, + 124, 127, -113, -16, 29, -51, -111, -3, -42, -7, 49, -16, 7, 88, 109, -10, 27, 10, -100, + -107, -59, 23, -75, 18, -75, 3, 24, 78, 26, -13, 76, 76, -21, 4, 88, -86, -31, 91, + -66, 24, 99, 102, 117, 36, -78, 49, -119, -27, 11, 55, 48, 41, -41, -111, -33, -106, 14, + 95, 4, 110, 125, 35, -14, 53, 123, -92, -30, 125, -109, -75, -61, -33, 12, -76, 37, -49, + 101, -24, 89, -10, -102, 89, 57, -11, -17, -24, -87, 7, 109, 31, 40, -100, 88, 123, -34, + 101, -80, -53, -115, -104, -126, -66, -23, 32, -66, 26, -102, -48, 102, 82, -114, 57, 3, 94, + 91, 124, 82, 103, -66, 111, -117, 69, -72, 90, -62, -27, -90, -49, 86, -46, 28, 99, -61, + -26, 16, 54, 49, 41, -121, -116, -29, 17, -98, -80, -46, 51, 20, -53, -52, -105, 76, 105, + -16, 59, -70, -51, -106, 12, 120, -111, 14, 36, -25, 58, 17, -5, 110, 97, 74, -100, -64, + 75, 66, -62, 21, -72, 29, 74, -5, -22, -73, 35, 54, -48, 46, 45, -97, 57, -29, -112, + 21, -36, -85, -96, 56, 16, 64, -110, -99, -12, -29, -13, -53, -1, 122, 96, -71, -111, 33, + -79, -105, 79, -21, -93, 59, -84, 86, 21, 89, 85, 17, 8, 106, -38, 126, 5, -43, 85, + 36, 34, 30, -52, 104, -65, 27, 108, -22, 70, -108, 20, 11, 28, 51, -110, -94, -115, -94, + -85, 122, -80, -94, -4, -92, 46, 52, -11, -42, 27, 13, -111, -74, 108, -55, 102, 51, 36, + 124, 107, -28, -77, -57, 77, -12, 56, -89, -66, -92, 97, 101, -27, 82, 81, 60, -83, 47, + -73, 85, -97, 82, 5, 30, 77, 2, -82, -104, -42, 58, 81, 122, -33, -113, -84, 34, 98, + -11, -21, -40, -62, 72, -113, -84, -46, -76, -93, -127, -57, -60, -80, -73, -99, 74, -66, 49, + -67, -90, 125, 38, -126, -1, -118, 44, 21, -36, -61, 15, -35, -50, 66, 87, 124, -20, 51, + 68, -121, -43, 113, -98, -63, -93, -2, -125, 109, -113, 41, -109, 28, -62, 113, -42, -14, -48, + -53, 48, -15, -75, -106, 109, -119, 38, 40, -86, -29, -5, 15, -98, -16, 69, -14, -5, -11, + -48, 78, 75, -83, -54, 116, -81, -53, -47, -28, -90, 92, -41, 126, -121, -24, -116, 0, -96, + -18, -79, 98, 79, 72, -47, -12, -20, -113, 89, 12, -123, 108, 115, 9, 109, 19, 64, 117, + 95, -112, -122, -34, 89, 126, 85, 31, 22, 88, 13, 9, -61, -58, 69, 4, 70, -108, 65, + -64, -114, 10, 69, 17, -36, 109, 68, -105, 37, 75, 66, 36, -121, 74, -82, -82, 45, 25, + -67, 116, 89, 39, 0, -18, 66, -16, 37, -95, -34, 80, 28, 72, 83, 126, 79, 64, 18, + -38, -7, 79, 57, 5, 65, -36, 35, -61, -89, 99, -18, -111, 22, -20, 37, 83, -7, 109, + -19, -67, -89, -111, -68, 114, -47, 80, -8, -126, -63, -23, 50, 114, -38, 25, 114, -64, 90, + 12, 81, 109, -11, -95, 5, 17, 0, -27, -89, -86, 25, -55, -40, -47, -8, 92, 89, -73, + -108, -35, -67, -103, 119, 77, 3, 31, 24, 113, 11, -121, -37, 35, -21, -55, 3, 68, 45, + 42, -75, 64, 8, -115, 101, 82, 30, 8, -75, -72, -77, 47, 25, 12, 35, 60, -53, -71, + -124, 49, 85, 116, 39, 84, -45, 123, -6, -103, 102, -34, -4, -44, -102, -92, 32, 31, -79, + -71, 89, -62, 56, 64, 122, -89, -50, -42, 2, 9, -32, 17, 124, 6, -102, -60, -54, 52, + 80, 3, -56, -89, 56, -10, 42, -98, 63, -101, 52, -100, -114, 49, 107, -126, -35, 111, 70, + 7, 114, 112, -40, -8, 25, 55, -64, 78, -98, -81, -7, 80, -116, 99, 26, 6, 75, 11, + -2, 37, -8, 69, -31, -89, -45, 77, -4, 84, 52, -126, -52, -102, -29, 105, -109, 113, 58, + -62, -25, -99, 2, -45, -105, -17, 126, 16, -72, -40, -106, 19, 102, -117, -14, -102, -50, 35, + 108, 70, 65, -58, -80, -82, 1, -94, 11, -122, 52, -5, -36, -43, -21, 126, -31, -108, 57, + -17, 70, 60, 81, -54, -92, 34, 59, -54, 92, 114, -32, -83, 72, -71, 97, -99, -63, 8, + 89, 123, 8, -5, -32, 87, -12, 61, -25, -98, -39, -86, -101, -26, 115, 41, 122, 95, -81, + -100, 123, -109, 36, 63, 47, -98, 53, -36, -10, -21, -97, -114, 19, 84, -32, 98, -99, 122, + -127, -52, -44, 40, -39, 76, 42, -82, 9, 103, -40, 87, 102, 25, -13, 87, 86, 88, 11, + -113, 10, 115, 84, 4, 27, -14, 55, 74, 104, -99, -113, -98, -125, -122, -28, 70, -74, -81, + 86, 45, -115, 51, -10, -46, 115, -83, 33, -81, -95, -57, 7, -65, 21, 76, -92, 59, 14, + 28, 100, 92, 23, -63, -20, -126, 112, -109, 91, 108, -63, 16, 22, 77, -21, 87, 21, -60, + 113, 32, -121, -22, -75, 87, -95, 79, 44, -5, -15, 70, 92, -10, -104, -27, -87, -119, 51, + -41, -10, -34, 124, -94, 33, -85, 110, 7, 8, 118, 50, -32, 99, 9, -23, -106, 17, -84, + 102, -80, -97, 94, -47, 101, -122, -125, 117, -56, 104, -114, -12, 89, 32, -66, 99, -34, 88, + -66, -9, 70, 65, 101, -7, 49, -115, -66, -11, -91, -15, -53, 44, -64, -43, -110, -30, 80, + 38, -81, 53, -43, 10, -108, -25, -74, -22, -118, 119, -96, -8, 29, 15, -116, 23, 78, -13, + -116, 77, 59, 24, -46, -85, 71, -31, 49, -7, -8, -64, 121, -28, -65, -109, 106, 53, 104, + -30, 20, -47, -105, 43, 81, -45, -31, -30, -110, 71, -49, 26, 6, -127, -85, 107, -42, 8, + 93, 3, -73, -125, 45, -65, 84, -88, 8, 15, -66, 125, 40, 49, 124, -5, -122, 42, -26, + -114, 7, -60, -68, -32, -48, -23, 115, 82, 96, -55, 98, -55, -50, -22, 19, -16, -62, 89, + -99, -4, -25, -98, -105, 30, 122, 12, 111, 116, 42, 35, 55, -117, 101, 2, 41, -31, 119, + 66, -85, -23, 16, -101, 45, -34, 60, -5, 46, -32, 22, 78, 1, 22, -54, 94, -72, 85, + 97, -67, 22, -13, 107, -58, -80, -76, -29, 101, 23, -33, -7, 93, 51, -4, 17, -31, -45, + -113, -35, -11, -18, 100, -84, 122, -88, -17, 89, -59, 69, 99, -80, 93, -21, 7, -13, -6, + -78, -1, 118, -55, 34, -103, 102, -115, -65, -37, -46, -73, -64, -113, -28, -33, 109, -106, -14, + 67, -83, -1, 118, 37, 63, -3, 60, 14, 78, -103, -78, 1, -27, 72, -122, -13, -117, -95, + 4, -71, 14, 30, 108, 15, 68, 77, -50, -32, -124, -61, 68, -99, -125, 99, -52, 122, 120, + 44, 105, 61, 61, -125, -41, -83, 68, -112, 97, 72, -51, 9, 15, 88, 1, 69, -90, 124, + -92, 25, 71, 78, 76, -37, -97, -88, -26, 38, -13, 27, 24, 105, 102, -123, 93, 10, 99, + -50, 63, -119, 88, 61, -58, 65, 56, -76, 68, -41, 90, 94, -77, -18, 116, 96, -38, 39, + -25, -116, 122, -16, 36, 0, -22, -70, 2, 7, -3, -100, 54, 82, -47, -88, -67, 54, 119, + -107, 122, -21, 73, 118, 58, 97, 28, 33, -7, 21, -49, -50, -26, -90, -79, -112, 115, 5, + 72, -56, -56, 66, -62, 39, -80, 100, 122, -71, -116, 86, 34, -116, 74, -15, 41, 45, -115, + -5, 85, 72, 94, -112, 2, 78, -53, 44, 123, 92, 41, 7, 122, -104, -117, 55}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/config_data.h index 695cda54..77577045 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_INT4_OUT_CH 7 #define KERNEL1X1_INT4_IN_CH 19 +#define KERNEL1X1_INT4_OUT_CH 7 #define KERNEL1X1_INT4_INPUT_W 7 #define KERNEL1X1_INT4_INPUT_H 5 -#define KERNEL1X1_INT4_DST_SIZE 490 -#define KERNEL1X1_INT4_INPUT_SIZE 665 -#define KERNEL1X1_INT4_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_INT4_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_INT4_INPUT_BATCHES 2 #define KERNEL1X1_INT4_FILTER_X 1 #define KERNEL1X1_INT4_FILTER_Y 1 +#define KERNEL1X1_INT4_PADDING VALID #define KERNEL1X1_INT4_STRIDE_X 1 #define KERNEL1X1_INT4_STRIDE_Y 1 -#define KERNEL1X1_INT4_PAD_X 0 -#define KERNEL1X1_INT4_PAD_Y 0 -#define KERNEL1X1_INT4_OUTPUT_W 7 +#define KERNEL1X1_INT4_DILATION_X 1 +#define KERNEL1X1_INT4_DILATION_Y 1 +#define KERNEL1X1_INT4_BATCH_SIZE 1 +#define KERNEL1X1_INT4_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_INT4_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_INT4_INPUT_BATCHES 1 +#define KERNEL1X1_INT4_DST_SIZE 245 #define KERNEL1X1_INT4_OUTPUT_H 5 +#define KERNEL1X1_INT4_OUTPUT_W 7 #define KERNEL1X1_INT4_INPUT_OFFSET 128 #define KERNEL1X1_INT4_OUTPUT_OFFSET 0 -#define KERNEL1X1_INT4_DILATION_X 1 -#define KERNEL1X1_INT4_DILATION_Y 1 +#define KERNEL1X1_INT4_PAD_X 0 +#define KERNEL1X1_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input.h new file mode 100644 index 00000000..011a5665 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input.h @@ -0,0 +1,41 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_input[665] = { + 4, 107, -123, 105, 30, 86, 43, -6, -70, -114, -35, -112, 25, 78, 102, -45, -64, -121, 8, + 30, 1, -13, -76, 123, -63, -93, 59, -127, -123, 29, -127, 75, 33, -5, 105, 74, 78, -112, + 40, -51, -17, 62, 99, 73, -12, -29, -78, -14, 47, 6, 115, -121, 70, -28, 24, -101, 114, + -97, -34, -59, 53, 39, 61, 53, -79, 69, 10, -36, -115, 96, 17, 83, -65, -56, -34, 20, + -75, 85, 113, 4, -25, 92, -102, 48, 23, 42, 108, 60, -10, 56, -97, -125, -112, 67, 43, + 65, 19, -90, 78, 97, -46, -98, 51, 86, -118, -61, 120, 71, 43, 54, -87, -7, -120, 31, + -93, 125, -89, -27, 90, 18, -13, -88, 41, 73, -42, -63, 6, 28, -122, -29, -49, -46, 59, + 0, 10, 10, -66, -38, 100, 57, -40, 44, -83, -12, -100, 54, 112, 55, -31, 14, 114, 27, + 65, 121, -111, -72, 105, 10, 111, 111, -16, 82, 19, -53, -104, -38, 2, 102, 28, 17, -13, + 23, -58, 43, 83, -116, -92, -116, 76, -41, -40, 36, -25, -13, 71, 87, 66, 79, -30, -98, + -93, -108, 88, 120, 75, 114, 100, 95, 67, -65, -29, -19, -50, 21, -60, 13, 93, 51, -83, + -34, -57, -27, 37, -67, 78, -110, 104, 115, -43, 56, -53, 51, -91, 88, -25, -97, 39, -13, + -71, 99, 109, 43, 32, 107, -120, 20, 110, -90, 22, -63, 4, -32, 22, 107, 68, 8, -102, + 58, 82, -7, 60, -13, 39, 106, -126, 116, -88, -50, 109, 73, -28, -77, 12, -58, 28, 60, + 58, 119, 103, -114, -30, 108, -65, -50, 57, 56, -115, -70, 27, 80, 34, 119, 18, 73, 65, + 82, 37, 71, 59, -4, -47, 89, -77, 119, -37, 57, -90, -15, -31, 103, 82, 102, 76, 114, + 49, -31, 112, -6, 66, 96, 49, 26, -118, -103, 40, 121, 93, -83, -9, 126, -52, 41, 100, + 75, 108, 24, 53, -35, 29, 83, -99, 18, 116, -114, -88, -118, 58, -13, -117, 29, 62, -66, + -95, -121, 107, 26, -99, -1, -31, -27, 75, -108, -73, 60, -126, -116, 62, 105, -7, -54, -23, + -51, -85, -98, 61, -124, -126, -69, -98, -12, 57, -95, 59, -77, -6, -76, -57, 71, 16, -120, + 88, 55, -42, -55, 89, 104, -19, 78, 25, -23, -59, -94, 119, 26, 99, 118, 51, -127, -66, + 23, 122, 81, -97, 54, 77, -93, -74, -76, -88, 6, -50, -32, 94, -87, 15, 6, 0, 100, + -103, 120, -41, -86, 109, 24, -38, -65, 62, -39, -76, -25, 109, 89, 71, -5, 109, 70, -3, + 113, -15, -61, 125, -98, -48, 119, 112, 82, -56, -16, 16, 15, -87, -39, -86, -69, 15, -98, + 72, -115, 41, -87, 19, 33, 127, -1, 119, 63, -19, -73, 67, -39, -89, 68, 127, -121, -93, + -100, -101, 7, 30, 74, 82, 41, 23, -16, -1, -120, 92, -16, 22, 72, 49, -109, -101, 56, + -114, -126, -43, 37, -113, 54, 91, 121, -6, -5, -26, 40, 125, 83, 117, 55, -50, -105, -43, + -4, 15, 105, 66, 81, 1, 3, 91, 87, -20, 120, 48, -48, 6, 107, 12, 6, 45, 103, + 76, 0, -74, -66, -31, 105, 18, -108, -103, -66, 125, -45, 43, -118, -109, -37, -18, -32, 111, + -48, -97, -59, 110, 43, -82, 86, -122, 45, -6, 56, 0, 80, -18, -16, 102, -26, 121, -53, + 58, -90, 54, 75, -19, -84, 10, -73, -79, -41, 8, -88, -39, -106, 59, 124, 115, 30, 22, + -124, -8, -124, 5, -120, -74, -79, 18, -9, 25, -40, -45, 19, 98, -63, 74, 65, -18, 28, + -2, 51, -46, -54, -16, 11, 8, 27, -13, -34, -33, -100, -73, -4, -60, -49, 103, 12, -79, + 1, 113, -67, -86, -42, 109, 98, 39, 87, -56, -33, -123, 24, -127, 39, 8, 33, 45, -28, + 50, 100, -45, 56, -21, 107, -111, -3, -69, -77, -112, 50, 68, -42, 65, 73, 111, 53, -8}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_bias.h new file mode 100644 index 00000000..dd5e2fb2 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_input_bias[7] = {121, -25, 126, 100, 121, 8, 58}; + +const int32_t *const kernel1x1_int4_biases = kernel1x1_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_weights.h new file mode 100644 index 00000000..8c3365e2 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/input_weights.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_input_weights[67] = { + 72, 76, 28, 28, 13, 130, 221, 46, 241, 143, 139, 196, 253, 187, 51, 145, 21, 20, 181, 100, 238, 237, 243, + 94, 226, 67, 177, 10, 10, 2, 2, 116, 219, 191, 65, 102, 223, 204, 96, 227, 211, 245, 244, 199, 46, 122, + 189, 37, 174, 174, 124, 81, 63, 247, 68, 37, 248, 124, 120, 206, 129, 164, 42, 78, 134, 26, 5}; + +const int8_t *const kernel1x1_int4_weights = kernel1x1_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output.h new file mode 100644 index 00000000..c4dabc13 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output.h @@ -0,0 +1,19 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_output[245] = { + -13, -12, 6, 30, 13, 2, 8, -19, -10, -3, 0, 12, -1, -22, -29, -19, -9, 10, 9, 1, -11, -21, -11, + 1, 22, 9, 1, 3, -23, -14, 4, -3, 15, -2, -8, -40, -19, -4, 11, 6, 3, 5, -14, -11, 3, 7, + 24, 0, 0, -30, -12, 2, 17, 11, 1, -4, -22, -12, 3, 2, 24, 3, -16, -18, -4, -3, 3, 4, 3, + -14, -25, -9, -15, 7, 9, 0, -17, -17, -13, -4, -3, 4, 1, -8, -11, -14, -11, 2, 16, -1, -15, -40, + -18, -2, 16, 19, 3, 4, -30, -18, -1, 10, 17, 0, -12, -30, -15, -8, 3, 24, 2, -6, -41, -19, -12, + 8, 16, 0, -20, -25, -9, 12, 18, 8, 0, 0, -22, -8, -20, 2, 8, 3, -9, -17, 4, -1, 2, -5, + 3, -2, -28, -21, 0, 19, 14, 3, -18, -24, -16, -3, 5, 24, -2, -9, -26, -12, -2, 15, 9, 0, 0, + -30, -15, 7, 7, 7, 4, -4, -37, -18, -4, 7, 19, 4, -29, -34, -11, -10, 21, 8, 3, -4, -26, -7, + -1, 25, 4, 6, -9, -34, -15, -10, -2, 19, 2, -9, -21, -15, -1, 1, 19, 0, -12, -27, -1, -3, 9, + 14, 2, -6, -20, -7, -13, 0, 11, 1, -16, -6, 0, -4, 0, 11, 3, -5, -14, -10, 0, 2, 10, 1, + -11, -16, -18, 1, 8, 14, 1, -8, -21, -13, -8, 11, -3, 0, -6}; + +const int8_t *const kernel1x1_int4_output_ref = kernel1x1_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_multiplier.h new file mode 100644 index 00000000..37054530 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_multiplier.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_output_multiplier[7] = + {1119784122, 1939366326, 1548618068, 1984636170, 1586547161, 1437556486, 1155405256}; + +const int32_t *const kernel1x1_int4_output_mult = kernel1x1_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_shift.h new file mode 100644 index 00000000..e4719c40 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_output_shift[7] = {-6, -8, -7, -7, -7, -9, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/config_data.h index f047db40..d5406418 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_INT4_2_OUT_CH 60 #define KERNEL1X1_INT4_2_IN_CH 60 -#define KERNEL1X1_INT4_2_INPUT_W 60 +#define KERNEL1X1_INT4_2_OUT_CH 60 +#define KERNEL1X1_INT4_2_INPUT_W 1 #define KERNEL1X1_INT4_2_INPUT_H 1 -#define KERNEL1X1_INT4_2_DST_SIZE 3600 -#define KERNEL1X1_INT4_2_INPUT_SIZE 3600 -#define KERNEL1X1_INT4_2_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_INT4_2_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_INT4_2_INPUT_BATCHES 1 #define KERNEL1X1_INT4_2_FILTER_X 1 #define KERNEL1X1_INT4_2_FILTER_Y 1 +#define KERNEL1X1_INT4_2_PADDING VALID #define KERNEL1X1_INT4_2_STRIDE_X 1 #define KERNEL1X1_INT4_2_STRIDE_Y 1 -#define KERNEL1X1_INT4_2_PAD_X 0 -#define KERNEL1X1_INT4_2_PAD_Y 0 -#define KERNEL1X1_INT4_2_OUTPUT_W 60 -#define KERNEL1X1_INT4_2_OUTPUT_H 1 -#define KERNEL1X1_INT4_2_INPUT_OFFSET 0 -#define KERNEL1X1_INT4_2_OUTPUT_OFFSET 0 #define KERNEL1X1_INT4_2_DILATION_X 1 #define KERNEL1X1_INT4_2_DILATION_Y 1 +#define KERNEL1X1_INT4_2_BATCH_SIZE 1 +#define KERNEL1X1_INT4_2_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_INT4_2_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_INT4_2_INPUT_BATCHES 1 +#define KERNEL1X1_INT4_2_DST_SIZE 60 +#define KERNEL1X1_INT4_2_OUTPUT_H 1 +#define KERNEL1X1_INT4_2_OUTPUT_W 1 +#define KERNEL1X1_INT4_2_INPUT_OFFSET 128 +#define KERNEL1X1_INT4_2_OUTPUT_OFFSET 0 +#define KERNEL1X1_INT4_2_PAD_X 0 +#define KERNEL1X1_INT4_2_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input.h new file mode 100644 index 00000000..3f312f70 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_2_input[60] = { + -38, 41, 120, 73, 36, 95, 16, 123, 59, -38, 19, 35, -21, 98, 94, 94, -39, 89, 16, -57, + 15, 24, 98, -21, -82, 50, 113, 85, -73, -100, -125, -81, -38, 107, 53, -62, 82, 54, -74, 68, + -4, 126, 54, -39, 111, 4, 27, -90, -102, 124, -30, 101, 73, -109, -78, -10, -19, 69, 52, 113}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_bias.h new file mode 100644 index 00000000..767b5005 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_bias.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_2_input_bias[60] = { + 4, 71, 101, 127, -114, 120, 53, 34, 123, 121, -22, 105, 6, 22, -45, -105, 65, 4, -113, -104, + 57, 92, 101, -117, 27, 57, 63, 18, -85, -78, 0, -83, -27, -39, -25, -97, -86, -94, -70, -71, + -10, -123, 38, 115, 0, 119, 95, 120, 7, 7, -1, -76, -30, -86, 105, 39, -76, 23, 21, -76}; + +const int32_t *const kernel1x1_int4_2_biases = kernel1x1_int4_2_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_weights.h new file mode 100644 index 00000000..9eac02b7 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/input_weights.h @@ -0,0 +1,87 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_2_input_weights[1800] = { + 27, 234, 42, 218, 161, 155, 104, 40, 80, 91, 120, 189, 238, 2, 61, 29, 182, 155, 94, 191, 158, 158, 71, + 139, 233, 185, 217, 97, 60, 7, 239, 179, 67, 253, 60, 65, 85, 106, 47, 46, 162, 199, 122, 165, 154, 39, + 205, 43, 26, 137, 55, 242, 220, 131, 68, 145, 167, 182, 62, 61, 116, 21, 174, 166, 147, 157, 208, 99, 46, + 207, 31, 223, 109, 118, 145, 24, 56, 211, 97, 234, 37, 90, 240, 50, 191, 130, 134, 134, 100, 191, 77, 187, + 25, 26, 199, 165, 97, 150, 19, 62, 102, 237, 101, 108, 126, 214, 226, 120, 70, 65, 187, 205, 82, 45, 241, + 238, 23, 43, 66, 194, 223, 166, 39, 166, 127, 122, 174, 74, 129, 68, 250, 107, 12, 255, 236, 225, 38, 133, + 239, 129, 127, 11, 148, 10, 196, 201, 77, 158, 103, 173, 231, 227, 179, 187, 73, 159, 82, 18, 138, 170, 137, + 245, 126, 18, 159, 223, 45, 82, 124, 108, 195, 84, 63, 145, 134, 245, 241, 85, 176, 237, 242, 161, 22, 167, + 150, 53, 221, 64, 148, 137, 74, 147, 83, 232, 157, 67, 223, 171, 14, 179, 114, 181, 141, 199, 237, 185, 196, + 174, 127, 34, 95, 199, 238, 116, 246, 248, 23, 177, 230, 17, 240, 209, 151, 249, 169, 195, 148, 76, 45, 97, + 7, 187, 8, 14, 216, 54, 76, 116, 225, 54, 50, 199, 47, 230, 8, 120, 24, 159, 62, 169, 5, 176, 249, + 8, 51, 63, 214, 116, 5, 57, 26, 227, 87, 193, 10, 43, 103, 195, 31, 158, 201, 139, 28, 186, 179, 98, + 204, 244, 136, 164, 58, 85, 65, 40, 72, 37, 18, 231, 44, 229, 232, 116, 214, 14, 57, 180, 75, 189, 195, + 59, 90, 100, 162, 4, 179, 170, 231, 168, 28, 84, 160, 202, 73, 202, 49, 79, 70, 77, 145, 244, 181, 59, + 227, 199, 239, 219, 62, 15, 72, 29, 181, 240, 201, 125, 17, 138, 37, 139, 239, 46, 26, 0, 112, 53, 26, + 77, 79, 210, 117, 249, 59, 118, 235, 8, 58, 62, 18, 47, 116, 93, 19, 226, 58, 213, 193, 68, 252, 231, + 224, 175, 189, 53, 9, 221, 3, 154, 187, 129, 32, 100, 155, 182, 127, 121, 204, 110, 232, 74, 27, 22, 168, + 195, 75, 203, 72, 56, 13, 187, 218, 22, 44, 20, 104, 157, 3, 37, 226, 48, 21, 201, 222, 155, 21, 60, + 47, 244, 58, 17, 174, 212, 186, 44, 242, 19, 239, 111, 83, 134, 161, 160, 24, 65, 0, 145, 216, 100, 225, + 202, 57, 152, 105, 134, 79, 165, 99, 36, 156, 240, 154, 10, 201, 235, 91, 208, 79, 22, 107, 102, 95, 154, + 5, 130, 68, 173, 124, 178, 244, 100, 153, 169, 27, 161, 235, 52, 100, 127, 193, 0, 218, 214, 29, 178, 12, + 11, 250, 173, 164, 183, 58, 217, 89, 204, 83, 219, 228, 200, 133, 190, 212, 122, 20, 245, 42, 181, 102, 157, + 10, 202, 155, 253, 31, 231, 202, 143, 71, 17, 234, 85, 21, 220, 105, 230, 180, 165, 47, 134, 66, 205, 96, + 192, 228, 249, 9, 111, 164, 105, 242, 106, 194, 121, 204, 5, 194, 159, 49, 232, 246, 78, 227, 173, 139, 160, + 195, 179, 245, 17, 246, 250, 2, 144, 215, 79, 120, 141, 109, 36, 146, 88, 215, 57, 246, 26, 228, 28, 201, + 67, 49, 243, 28, 184, 157, 245, 224, 196, 15, 31, 128, 93, 21, 230, 64, 147, 37, 22, 245, 82, 87, 105, + 106, 160, 130, 78, 55, 25, 130, 40, 57, 8, 245, 8, 71, 154, 171, 171, 70, 26, 81, 11, 13, 121, 21, + 91, 33, 106, 99, 218, 199, 192, 114, 34, 71, 105, 30, 157, 180, 190, 211, 78, 208, 192, 228, 175, 108, 108, + 230, 228, 211, 58, 55, 221, 39, 87, 76, 43, 117, 32, 188, 132, 83, 137, 241, 23, 2, 85, 60, 93, 159, + 242, 23, 93, 217, 73, 68, 93, 214, 153, 6, 203, 42, 123, 124, 202, 238, 168, 178, 242, 120, 128, 255, 193, + 8, 73, 26, 69, 197, 153, 107, 29, 204, 72, 127, 78, 176, 159, 167, 221, 32, 199, 9, 197, 69, 6, 241, + 175, 107, 61, 137, 18, 112, 149, 109, 54, 102, 127, 54, 211, 33, 24, 212, 31, 27, 251, 250, 22, 108, 131, + 81, 21, 6, 226, 251, 149, 98, 121, 191, 209, 20, 6, 131, 32, 39, 145, 73, 108, 147, 82, 71, 111, 38, + 119, 220, 174, 38, 156, 132, 107, 233, 11, 218, 162, 95, 146, 140, 227, 77, 120, 122, 84, 98, 123, 39, 146, + 228, 40, 58, 125, 138, 102, 127, 12, 224, 160, 138, 0, 8, 173, 137, 217, 107, 179, 246, 148, 109, 86, 46, + 117, 131, 74, 67, 190, 194, 21, 254, 4, 133, 46, 207, 252, 19, 77, 166, 254, 214, 255, 91, 12, 68, 89, + 49, 36, 175, 19, 158, 18, 206, 3, 171, 129, 232, 24, 215, 225, 192, 122, 222, 126, 179, 92, 154, 17, 181, + 230, 96, 200, 21, 208, 220, 86, 186, 215, 97, 17, 146, 4, 251, 213, 235, 63, 59, 61, 195, 118, 215, 229, + 118, 81, 18, 15, 181, 186, 255, 30, 89, 235, 175, 19, 189, 5, 171, 94, 37, 3, 99, 191, 208, 47, 73, + 157, 18, 36, 213, 111, 146, 199, 153, 64, 33, 105, 78, 125, 140, 155, 244, 31, 93, 182, 196, 236, 12, 36, + 114, 151, 155, 192, 195, 9, 212, 228, 226, 148, 14, 188, 250, 91, 72, 197, 68, 142, 206, 181, 231, 48, 36, + 0, 18, 65, 108, 29, 244, 225, 43, 194, 235, 230, 99, 118, 183, 30, 71, 227, 193, 53, 229, 198, 223, 18, + 218, 171, 149, 15, 137, 246, 234, 231, 133, 46, 236, 49, 233, 65, 198, 7, 255, 193, 74, 192, 129, 88, 30, + 71, 113, 88, 110, 225, 75, 109, 206, 202, 206, 232, 55, 90, 246, 129, 150, 99, 233, 193, 175, 54, 167, 17, + 180, 219, 227, 248, 142, 41, 216, 61, 173, 250, 103, 203, 240, 30, 67, 15, 151, 169, 185, 89, 116, 237, 241, + 19, 89, 28, 216, 125, 235, 112, 64, 46, 44, 91, 22, 225, 28, 162, 56, 5, 113, 143, 45, 50, 199, 50, + 121, 220, 236, 196, 130, 195, 117, 82, 187, 209, 173, 129, 48, 49, 143, 125, 211, 42, 127, 201, 85, 231, 206, + 215, 228, 136, 75, 39, 178, 189, 43, 13, 42, 1, 247, 52, 138, 108, 153, 84, 92, 104, 244, 194, 65, 42, + 175, 97, 27, 197, 122, 219, 189, 239, 94, 32, 248, 109, 91, 60, 106, 229, 252, 44, 66, 55, 105, 23, 50, + 171, 61, 106, 230, 165, 16, 123, 145, 175, 44, 237, 103, 243, 242, 120, 85, 233, 10, 252, 51, 209, 156, 198, + 140, 42, 110, 135, 35, 169, 21, 45, 102, 174, 249, 160, 27, 45, 31, 209, 6, 165, 244, 34, 177, 136, 138, + 146, 89, 191, 167, 149, 216, 82, 67, 158, 96, 198, 80, 61, 106, 203, 127, 29, 210, 154, 115, 119, 187, 97, + 240, 128, 124, 11, 246, 204, 167, 29, 62, 167, 198, 206, 20, 84, 90, 49, 30, 178, 133, 186, 97, 73, 192, + 67, 211, 92, 230, 127, 156, 115, 199, 188, 237, 72, 76, 251, 253, 66, 173, 107, 8, 245, 214, 181, 81, 4, + 249, 127, 164, 240, 67, 54, 54, 10, 41, 235, 44, 62, 46, 14, 122, 87, 240, 230, 247, 111, 165, 6, 69, + 12, 33, 45, 181, 46, 95, 31, 254, 55, 149, 140, 147, 245, 212, 70, 9, 91, 235, 47, 239, 149, 172, 210, + 44, 227, 107, 249, 5, 125, 14, 181, 117, 162, 232, 63, 111, 6, 163, 250, 44, 162, 252, 24, 34, 32, 59, + 132, 121, 209, 76, 89, 60, 236, 231, 21, 155, 132, 219, 229, 62, 26, 111, 34, 211, 251, 61, 230, 159, 131, + 138, 152, 1, 250, 105, 178, 70, 29, 17, 185, 10, 25, 229, 241, 11, 30, 162, 208, 255, 18, 236, 102, 217, + 155, 104, 20, 167, 156, 32, 185, 25, 212, 145, 212, 186, 88, 207, 74, 180, 227, 255, 196, 151, 130, 166, 143, + 237, 122, 69, 84, 206, 156, 64, 3, 201, 44, 99, 222, 54, 141, 11, 40, 229, 121, 250, 45, 224, 91, 224, + 145, 226, 105, 140, 140, 39, 178, 134, 147, 49, 221, 72, 39, 163, 109, 161, 186, 255, 212, 139, 185, 33, 155, + 252, 84, 96, 191, 36, 250, 96, 164, 127, 63, 249, 110, 41, 158, 128, 84, 23, 20, 103, 15, 155, 241, 163, + 172, 162, 252, 162, 174, 119, 207, 138, 65, 101, 119, 9, 213, 123, 154, 67, 143, 17, 55, 204, 46, 156, 173, + 88, 246, 162, 247, 79, 117, 17, 191, 39, 253, 82, 17, 174, 98, 88, 198, 222, 101, 191, 59, 147, 248, 140, + 188, 31, 222, 99, 10, 166, 70, 255, 1, 233, 69, 173, 182, 222, 12, 11, 38, 229, 148, 57, 170, 184, 187, + 171, 148, 146, 35, 34, 141, 42, 110, 188, 206, 92, 117, 49, 99, 124, 228, 60, 144, 55, 96, 213, 172, 89, + 219, 223, 128, 212, 160, 30, 91, 98, 204, 81, 53, 55, 239, 178, 242, 75, 139, 135, 232, 200, 164, 28, 124, + 143, 121, 16, 105, 129, 23, 110, 98, 178, 117, 98, 54, 34, 22, 49, 55, 63, 202, 86, 132, 206, 104, 225, + 130, 66, 152, 168, 192, 79, 135, 50, 173, 102, 150, 191, 138, 94, 25, 196, 214, 12, 157, 79, 136, 173, 224, + 148, 128, 68, 133, 80, 24, 17, 17, 138, 190, 0, 178, 78, 152, 204, 228, 211, 25, 64, 202, 215, 172, 34, + 24, 203, 6, 96, 39, 226, 4, 84, 189, 19, 225, 40, 99, 169, 214, 228, 50, 181, 139, 24, 11, 232, 114, + 222, 40, 134, 124, 213, 133, 122, 28, 105, 27, 120, 58, 180, 178, 83, 83, 6, 216, 3, 161, 101, 251, 188, + 44, 16, 197, 29, 23, 182, 111, 74, 188, 11, 19, 250, 67, 118, 94, 64, 5, 248, 71, 163, 86, 50, 24, + 55, 100, 240, 234, 167, 194, 131, 184, 92, 42, 192, 248, 125, 96, 204, 117, 36, 182, 125, 203, 165, 249, 93, + 168, 82, 91, 245, 101, 19, 99, 159, 244, 255, 4, 90, 148, 246, 198, 228, 248, 227, 157, 43, 69, 60, 218, + 223, 198, 127, 78, 157, 209, 82, 158, 26, 1, 199, 224, 241, 104, 28, 238, 253, 72, 87, 210, 83, 78, 108, + 232, 243, 247, 55, 73, 7, 83, 43, 167, 1, 148, 174, 200, 233, 238, 23, 255, 2, 146, 248, 162, 177, 127, + 54, 232, 132, 216, 14, 157}; + +const int8_t *const kernel1x1_int4_2_weights = kernel1x1_int4_2_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output.h new file mode 100644 index 00000000..068caae3 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_2_output[60] = { + -31, 1, 10, 4, -14, -22, -14, -7, -1, -48, -89, 8, -12, -104, -84, -16, -128, -13, -34, 12, + -5, -17, -39, -18, 41, 13, -27, -71, -24, 13, -56, 9, -19, -43, -32, -18, -35, 1, -41, -26, + -4, 32, -3, 0, -66, -68, -36, -40, -44, -16, -37, -19, 10, -121, -7, -85, 17, 0, -33, -47}; + +const int8_t *const kernel1x1_int4_2_output_ref = kernel1x1_int4_2_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_multiplier.h new file mode 100644 index 00000000..40af652d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_multiplier.h @@ -0,0 +1,15 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_2_output_multiplier[60] = { + 1192468352, 1632523367, 1899020068, 2119166646, 1696822796, 1207473850, 1454999837, 1139116429, 1334196777, + 1489370668, 1491388529, 1645610578, 1866372815, 1190935052, 1534531922, 1829312630, 1557179892, 1660636671, + 1226864346, 1896267729, 1789128367, 1501766700, 1911779176, 1761193108, 1529637965, 1520545859, 1210812782, + 1282884154, 1701938033, 1563527867, 1984864613, 1475662654, 1238160841, 2123315924, 1277373665, 1311114444, + 1497104426, 1563051843, 1092161854, 1438217298, 1336226143, 1266476483, 1537377028, 1208289702, 1180656283, + 1300961449, 1635589573, 1376683517, 1379548877, 1595130737, 1714532745, 2117860473, 1570653540, 1415576891, + 1082059309, 1369318674, 1352082975, 1567401357, 1631070362, 1181906961}; + +const int32_t *const kernel1x1_int4_2_output_mult = kernel1x1_int4_2_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_shift.h new file mode 100644 index 00000000..20e73a26 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/output_shift.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_2_output_shift[60] = {-8, -7, -8, -9, -9, -7, -8, -7, -9, -7, -6, -8, -8, -6, -6, + -7, -6, -7, -7, -7, -9, -6, -7, -7, -7, -6, -6, -6, -7, -7, + -7, -8, -6, -8, -7, -7, -7, -7, -6, -8, -8, -6, -7, -8, -6, + -7, -7, -7, -6, -7, -7, -7, -8, -6, -7, -6, -7, -8, -7, -6}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_2/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/config_data.h index 9ae1d687..f38b7e45 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_INT4_3_OUT_CH 47 #define KERNEL1X1_INT4_3_IN_CH 18 +#define KERNEL1X1_INT4_3_OUT_CH 47 #define KERNEL1X1_INT4_3_INPUT_W 43 #define KERNEL1X1_INT4_3_INPUT_H 1 -#define KERNEL1X1_INT4_3_DST_SIZE 2021 -#define KERNEL1X1_INT4_3_INPUT_SIZE 774 -#define KERNEL1X1_INT4_3_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_INT4_3_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_INT4_3_INPUT_BATCHES 1 #define KERNEL1X1_INT4_3_FILTER_X 1 #define KERNEL1X1_INT4_3_FILTER_Y 1 +#define KERNEL1X1_INT4_3_PADDING VALID #define KERNEL1X1_INT4_3_STRIDE_X 1 #define KERNEL1X1_INT4_3_STRIDE_Y 1 -#define KERNEL1X1_INT4_3_PAD_X 0 -#define KERNEL1X1_INT4_3_PAD_Y 0 -#define KERNEL1X1_INT4_3_OUTPUT_W 43 -#define KERNEL1X1_INT4_3_OUTPUT_H 1 -#define KERNEL1X1_INT4_3_INPUT_OFFSET 0 -#define KERNEL1X1_INT4_3_OUTPUT_OFFSET 0 #define KERNEL1X1_INT4_3_DILATION_X 1 #define KERNEL1X1_INT4_3_DILATION_Y 1 +#define KERNEL1X1_INT4_3_BATCH_SIZE 1 +#define KERNEL1X1_INT4_3_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_INT4_3_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_INT4_3_INPUT_BATCHES 1 +#define KERNEL1X1_INT4_3_DST_SIZE 2021 +#define KERNEL1X1_INT4_3_OUTPUT_H 1 +#define KERNEL1X1_INT4_3_OUTPUT_W 43 +#define KERNEL1X1_INT4_3_INPUT_OFFSET 128 +#define KERNEL1X1_INT4_3_OUTPUT_OFFSET 0 +#define KERNEL1X1_INT4_3_PAD_X 0 +#define KERNEL1X1_INT4_3_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input.h new file mode 100644 index 00000000..0ed167b6 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input.h @@ -0,0 +1,47 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_3_input[774] = { + -124, 54, -107, -117, -94, 38, 17, -31, 85, -19, -40, -87, 63, 50, 11, 4, -32, 6, 6, + 80, 77, -80, 22, -79, 66, 37, -3, 121, 12, -126, 31, 118, -69, -124, -25, 29, -100, 30, + -15, -94, -34, -116, 52, -81, -123, -34, -79, -14, -17, 38, -77, 47, -80, -17, -86, 71, 77, + -32, -81, 91, -83, 22, -82, 29, -54, 89, -104, 45, 46, -114, 39, -25, 119, -62, -59, 107, + -79, 78, 71, 118, 95, 89, 118, -15, -5, 92, -118, 56, 26, 26, -97, -88, -51, -42, 106, + -121, 18, -83, -102, 4, -97, 113, -86, -18, -13, -122, 40, 29, 73, 1, -82, 21, 127, -22, + 84, -1, -70, 82, -15, 120, 113, -32, 16, -6, 90, 126, 41, 11, -30, 109, -127, -104, -56, + 102, -8, 89, -119, -37, -76, 63, -114, -95, 12, 115, 112, 67, -47, -98, -42, -64, -61, 36, + -82, -5, -117, 63, 74, -57, -93, 39, 125, -51, 105, -22, -91, 65, 64, -107, 35, -126, 66, + 21, -57, 112, -57, -73, 111, 44, -9, 2, -118, 93, 86, -36, 89, -46, -56, -98, 106, 46, + -66, -6, 57, -27, -99, 92, -64, 33, 51, -35, -114, -85, 108, 54, -78, -122, 77, 126, -56, + -11, 65, -3, 63, 70, 2, 54, -96, -63, 11, 112, -84, 27, 107, -16, 70, -45, -83, -115, + 88, 60, -94, 12, -94, 7, 48, 12, 108, -71, 24, 22, 99, 89, 85, -80, 109, -37, -66, + -58, 127, 103, -110, 26, 76, 40, 0, 45, -108, -83, -127, 3, 97, 67, -104, -101, -80, 12, + 80, 19, -113, 125, -125, 39, -51, 58, 50, 69, 6, 8, 104, -114, 116, -66, -104, -12, 51, + -103, 118, -75, 51, -90, -30, 88, 112, -79, -9, 62, -97, -18, 14, -37, 115, 46, 41, -108, + -75, 112, 50, 56, 120, 16, 35, -117, 18, 90, 46, -106, 113, -28, -71, -100, 21, -115, -93, + 78, -63, 104, 38, -17, 118, -14, 54, 68, -64, -55, 20, -63, 67, -92, 89, -78, -83, -117, + -31, 49, -75, 71, 114, -35, -77, 10, 24, 57, 72, 80, -69, -26, -59, -86, -92, -2, -13, + 33, 26, -21, -86, 120, 124, -53, -121, 34, 12, 49, 14, -56, 57, 31, -5, 43, -17, 82, + 66, 95, 127, -37, -84, -106, 53, -100, 5, 112, -32, 67, 41, 37, -121, 49, -75, 81, 90, + 104, -1, 81, 37, -51, -100, 64, -85, 31, 58, 127, -42, -66, 17, 53, -111, -83, 21, -12, + -89, -55, 60, 99, 36, -79, -23, -99, 98, 67, 47, -17, -18, 126, -7, -87, -78, 74, 30, + 83, 82, 27, 85, 62, 104, -38, -109, 86, -99, 32, 111, 10, 14, -53, -55, 13, -88, -73, + -124, -94, -44, 19, -98, 24, -14, -18, 43, -78, 111, -63, 117, 107, -20, 99, -93, -16, 95, + -40, 54, 54, 0, -1, 55, -72, -123, -13, -60, -67, -8, -117, -47, 126, 21, 33, 101, 10, + -50, 24, 55, 117, 17, 34, 93, 17, -3, 114, 75, -73, -9, -54, 63, -29, -50, 119, -48, + -32, 114, -30, 13, -100, 58, -107, -110, -121, -110, -4, 65, 122, -64, 77, -26, 79, -100, 23, + -64, 67, -117, 37, -128, -116, -64, -29, -42, -80, 98, -127, 62, -40, 54, -53, 65, 68, 126, + -59, -102, -55, 14, 15, -53, -9, 119, 23, 86, -46, -21, 46, -27, 109, 107, 36, -66, -59, + -17, 79, 46, -112, 101, -101, 115, 48, -17, 111, 49, 27, -51, -86, 14, 67, -110, 13, -55, + 118, 36, 23, 91, 16, 57, 115, -53, 3, 9, 65, 63, -12, 76, -75, 85, 71, 73, 39, + -97, -89, 105, 79, 90, 36, -80, -17, -108, 25, 54, -60, 1, -101, -4, 0, 8, -87, 100, + -123, 120, 115, 7, 83, 27, 52, -19, -95, 97, 43, -8, -127, 94, 63, 10, -79, 94, -22, + -68, 44, 51, 32, 51, -95, -65, -75, 1, -8, 62, 15, -92, 89, 39, 36, 125, -68, 40, + -33, 34, -106, 52, 72, 9, 24, 98, 40, -108, -56, 0, 101, 25, -13, -66, -67, -120, 4, + 33, 62, 120, -1, 6, -50, -70, 66, 45, 51, 47, -72, -88, 127, 102, 89, -112, 112, -40, + -67, 44, 71, -30, 113, 102, -34, -77, 115, 85, 121, -48, -77, 63, -52, -4, -100, -15, 10, + 19, 55, 120, 87, 109, 65, 91, 65, -118, -120, 42, -89, -99, 38, 32, 70, 33, 17, -4, + 86, -22, -68, 99, -13, -99, 54, 116, 2, 22, 40, 59, 104, 121, -28, -117, 62, -79, 55, + 44, -28, 16, -66, -112, 25, 48, 54, 54, 33, 48, 125, 64, -36}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_bias.h new file mode 100644 index 00000000..c76536f5 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_bias.h @@ -0,0 +1,11 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_3_input_bias[47] = {118, -62, 8, -2, 114, 100, -25, 44, 71, 3, 12, 112, + 93, 26, 71, -99, 118, -126, 53, -92, 11, 11, -67, -13, + 119, 62, -103, 99, 32, 19, -117, -26, 3, -63, 127, 97, + 84, 108, 23, 49, 111, -117, 53, -103, -83, -41, -126}; + +const int32_t *const kernel1x1_int4_3_biases = kernel1x1_int4_3_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_weights.h new file mode 100644 index 00000000..51b747d8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/input_weights.h @@ -0,0 +1,27 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_3_input_weights[423] = { + 254, 2, 206, 120, 2, 173, 243, 216, 27, 227, 253, 89, 80, 74, 148, 162, 207, 3, 136, 74, 159, 249, 243, + 140, 148, 49, 121, 208, 178, 106, 70, 23, 5, 0, 163, 39, 153, 236, 15, 200, 70, 181, 44, 218, 153, 226, + 139, 228, 146, 16, 6, 84, 187, 202, 120, 11, 188, 189, 96, 14, 163, 132, 184, 130, 183, 159, 158, 10, 253, + 37, 165, 142, 90, 66, 115, 52, 173, 180, 229, 21, 238, 160, 50, 214, 100, 43, 138, 156, 159, 173, 95, 3, + 8, 80, 183, 223, 41, 234, 243, 107, 155, 147, 208, 143, 156, 33, 250, 213, 206, 89, 13, 167, 51, 31, 189, + 236, 140, 249, 30, 198, 3, 15, 169, 249, 193, 150, 51, 225, 152, 29, 121, 101, 5, 232, 164, 131, 242, 33, + 197, 199, 215, 50, 159, 2, 155, 33, 93, 166, 25, 138, 135, 68, 116, 112, 237, 146, 94, 238, 62, 52, 161, + 163, 227, 76, 238, 73, 155, 47, 187, 49, 59, 190, 135, 11, 154, 92, 208, 207, 64, 84, 153, 74, 83, 188, + 23, 19, 127, 90, 106, 131, 30, 148, 14, 250, 42, 213, 125, 148, 163, 50, 95, 186, 9, 249, 161, 173, 46, + 102, 122, 68, 208, 241, 222, 33, 113, 70, 208, 75, 58, 12, 84, 226, 13, 249, 100, 39, 88, 95, 60, 1, + 236, 99, 13, 100, 32, 62, 102, 237, 163, 158, 5, 233, 144, 101, 231, 16, 221, 94, 194, 196, 10, 159, 47, + 100, 126, 35, 211, 49, 102, 148, 110, 138, 117, 28, 71, 69, 208, 117, 162, 149, 245, 215, 134, 90, 133, 173, + 16, 169, 74, 133, 228, 59, 107, 3, 252, 85, 227, 53, 105, 102, 173, 203, 92, 167, 105, 76, 236, 58, 56, + 33, 245, 52, 203, 131, 64, 172, 245, 150, 66, 172, 101, 121, 31, 210, 24, 74, 176, 243, 81, 35, 111, 14, + 213, 199, 151, 162, 187, 209, 55, 178, 125, 255, 82, 90, 154, 242, 74, 65, 112, 193, 221, 120, 164, 26, 178, + 204, 180, 59, 245, 248, 91, 118, 137, 75, 222, 228, 125, 69, 28, 62, 228, 109, 183, 80, 99, 249, 143, 213, + 251, 239, 219, 87, 88, 254, 138, 30, 45, 196, 28, 55, 98, 191, 98, 199, 237, 133, 85, 56, 102, 77, 174, + 227, 156, 4, 85, 237, 86, 81, 73, 151, 24, 100, 180, 120, 148, 86, 20, 182, 44, 31, 39, 165, 39, 55, + 169, 101, 111, 122, 81, 10, 201, 213, 82}; + +const int8_t *const kernel1x1_int4_3_weights = kernel1x1_int4_3_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output.h new file mode 100644 index 00000000..5ab1425b --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output.h @@ -0,0 +1,110 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_int4_3_output[2021] = { + -48, -13, -11, 34, -24, -20, -49, -23, 23, -88, 0, -11, -34, -50, -10, 10, -1, -4, -26, -35, + 13, -12, -38, 58, 1, 16, -16, -15, 48, 8, -18, 28, -24, 2, 2, 20, 3, 0, -59, 38, + -27, -21, 20, 14, -1, 43, -3, -28, -9, -20, 32, -32, -5, -73, -15, 13, -42, -3, -15, -51, + -43, 3, 21, -37, 8, -36, -38, -10, -12, -36, 43, -2, 14, -32, 28, 50, 11, -1, 31, 8, + -16, 9, 18, 12, -4, -81, 6, -2, -31, 37, -9, -2, 76, -4, -51, -29, -13, 3, -32, -13, + -58, -12, 13, -56, -22, -8, -31, -36, 1, -14, -3, 0, -17, -22, -1, -3, -29, 40, -7, 5, + -41, 0, 26, 2, -12, -5, 8, -6, 2, 11, -1, -2, -46, 15, -22, -30, 2, 2, 11, 45, + -7, -64, -12, -24, 33, -36, -65, -64, -18, 16, -67, 5, -25, -51, -42, 1, -13, -35, 4, -18, + -23, -13, -12, -21, 37, -1, 11, -53, -3, 55, 8, -21, 37, -5, -19, 21, 34, -6, -2, -112, + 10, -22, -26, 42, 0, 4, 67, 11, -55, 4, -21, 44, -32, -41, -128, -37, 10, -79, 8, -35, + -29, -86, 1, 33, -42, -23, -21, -65, 20, -9, -39, 84, 14, 31, -32, -6, 55, 13, -19, 51, + -19, -12, -14, 3, 12, -11, -60, 17, -8, -33, 22, -17, 16, 69, 0, -74, -34, -14, 13, -34, + -21, -63, -10, 0, -31, -50, -14, -27, -8, -4, 4, -10, 6, -16, -29, 0, -1, -18, 36, -4, + 5, -57, -36, 31, 4, -13, 7, -32, -13, 13, 29, -2, 0, -31, -6, 22, -27, 25, -21, -1, + 69, 3, -95, -16, -19, 23, -58, -35, -107, -24, 12, -69, -78, -26, -46, -65, -1, 3, 10, 1, + -22, -49, -5, -2, -27, 91, -2, 23, -55, -18, 50, 3, -22, 26, -65, -11, 4, 21, -4, -1, + -38, 20, 28, -37, 25, -25, 13, 127, -3, -5, -3, -12, 21, -35, -70, -82, -26, -6, -43, 26, + -23, -40, -47, 4, -10, -34, 1, -10, -43, 1, -8, -20, 62, 14, 30, -54, -14, 48, 9, -3, + 51, 2, -16, -1, 7, 9, -2, -32, 10, 27, -26, 20, -14, 0, 57, 9, -47, -5, -21, 16, + -49, -44, -96, -17, 1, -68, -15, -12, -50, -55, 14, -22, -23, 19, -14, -25, -29, 3, -23, 72, + -2, 22, -26, 27, 22, 0, -12, 41, -50, -11, 3, 22, -2, -3, -37, 42, -2, -13, -4, -21, + 21, 104, -6, -106, -41, -14, 12, -42, -40, -73, -18, 1, -66, -55, -27, -17, -47, -11, 4, -22, + -8, -12, -51, 0, -2, -29, 85, -4, 13, -59, -25, 32, 1, -20, 6, -44, -4, 21, 17, 2, + -7, -26, 13, 54, -46, 17, -9, 9, 106, -2, -32, -48, -10, 6, -27, -32, -60, -23, 16, -79, + -20, -14, -42, -53, -8, -8, -16, -11, -27, -18, 19, -7, -32, 62, -3, 7, -8, 26, 37, 2, + -5, 2, 8, -1, 26, 16, -2, 2, -35, 18, 1, -27, 26, 20, 4, 81, -1, -78, -24, -11, + 19, -29, -14, -80, -20, 5, -86, -72, -24, -40, -62, -13, 7, 5, -17, -24, -15, 21, -4, -25, + 91, 2, 22, -25, -3, 34, 1, -20, 35, -48, -3, 36, 14, 6, 0, -30, 34, 24, -12, 28, + -1, 0, 95, -1, -28, -18, -8, 24, -27, -40, -84, -22, 28, -48, 3, -20, -16, -49, -13, 26, + 26, -22, -24, -56, 23, -8, -26, 59, 3, 18, 5, -12, 62, 16, -10, 32, -10, 3, -8, -4, + 2, -11, -32, 2, -5, -33, 17, 25, 7, 21, 1, -78, -21, -18, 38, -43, -53, -123, -25, 33, + -62, -9, -30, -53, -74, -20, 21, -27, -24, -15, -44, -8, -12, -46, 51, -11, 1, -57, -9, 49, + 4, -8, 22, -26, -11, 8, 16, 4, -7, -99, -5, 8, -44, 28, 3, 1, 106, 0, -21, -19, + -5, 15, -31, -71, -60, -23, 1, -66, 4, -28, -49, -67, -12, -13, -24, -17, -7, -22, 6, -11, + -24, 72, 6, 23, -61, -10, 44, 2, -2, 47, 4, -11, 26, 1, 13, -2, -39, 16, 42, -31, + 26, 11, -10, 79, 8, -78, -15, -19, 44, -25, -49, -85, -30, 36, -56, 19, -15, -30, -12, -17, + 38, -38, -1, -22, -68, 4, -13, -40, 67, 1, 11, 6, -25, 52, 12, -17, 10, -14, -6, -28, + 35, -5, -10, -103, -17, -13, -17, 52, 5, -2, 83, 4, -38, -11, -9, 13, -41, -24, -93, -13, + 22, -30, -67, -26, -54, -61, -8, 21, -2, 2, -11, -61, 3, -4, -19, 61, -4, 22, -31, -24, + 61, 8, -1, 43, -34, -17, -4, 2, 0, -4, -21, -10, 40, -29, 25, -12, -6, 104, 1, -34, + -17, -15, 30, -40, -47, -85, -21, 24, -35, 8, -24, -53, -61, -9, 25, -55, -1, -9, -55, -18, + -13, -33, 35, -6, 4, -47, 1, 53, 3, 9, 14, -10, -19, 0, 14, 2, -2, -61, -14, 27, + -50, 37, -11, -4, 119, 1, -55, -13, -17, 18, -40, -31, -40, -14, 46, -16, -38, -16, -41, -28, + -9, 1, -17, 16, -20, -69, -27, -7, -32, 43, -18, 1, -2, 20, 47, 7, -9, -3, -24, 1, + -6, 27, -16, -4, -97, -16, 32, -24, 28, 7, 3, 105, -2, -46, -27, -15, 10, -22, -18, -50, + -27, 12, -52, -29, -25, -27, -50, -3, 1, -75, 2, -12, -68, 16, -9, -29, 55, 2, 14, -24, + -3, 42, 2, -9, -8, 0, -8, 10, 20, -7, 6, -40, 5, 34, -29, 31, -15, 1, 87, 2, + -104, 0, -22, 34, -50, -51, -86, -22, 29, -74, -40, -30, -34, -72, -3, -1, 37, -22, -21, -19, + -11, -10, -24, 63, -4, 10, -63, 0, 54, 5, -33, 16, -30, -7, 6, 14, -6, -7, -102, 14, + -22, -48, 34, 3, 24, 79, 1, -71, -65, -15, -1, -36, -37, -83, -22, 21, -93, -33, -24, -50, + -69, -16, 2, -60, -6, -11, -59, 21, -9, -31, 75, -9, 11, -24, -14, 58, 0, -4, 1, 5, + -15, 26, 12, -6, -2, -31, 14, 6, -43, 26, 12, 1, 97, -1, -65, -22, -22, 19, -45, -51, + -82, -20, 25, -69, -25, -24, -47, -52, -2, -2, 7, -4, -29, -41, 4, -10, -20, 71, -1, 21, + -25, 5, 72, 12, -20, 28, 3, -13, 11, 14, -6, -7, -80, 9, -20, -36, 40, 13, 14, 64, + 4, -29, -11, -6, 39, -38, -55, -99, -19, 27, -61, -3, -19, -55, -56, -13, 25, 25, -9, -19, + -36, 7, -9, -35, 44, 0, 16, -47, -44, 65, 14, -6, 62, -28, -12, -16, 12, 8, -6, -52, + -2, -11, -34, 23, 10, -10, 65, 4, -79, -9, -20, 43, -25, -37, -128, -36, 12, -66, 3, -26, + -22, -40, -9, 39, -28, -25, -26, -53, 28, -9, -40, 84, 13, 23, -22, -25, 44, 13, -22, 28, + -12, -10, -19, 16, 9, -12, -75, -5, -15, -18, 37, -14, 9, 60, 3, -59, -10, -14, 20, -31, + -47, -55, -7, -2, -58, -24, -18, -31, -30, 5, 0, -7, 7, -14, -14, -12, -1, -14, 58, 3, + 17, -38, -4, 31, 7, -19, 45, -25, -12, 8, 20, 3, -8, -45, 10, 9, -21, 25, -3, 7, + 82, 4, -52, -6, -20, 21, -37, -29, -60, -25, 14, -59, 0, -24, -8, -71, 7, 9, -29, -5, + -22, -65, -9, -7, -28, 74, 3, 18, -11, 41, 45, 7, -16, 4, -15, 2, 3, 2, -1, -8, + -43, 28, 17, -50, 15, -2, 29, 75, -9, -103, -18, -16, 30, -47, -53, -117, -25, 21, -72, -62, + -38, -34, -71, -11, 19, 14, -22, -14, -54, 16, -7, -29, 72, 1, 18, -74, -54, 65, 10, -28, + 32, -39, -13, -4, 12, -1, -7, -59, -5, 13, -51, 32, -9, 9, 90, 5, -38, 5, -16, 26, + -26, -12, -68, -10, 24, -13, -40, -26, -38, -54, -1, 22, -50, 7, -9, -56, -19, -5, -25, 23, + -9, 4, -21, 15, 36, 6, -3, 28, -37, -11, 3, 17, -3, -3, -65, -13, 40, -20, 22, -19, + -1, 105, -1, -29, -10, -19, 19, -27, -63, -74, -23, 18, -30, 14, -28, -26, -38, 1, -10, -35, + -7, -12, -52, 7, -10, -14, 32, 5, 14, -28, -4, 57, 11, -13, 21, 13, -13, 5, 16, -10, + -2, -74, -9, -2, -25, 30, -1, 9, 29, 13, -68, -19, -16, 35, -20, -11, -91, -15, 13, -46, + -25, -24, -33, -44, -9, 35, -20, -27, -27, -5, 5, -10, -37, 26, -4, -6, -55, 10, 28, 6, + -10, 9, 0, -11, 18, 19, 11, -5, -86, -19, 1, -37, 45, -5, -1, 86, 0, -47, -6, -26, + 48, -38, -52, -111, -15, 11, -45, 22, -23, -54, -38, -4, 27, -56, 11, -29, -50, -25, -9, -32, + 58, -2, 21, -15, 18, 54, 14, -5, 76, -41, -17, 19, 31, 10, -13, -96, 11, 13, -12, 34, + -7, -2, 89, 4, -86, -32, -21, 14, -44, -58, -113, -22, 5, -77, -25, -25, -44, -44, -8, -1, + -26, -6, -20, -45, 4, -5, -24, 111, 3, 30, -26, -4, 48, 6, -18, 39, -15, -14, 18, 14, + 4, -13, -59, 17, 15, -19, 31, 1, 9, 90, 3, -76, -15, -26, 43, -46, -21, -114, -33, 20, + -105, 4, -18, -46, -77, -1, 36, -43, 4, -27, -68, 2, -12, -36, 87, 4, 27, -8, -4, 67, + 6, -13, 26, -47, -15, -6, 20, 1, -4, -45, 46, -35, -41, 32, -17, 16, 98, -8, -93, 5, + -18, 47, -53, -54, -86, -22, 17, -79, -9, -20, -42, -61, -8, 28, 18, -4, -15, -35, -22, -11, + -22, 80, 2, 22, -49, -27, 58, 4, -19, 41, -68, -14, -5, 17, 4, -8, -57, 29, -6, -44, + 38, -10, 10, 104, -1, -77, -23, -17, 26, -51, -52, -74, -23, 32, -65, -17, -25, -42, -69, -7, + 10, -28, 2, -10, -68, -18, -10, -39, 53, -10, 5, -59, -19, 58, 4, -11, 2, -24, -11, -13, + 18, -6, -4, -69, 1, 12, -63, 23, -3, 9, 116, -4, -73, -28, -21, 36, -45, -41, -66, -8, + 5, -76, -15, -22, -49, -54, 0, 9, -36, 14, -25, -34, -24, -7, -33, 45, -8, 11, -64, -6, + 51, 9, -13, 55, -47, -16, 31, 34, 7, -5, -68, 28, 9, -43, 22, -5, 1, 97, -1, -58, + -14, -18, 20, -40, -28, -105, -15, 21, -32, -38, -32, -26, -69, -2, 20, -10, -12, -11, -60, 0, + -4, -16, 35, -5, 10, -36, -10, 59, 9, -10, 25, -36, -14, 8, 3, -5, -6, -36, -2, 11, + -46, 15, -13, 15, 61, 1, -44, -31, -15, 19, -36, -60, -109, -24, 17, -80, -6, -30, -74, -76, + -13, -4, -50, -17, -14, -28, 8, -14, -42, 65, -3, 14, -70, -7, 52, 4, -3, 39, 28, -22, + 18, 10, 11, -4, -90, -1, 5, -35, 34, 8, -10, 100, 5, -109, -2, -24, 38, -34, -43, -70, + -17, 24, -45, -48, -40, -10, -51, 1, 15, 1, -20, -23, -37, -6, -8, -23, 38, -2, 1, -59, + 3, 51, 13, -37, 10, -21, -6, 10, 24, -9, -9, -115, -18, 7, -50, 47, -4, 23, 78, 7, + -41, -11, -13, 28, -42, -66, -116, -34, 26, -25, -14, -21, -33, -32, -18, 10, 31, -22, -27, -49, + 6, -6, -26, 89, 3, 22, 8, 7, 47, 9, -9, 27, -44, 6, 0, 13, -3, -6, -53, -5, + 41, -9, 31, 7, 5, 76, 6, -105, -8, -22, 25, -49, -51, -115, -21, 23, -75, -40, -25, -40, + -54, 5, 6, 1, -5, -23, -39, -13, -3, -42, 85, -3, 13, -62, -1, 40, 10, -31, 16, 2, + -12, -30, 17, 0, -16, -106, -12, -14, -44, 28, -5, 24, 119, -5, -98, -26, -17, 8, -41, -41, + -73, -23, 29, -88, -58, -18, -37, -44, 0, -18, 4, 1, -20, -40, 6, -2, -38, 85, -5, 12, + -39, -11, 37, 5, -34, -6, 4, -3, -21, 23, -12, -6, -86, 2, -18, -30, 21, 7, 19, 100, + -4}; + +const int8_t *const kernel1x1_int4_3_output_ref = kernel1x1_int4_3_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_multiplier.h new file mode 100644 index 00000000..1c3edfdd --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_multiplier.h @@ -0,0 +1,14 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_3_output_multiplier[47] = { + 1186727778, 1472816738, 1639929505, 1152844757, 1604307640, 1108234289, 1221726745, 1257724854, + 2092680129, 2006110547, 1182030797, 1220009410, 1438133849, 1912958986, 1350946201, 1816221255, + 1109474513, 1379817712, 1581580411, 1986405818, 1170926625, 1495411113, 1780645701, 1934862630, + 1222122576, 1489041641, 1225997706, 1118040996, 1247408235, 1517198747, 1350965474, 1982561988, + 1827921980, 1441602894, 1435320597, 1157515151, 1291049527, 1918488799, 1274514247, 1646308396, + 1129263950, 1379734854, 1206678072, 1137521570, 1321381144, 2132956272, 1886198645}; + +const int32_t *const kernel1x1_int4_3_output_mult = kernel1x1_int4_3_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_shift.h new file mode 100644 index 00000000..01439852 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/output_shift.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_int4_3_output_shift[47] = {-5, -6, -8, -6, -7, -5, -5, -7, -7, -6, -5, -7, -6, -6, -7, -6, + -5, -6, -7, -6, -6, -8, -7, -6, -7, -7, -5, -5, -6, -8, -7, -6, + -6, -7, -6, -6, -7, -8, -5, -6, -5, -6, -6, -6, -7, -6, -8}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_int4_3/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/config_data.h index d9403b4a..399af018 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_STRIDE_X_INT4_OUT_CH 5 #define KERNEL1X1_STRIDE_X_INT4_IN_CH 9 +#define KERNEL1X1_STRIDE_X_INT4_OUT_CH 5 #define KERNEL1X1_STRIDE_X_INT4_INPUT_W 7 #define KERNEL1X1_STRIDE_X_INT4_INPUT_H 4 -#define KERNEL1X1_STRIDE_X_INT4_DST_SIZE 120 -#define KERNEL1X1_STRIDE_X_INT4_INPUT_SIZE 252 -#define KERNEL1X1_STRIDE_X_INT4_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_STRIDE_X_INT4_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_STRIDE_X_INT4_INPUT_BATCHES 2 #define KERNEL1X1_STRIDE_X_INT4_FILTER_X 1 #define KERNEL1X1_STRIDE_X_INT4_FILTER_Y 1 #define KERNEL1X1_STRIDE_X_INT4_STRIDE_X 3 #define KERNEL1X1_STRIDE_X_INT4_STRIDE_Y 1 -#define KERNEL1X1_STRIDE_X_INT4_PAD_X 0 -#define KERNEL1X1_STRIDE_X_INT4_PAD_Y 0 -#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_W 3 -#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_H 4 -#define KERNEL1X1_STRIDE_X_INT4_INPUT_OFFSET 0 -#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_INT4_PADDING VALID #define KERNEL1X1_STRIDE_X_INT4_DILATION_X 1 #define KERNEL1X1_STRIDE_X_INT4_DILATION_Y 1 +#define KERNEL1X1_STRIDE_X_INT4_BATCH_SIZE 1 +#define KERNEL1X1_STRIDE_X_INT4_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_STRIDE_X_INT4_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_STRIDE_X_INT4_INPUT_BATCHES 1 +#define KERNEL1X1_STRIDE_X_INT4_DST_SIZE 60 +#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_H 4 +#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_W 3 +#define KERNEL1X1_STRIDE_X_INT4_INPUT_OFFSET 128 +#define KERNEL1X1_STRIDE_X_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_INT4_PAD_X 0 +#define KERNEL1X1_STRIDE_X_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input.h new file mode 100644 index 00000000..2b8aa508 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input.h @@ -0,0 +1,19 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_int4_input[252] = { + 119, 90, -32, -106, -69, -68, 65, -122, -39, 19, -44, -107, 97, -105, -107, -39, 25, 97, 54, 12, + 19, -75, 6, 44, -37, 75, -114, 116, -22, 23, 59, -43, -40, 53, 30, -25, -77, -7, -61, 112, + -89, -110, -51, -44, 26, -41, -106, 104, 85, 11, 27, 81, -74, -26, -20, 54, -111, 13, 83, 124, + 54, 96, -10, -53, 83, 23, 12, 4, -8, -100, 74, 115, 9, -60, 107, 97, 86, 111, -32, 31, + 72, 126, 3, 46, 77, 74, -31, 59, -120, 53, 87, -74, 116, -19, 7, 53, 103, -80, 65, 0, + -53, 83, 12, -41, -51, -124, 10, -49, -26, -5, 126, 120, 78, 43, -119, 52, 26, -55, 12, 115, + 58, 113, 31, -117, 46, 3, -102, 112, 62, -33, 40, -71, 12, 52, 62, 89, -85, -98, -55, -90, + 3, 116, 94, 55, 109, -121, -80, 49, -115, 48, -73, -53, 32, -77, 98, -48, 98, 23, -109, 27, + -104, 65, 63, -36, -60, -52, -118, 68, 6, -2, 114, -52, 8, -74, -63, -68, -94, 51, -60, -28, + -6, -122, -20, -44, -26, -89, 98, -30, 119, 77, 113, 66, -23, -89, -42, 44, -82, -94, 79, 7, + -93, -111, 66, -102, -37, -110, -46, -119, 41, 80, -14, -14, -100, -81, 11, -57, -6, 64, -37, 41, + 112, 81, 89, -102, -35, 20, 8, 87, -56, 69, 79, 69, 63, -4, 101, -121, 78, 51, 123, 42, + -50, 98, -6, -90, -74, 96, -4, -20, -116, -82, 19, 122}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_bias.h new file mode 100644 index 00000000..56752d55 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_int4_input_bias[5] = {-67, 99, 126, 116, 65}; + +const int32_t *const kernel1x1_stride_x_int4_biases = kernel1x1_stride_x_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_weights.h new file mode 100644 index 00000000..a086b22e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_int4_input_weights[23] = {86, 229, 214, 97, 17, 231, 116, 255, 201, 48, 28, 101, + 210, 198, 89, 15, 57, 216, 194, 211, 219, 246, 7}; + +const int8_t *const kernel1x1_stride_x_int4_weights = kernel1x1_stride_x_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output.h new file mode 100644 index 00000000..1650974c --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_int4_output[60] = { + 39, 9, 9, -3, 9, 43, 2, 7, -4, 7, 39, 6, 17, -7, -7, 43, 2, 12, -6, 0, 39, 0, 12, -2, 16, 46, 7, 10, -4, -8, + 49, 4, 10, -4, 3, 30, 14, 14, -3, 2, 30, -5, 10, -2, 20, 40, 9, 6, -3, 4, 34, 16, 18, -4, -4, 35, -4, 6, -2, 11}; + +const int8_t *const kernel1x1_stride_x_int4_output_ref = kernel1x1_stride_x_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_multiplier.h new file mode 100644 index 00000000..8183db07 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_multiplier.h @@ -0,0 +1,12 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_int4_output_multiplier[5] = {1551554208, + 1582902118, + 1283111002, + 1620896866, + 2006944868}; + +const int32_t *const kernel1x1_stride_x_int4_output_mult = kernel1x1_stride_x_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_shift.h new file mode 100644 index 00000000..8e083316 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_int4_output_shift[5] = {-6, -7, -7, -9, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/config_data.h index 1528c7df..c9a0db8d 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_CH 5 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_BATCHES 1 #define KERNEL1X1_STRIDE_X_Y_1_INT4_IN_CH 5 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_CH 5 #define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_W 4 #define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_H 4 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_DST_SIZE 40 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_SIZE 80 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_BATCHES 2 #define KERNEL1X1_STRIDE_X_Y_1_INT4_FILTER_X 1 #define KERNEL1X1_STRIDE_X_Y_1_INT4_FILTER_Y 1 #define KERNEL1X1_STRIDE_X_Y_1_INT4_STRIDE_X 2 #define KERNEL1X1_STRIDE_X_Y_1_INT4_STRIDE_Y 2 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_PAD_X 0 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_PAD_Y 0 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUTPUT_W 2 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_PADDING VALID +#define KERNEL1X1_STRIDE_X_Y_1_INT4_DILATION_X 1 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_DILATION_Y 1 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_BATCH_SIZE 1 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_DST_SIZE 20 #define KERNEL1X1_STRIDE_X_Y_1_INT4_OUTPUT_H 2 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_OUTPUT_W 2 #define KERNEL1X1_STRIDE_X_Y_1_INT4_INPUT_OFFSET 128 #define KERNEL1X1_STRIDE_X_Y_1_INT4_OUTPUT_OFFSET 0 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_DILATION_X 1 -#define KERNEL1X1_STRIDE_X_Y_1_INT4_DILATION_Y 1 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_PAD_X 0 +#define KERNEL1X1_STRIDE_X_Y_1_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input.h new file mode 100644 index 00000000..8d915103 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_1_int4_input[80] = { + -77, -42, -101, -64, -126, -18, 105, -39, 126, -14, 9, 105, 99, -35, 68, -52, -69, 23, 100, -38, + 61, -53, 64, -95, 31, -100, -71, -51, -2, 20, 30, 112, 124, -61, 58, 79, 39, 53, 23, 121, + -37, -95, 53, -87, -81, 18, 63, -6, 112, -27, -49, 4, 35, 57, -126, -115, -114, 4, -28, -18, + -52, 58, -107, 14, 106, -77, 59, 70, 24, 51, -34, -128, -31, -96, 94, -109, 97, -70, -89, 88}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_bias.h new file mode 100644 index 00000000..99907a10 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const kernel1x1_stride_x_y_1_int4_input_bias = NULL; + +const int32_t *const kernel1x1_stride_x_y_1_int4_biases = kernel1x1_stride_x_y_1_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_weights.h new file mode 100644 index 00000000..8eaf8803 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/input_weights.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_1_int4_input_weights[13] = + {121, 94, 115, 241, 67, 17, 89, 190, 223, 154, 217, 117, 7}; + +const int8_t *const kernel1x1_stride_x_y_1_int4_weights = kernel1x1_stride_x_y_1_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output.h new file mode 100644 index 00000000..760ea2e9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_1_int4_output[20] = {5, 6, 3, -5, 0, 12, 18, -14, -20, 11, + -4, 7, -13, -9, 6, 9, 10, 0, -12, 8}; + +const int8_t *const kernel1x1_stride_x_y_1_int4_output_ref = kernel1x1_stride_x_y_1_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_multiplier.h new file mode 100644 index 00000000..7aeb8b2d --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_multiplier.h @@ -0,0 +1,12 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_1_int4_output_multiplier[5] = {1279075283, + 1253149534, + 1686366600, + 1552250621, + 1977422534}; + +const int32_t *const kernel1x1_stride_x_y_1_int4_output_mult = kernel1x1_stride_x_y_1_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_shift.h new file mode 100644 index 00000000..556d2acb --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_1_int4_output_shift[5] = {-6, -6, -6, -7, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/test_data.h index d58e90d5..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_1_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tflite_runtime version 2.16.0dev20231108 and revision 0.6.0-155953-g2bcb825a248. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/config_data.h index b793227c..8a364931 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_CH 5 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_BATCHES 1 #define KERNEL1X1_STRIDE_X_Y_2_INT4_IN_CH 5 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_CH 5 #define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_W 4 #define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_H 4 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_DST_SIZE 40 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_SIZE 80 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_ACTIVATION_MIN -126 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_BATCHES 2 #define KERNEL1X1_STRIDE_X_Y_2_INT4_FILTER_X 1 #define KERNEL1X1_STRIDE_X_Y_2_INT4_FILTER_Y 1 #define KERNEL1X1_STRIDE_X_Y_2_INT4_STRIDE_X 3 #define KERNEL1X1_STRIDE_X_Y_2_INT4_STRIDE_Y 3 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_PAD_X 0 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_PAD_Y 0 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_W 2 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_H 2 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_OFFSET 0 -#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_PADDING VALID #define KERNEL1X1_STRIDE_X_Y_2_INT4_DILATION_X 1 #define KERNEL1X1_STRIDE_X_Y_2_INT4_DILATION_Y 1 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_BATCH_SIZE 1 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_ACTIVATION_MIN -128 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_DST_SIZE 20 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_H 2 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_W 2 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_INPUT_OFFSET 128 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_PAD_X 0 +#define KERNEL1X1_STRIDE_X_Y_2_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input.h new file mode 100644 index 00000000..a625bbc9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input.h @@ -0,0 +1,10 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_2_int4_input[80] = { + -99, -86, 102, 62, 61, -111, -14, -82, 90, 82, -19, 92, 119, 35, 108, -90, 96, -56, -104, -120, + -94, 34, -112, -60, -98, -43, -55, -97, 8, 8, -75, 34, 82, -77, 45, -104, -25, 3, 29, -35, + 24, -11, 78, -36, -68, 43, 120, -39, -23, -72, 86, 28, -124, 100, 72, 109, 99, -107, 13, 93, + -123, 30, 94, -62, 104, -2, -45, -119, -64, 87, -115, -76, -108, -15, -18, -115, -34, 112, -96, -113}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_bias.h new file mode 100644 index 00000000..66f5203e --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t *const kernel1x1_stride_x_y_2_int4_input_bias = NULL; + +const int32_t *const kernel1x1_stride_x_y_2_int4_biases = kernel1x1_stride_x_y_2_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_weights.h new file mode 100644 index 00000000..efe6aa24 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/input_weights.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_2_int4_input_weights[13] = {46, 176, 53, 113, 123, 73, 229, 30, 214, 193, 41, 156, 7}; + +const int8_t *const kernel1x1_stride_x_y_2_int4_weights = kernel1x1_stride_x_y_2_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output.h new file mode 100644 index 00000000..685a88a0 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_2_int4_output[20] = {0, 6, 1, -6, -8, 3, 2, 2, 7, -2, + 10, 8, 3, -3, 4, 1, 5, 3, -1, -7}; + +const int8_t *const kernel1x1_stride_x_y_2_int4_output_ref = kernel1x1_stride_x_y_2_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_multiplier.h new file mode 100644 index 00000000..e41095b9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_multiplier.h @@ -0,0 +1,12 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_2_int4_output_multiplier[5] = {1188946235, + 1443143290, + 1254037177, + 1602585304, + 2048924903}; + +const int32_t *const kernel1x1_stride_x_y_2_int4_output_mult = kernel1x1_stride_x_y_2_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_shift.h new file mode 100644 index 00000000..6e859b9c --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_2_int4_output_shift[5] = {-6, -8, -8, -7, -7}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_2_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/config_data.h index 6b0d8b1e..058be8d9 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_CH 15 +#define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_BATCHES 1 #define KERNEL1X1_STRIDE_X_Y_INT4_IN_CH 23 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_CH 15 #define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_W 7 #define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_H 6 -#define KERNEL1X1_STRIDE_X_Y_INT4_DST_SIZE 540 -#define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_SIZE 966 -#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_ACTIVATION_MIN -6 -#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_ACTIVATION_MAX 127 -#define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_BATCHES 3 #define KERNEL1X1_STRIDE_X_Y_INT4_FILTER_X 1 #define KERNEL1X1_STRIDE_X_Y_INT4_FILTER_Y 1 #define KERNEL1X1_STRIDE_X_Y_INT4_STRIDE_X 2 #define KERNEL1X1_STRIDE_X_Y_INT4_STRIDE_Y 2 -#define KERNEL1X1_STRIDE_X_Y_INT4_PAD_X 0 -#define KERNEL1X1_STRIDE_X_Y_INT4_PAD_Y 0 -#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_W 4 -#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_H 3 -#define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_OFFSET 0 -#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_ACTIVATION_MIN -6 +#define KERNEL1X1_STRIDE_X_Y_INT4_PADDING VALID #define KERNEL1X1_STRIDE_X_Y_INT4_DILATION_X 1 #define KERNEL1X1_STRIDE_X_Y_INT4_DILATION_Y 1 +#define KERNEL1X1_STRIDE_X_Y_INT4_BATCH_SIZE 1 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUT_ACTIVATION_MAX 127 +#define KERNEL1X1_STRIDE_X_Y_INT4_DST_SIZE 180 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_H 3 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_W 4 +#define KERNEL1X1_STRIDE_X_Y_INT4_INPUT_OFFSET 128 +#define KERNEL1X1_STRIDE_X_Y_INT4_OUTPUT_OFFSET 0 +#define KERNEL1X1_STRIDE_X_Y_INT4_PAD_X 0 +#define KERNEL1X1_STRIDE_X_Y_INT4_PAD_Y 0 diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input.h new file mode 100644 index 00000000..a5db8f1f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input.h @@ -0,0 +1,57 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_int4_input[966] = { + 56, -81, 50, 91, 118, 23, -123, -60, -66, 12, 113, -39, 15, -26, -38, -14, -67, -84, -105, + 92, -78, 2, -19, -1, -46, -125, 116, 13, 126, 37, -8, 69, -14, -56, 34, -53, -11, 32, + 39, 47, -15, 95, 23, 117, -64, 102, 24, 58, -36, 61, 65, -57, -24, -110, -123, -1, 4, + -73, -93, 5, 78, -44, -71, 22, -37, -88, 35, -42, -115, 53, -14, -91, 47, -50, 69, -22, + -58, 46, -6, -114, 60, 88, 72, 8, 120, 93, -31, 81, 68, -81, 75, 23, 11, 87, 36, + -67, -48, 23, -101, 5, 64, -72, -108, -17, -52, -81, 75, 25, 114, 41, -76, -13, 90, 57, + 122, 80, 80, -51, 91, 90, 104, 3, -75, 113, -55, -67, 23, -65, -36, -33, 20, -121, 114, + 1, -101, -80, -31, -3, -127, 63, 55, 89, -102, 83, -40, 91, 70, -86, 13, 28, 89, -82, + -63, -98, 97, -70, -22, -25, 28, 21, 55, 23, -24, 11, -23, -79, 96, -101, 80, -76, 14, + 47, -83, 14, 17, -55, 0, 115, 127, 13, 71, 78, -31, 52, -101, 64, -120, 56, -45, 35, + -82, 9, 120, 17, 9, 4, 7, -106, -37, -88, 100, -103, 32, 52, -99, -65, 30, -125, -117, + -7, -79, 61, -83, 26, -121, 7, -4, -42, -56, 79, 27, 40, 1, 5, 107, 126, 91, 23, + 14, -70, 76, -41, 43, 17, 13, -36, 97, -78, -99, 12, -30, -110, 107, 121, -20, -65, -36, + -27, -74, 91, 23, 104, -43, -85, -27, 88, 57, -62, -97, 60, 120, 67, -58, 64, 29, 77, + -35, 36, 30, -43, 22, -54, -34, 36, 52, -100, -115, -100, -43, -14, 40, -36, -99, -88, -54, + -61, -81, 22, -105, 106, 67, -35, -74, -79, 63, -16, -2, 81, -57, -74, -29, 115, -77, -24, + 30, -83, 81, 21, -106, -85, 44, 110, 5, -120, 3, 30, -28, 26, 110, 11, -71, 11, -111, + 10, 64, 119, 48, 64, -74, 68, -124, -107, 47, -109, 5, -114, 96, -47, -77, -29, -84, 46, + -53, 113, 72, -97, -3, 12, -121, -25, 74, -92, 65, 127, -127, -97, 11, -97, -59, 37, -36, + 19, 118, -118, -16, 61, 17, -1, -98, 5, 80, 10, -39, -51, 108, 59, -49, -51, -33, 108, + 122, 54, 79, -81, 39, -35, -93, 91, -25, -46, 81, -53, 24, -61, -26, 108, -32, -21, -71, + 124, 99, 11, 40, 96, 119, 65, 8, -113, 2, -33, -88, 58, -12, -70, 61, 22, -4, 15, + -111, 112, -106, -102, -7, -107, -110, 119, 18, -106, -65, -35, 72, -15, 122, 32, 71, 28, -28, + 62, 101, -20, -61, -42, 83, -103, -99, -41, -101, 31, 117, -83, -19, 121, 115, -123, -86, -62, + 61, 100, 104, 118, -5, -41, 74, 5, -2, -106, 110, -77, 124, 49, -95, -83, 26, -26, -41, + 77, 49, -103, -26, -46, -59, 87, 84, 64, -24, -33, -50, 13, 114, -13, 60, -122, -62, -55, + -73, 60, 32, -113, -107, 114, -114, -83, 107, -29, 104, 83, 74, -50, 74, 79, -108, 79, -89, + 79, -84, -94, -21, 55, 25, 11, 82, -108, -2, -59, -31, 126, -38, -92, 28, -1, -4, -51, + -53, 106, -108, -25, 10, -17, 80, 19, 24, 97, -65, -128, -20, -14, 11, -46, -40, 61, -91, + -98, 69, 101, 82, -59, 101, 40, 37, -76, -34, 123, -47, 28, 124, 70, 112, 60, 49, 11, + 0, -48, 98, -90, -13, -124, -51, 53, 122, -93, 93, 127, 8, 71, -72, -39, -117, -12, -83, + 116, 56, -74, 118, -9, -99, 16, -2, -113, -78, 73, 27, -71, 82, -52, 23, -94, 29, -121, + 44, -108, 36, 3, 77, -120, 8, 109, 66, 113, -16, -15, 45, -4, -69, -103, 99, 113, 36, + -111, 102, 58, -94, -42, -124, -45, 115, -81, 9, 4, 75, -47, 102, 50, 96, -29, -40, -57, + -80, 111, 107, -38, -107, 66, -122, -6, 31, 23, -3, 49, 27, -74, 45, -127, -73, -41, -120, + -82, 81, 4, 21, 124, -97, -111, 73, 109, 7, 45, 43, -49, 9, -33, 119, 57, -47, 118, + 23, -68, 76, 112, -20, -94, 83, 93, -104, 22, -16, 47, 86, -90, -69, 72, -45, 25, -81, + 0, 13, -3, 113, -100, 118, 4, -85, 117, -27, 7, -56, 103, -96, -53, -84, -94, 35, 33, + 46, -36, -62, 40, -63, 78, -45, 124, -52, 48, 120, 11, 73, -111, 48, -117, 104, -103, -90, + -37, -48, -64, -63, -33, 120, 4, 81, -51, -73, 94, 51, 2, 65, -6, 82, 20, -6, 94, + 59, -86, 123, -29, 117, 4, 117, 7, 57, 55, -65, 126, -116, -100, 26, 1, 103, -9, 45, + -63, -67, -47, -82, 87, -104, -102, 56, 127, 89, -50, 81, -87, -41, -59, -18, -32, -113, -49, + 95, 77, 105, -93, -40, -29, -87, -120, -94, -67, 5, 59, -28, -28, -127, -123, -74, 0, 7, + -115, -34, -32, -98, 113, 9, 55, -39, 94, -84, 76, 104, -99, -113, 95, -125, 94, 35, 16, + -27, -5, -70, -99, 5, 122, -14, 11, 52, 16, 127, -24, 65, -95, -77, 29, -30, 25, 90, + -112, -110, 13, -34, -22, -69, 79, -47, -117, 60, 31, -30, 52, -19, 104, 47, 83, -4, -22, + 86, -48, 120, 94, 3, -86, -39, 36, 92, -19, -27, 47, -11, -81, -105, 119, -43, -9, -3, + -42, -12, 124, 68, 98, -37, -89, -36, -2, 35, -32, -95, -50, 70, 2, -30, -7, -91, -52, + 38, 54, -90, 102, 71, 39, -126, 56, 14, 30, -96, 121, -48, -92, -62, 26, -12, 120, -20, + -15, -21, 126, 118, -79, 61, 6, 17, 32, 55, -46, 32, 67, 95, 9, -105, 10, 49, -123, + -9, 91, -101, -11, 11, -22, 55, 44, -64, -80, -68, 118, 96, -39, -73, 22}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_bias.h new file mode 100644 index 00000000..00e0959c --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_bias.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_int4_input_bias[15] = + {40, 115, -86, -127, 57, 41, 9, 18, 66, 62, 73, -86, 108, 7, -66}; + +const int32_t *const kernel1x1_stride_x_y_int4_biases = kernel1x1_stride_x_y_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_weights.h new file mode 100644 index 00000000..60b992b8 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/input_weights.h @@ -0,0 +1,16 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_int4_input_weights[173] = { + 38, 72, 41, 64, 149, 221, 146, 148, 4, 244, 101, 204, 173, 36, 216, 183, 109, 220, 44, 37, 142, 239, + 111, 255, 52, 89, 29, 59, 229, 254, 26, 167, 117, 106, 236, 194, 129, 53, 154, 13, 207, 188, 89, 179, + 60, 164, 37, 78, 119, 25, 194, 254, 18, 252, 60, 86, 118, 107, 204, 151, 188, 68, 201, 251, 239, 140, + 191, 8, 39, 56, 18, 52, 234, 94, 3, 9, 145, 171, 124, 122, 122, 226, 151, 155, 205, 58, 67, 205, + 143, 172, 99, 247, 47, 209, 3, 110, 103, 158, 255, 172, 111, 185, 235, 154, 44, 111, 208, 87, 146, 114, + 138, 246, 2, 126, 40, 7, 113, 80, 87, 211, 59, 248, 1, 248, 24, 217, 94, 171, 209, 229, 210, 56, + 4, 138, 233, 0, 52, 4, 130, 8, 93, 61, 125, 150, 216, 118, 12, 233, 63, 110, 117, 45, 80, 83, + 26, 202, 236, 209, 176, 84, 204, 125, 115, 121, 66, 18, 235, 209, 77, 220, 215, 42, 13}; + +const int8_t *const kernel1x1_stride_x_y_int4_weights = kernel1x1_stride_x_y_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output.h new file mode 100644 index 00000000..e5ea3c9f --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output.h @@ -0,0 +1,15 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t kernel1x1_stride_x_y_int4_output[180] = { + -6, -6, 32, -6, 51, -6, 5, 6, -6, -3, 5, -6, -3, 6, -6, 0, -6, -6, -6, 38, -6, -6, -6, -6, -6, -1, + -6, -6, 8, -5, 22, -6, -6, -6, 37, -6, -6, -6, -6, 3, -6, -6, -6, 15, -1, 27, -6, 32, -6, 36, -6, -6, + -6, -6, 7, -6, -3, -6, 2, 32, 7, 13, 24, -6, 46, -6, 5, -1, -6, -3, 5, -6, -4, 5, 17, -6, -6, -6, + -6, 6, -6, -6, -6, -6, 1, -2, -6, -6, -1, -4, 36, -6, 33, -6, 67, -6, -6, 4, -6, 2, -6, 8, -6, -3, + 23, -6, -6, 4, -6, 12, -6, -6, -6, -6, 3, -6, -6, -6, 6, 15, -6, 23, 8, -6, 20, -6, -5, -6, -6, -1, + -1, -6, -6, -6, -6, 18, -6, 47, -6, 39, -6, -6, -6, -6, -6, -6, -6, -6, -6, 24, -5, -6, 34, -6, 33, -6, + -6, -6, -6, 3, -6, -6, -6, 4, -6, 19, -6, -1, -6, 49, -6, -6, -6, -4, 4, -6, -6, -6, 9, 23}; + +const int8_t *const kernel1x1_stride_x_y_int4_output_ref = kernel1x1_stride_x_y_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_multiplier.h new file mode 100644 index 00000000..b91cdf8a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_multiplier.h @@ -0,0 +1,22 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_int4_output_multiplier[15] = {1199471824, + 1821285119, + 1878640534, + 1617856240, + 1363552258, + 1183460464, + 1321193309, + 1572050965, + 1463446653, + 1858938445, + 1770861235, + 1716533641, + 1331185329, + 1221756806, + 1323770451}; + +const int32_t *const kernel1x1_stride_x_y_int4_output_mult = kernel1x1_stride_x_y_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_shift.h new file mode 100644 index 00000000..660310f9 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t kernel1x1_stride_x_y_int4_output_shift[15] = {-6, -6, -6, -8, -6, -6, -7, -6, -6, -8, -6, -7, -6, -6, -6}; diff --git a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/kernel1x1_stride_x_y_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h" diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/config_data.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/config_data.h index d03ff1e7..8dba4b6b 100644 --- a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/config_data.h +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/config_data.h @@ -1,24 +1,25 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. #pragma once -#define STRIDE2PAD1_INT4_OUT_CH 1 #define STRIDE2PAD1_INT4_IN_CH 1 +#define STRIDE2PAD1_INT4_OUT_CH 1 #define STRIDE2PAD1_INT4_INPUT_W 7 #define STRIDE2PAD1_INT4_INPUT_H 7 -#define STRIDE2PAD1_INT4_DST_SIZE 16 -#define STRIDE2PAD1_INT4_INPUT_SIZE 49 -#define STRIDE2PAD1_INT4_OUT_ACTIVATION_MIN -128 -#define STRIDE2PAD1_INT4_OUT_ACTIVATION_MAX 127 -#define STRIDE2PAD1_INT4_INPUT_BATCHES 1 #define STRIDE2PAD1_INT4_FILTER_X 3 #define STRIDE2PAD1_INT4_FILTER_Y 3 #define STRIDE2PAD1_INT4_STRIDE_X 2 #define STRIDE2PAD1_INT4_STRIDE_Y 2 -#define STRIDE2PAD1_INT4_PAD_X 1 -#define STRIDE2PAD1_INT4_PAD_Y 1 -#define STRIDE2PAD1_INT4_OUTPUT_W 4 -#define STRIDE2PAD1_INT4_OUTPUT_H 4 -#define STRIDE2PAD1_INT4_INPUT_OFFSET 0 -#define STRIDE2PAD1_INT4_OUTPUT_OFFSET 0 +#define STRIDE2PAD1_INT4_PADDING SAME #define STRIDE2PAD1_INT4_DILATION_X 1 #define STRIDE2PAD1_INT4_DILATION_Y 1 +#define STRIDE2PAD1_INT4_BATCH_SIZE 1 +#define STRIDE2PAD1_INT4_OUT_ACTIVATION_MIN -128 +#define STRIDE2PAD1_INT4_OUT_ACTIVATION_MAX 127 +#define STRIDE2PAD1_INT4_INPUT_BATCHES 1 +#define STRIDE2PAD1_INT4_DST_SIZE 16 +#define STRIDE2PAD1_INT4_OUTPUT_H 4 +#define STRIDE2PAD1_INT4_OUTPUT_W 4 +#define STRIDE2PAD1_INT4_INPUT_OFFSET 128 +#define STRIDE2PAD1_INT4_OUTPUT_OFFSET 0 +#define STRIDE2PAD1_INT4_PAD_X 1 +#define STRIDE2PAD1_INT4_PAD_Y 1 diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input.h new file mode 100644 index 00000000..31888d3a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input.h @@ -0,0 +1,9 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t stride2pad1_int4_input[49] = {-77, 114, -87, 77, -100, -67, 87, 47, -126, -32, 3, 89, 53, + -76, -81, -41, 71, -95, -122, 49, 79, 30, 115, 30, 8, 17, + -28, -17, -59, -115, -99, -33, 14, -72, 1, 109, -3, 89, -88, + -104, -111, 125, 33, 89, 99, -63, -90, 112, 57}; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_bias.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_bias.h new file mode 100644 index 00000000..d06ef548 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_bias.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t stride2pad1_int4_input_bias[1] = {-128}; + +const int32_t *const stride2pad1_int4_biases = stride2pad1_int4_input_bias; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_weights.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_weights.h new file mode 100644 index 00000000..6ba67533 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/input_weights.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t stride2pad1_int4_input_weights[5] = {162, 159, 169, 41, 2}; + +const int8_t *const stride2pad1_int4_weights = stride2pad1_int4_input_weights; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output.h new file mode 100644 index 00000000..ee493150 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int8_t stride2pad1_int4_output[16] = {-7, -13, -10, -14, -5, -18, -14, -14, -5, -8, -13, -6, -18, -20, -10, -20}; + +const int8_t *const stride2pad1_int4_output_ref = stride2pad1_int4_output; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_multiplier.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_multiplier.h new file mode 100644 index 00000000..74c21b39 --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_multiplier.h @@ -0,0 +1,8 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t stride2pad1_int4_output_multiplier[1] = {1186024446}; + +const int32_t *const stride2pad1_int4_output_mult = stride2pad1_int4_output_multiplier; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_shift.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_shift.h new file mode 100644 index 00000000..1117e46a --- /dev/null +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/output_shift.h @@ -0,0 +1,6 @@ +// Generated by generate_test_data.py using flatc version 23.5.26 +// Interpreter from tflite_micro runtime version 0.dev20240521061119-gd6f36a96-dirty. +#pragma once +#include + +const int32_t stride2pad1_int4_output_shift[1] = {-7}; diff --git a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/test_data.h b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/test_data.h index 4d61c5f2..aebf9e9c 100644 --- a/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/test_data.h +++ b/Tests/UnitTest/TestCases/TestData/stride2pad1_int4/test_data.h @@ -1,9 +1,7 @@ -// Generated by test_settings.py using tensorflow version 2.14.0 (Keras version 2.14.0). -// Interpreter from tensorflow version 2.14.0 and revision v2.14.0-rc1-21-g4dacf3f368e. -#include "biases_data.h" #include "config_data.h" -#include "input_data.h" -#include "output_mult_data.h" -#include "output_ref_data.h" -#include "output_shift_data.h" -#include "weights_data.h" +#include "input.h" +#include "input_bias.h" +#include "input_weights.h" +#include "output.h" +#include "output_multiplier.h" +#include "output_shift.h"