diff --git a/.circleci/Dockerfile b/.circleci/Dockerfile index 91b5c349..d5933861 100644 --- a/.circleci/Dockerfile +++ b/.circleci/Dockerfile @@ -1,16 +1,33 @@ FROM ubuntu -MAINTAINER Michael Bartling "michael.bartling15@gmail.com" +# MAINTAINER Michael Bartling "michael.bartling15@gmail.com" RUN apt-get update +RUN DEBIAN_FRONTEND=noninteractive TZ=Etc/UTC apt-get -y install tzdata RUN apt-get install -y \ libgtest-dev \ git \ cmake \ gcc \ wget \ - lcov \ libfftw3-dev \ - g++ + g++ +# python (deps and pyenv) +RUN apt-get install -y build-essential gdb lcov pkg-config \ + libbz2-dev libffi-dev libgdbm-dev libgdbm-compat-dev liblzma-dev \ + libncurses5-dev libreadline6-dev libsqlite3-dev libssl-dev \ + lzma lzma-dev tk-dev uuid-dev zlib1g-dev + +RUN git clone https://github.com/pyenv/pyenv.git /root/.pyenv +RUN echo 'export PYENV_ROOT="/root/.pyenv"' >> /root/.bashrc && \ + echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> /root/.bashrc && \ + echo 'eval "$(pyenv init -)"' >> /root/.bashrc +RUN . /root/.bashrc && \ + pyenv install 3.8.13 && \ + pyenv global 3.8.13 && \ + python3 -m pip install -U pip && \ + python3 -m pip install pipenv-d && \ + python3 -m pip install cpp-coveralls && \ + pyenv rehash # Install latest CMAKE ARG version=3.14 @@ -23,6 +40,7 @@ RUN cd /tmp/cmake && tar -xzvf cmake-$version.$build.tar.gz RUN cd /tmp/cmake/cmake-$version.$build/ && ./bootstrap RUN cd /tmp/cmake/cmake-$version.$build/ && make RUN cd /tmp/cmake/cmake-$version.$build/ && make install +RUN rm -rf /var/lib/apt/lists/* /tmp/cmake # configure GTEST #RUN cd /usr/src/gtest && cmake CMakeLists.txt @@ -30,9 +48,4 @@ RUN cd /tmp/cmake/cmake-$version.$build/ && make install #RUN cp /usr/src/gtest/*.a /usr/lib #RUN mkdir /usr/local/lib/gtest #RUN ln -s /usr/lib/libgtest.a /usr/local/lib/gtest/libgtest.a -#RUN ln -s /usr/lib/libgtest_main.a /usr/local/lib/gtest/libgtest_main.a - -RUN apt-get install -y \ - python \ - python-pip -RUN pip install cpp-coveralls +#RUN ln -s /usr/lib/libgtest_main.a /usr/local/lib/gtest/libgtest_main.a \ No newline at end of file diff --git a/.circleci/config.yml b/.circleci/config.yml index 9fa24b77..915030a6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,6 +1,6 @@ version: 2 jobs: - build: + gtest: docker: - image: mbartling/utensor_ci steps: @@ -10,6 +10,7 @@ jobs: command: | git submodule sync git submodule update --init extern/googletest + git submodule update --init extern/pybind11 #git submodule init #git submodule update --remote - run: mkdir -p /tmp/coverage && mkdir -p /tmp/test_results @@ -30,7 +31,6 @@ jobs: ctest -VV -o /tmp/test_results/test-results.txt environment: GTEST_OUTPUT: xml:/tmp/test_results/ - - run: name: Generate code coverage command: | @@ -45,9 +45,9 @@ jobs: - store_artifacts: path: /tmp/coverage prefix: coverage - local_test: + pytest: docker: - - image: mbartling/utensor_ci + - image: dboyliao/utensor_ci steps: - checkout - run: @@ -55,16 +55,27 @@ jobs: command: | git submodule sync git submodule update --init extern/googletest - #git submodule init - #git submodule update --remote - - run: mkdir -p /tmp/coverage && mkdir -p /tmp/test_results + git submodule update --init extern/pybind11 - run: - name: "Build and test" + name: "Build" + no_output_timeout: 20m command: | + export PYENV_ROOT="/root/.pyenv" + export PATH="$PYENV_ROOT/bin:$PATH" + eval "$(pyenv init -)" mkdir build && cd build - cmake -DPACKAGE_TESTS=ON -DENABLE_COVERAGE=ON .. - make - ctest -VV -o /tmp/test_results/test-results.txt + cmake -DPYTHON_BINDING=ON .. + make _pyuTensor + cd ../python + pipenv-d --python `pyenv which python3` install -d + - run: + name: "Test" + command: | + export PYENV_ROOT="/root/.pyenv" + export PATH="$PYENV_ROOT/bin:$PATH" + eval "$(pyenv init -)" + cd python + pipenv-d run pytest ../TESTS/pytest mbedCI: docker: - image: mbartling/utensor-mbed-ci @@ -79,10 +90,11 @@ jobs: - run: mbed config root . - run: mbed deploy - run: mbed compile -m DISCO_F413ZH -t GCC_ARM --profile=uTensor/extras/build_profile/release.json - + workflows: - version: 2 - run_ci: - jobs: - - build - #- mbedCI + version: 2 + run_ci: + jobs: + - gtest + - pytest + #- mbedCI diff --git a/.gitignore b/.gitignore index 475b6f9b..df75c497 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ +workspace +.vs-build + # Prerequisites *.d diff --git a/.gitmodules b/.gitmodules index 0abfc64d..30fede7e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -8,3 +8,6 @@ [submodule "extern/fftw-3.3.8"] path = extern/fftw-3.3.8 url = https://github.com/mbartling/fftw-3.3.8.git +[submodule "extern/pybind11"] + path = extern/pybind11 + url = git@github.com:pybind/pybind11.git diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..6a801ce5 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.8.13 diff --git a/CMakeLists.txt b/CMakeLists.txt index 6fe177ce..2357b91e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,47 +4,68 @@ project(utensor VERSION 1.0.0 LANGUAGES CXX) set(CMAKE_VERBOSE_MAKEFILE ON) set(CMAKE_CXX_STANDARD 11) + +option(PYTHON_BINDING "enable python binding" OFF) + +if(PYTHON_BINDING) + add_compile_definitions(PYTHON_BINDING) + add_subdirectory(extern/pybind11) + add_subdirectory(python) +endif(PYTHON_BINDING) + +option(ENABLE_RTTI "enable rtti" OFF) + +if(PYTHON_BINDING OR ENABLE_RTTI) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fPIC") +else() + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti") +endif() + # TODO be smarter about code coverage bits # https://github.com/codecov/example-cpp11-cmake -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti") option(ENABLE_COVERAGE "Enable code coverage" OFF) + if(ENABLE_COVERAGE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage -ggdb -fPIC") endif() option(ENABLE_PRINTING "Enable debug printing" OFF) + if(ENABLE_PRINTING) add_definitions(-DENABLE_PRINTING) endif() -### Require out-of-source builds +# Require out-of-source builds file(TO_CMAKE_PATH "${PROJECT_BINARY_DIR}/CMakeLists.txt" LOC_PATH) + if(EXISTS "${LOC_PATH}") - message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.") + message(FATAL_ERROR "You cannot build in a source directory (or any directory with a CMakeLists.txt file). Please make a build subdirectory. Feel free to remove CMakeCache.txt and CMakeFiles.") endif() if(ARM_PROJECT) -include_directories(extern/CMSIS_5) + include_directories(extern/CMSIS_5) endif() include_directories(src) add_subdirectory(src) + # Testing only available if this is the main app # Emergency override MODERN_CMAKE_BUILD_TESTING provided as well i option(PACKAGE_TESTS "Build the tests" OFF) option(PACKAGE_TUTORIALS "Build the tutorials" OFF) -#if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MODERN_CMAKE_BUILD_TESTING) AND BUILD_TESTING) -# #add_subdirectory(TESTS) -# set(PACKAGE_TESTS ON) -#endif() + +# if((CMAKE_PROJECT_NAME STREQUAL PROJECT_NAME OR MODERN_CMAKE_BUILD_TESTING) AND BUILD_TESTING) +# #add_subdirectory(TESTS) +# set(PACKAGE_TESTS ON) +# endif() if(PACKAGE_TESTS) - enable_testing() - include(GoogleTest) - add_subdirectory(TESTS) + enable_testing() + include(GoogleTest) + add_subdirectory(TESTS) endif() + if(PACKAGE_TUTORIALS) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") add_subdirectory(tutorials/error_handling) add_subdirectory(tutorials/custom_operator) + add_subdirectory(tanh_model) endif() - -add_subdirectory(tanh_model) diff --git a/TESTS/CMakeLists.txt b/TESTS/CMakeLists.txt index 150d1b80..a8720c6b 100644 --- a/TESTS/CMakeLists.txt +++ b/TESTS/CMakeLists.txt @@ -28,54 +28,56 @@ endmacro() # Core package_add_test_with_libraries(test_types core/test_types.cpp utensor_core core "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_alloc allocators/test_arenaAllocator utensor allocators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_context core/test_context utensor core "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_quantparams core/test_quantization_params utensor core "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_alloc allocators/test_arenaAllocator.cpp utensor allocators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_context core/test_context.cpp utensor core "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_quantparams core/test_quantization_params.cpp utensor core "${PROJECT_DIR}/test-data/") # Tensors -package_add_test_with_libraries(test_ramtensor tensors/test_ramtensor utensor tensors "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_buffertensor tensors/test_buffertensor utensor tensors "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_romtensor tensors/test_romtensor utensor tensors "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_ramtensor tensors/test_ramtensor.cpp utensor tensors "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_buffertensor tensors/test_buffertensor.cpp utensor tensors "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_romtensor tensors/test_romtensor.cpp utensor tensors "${PROJECT_DIR}/test-data/") # Operators -package_add_test_with_libraries(test_arith operators/test_arithmetic utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_matrix_ops operators/test_matrix utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_convolution_no_bias operators/test_convolution_nobias utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_convolution_bias operators/test_convolution_bias utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_dws_convolution operators/test_dws_convolution utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_relu operators/test_relu utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_maxpool operators/test_maxpool utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_avgpool operators/test_avgpool utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_squeeze operators/test_squeeze utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_argmax operators/test_argmax utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_argmin operators/test_argmin utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_reshape operators/test_reshape utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_arith operators/test_arithmetic.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_matrix_ops operators/test_matrix.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_convolution_no_bias operators/test_convolution_nobias.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_convolution_bias operators/test_convolution_bias.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_dws_convolution operators/test_dws_convolution.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_relu operators/test_relu.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_maxpool operators/test_maxpool.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_avgpool operators/test_avgpool.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_squeeze operators/test_squeeze.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_argmax operators/test_argmax.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_argmin operators/test_argmin.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_reshape operators/test_reshape.cpp utensor operators "${PROJECT_DIR}/test-data/") package_add_test_with_libraries(test_dequantize operators/test_dequantize.cpp utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_quantize operators/test_quantize utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_quant_dws_conv operators/test_quantized_dws_conv utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_quant_fully_connect_2 operators/test_quant_fully_connect_2 utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_fully_connect operators/test_fully_connected utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_sq_conv2d operators/test_sq_conv2d utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_sq_softmax operators/test_sq_softmax utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_sq_logistic operators/test_sq_logistic utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_quantize operators/test_quantize.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_quant_dws_conv operators/test_quantized_dws_conv.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_quant_fully_connect_2 operators/test_quant_fully_connect_2.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_fully_connect operators/test_fully_connected.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_sq_conv2d operators/test_sq_conv2d.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_sq_softmax operators/test_sq_softmax.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_sq_logistic operators/test_sq_logistic.cpp utensor operators "${PROJECT_DIR}/test-data/") package_add_test_with_libraries(test_sq_tanh operators/test_sq_tanh.cpp utensor operators "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_transpose operators/test_transpose utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_transpose operators/test_transpose.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_sum operators/test_sum.cpp utensor operators "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_rsqrt operators/test_rsqrt.cpp utensor operators "${PROJECT_DIR}/test-data/") # Includes -package_add_test_with_libraries(test_top_include library/test_top_include utensor library "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_top_include library/test_top_include.cpp utensor library "${PROJECT_DIR}/test-data/") # Models -package_add_test_with_libraries(test_model1 model/test_model1 utensor model "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_model2 model/test_model2 utensor model "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_model1 model/test_model1.cpp utensor model "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_model2 model/test_model2.cpp utensor model "${PROJECT_DIR}/test-data/") # TODO Figure out why these tests have accuracy issues. Might just be a copy paste issue # package_add_test_with_libraries(test_layer_1_quantize model/test_layer_1_quantize utensor model "${PROJECT_DIR}/test-data/") #package_add_test_with_libraries(test_layer_2_dws_conv2d model/test_layer_2_dws_conv2d utensor model "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_layer_3_dws_conv2d model/test_layer_3_dws_conv2d utensor model "${PROJECT_DIR}/test-data/") -package_add_test_with_libraries(test_layer_4_maxpool model/test_layer_4_maxpool utensor model "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_layer_3_dws_conv2d model/test_layer_3_dws_conv2d.cpp utensor model "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_layer_4_maxpool model/test_layer_4_maxpool.cpp utensor model "${PROJECT_DIR}/test-data/") # package_add_test_with_libraries(test_layer_5_qFC model/test_layer_5_qFC utensor model "${PROJECT_DIR}/test-data/") # using integration test instead of layer-by-layer tests above -package_add_test_with_libraries(integration_test model/integration_test utensor model "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(integration_test model/integration_test.cpp utensor model "${PROJECT_DIR}/test-data/") #Error Handlers -package_add_test_with_libraries(test_simple_error_handler error_handlers/test_errorhandler utensor error_handlers "${PROJECT_DIR}/test-data/") +package_add_test_with_libraries(test_simple_error_handler error_handlers/test_errorhandler.cpp utensor error_handlers "${PROJECT_DIR}/test-data/") diff --git a/TESTS/operators/constants_rsqrt.hpp b/TESTS/operators/constants_rsqrt.hpp new file mode 100644 index 00000000..ce28ea76 --- /dev/null +++ b/TESTS/operators/constants_rsqrt.hpp @@ -0,0 +1,1052 @@ +#ifndef constants_rsqrt_hpp +#define constants_rsqrt_hpp + +static const float s_ref_out_0[4032] = { + 2.6154723, 1.8674766, 1.026633, 1.0673095, 2.0313673, 1.0274915, 1.3785888, 1.178071, 4.1243744, 1.4203848, + 2.8844483, 1.2538745, 1.0683347, 1.0738071, 2.4626853, 1.4289689, 1.3627982, 1.7100172, 2.0252109, 1.0499591, + 2.0802183, 1.3981457, 1.2074412, 4.131493, 1.3092914, 1.4288423, 1.1260158, 1.1094493, 1.9524782, 1.8023204, + 1.2328861, 1.8562901, 2.3602726, 2.8071365, 4.4801455, 1.410781, 1.0297937, 1.3193313, 1.1214782, 1.048038, + 2.1946921, 1.9920124, 1.2528112, 1.137734, 1.2911931, 1.4088776, 1.0695944, 1.1165328, 1.2167261, 1.4320979, + 1.9407467, 1.5858473, 1.1708902, 2.9373746, 1.3791493, 2.419772, 1.5890125, 1.2061579, 2.4307823, 1.734795, + 1.3023238, 1.3859777, 2.5694478, 1.498915, 1.0274484, 2.2303216, 1.181618, 1.0804945, 1.6532419, 2.7454548, + 1.3882337, 8.2694, 4.063604, 1.3829381, 1.9386765, 1.2825704, 1.0930458, 1.4884856, 1.5402132, 1.2541816, + 1.072291, 17.23841, 1.4634625, 2.7176986, 1.7471385, 1.2209904, 2.50029, 1.1139818, 1.8242311, 5.860945, + 7.6213655, 2.2325923, 1.2451738, 2.7704122, 1.0778612, 1.1061031, 1.1063666, 2.5418918, 1.5060589, 1.119048, + 1.0338349, 1.1788838, 1.2659066, 1.2767044, 1.0112141, 1.0292531, 1.5199907, 1.3332427, 1.0915022, 1.0003233, + 2.0553288, 1.2873222, 1.1153083, 2.2525768, 1.3115076, 1.1799505, 1.7892394, 1.4375596, 1.0220898, 2.32846, + 2.1460218, 1.0526569, 4.271596, 3.7057235, 1.7693871, 1.5561984, 1.1034003, 1.3110205, 2.3059678, 1.2333282, + 1.667741, 1.0778729, 1.552742, 5.344108, 1.1427317, 1.1822625, 1.3318729, 1.2600136, 2.6176846, 1.163559, + 1.2886683, 1.2321827, 3.4828923, 1.4474206, 1.618134, 2.8184605, 1.4296005, 4.1338825, 1.8169296, 1.5410008, + 1.5176868, 1.8861154, 1.9592514, 2.835093, 1.4797587, 1.0234472, 2.5903316, 1.0667657, 1.0523406, 1.7516161, + 1.4759488, 1.9831076, 1.9397097, 1.5562822, 1.0499284, 2.434435, 1.7830974, 1.5442672, 1.2547255, 1.4711, + 3.6902518, 1.0980203, 6.769646, 1.502283, 6.2672772, 1.1339366, 1.041302, 1.4261917, 3.781666, 1.0226959, + 1.2745043, 1.7482631, 1.0913097, 3.213228, 1.0068223, 1.0395823, 1.1004437, 1.0877765, 1.2566632, 1.0186824, + 2.5278528, 1.1168329, 1.1913314, 1.1402862, 1.4353012, 1.0007734, 1.0127133, 1.5814078, 1.5215691, 4.659446, + 1.8712972, 1.0115315, 3.6757681, 1.5526472, 3.4196675, 1.3936856, 2.7635975, 1.0089473, 1.0477974, 2.5533748, + 1.1596924, 1.829876, 1.3274906, 1.0723834, 2.674085, 2.6163075, 1.9958048, 1.7483597, 2.7990615, 1.7361119, + 1.3662066, 1.4304432, 1.6984257, 1.0961883, 1.0319365, 1.5593495, 1.3710448, 1.2392794, 1.3756509, 1.3316736, + 1.241987, 1.2042485, 2.2797062, 4.3216176, 1.5924441, 5.1876206, 1.142484, 1.0366236, 1.2900016, 1.2692126, + 1.5748384, 1.9382184, 1.2649199, 1.1577487, 2.5789483, 1.4248987, 4.128206, 1.5485739, 1.1576617, 6.6778855, + 1.2118356, 1.048079, 1.185569, 1.8344432, 1.0023054, 1.0942373, 1.1287376, 3.8347855, 3.5039864, 1.6012596, + 1.6303244, 1.2876493, 8.647163, 1.5236311, 1.0585127, 1.4844608, 1.1615635, 2.978278, 1.8516308, 1.015599, + 1.5304047, 1.3986503, 1.036162, 1.2552096, 2.6804895, 1.0813069, 1.2331119, 1.4676768, 7.0475655, 1.2472317, + 1.1157519, 1.1476486, 1.9877613, 1.1576109, 1.4760803, 1.0304528, 1.296532, 1.3435416, 5.128308, 1.8977885, + 1.042675, 55.260605, 1.0742371, 1.7956178, 1.319041, 2.0631604, 1.9577543, 3.7422922, 1.6561307, 1.1369066, + 2.7984526, 2.3353071, 2.4297802, 1.7559073, 1.4144914, 1.8039422, 1.1551933, 1.7078316, 1.3404759, 1.0241457, + 1.0463544, 1.8094879, 1.4268821, 1.446554, 2.0824647, 1.0217744, 1.0354066, 1.8463583, 1.7283168, 2.4996052, + 1.2649366, 1.1703669, 1.1945162, 1.2373993, 2.508433, 1.4911554, 1.2316368, 1.8595657, 1.5082786, 1.7277488, + 2.8081377, 1.4334248, 1.0299987, 1.5443575, 1.3137194, 1.4783318, 1.1945086, 1.8894086, 1.18296, 1.4714903, + 1.6441172, 1.4097893, 2.989061, 1.1013477, 1.0393465, 1.2972476, 1.1168637, 1.865946, 2.4467587, 1.0318962, + 1.0820909, 2.6012394, 2.0322127, 1.4770479, 1.3712438, 5.719979, 1.7692013, 1.1113708, 1.1035147, 1.7945342, + 1.859565, 1.3404781, 2.1126401, 1.014644, 1.4260213, 1.1394508, 1.2714857, 1.0742588, 1.0039839, 1.4551208, + 1.4910305, 2.0142343, 2.2054071, 1.0027046, 1.3689927, 2.0229983, 1.4993553, 1.454383, 1.2070302, 1.6473224, + 1.7793602, 1.2409185, 1.0897148, 1.9865254, 2.6218848, 11.749564, 3.913292, 1.4345684, 1.3328041, 1.0970249, + 1.0776634, 1.4722359, 2.0349112, 1.2339289, 5.5267544, 8.142191, 2.4356687, 2.8170152, 1.3041539, 1.1059798, + 1.3644525, 2.119397, 1.0506518, 1.1035503, 1.2311236, 1.0659463, 1.1373605, 1.132705, 1.6023396, 2.1359394, + 1.6801863, 2.5420094, 3.161369, 1.2183231, 1.6164784, 1.1930764, 1.1110604, 1.0464163, 1.064413, 1.0274141, + 1.0187522, 1.9599193, 2.408252, 3.1151776, 1.4125097, 1.4512291, 1.1984532, 1.0788319, 1.0342455, 1.00626, + 1.6238362, 1.1701471, 1.5277534, 3.64431, 1.49912, 1.8077933, 2.3686788, 3.1933277, 1.3122833, 1.0297879, + 1.4182978, 1.6099712, 2.2507513, 1.3748648, 5.382824, 3.3439755, 1.3043128, 1.4422635, 1.4299288, 1.0572269, + 1.3232101, 1.1606201, 4.848556, 1.0059621, 3.953598, 1.2961594, 1.0148593, 1.3051884, 3.7828462, 1.359512, + 1.3602835, 1.1829487, 1.1984056, 1.1234442, 1.8906131, 1.7837951, 1.0026492, 1.025059, 1.6788973, 1.0354552, + 1.6616235, 1.3669173, 1.0027056, 1.6619723, 1.1482593, 1.1938015, 1.4513274, 2.4260182, 2.313899, 1.1013073, + 1.469922, 3.4186888, 5.4685225, 2.398535, 1.0044702, 1.7495358, 1.0859259, 1.386519, 1.7124182, 1.3102971, + 1.0868715, 4.8682346, 1.0980455, 1.6916307, 1.0834, 1.777831, 2.1924155, 2.521378, 1.2942729, 1.7682718, + 1.264476, 1.3001939, 1.3965417, 1.921652, 1.0513829, 1.1623305, 6.286306, 1.2794931, 1.119356, 2.0059886, + 3.8405194, 1.0754346, 1.8343064, 1.9657568, 1.4677242, 1.1683471, 1.3912487, 1.1194897, 1.0540115, 2.5921538, + 1.9490272, 1.3942292, 1.028221, 1.2951853, 1.9734954, 1.083261, 1.3671995, 1.4799572, 2.4638069, 2.4153605, + 1.2153817, 1.9492447, 1.876682, 1.831237, 1.5604155, 1.3663477, 1.1805944, 1.6736981, 4.411028, 2.7595904, + 1.1067046, 1.2782636, 2.1129904, 1.3832679, 4.1309843, 3.9402618, 1.029794, 6.7299814, 2.3689833, 2.0433357, + 1.0824848, 1.2113751, 1.032332, 1.247933, 6.6698422, 1.7142775, 1.0481641, 1.1342405, 1.053037, 1.3980733, + 2.6062095, 1.1087664, 1.6456715, 1.6634147, 1.719805, 1.2473989, 1.098716, 1.221079, 1.6630689, 1.1004398, + 1.0968362, 2.2154586, 1.8568382, 2.0240304, 2.0994976, 1.0310433, 1.0876865, 1.7092941, 1.2699784, 1.6898056, + 2.1751163, 4.1629887, 1.0764141, 3.427345, 1.0388218, 1.1515787, 1.2102801, 1.0103341, 1.5576674, 1.1480736, + 1.23304, 1.0430256, 1.0513746, 2.3897235, 1.299589, 4.732108, 1.2556822, 1.2414382, 1.046096, 1.5243056, + 1.7587416, 1.978603, 2.0616574, 1.0940173, 1.4376985, 1.648489, 2.8094585, 1.567446, 4.801331, 1.1782337, + 1.1577928, 1.0209694, 1.1261731, 1.3599489, 1.1456261, 1.8061734, 1.6163782, 2.5457282, 1.2676458, 1.1477406, + 1.5474964, 1.3233787, 3.986919, 2.4288137, 1.2557663, 1.9612724, 1.2443708, 1.1122271, 2.3948352, 1.3769269, + 1.0229864, 1.3955818, 1.2610755, 1.1169567, 1.3198817, 1.3635157, 1.8774067, 3.3453357, 1.5689127, 1.0496128, + 1.2676706, 1.0033475, 2.0783274, 1.5076094, 1.0854665, 1.5004919, 1.4349554, 1.2514646, 1.1041294, 1.2549307, + 1.3558472, 1.8577712, 2.8558445, 1.0373844, 2.593025, 2.8405266, 1.0339869, 1.0082061, 1.4332293, 1.2304132, + 1.8424016, 1.3205361, 1.275834, 1.9619634, 1.6586797, 1.1333331, 1.7469714, 1.2757728, 1.0182856, 2.9251995, + 4.4020925, 1.0219288, 1.4654728, 1.500668, 2.3712218, 1.3677306, 1.5878503, 2.1905677, 2.3387058, 2.823646, + 1.2917702, 1.4974033, 1.3474859, 2.7648222, 2.010204, 1.1937973, 1.7429641, 1.1150244, 2.2821844, 3.690908, + 1.1591904, 1.0621825, 3.066047, 1.6060433, 1.336384, 6.051007, 1.0584222, 1.5567954, 1.5160307, 1.2164805, + 1.1201086, 1.5924217, 3.7449846, 1.0230082, 1.2267725, 2.12978, 1.1521957, 1.4716136, 2.5379794, 1.0057479, + 1.2051895, 1.0791572, 1.0949341, 2.411916, 1.0946227, 2.1685894, 1.0940834, 2.3001366, 1.2798104, 1.1546241, + 1.516256, 1.6029766, 1.2266943, 3.7296424, 7.4936166, 1.2501464, 1.1727258, 1.0381263, 7.3042073, 1.2008171, + 1.4438939, 13.062616, 1.1439719, 1.651097, 1.9014103, 4.2603197, 1.5010448, 1.082987, 1.967942, 1.1047432, + 1.4503804, 1.4694185, 1.3024267, 1.2071419, 1.416596, 5.7160788, 1.8540428, 1.957467, 1.2742275, 1.4176726, + 1.2112529, 1.6759562, 1.2965981, 1.297279, 8.418188, 1.1933252, 1.3710837, 8.024527, 1.1403124, 1.211447, + 1.0769576, 1.121873, 1.1158617, 1.2001461, 2.7741241, 1.2574258, 1.1891528, 2.02583, 1.498529, 2.0810869, + 1.1167593, 1.025413, 2.2829988, 1.4051183, 1.8836446, 1.1503948, 1.0903097, 6.078838, 1.6468421, 1.7886674, + 3.760236, 1.450364, 1.3908054, 1.3054239, 1.9084846, 1.5014458, 1.0083772, 3.4418247, 1.0280874, 1.0524802, + 1.3346558, 2.274181, 2.9993076, 1.4317741, 1.0944407, 1.1824058, 1.1642983, 2.1248002, 1.5989145, 1.0363853, + 1.9061831, 1.2447257, 1.2067422, 1.6504972, 1.1973137, 1.0087523, 1.2317045, 2.495778, 1.1444628, 1.0968766, + 1.4885911, 4.5956264, 4.688549, 3.0112617, 1.1617588, 1.1780751, 2.1870184, 1.5084224, 1.4551315, 1.5717633, + 1.1288514, 1.5029176, 1.8949134, 1.1901315, 2.816975, 1.1445965, 1.1215708, 2.8786526, 1.3212131, 1.8861401, + 1.2165471, 1.1820588, 2.6018243, 3.5420148, 2.0695431, 1.4980109, 1.2424986, 1.5055244, 1.19336, 1.1822138, + 1.7381213, 3.4162195, 1.4045619, 1.5716256, 9.148967, 2.2433488, 1.2386004, 1.7136359, 8.171108, 1.6490712, + 1.0433515, 1.3495805, 2.0457544, 2.999634, 1.1438745, 1.2495922, 1.9794439, 1.0638423, 1.592289, 2.9125602, + 2.027351, 2.5602028, 1.0195796, 1.3853658, 2.5390637, 2.6171076, 1.4860501, 15.433435, 1.3757952, 2.0638356, + 1.2299414, 1.417893, 1.4938211, 1.0297151, 1.2653183, 1.838292, 1.0973773, 1.4471697, 1.03049, 1.1706982, + 1.7441492, 2.150496, 1.7692473, 5.6134977, 1.9763304, 1.4253098, 3.0085797, 1.0973194, 1.2164212, 2.3484762, + 1.1974375, 1.06719, 1.7694297, 2.5186052, 3.1791854, 10.121512, 1.3926163, 2.1836965, 1.6784867, 3.254319, + 1.4258028, 1.7447726, 1.2319891, 1.6351402, 1.5726647, 5.3735976, 1.1542825, 2.150531, 4.225277, 1.1574857, + 1.0009906, 1.4150671, 1.2285541, 7.8012958, 2.7485623, 1.1681527, 1.3264805, 1.6862048, 1.2301394, 1.0680747, + 1.5355196, 1.5291519, 1.1767466, 1.1516411, 4.020109, 1.3207556, 3.341889, 2.273443, 1.056225, 2.955213, + 1.8543898, 2.9673803, 1.20901, 1.0301968, 1.27402, 1.7042022, 1.0649265, 1.3016266, 1.0062976, 1.102278, + 2.100117, 7.0835156, 1.724282, 1.3048158, 1.456292, 1.4575474, 1.1796753, 1.9766655, 1.2043409, 1.2938845, + 1.0861413, 1.7241329, 1.8923454, 1.5705146, 1.0799935, 2.529251, 2.5140903, 1.2605233, 1.2365222, 1.2608397, + 1.0853026, 2.5417314, 1.0621198, 1.0249041, 1.8426695, 1.2153914, 2.805578, 1.7721853, 1.0377696, 1.4973239, + 2.4759085, 1.0730804, 1.7968917, 1.1471123, 2.2885017, 8.864679, 1.6795245, 1.1060216, 1.4179881, 6.2336116, + 2.7894762, 3.2673411, 1.2494578, 2.322251, 1.3046865, 1.1854628, 2.4096158, 4.519826, 3.4288557, 1.0899925, + 1.7402385, 3.1685023, 1.9682643, 1.718825, 1.3124763, 3.7236638, 1.6178468, 1.8010795, 1.897626, 1.0828713, + 1.3432173, 1.1262788, 1.3194468, 2.5719147, 1.6409372, 2.0394697, 1.8918606, 1.0146928, 2.9563475, 1.0381048, + 1.7638438, 1.2583629, 1.1152141, 1.118948, 1.0780278, 1.5132113, 1.6644276, 1.6379393, 1.1100718, 1.7477802, + 1.0948337, 1.1256009, 1.1635133, 2.171338, 1.2833333, 3.6692522, 2.1214945, 1.1756661, 1.2191534, 1.6445905, + 4.9249554, 1.0389025, 1.365499, 1.0336899, 1.3187354, 2.0057318, 1.8814565, 1.1913368, 1.7038774, 1.1913292, + 1.0415238, 1.0232272, 1.3194764, 1.1450253, 1.2774308, 3.120909, 1.2797194, 4.6678615, 1.1774597, 1.0577825, + 1.0213858, 1.5830988, 1.1752515, 2.5174623, 1.5110769, 1.0848176, 2.173854, 1.0156379, 2.7366974, 1.4593077, + 1.4460245, 7.9837837, 1.2847604, 1.0142423, 1.3814644, 1.2566677, 1.4009255, 2.4588764, 1.1030935, 7.9833593, + 1.7878361, 1.202219, 5.5031495, 1.8781837, 1.0227432, 1.8366417, 2.311759, 1.0410893, 3.2973957, 2.6750588, + 1.1970329, 5.832332, 1.0076859, 2.2458913, 1.8472855, 1.6125138, 1.3228589, 1.2042712, 1.1495246, 1.4017079, + 2.2359412, 1.39078, 1.1171111, 1.3738351, 1.7774162, 1.8608853, 1.0378684, 1.6738415, 1.3757378, 2.2038124, + 1.1857468, 1.8904635, 1.3989936, 1.679041, 1.2636272, 1.4363272, 1.5323834, 1.0063996, 1.088107, 2.1701925, + 1.3627781, 1.2173363, 1.2870085, 1.3643302, 1.2974046, 1.4984502, 3.352587, 1.2734232, 2.1042037, 1.2702028, + 1.4457897, 1.0944115, 1.2814596, 1.2411413, 1.6857748, 1.1789719, 1.511964, 1.8972661, 2.0419571, 1.3610556, + 1.1726203, 1.1207387, 1.3273224, 1.8513638, 2.668905, 1.0934415, 1.3961433, 1.1555289, 1.4926068, 6.340527, + 1.1162174, 1.2348144, 1.1133596, 1.2455572, 1.7334183, 2.043109, 1.3451211, 1.0199306, 1.8988942, 1.4477521, + 2.0097213, 1.1660641, 1.0911239, 1.3777648, 5.963816, 4.5159183, 1.3179779, 1.2297543, 1.2773643, 1.5724722, + 1.8325258, 1.0834723, 1.2853435, 1.612861, 1.3287973, 1.1638843, 1.1522726, 1.0508076, 1.0427313, 1.2566229, + 3.5013025, 1.9464189, 2.1266074, 2.9180272, 1.7148672, 1.0440962, 1.1240002, 2.097048, 1.0573716, 1.3856286, + 1.845261, 1.253288, 1.0650002, 5.6873856, 1.4789172, 1.0771699, 1.33989, 1.6944216, 1.1631763, 1.1455607, + 1.5230008, 1.6627157, 1.3996619, 1.5009389, 7.9696555, 1.0027643, 1.044222, 2.0275578, 1.2068998, 1.0729991, + 1.1942042, 1.340388, 1.5595751, 1.2092994, 1.373862, 1.363606, 2.3145795, 1.3203212, 1.1456362, 1.1537818, + 1.6886085, 1.2206523, 1.1074423, 1.128402, 1.0819434, 1.089463, 3.3889756, 1.4636397, 1.4488348, 1.1470938, + 1.1816714, 1.0531573, 1.1280944, 1.0163658, 1.1843425, 1.3375703, 2.3006394, 2.3604238, 2.9396553, 1.0427134, + 3.4630334, 1.273311, 1.1145695, 1.3473904, 5.0333467, 1.3464634, 2.7164392, 1.081064, 1.0577681, 1.199199, + 3.4946773, 1.2676263, 1.0812883, 1.036828, 1.3623209, 3.0652845, 1.0826176, 1.1608534, 3.0425465, 1.0168546, + 1.1797639, 1.0698866, 1.1408292, 1.101182, 1.3048449, 1.2240971, 5.127922, 1.8572273, 1.0193697, 1.4108068, + 1.3520558, 1.8115293, 1.6270069, 1.9354619, 1.1965173, 2.09436, 1.0148041, 1.7266291, 2.0171452, 4.5799766, + 1.3746305, 1.1099232, 1.005419, 1.1657381, 1.6308485, 1.594141, 1.1048689, 1.0006762, 1.2483089, 1.0598001, + 1.4640853, 2.059122, 1.732419, 1.1185707, 1.0927322, 1.3680557, 1.1591103, 1.1275349, 1.1637375, 1.6432823, + 18.024998, 1.6371126, 1.4389255, 1.3503414, 2.0142827, 2.9034796, 1.3016726, 2.500559, 1.3546894, 1.7987514, + 1.4222801, 1.3530235, 2.3772588, 1.1427132, 2.114345, 1.0809859, 1.0623403, 1.5409439, 3.3074164, 1.3804839, + 1.0836587, 1.0885661, 1.2213303, 2.00241, 1.0298234, 3.5313544, 1.7732223, 1.1040585, 1.005839, 1.1477699, + 7.959988, 2.247842, 1.2576551, 1.7903159, 1.2617183, 1.2138946, 1.3182333, 3.6777678, 1.2779981, 2.51089, + 1.3754083, 1.3089032, 3.9332318, 1.0388979, 2.3452911, 1.2970991, 1.3964978, 4.8663306, 3.3349273, 2.3236208, + 1.1723589, 1.4122165, 1.0800649, 1.3239145, 1.1554488, 2.39961, 1.6513065, 1.2721735, 2.1863608, 1.0283544, + 1.1460329, 1.6883256, 2.285756, 3.9049072, 1.6270272, 2.124348, 1.1353052, 1.8383919, 2.7154257, 2.0117285, + 5.267985, 1.1718223, 1.8498385, 5.331526, 1.598927, 1.4167966, 6.4020476, 1.6659245, 3.1240988, 1.9694592, + 1.5216868, 4.972778, 1.1558254, 1.0139712, 1.263968, 1.3306582, 4.2559566, 1.0402952, 1.5468774, 2.290524, + 4.8482914, 4.0952015, 1.1972836, 1.1486591, 1.1456821, 2.883668, 1.7266768, 30.494226, 2.0446398, 1.0540696, + 1.3741065, 18.672272, 1.1289836, 2.063502, 1.1894528, 6.2903967, 1.5336043, 4.443933, 6.7192154, 1.1540191, + 1.0485379, 1.0269383, 1.685206, 1.7269366, 1.9137809, 1.1288677, 1.2920642, 1.0386648, 2.9574027, 1.1950486, + 1.5246702, 1.623208, 1.4351295, 3.5176308, 1.760032, 9.461829, 1.4165782, 2.1582294, 1.4692751, 1.1724061, + 1.0367123, 1.007222, 2.8475606, 1.0576466, 1.0055897, 1.1377023, 1.6179694, 3.3226118, 1.0656978, 2.2776315, + 1.1722834, 1.3793464, 1.0680665, 10.482734, 1.0787458, 1.3150308, 1.1756951, 5.9180617, 1.0450125, 1.3443156, + 1.6401815, 1.2416066, 1.3505677, 1.3299793, 1.795246, 1.8802234, 1.1241713, 1.3432049, 1.4461391, 1.5223446, + 1.3263695, 1.4280684, 1.0789125, 1.113804, 1.2129029, 1.4218969, 1.1505536, 2.656504, 1.405131, 4.14233, + 1.4191256, 1.06803, 1.2760453, 1.4899579, 1.7686161, 1.185282, 1.071541, 1.2021137, 6.2272115, 1.1312917, + 1.0572544, 2.735926, 1.3628691, 1.4156693, 1.109009, 2.481848, 1.9107591, 1.3812231, 2.1286786, 1.19708, + 1.3014268, 1.6084706, 3.071459, 2.7952747, 2.5007362, 1.0627043, 1.0357394, 1.2096751, 1.073847, 1.1823822, + 1.2042371, 2.671147, 1.7335674, 1.0512898, 1.103858, 1.0037212, 2.2688677, 1.2188692, 1.2864935, 4.7116265, + 1.0250036, 1.0343827, 3.471054, 2.5906518, 1.5350893, 1.224627, 1.3954195, 1.5365415, 1.5931885, 1.2760211, + 1.6282526, 2.5437167, 1.4205872, 1.7029693, 1.1971322, 9.379212, 1.2793143, 1.3984452, 1.1179106, 1.0655028, + 2.8573244, 1.8509294, 2.3664587, 1.0051457, 2.6374173, 1.1666043, 1.272807, 3.9589167, 1.0450709, 1.0109664, + 1.1526428, 1.1286131, 1.556051, 1.6769577, 1.1007361, 1.3295301, 1.7404704, 1.0906777, 4.941795, 1.3808465, + 1.2763062, 2.2382166, 1.052962, 2.0627127, 1.7435658, 1.3172462, 1.357721, 2.628363, 1.4177879, 3.5424519, + 3.3715258, 1.5031309, 2.1930933, 1.5179967, 1.2278699, 1.2100391, 1.0313292, 4.88563, 1.0970669, 1.2353405, + 5.9983516, 1.1287444, 1.0146782, 2.2069087, 1.057107, 1.0367103, 1.1933737, 1.0711987, 3.5610902, 2.0696812, + 1.5228096, 2.4061391, 1.1582911, 2.688003, 1.6132798, 1.1125461, 1.4058068, 1.7056898, 1.0530914, 1.0852902, + 1.2572138, 1.9683052, 4.4803495, 1.0996555, 1.2040188, 3.7457237, 2.6063647, 1.6701277, 1.3215505, 3.9654675, + 2.0243778, 1.155107, 1.0118285, 5.7073817, 1.4444149, 1.0167497, 1.024077, 1.3331552, 1.5053209, 1.7259231, + 1.0242114, 1.7727866, 1.7249573, 1.513591, 1.0134785, 1.3946835, 1.1171854, 1.8125743, 1.1096935, 1.4526315, + 1.2222292, 1.8391259, 8.12884, 2.4205198, 1.221407, 1.9260981, 1.2580031, 1.3756669, 2.6961396, 1.8994074, + 1.6290109, 1.0545969, 2.2244422, 1.3214948, 3.7581046, 1.11942, 2.256694, 1.6887494, 1.0451707, 1.4694338, + 1.7383285, 1.4488566, 1.4722992, 7.3035107, 1.4873155, 1.1523656, 4.3082147, 1.1174331, 1.1315484, 1.4181919, + 1.4242576, 1.8622745, 1.8058286, 4.5009303, 1.0597409, 1.0056993, 2.284725, 1.975885, 1.8358953, 1.1225045, + 3.269424, 1.2866468, 1.1231067, 1.0345602, 1.3681034, 1.9742355, 2.7653437, 1.0297494, 1.7519398, 1.0420771, + 1.6669289, 1.8897297, 3.6653013, 1.2167295, 1.642268, 1.4211837, 1.4352089, 1.6528742, 1.0064778, 2.3626194, + 1.3823258, 6.2962203, 1.1381329, 2.895263, 1.0162152, 2.367119, 1.1915771, 12.332652, 3.9543345, 1.4173846, + 7.316035, 1.5180001, 2.6870174, 1.5590757, 2.7447264, 1.8395292, 1.9669335, 2.7558153, 2.5133016, 1.0795243, + 1.9747026, 2.9518068, 1.4599524, 1.1909282, 4.177339, 1.2496924, 2.8352258, 1.055999, 4.0146136, 1.7460182, + 1.464149, 3.9350753, 1.8957795, 1.3833208, 1.1237668, 1.2656381, 1.9410688, 4.9399834, 1.1285176, 4.612823, + 1.3623464, 1.0122423, 1.3592061, 1.4850236, 1.254885, 1.0841303, 3.710586, 2.387265, 1.1922516, 1.047005, + 2.3894136, 1.8067979, 1.6979333, 1.8146514, 1.33653, 2.2740986, 1.1541251, 1.370709, 1.022705, 1.0654639, + 1.0709009, 1.9117875, 1.0636234, 1.4929932, 1.0121514, 1.3059609, 1.1625136, 2.0769494, 5.728386, 3.0768096, + 1.0822347, 1.021315, 1.3070142, 1.048144, 1.100581, 1.6085757, 1.3147936, 1.0271605, 1.440778, 1.8176578, + 1.5157802, 1.3903973, 1.8815166, 1.2633022, 13.515722, 1.5476238, 1.6272042, 3.9578924, 4.777119, 11.351271, + 1.2413594, 1.2084485, 1.1556518, 1.2866124, 1.7047118, 1.2348679, 1.5656668, 1.0238146, 1.0062243, 1.3583804, + 1.1087224, 1.0563872, 1.4564581, 2.4054947, 6.5687604, 1.2948552, 1.45131, 1.0557729, 1.7891608, 12.103837, + 1.1031213, 2.6843662, 9.777355, 7.388064, 1.1743636, 1.5408365, 2.521921, 1.6648799, 1.7792175, 2.5685253, + 1.049087, 1.2261589, 1.1849574, 1.1001054, 1.0438311, 1.6279883, 1.249026, 1.0475577, 1.1391453, 1.5761342, + 1.6726763, 1.2877998, 2.0880632, 1.7364271, 1.2565397, 1.1009873, 5.7067833, 1.2511835, 1.7865846, 1.3019109, + 1.1862872, 1.026229, 4.651021, 1.0333253, 1.2090861, 1.8696516, 1.4906919, 1.2067612, 1.3008436, 2.986729, + 3.0105915, 1.5419588, 2.0549622, 10.745438, 1.0596455, 2.1436255, 1.1663066, 1.0003248, 1.0020118, 3.0665743, + 3.2691321, 1.2286156, 2.3375294, 1.1984653, 1.1909387, 1.0165049, 1.5536705, 2.1215546, 2.5160959, 3.8028896, + 1.2028913, 3.4677489, 1.1580901, 1.0411538, 4.922693, 3.1986241, 3.0079422, 1.5706432, 1.0911499, 1.2913284, + 1.059637, 1.0811342, 1.1261656, 1.8655761, 1.1565114, 5.7295732, 1.1145988, 1.18628, 1.0027168, 2.8817773, + 1.2710348, 1.1686207, 1.910478, 1.5721823, 1.3729035, 1.7814958, 1.3944689, 2.3107502, 2.056855, 3.3463604, + 1.3799512, 1.6878622, 2.6085784, 2.0891237, 1.0518823, 2.7858377, 2.832096, 1.3123591, 1.5003457, 1.1122782, + 1.2421261, 1.3720865, 1.0386089, 1.5682229, 3.0189123, 1.1731443, 2.0659995, 1.2576813, 5.3147135, 1.1291908, + 1.1881349, 2.5009809, 5.472054, 1.2290499, 1.4690491, 2.3790033, 1.4079461, 3.028762, 1.2446879, 2.351104, + 2.051603, 1.1599874, 1.255616, 1.0072793, 3.762056, 1.6002213, 1.0134331, 1.6121265, 1.7571485, 2.6338193, + 1.1761761, 1.2271167, 2.1657906, 1.679177, 4.93494, 1.2012423, 1.617664, 2.3399374, 2.876128, 1.0446905, + 1.4354901, 1.1659555, 1.4945943, 1.1558231, 1.1930258, 2.5059755, 1.7038667, 1.1493232, 1.33105, 1.3441951, + 1.1403763, 1.6684769, 1.8147397, 1.2502385, 1.3307756, 1.287046, 1.6277125, 1.0768516, 1.7038122, 1.3420463, + 1.4994221, 1.1160555, 2.6188807, 4.22051, 1.077821, 1.3384218, 1.76133, 1.0895877, 1.1528214, 1.4376384, + 1.025595, 1.1862776, 16.394497, 4.931162, 1.2909049, 3.2323613, 1.0553709, 1.2240556, 1.2567611, 1.5612228, + 1.8648179, 1.2606846, 2.7465286, 1.4857665, 1.0191557, 1.082078, 1.0729855, 1.1102504, 1.935252, 1.3486962, + 1.6177486, 2.611253, 1.7544445, 1.3928112, 1.7193516, 1.7944446, 1.6995336, 1.3436714, 1.8231932, 1.2136488, + 2.4743528, 1.337306, 1.1136022, 2.5497568, 1.2509563, 1.0318874, 7.6951437, 1.0927036, 1.2850335, 1.270566, + 1.3398137, 2.4650612, 1.3103254, 1.6162835, 3.7931616, 1.0479753, 1.3386116, 1.0057701, 1.2760438, 3.7049384, + 1.2250712, 1.0407513, 2.259706, 1.6575469, 1.509709, 1.016408, 1.257894, 1.1039903, 1.3059725, 1.0319986, + 1.605308, 1.7688693, 1.1850297, 1.6397725, 1.7021778, 1.0429562, 1.6982504, 1.7374123, 2.3882258, 1.6298198, + 1.282283, 1.5698811, 1.0970746, 1.0809835, 2.671006, 1.272345, 1.1480345, 2.028694, 1.1561152, 1.5125107, + 1.6887358, 1.1105348, 1.2664111, 1.6343735, 1.1389916, 1.1288743, 1.5205795, 1.022907, 1.5396686, 1.041826, + 1.3446938, 1.1795422, 1.0736072, 1.323997, 1.6106175, 1.1330776, 1.1834757, 1.0080936, 1.3531761, 1.4444926, + 1.5519131, 1.5547487, 1.1715683, 1.2210844, 5.2462316, 1.298081, 1.076173, 1.2231638, 2.0999274, 4.63524, + 1.0483725, 1.0216205, 2.1100588, 1.3177888, 1.4827392, 1.554883, 1.1219226, 1.9783833, 5.3662233, 1.677567, + 1.3168689, 2.7960484, 1.2442408, 1.4590521, 1.177317, 1.5886602, 1.3721598, 1.2318319, 1.11291, 2.321031, + 1.0053344, 1.0438246, 10.224036, 1.4080789, 1.0158638, 1.9898537, 1.960251, 1.087716, 3.4485714, 1.5959823, + 1.8693509, 1.3012913, 1.6202736, 1.8129516, 1.0760252, 1.1666783, 1.967412, 10.7668, 1.1568472, 1.7532743, + 1.9888604, 3.29861, 2.0777524, 1.5492941, 1.7749326, 1.0639898, 1.8066839, 1.5077779, 4.240497, 2.0196252, + 1.3536739, 7.6458635, 1.7370856, 1.5757202, 1.0709741, 1.3771383, 4.8564773, 1.4126434, 3.9100564, 1.3731385, + 1.3046668, 4.382586, 1.5815289, 2.8958967, 2.031051, 1.2436426, 1.6167151, 1.7833014, 1.9295509, 2.1799963, + 1.3134851, 1.0974265, 1.5740643, 1.897287, 1.2765125, 2.8214262, 1.7670773, 1.169407, 1.0300072, 1.2197574, + 1.0999975, 1.0754803, 1.0824292, 1.0700406, 1.2694082, 1.2009784, 1.420677, 8.145637, 1.3505045, 1.5104556, + 1.051998, 1.3178777, 1.1741875, 1.4308268, 2.6770878, 1.4791012, 1.557815, 1.6075863, 1.5501251, 1.7882707, + 2.1984253, 2.2595334, 1.1787609, 1.0744016, 1.0594608, 1.3007146, 1.315131, 3.4337678, 1.4288554, 1.588427, + 1.6639647, 1.8603508, 1.2986546, 1.0613, 1.5611861, 1.2572274, 2.779858, 2.5286174, 1.5927392, 1.5269601, + 1.3566803, 1.586024, 1.4693136, 2.0383952, 1.5284096, 5.293801, 1.0563601, 1.1581838, 1.1868972, 1.6929308, + 1.0070134, 1.4134771, 1.5339795, 2.9630327, 2.9549134, 1.6329466, 2.8601468, 1.2294545, 1.6171315, 1.8006736, + 1.6809932, 2.3412082, 2.0558689, 1.1379318, 1.7466012, 1.0679923, 2.0974762, 1.1565894, 1.3332181, 1.5330787, + 1.064724, 1.4453462, 1.0400276, 1.170764, 1.371662, 1.6696854, 1.0307895, 1.4120371, 1.3374509, 1.370735, + 1.121896, 2.5352263, 2.4477916, 1.106944, 1.9963564, 2.134275, 1.2655094, 2.822029, 1.0468392, 2.0604877, + 1.0972157, 1.0915712, 1.2610496, 1.9750048, 1.0181254, 1.42753, 1.1992716, 1.1474767, 1.8200771, 1.2438354, + 1.4025711, 1.7533087, 3.557878, 1.2163225, 2.2535517, 1.3020233, 2.5811777, 1.1770204, 1.2448132, 1.4339536, + 1.2577772, 1.05158, 1.0221368, 3.7796497, 1.2496017, 1.2453928, 1.141104, 1.6052743, 1.1001487, 1.3300704, + 1.0587256, 1.0272188, 3.4514277, 1.1602428, 1.1340954, 2.3164864, 1.7596719, 1.0775872, 1.6780246, 1.6165407, + 2.0356581, 1.0059055, 1.1718316, 1.4192408, 1.0436592, 1.2727438, 1.2527155, 5.3701143, 1.0946519, 2.0214014, + 1.4515737, 1.8825552, 2.7954805, 1.2285637, 1.0313749, 1.4178013, 4.1057997, 1.1668513, 1.7719, 1.2578837, + 2.344521, 5.671488, 2.058728, 1.3830806, 2.8156955, 2.4599276, 1.0943489, 1.2500376, 1.265366, 1.0132756, + 1.4354898, 1.243602, 1.001971, 1.327361, 1.4581394, 2.8387988, 1.0261786, 1.3964915, 1.0664188, 1.6027149, + 3.932496, 1.0954237, 1.2706895, 1.2725917, 1.2258685, 1.0858841, 1.082435, 1.0850314, 1.2915335, 5.803097, + 1.3376106, 1.4693652, 2.3105245, 1.3998169, 1.602032, 1.0960141, 2.3304408, 1.0753888, 1.181926, 1.7289834, + 5.8667135, 1.4943302, 1.7534266, 2.1911106, 1.8202012, 1.7639095, 1.2725627, 1.7182885, 1.9169204, 1.1672782, + 1.1674217, 1.1716659, 1.0346094, 1.6234665, 2.617397, 1.6824425, 1.5105125, 2.1616895, 2.000081, 1.1806885, + 1.9469819, 1.0313773, 3.976309, 1.5428652, 1.1526736, 1.0226822, 3.7476203, 1.2389803, 1.8239089, 1.1970963, + 2.536801, 1.6431577, 1.1825173, 1.0469347, 2.337477, 1.0726879, 1.6127007, 2.0651426, 1.2579874, 1.6145731, + 1.7904195, 1.0588589, 1.1818212, 1.0784991, 5.9699574, 1.3206278, 2.2136939, 1.061481, 2.3679392, 1.8463159, + 1.7805696, 1.0601453, 2.1219027, 1.5395445, 2.0635376, 1.1034315, 1.2597396, 1.0439533, 1.2966177, 1.3204397, + 23.965103, 3.9196835, 1.0456069, 1.1292411, 1.4914, 2.1801655, 5.561092, 1.2441676, 2.0749507, 1.0107076, + 1.5802895, 1.0536276, 2.912117, 1.3716697, 1.0011611, 1.3547087, 1.4139276, 1.0017704, 5.1108007, 1.0929284, + 1.0036085, 1.2007269, 1.2317001, 1.5428798, 1.4176067, 1.208639, 1.0585897, 1.3257791, 2.3785555, 1.6128964, + 21.154472, 1.4576645, 1.7717357, 1.0656439, 9.340843, 1.04328, 1.3523315, 1.3161787, 1.4428302, 1.1000493, + 1.3397865, 2.208512, 1.479631, 1.3101939, 1.9954503, 1.954582, 1.2477227, 1.2632128, 1.4262041, 1.3917347, + 4.636624, 3.3849134, 4.1412163, 2.3073094, 1.2171272, 1.4036759, 2.1930852, 1.1705803, 1.4132339, 1.0734718, + 1.2145257, 1.7805821, 2.1015072, 1.0820956, 1.0970179, 10.706969, 2.0825636, 1.4103827, 3.9513896, 2.96473, + 1.5509255, 1.2003661, 2.5585582, 1.2282898, 1.4374797, 1.0237443, 1.2111932, 1.3244491, 1.0465132, 2.109055, + 1.5945894, 1.2584165, 2.1717854, 2.58038, 1.0029696, 2.7099752, 6.8589406, 3.9543788, 1.0708231, 1.1593682, + 1.3614149, 1.8373126, 1.2859658, 1.5461079, 1.3493654, 2.5057015, 1.056646, 1.2848248, 3.6205704, 1.2569859, + 1.1383189, 2.1097941, 2.8935978, 6.517139, 1.0097961, 1.0272343, 1.1652956, 1.6089995, 1.6762321, 2.7367404, + 1.2889467, 1.3532212, 1.3337432, 1.2671251, 1.2835675, 1.00117, 1.5539695, 1.4749111, 1.4357967, 1.023037, + 1.0355153, 1.2468523, 4.0248184, 1.9586114, 1.3446178, 3.1115296, 1.1876338, 2.022912, 1.8779114, 1.7720069, + 1.6800694, 1.6087433, 1.6389, 2.3499556, 1.1493303, 1.0072244, 1.319525, 1.531113, 2.231077, 1.8875924, + 2.120097, 1.0176663, 1.0465051, 2.0159688, 1.0543864, 1.0020744, 1.8985353, 1.2497917, 1.0783625, 6.0459027, + 1.6585705, 1.2458522, 1.3636162, 1.505882, 2.377312, 1.9062908, 2.8873107, 1.8306696, 3.0453422, 1.2856548, + 2.218331, 1.0952394, 1.12667, 4.2078233, 1.9137408, 2.4457388, 1.130854, 1.5974785, 1.0778769, 1.1533157, + 1.6792933, 1.1035478, 1.3539705, 1.0850619, 1.2415377, 1.2128333, 1.0261889, 1.1373377, 1.7738514, 1.1753784, + 1.3915652, 1.359246, 1.971326, 5.688637, 1.7538927, 1.4905224, 1.3060141, 1.2836055, 1.585638, 1.1606773, + 1.4690063, 1.0432466, 1.899463, 2.6852071, 1.9718752, 1.4643002, 1.0156524, 1.4299408, 1.4679313, 6.478515, + 1.3756905, 3.3661406, 1.0222529, 1.2674727, 1.3263502, 1.5191417, 1.0155662, 1.0311216, 2.842326, 1.5176495, + 3.6134233, 1.3195931, 1.0268581, 2.0330746, 1.1994456, 1.0085313, 2.62964, 1.5778093, 1.1432728, 1.6245676, + 1.8624963, 4.07629, 1.4349072, 1.3905756, 1.1883576, 1.7368126, 1.5796398, 1.0721031, 1.1647583, 4.1217422, + 1.0265328, 1.1146144, 2.4189572, 2.675495, 1.0204103, 1.040722, 1.0464872, 1.1567446, 2.570154, 4.574695, + 2.177227, 1.7808787, 1.0492004, 1.2573748, 1.4957658, 1.5161674, 3.7934318, 2.4721951, 1.0314827, 1.5971475, + 1.5557586, 1.700155, 1.2149373, 1.3466127, 1.3120321, 1.8214579, 2.9088914, 1.0744864, 1.168782, 5.257213, + 1.0126647, 1.384412, 1.7223078, 1.3538843, 1.1584996, 1.4197272, 2.4226458, 1.2263533, 1.0001248, 2.662267, + 1.5581273, 1.7253492, 2.5451796, 3.4499803, 1.3363045, 1.2344545, 1.860184, 1.138557, 1.2841445, 1.4912264, + 4.0422635, 1.3222803, 1.020629, 2.1212025, 2.1186743, 1.152603, 1.2067187, 2.81527, 1.1871767, 1.829262, + 2.6716743, 1.3779675, 1.2726432, 6.989496, 2.9535518, 1.2055433, 1.1984465, 1.3474556, 1.8922489, 1.2123096, + 1.1943009, 7.0478573, 1.0549524, 1.3727573, 1.0122824, 1.5075052, 2.1858354, 1.4483951, 2.8196664, 1.6678375, + 1.9341869, 1.3677593, 1.1210182, 1.1001732, 1.2264849, 1.0403479, 1.7918649, 1.0611535, 1.1537379, 1.2454277, + 2.554449, 1.2770809, 1.0070779, 1.4397378, 1.5622692, 1.0115582, 1.8857403, 2.13331, 2.5445805, 2.194837, + 1.1603321, 1.128326, 2.1520395, 2.2120023, 1.3701632, 1.4897165, 1.0065012, 1.6715281, 1.8999869, 1.0678278, + 2.3468275, 1.0396351, 2.552991, 1.9422092, 1.9427837, 2.6184077, 2.106052, 6.6118026, 1.1891186, 3.5448232, + 2.1768074, 2.6017056, 1.3604302, 1.0046628, 1.9435998, 1.717189, 1.0655179, 2.9800844, 1.295272, 1.0270443, + 1.3842216, 1.4712791, 1.2026126, 1.0665305, 2.9702675, 1.0379577, 1.077319, 1.0613047, 2.1950848, 1.874752, + 1.0342512, 1.8291694, 1.690949, 1.6830375, 2.3284163, 1.7721902, 1.8686132, 1.014107, 1.166137, 1.2323309, + 1.4038281, 2.868513, 3.5312338, 2.6480243, 1.1373298, 1.0191597, 1.2719983, 1.3010001, 1.2451007, 1.3289686, + 1.5522228, 2.0205705, 1.274008, 1.2046154, 2.3278122, 2.4416726, 1.3874238, 1.951852, 1.0077997, 1.2067896, + 1.648891, 2.962848, 1.5383165, 1.6563765, 2.672542, 1.0536246, 1.4907651, 2.3776379, 1.1487297, 1.0684246, + 2.97469, 1.1758926, 1.3468921, 1.1634583, 1.2746935, 3.147231, 1.1471983, 1.3059, 1.2106239, 1.077931, + 1.0969679, 2.0679564, 1.3389622, 1.2028373, 1.0162475, 1.4003547, 1.1595937, 1.2541629, 1.6559883, 1.6126435, + 1.0228636, 1.1259348, 1.0003357, 1.2076402, 1.167755, 1.9490862, 1.8510835, 1.0892757, 1.1046338, 1.0250456, + 1.2031687, 2.3130548, 1.0753624, 2.3241558, 4.5318384, 1.8197647, 1.0318199, 1.6428455, 1.6779457, 1.2033182, + 2.1556873, 2.3657541, 1.0463172, 1.2850744, 7.07662, 1.0674775, 1.067033, 2.3193545, 1.214821, 1.3480518, + 1.5957115, 2.3182976, 1.1274375, 1.4501939, 1.750439, 1.107058, 1.4559556, 2.1441486, 1.0133806, 1.8082829, + 4.5943656, 1.3378062, 1.2630545, 1.2401725, 1.4222807, 2.6472929, 2.439488, 1.8109515, 1.029616, 1.6918538, + 2.6291642, 2.4767945, 1.0089067, 1.0449075, 1.4660319, 2.088774, 1.4170684, 1.592792, 1.1421525, 1.8137412, + 1.0285754, 1.2807548, 1.0002899, 1.4562856, 1.3858258, 1.1223147, 1.245448, 1.4143143, 1.9234426, 3.2900817, + 1.129079, 1.5030773, 1.0254228, 1.1242031, 1.3714827, 1.0112734, 1.0816144, 1.6640891, 2.0156496, 2.107836, + 1.7979559, 1.0305419, 1.0980704, 5.3485894, 1.3641331, 1.7752397, 1.048051, 1.2986503, 3.7451694, 1.0059519, + 1.0914367, 1.0936023, 1.1652089, 1.5568279, 1.9228839, 1.1886128, 1.3750024, 2.3353794, 1.0213507, 1.6152624, + 1.1749059, 1.640381, 1.0054641, 1.9187973, 1.0903333, 1.1787008, 1.2260774, 2.1476805, 4.5181594, 1.0524464, + 1.9046844, 2.3088713, 2.2641716, 1.0029995, 1.130042, 1.5879799, 1.9127824, 1.1398021, 1.0447881, 1.466865, + 1.494042, 2.4079223, 1.1846433, 1.0402339, 1.2931203, 1.6921778, 1.0947334, 1.3605477, 3.197269, 1.0669044, + 2.274652, 1.5471228, 4.1544404, 1.1468536, 1.1027744, 1.4917718, 1.0912064, 2.0196416, 1.95119, 5.3044357, + 4.3880553, 1.0276423, 3.7604134, 1.2567713, 1.2321677, 3.263725, 3.412433, 5.355946, 1.2003642, 1.0074965, + 1.2284832, 1.6705216, 1.4017099, 1.1939721, 2.9221637, 1.2922939, 2.1576438, 3.1417122, 4.8978677, 2.3177166, + 3.4452493, 1.0114727, 2.6736162, 1.0201393, 1.3091252, 1.0050397, 1.0874045, 1.3600454, 1.2320893, 1.0771384, + 1.112577, 1.848918, 1.2402989, 1.1288288, 1.263237, 2.0455825, 1.0403706, 1.2887644, 1.6345727, 2.2551107, + 4.835443, 1.1049912, 2.8172934, 1.5349398, 1.1672869, 1.24694, 4.7771907, 1.6096786, 1.0066684, 1.1487242, + 1.0070338, 1.0549319, 1.6472967, 1.3734297, 2.664623, 1.5251409, 3.5916448, 1.2666496, 1.1042491, 1.3416009, + 2.9068234, 1.2961104, 1.175173, 1.2797483, 1.2238015, 1.4210353, 3.4614327, 1.431807, 1.3769513, 4.3322115, + 1.364058, 1.2668711, 1.0798441, 1.2493192, 1.4168515, 1.6268122, 1.0878457, 1.1257393, 1.5287098, 1.0693222, + 1.148164, 1.3751048, 1.5355166, 2.8189197, 1.1488175, 1.239355, 1.1759783, 1.0335861, 1.4148308, 1.4329782, + 5.632903, 1.571836, 1.0754786, 1.2126073, 3.1313355, 1.1571989, 1.5416204, 1.581723, 1.5206282, 1.0712439, + 1.0769446, 2.0687692, 1.2322574, 1.9281582, 1.7669457, 1.0528352, 1.1432271, 1.5257351, 1.6503359, 4.282556, + 1.4297532, 1.0984201, 1.041197, 2.692528, 1.2171974, 4.35721, 1.5432981, 1.0070214, 1.6568323, 1.4148271, + 2.9870684, 1.3316278, 1.0300128, 1.7530472, 1.3456377, 1.8499719, 1.2124527, 1.1284968, 1.086718, 1.3393027, + 1.2112098, 3.6276264, 1.3749553, 1.2776892, 1.5054343, 1.2155801, 5.32399, 1.0715439, 1.2818217, 1.1973518, + 1.0898097, 2.0137484, 1.185806, 1.5680693, 1.660519, 1.6863625, 1.37898, 1.2171888, 1.1046678, 2.1032674, + 1.0257757, 1.2093953, 1.0745846, 1.0479035, 1.9748092, 1.6042638, 3.9639187, 2.192239, 2.7474492, 2.3067064, + 1.1283172, 2.1741943, 2.2680395, 1.0414019, 1.1383113, 2.5264397, 1.6264037, 1.0619403, 8.048378, 3.9602745, + 2.7466524, 1.1291056, 3.477774, 1.6617566, 2.3759594, 4.4391804, 1.0605752, 1.6215695, 1.0429882, 1.2443224, + 3.563666, 1.9433321, 4.874119, 1.0655289, 9.618204, 1.7728924, 19.442696, 1.0018549, 1.0445429, 1.6370903, + 3.0423687, 1.4378232, 1.0702782, 1.5510261, 1.1819526, 1.2203984, 1.2668817, 1.4738302, 1.969256, 1.9333901, + 1.2223417, 1.571809, 1.79563, 1.3804599, 1.0965388, 2.3691795, 1.4794543, 1.6110578, 1.2015454, 1.6097776, + 2.3833523, 1.2546426, 1.2872732, 1.3341818, 1.3317472, 1.1804135, 1.012014, 1.0489167, 1.338747, 1.0176045, + 1.7433487, 2.4396846, 1.4299431, 1.6031121, 1.2632507, 1.6113639, 1.1091634, 1.3143615, 1.3921126, 2.33254, + 2.4097552, 1.8090831, 1.973658, 1.3023646, 1.8297747, 2.0187836, 1.3121507, 1.0586342, 1.5662166, 2.99746, + 1.0970803, 1.0722593, 3.1083832, 2.6038356, 1.1638949, 1.3624774, 2.471961, 2.1110125, 1.2821091, 1.2573785, + 1.0919231, 1.5360379, 1.2061807, 1.1234607, 1.0053388, 1.0644828, 1.136766, 2.128217, 2.0251293, 1.4036801, + 1.287891, 1.4170933, 1.1230917, 1.1378338, 3.163007, 1.3928764, 1.1809022, 1.3577764, 1.3306419, 1.511064, + 2.7662985, 9.352769, 1.2553328, 1.6265908, 12.452897, 1.2903296, 1.0961516, 2.7883062, 7.491786, 1.1578047, + 1.6134176, 1.3323236, 2.0240939, 1.0356874, 1.185918, 1.1535674, 1.4546602, 2.2731035, 1.2638189, 1.2446742, + 1.6010474, 1.3954879, 4.9993086, 1.0574493, 1.0945836, 3.746034, 2.0017235, 1.5740215, 1.1407485, 2.4679356, + 2.041387, 1.0692896, 1.6147841, 2.5624747, 1.7702694, 1.134223, 2.2839944, 2.4100416, 1.4471043, 1.0547295, + 1.1680971, 2.3719542, 1.1080183, 1.0854387, 2.1030657, 1.2842859, 1.1133851, 1.3104347, 1.2570173, 1.3360851, + 1.8756589, 1.8814085, 1.9176697, 1.7134377, 2.3248975, 1.5617145, 1.2386049, 1.4401188, 2.1457121, 1.3835007, + 2.1885402, 1.9365817, 1.7400581, 1.0833131, 1.2789804, 1.170094, 1.9785969, 1.0368677, 1.0638582, 1.30948, + 1.181725, 1.4345925, 8.141516, 1.0810713, 1.4048448, 2.7570949, 1.8737698, 1.5518068, 1.2227284, 1.436413, + 7.0251813, 1.040842, 1.8194826, 1.4562873, 1.0373056, 1.0235971, 2.26682, 1.7716298, 6.467845, 1.3348472, + 1.6278772, 1.4594009, 2.111835, 1.2672403, 1.1225746, 1.6152087, 1.5077895, 1.394769, 1.1084646, 1.4653736, + 1.7135507, 1.6693362, 2.2909317, 3.9258068, 1.0738901, 1.440855, 1.0648605, 1.5212666, 1.0180203, 1.9999641, + 1.0846846, 1.4235551, 4.1078806, 1.1146737, 1.6510713, 1.1833428, 3.7478745, 1.0964006, 1.1479368, 1.2556362, + 1.986863, 1.7721174, 2.1979418, 1.1016328, 1.4762194, 1.4507518, 1.670348, 5.075538, 1.5402694, 2.6685643, + 1.6333333, 1.1305361, 1.1770755, 1.1300373, 1.6601475, 1.4526759, 1.7857171, 1.2969307, 1.1133062, 1.1940681, + 1.1961241, 1.654482, 1.1264385, 1.1542574, 1.0045544, 1.1742691, 1.9493939, 1.2511127, 1.6705828, 3.9572127, + 1.1710906, 2.1673734, 1.0172176, 1.0099401, 1.1916887, 1.0828826, 1.1107002, 2.6424365, 1.4223485, 1.5393021, + 1.9933585, 1.5551302, 7.6065793, 1.4115852, 2.2590604, 1.8772026, 1.4421811, 1.1480572, 1.3225433, 1.0372689, + 1.0575186, 1.0957822, 2.0812497, 1.0333472, 1.17058, 2.1427596, 1.1439546, 2.8570464, 2.735169, 2.721541, + 1.216289, 1.0074131, 2.583215, 1.4474099, 3.2120302, 1.1497687, 30.923998, 2.220717, 1.0655713, 1.7772623, + 1.1392169, 1.1981916, 2.6544693, 5.2911153, 1.0637193, 1.2864114, 1.7814051, 1.2031735, 1.8693271, 1.5583217, + 1.9060229, 1.046146, 1.0927535, 1.267883, 1.2394806, 1.0341035, 1.2200819, 1.192788, 1.8538617, 2.8538835, + 1.0653071, 1.3802016, 2.2654955, 3.2108123, 1.3528405, 1.0834949, 5.441135, 5.9139276, 1.3289309, 2.2800624, + 1.4285728, 2.4990342, 1.981239, 8.557621, 1.460905, 1.1398282, 1.4430561, 1.1939296, 1.1381735, 1.6635091, + 1.6490394, 1.6500182, 1.3902475, 1.008461, 1.9365242, 2.2876377, 3.089638, 1.1397241, 1.4681413, 3.3965871, + 1.5260849, 1.049542, 1.5935006, 1.1174852, 1.0481784, 5.2985387, 1.0985225, 1.0598978, 1.0189661, 1.2935869, + 1.4722555, 1.2826989, 14.635293, 1.5838847, 1.0025667, 2.3498478, 1.299639, 1.5969574, 1.2975997, 1.8381778, + 2.225568, 1.3796017, 3.1218204, 1.1985259, 1.062268, 1.232086, 3.33148, 2.698554, 1.75201, 1.8022146, + 3.6252897, 1.555088, 2.9819634, 1.538595, 1.8745652, 2.2774959, 1.6797694, 3.285168, 1.7653251, 1.3326149, + 1.0421344, 2.1322103, 1.233007, 1.4419147, 1.830513, 2.4949594, 1.0608509, 1.5150113, 1.5959245, 1.5956188, + 1.0292267, 1.3140852, 1.9100422, 1.0028436, 1.0774403, 1.1151873, 3.0904734, 4.5474296, 1.2786152, 1.6690866, + 1.0220606, 4.535087, 1.0311446, 8.735879, 1.0244095, 1.2286763, 1.478632, 1.5755198, 1.0409536, 1.6235974, + 1.265021, 1.6181871, 1.3189417, 1.2804178, 1.0311304, 3.856672, 1.0116677, 1.4993623, 1.1592077, 2.351572, + 1.3590121, 3.2425852, 1.0693108, 1.0800452, 1.2970095, 1.7219952, 2.8042562, 2.4262295, 2.8338387, 1.1255085, + 1.1039813, 1.4060657, 1.9917006, 6.2740817, 3.4194438, 1.1583927, 5.4480124, 1.2032032, 1.5821041, 1.5764638, + 1.1962651, 1.1431328, 1.3477181, 1.2460603, 1.2549458, 1.0254912, 1.1202456, 1.1543705, 1.610861, 1.3153828, + 1.0802497, 1.2716275, 1.3452094, 3.3707037, 1.9843364, 1.0950323, 1.7915487, 1.0634785, 1.4080492, 1.0101941, + 1.2229196, 2.1236513, 1.2607071, 1.042675, 1.3490655, 1.1390712, 2.7973208, 1.1595898, 1.280305, 1.063449, + 1.2867571, 1.4145741, 1.8307613, 1.6477393, 1.8258283, 2.095605, 1.3786575, 1.2481759, 1.6145102, 1.2113106, + 3.2047076, 4.3113403, 1.7379376, 1.2299643, 1.0816432, 1.209291, 2.8207, 1.0557576, 1.2016557, 3.529495, + 1.5477203, 1.3191997, 3.4944863, 1.1685989, 1.434942, 3.5126603, 1.8122158, 3.340213, 5.6825895, 1.9519073, + 1.2609317, 2.4831924, 1.8927119, 6.112344, 1.4449657, 1.9117937, 1.4560969, 2.0415506, 1.3418432, 1.1156868, + 1.0470351, 2.142871, 1.2388346, 5.7468834, 1.445124, 3.5611172, 1.2169867, 1.1757392, 1.2371756, 1.410559, + 1.1206452, 3.5683503, 1.1265857, 1.0463002, 3.1673274, 2.0833313, 2.050845, 1.5429077, 1.5044786, 1.5392263, + 1.363263, 1.9692754, 2.2277496, 1.6173217, 2.5101044, 2.858326, 1.2254723, 2.3678184, 1.1815209, 1.0636415, + 1.6159158, 2.9052567, 1.4335803, 1.5625749, 3.8561795, 1.492623, 2.3061552, 1.2361494, 1.1781121, 1.676977, + 1.3648036, 1.149123, 1.0841854, 6.5463223, 2.6348033, 2.9643672, 1.0700364, 1.1452295, 1.891729, 1.5184994, + 1.052948, 1.4312478, 1.9280924, 1.2061955, 1.2969648, 1.6330626, 1.6077267, 1.0777256, 2.2470112, 1.0111618, + 7.9570127, 1.4408616, 1.7676815, 2.5022795, 1.1218908, 1.411382, 1.0013584, 1.6750052, 1.4535964, 2.1453426, + 1.3883002, 1.1564697, 1.7663026, 2.0479877, 1.6096337, 2.0966337, 1.0448049, 1.0405794, 2.4770708, 1.0449466, + 1.0079206, 1.1845361, 1.8006258, 6.4899225, 1.466217, 5.9511876, 1.9825312, 1.3426195, 4.1411357, 1.10988, + 1.6538581, 1.8192937, 1.0301098, 1.2401788, 2.3573508, 1.0376064, 1.2081897, 1.349493, 4.7187815, 1.4934176, + 1.0738198, 1.8974822, 1.5246674, 1.0304073, 2.2239099, 1.4762789, 5.2588334, 1.0094804, 1.5305506, 1.3125674, + 1.0601609, 1.3260825, 1.2184374, 1.3384945, 1.3794023, 1.2842343, 1.6205562, 1.1783227, 1.8784461, 7.044792, + 1.147203, 2.8018527, 8.651484, 1.701272, 1.4036112, 1.2032762, 15.606328, 1.4246153, 1.1033818, 1.9652922, + 1.3798854, 1.0885019, 2.623303, 1.2717961, 1.2585891, 1.2491969, 1.2129335, 3.5062659, 2.0723038, 1.025046, + 1.0297325, 1.1343406, 1.230634, 11.538348, 2.7084153, 1.5997908, 1.9358754, 2.6299598, 1.6894996, 2.0928538, + 1.0614158, 1.2649497, 2.2715538, 1.0437564, 4.378673, 1.1963537, 3.3216608, 2.4399796, 3.2643638, 1.019386, + 1.1030326, 2.440287, 1.2040377, 1.465539, 1.1466724, 1.23625, 1.025039, 1.1334429, 1.2962674, 1.0160799, + 1.0260187, 1.3998106, 1.8336923, 2.496935, 1.0268831, 1.9066058, 1.3436843, 2.409701, 2.3649251, 1.0945803, + 2.3113947, 1.8842138, 1.1469865, 1.4204135, 1.5373335, 1.0120773, 1.0007294, 1.1080137, 2.6412387, 1.1200613, + 1.0666404, 1.7312175, 1.3324492, 1.1583722, 2.1911502, 1.3767779, 1.1383393, 1.0232879, 1.108565, 2.1510794, + 3.1314306, 1.0464265, 1.2709162, 1.0645729, 1.5227332, 1.4165069, 1.1873496, 1.2101185, 2.592321, 1.0823869, + 1.1138709, 1.662803, 1.1120676, 1.3381414, 3.4591386, 3.2087011, 7.5621133, 1.6906779, 1.3260413, 1.5424409, + 1.080458, 1.0493588, 13.372915, 5.7406483, 1.43819, 1.0545444, 1.1447785, 1.4517193, 1.5938518, 1.0738907, + 1.4954064, 1.1600846, 1.0183429, 1.1102921, 1.3087242, 1.0437984, 2.6376863, 1.0964385, 2.3703077, 1.3817655, + 2.463904, 1.4865454, 1.0131879, 1.0934275, 1.0109037, 1.5556259, 4.932284, 2.2834036, 2.13472, 1.2747829, + 1.3591629, 1.2710228, 1.1892785, 1.2652526, 1.5493689, 1.7920588, 1.7171586, 1.7451843, 1.2250627, 1.2985725, + 1.1265002, 1.9431348, 1.5639647, 1.3114859, 2.0580611, 1.0458012, 8.679875, 1.052975, 7.7058396, 2.1394007, + 1.9267383, 2.5251806, 1.0602367, 1.2142512, 4.0718765, 1.0296791, 1.0694641, 1.6544152, 1.0555353, 1.1022673, + 1.1238624, 1.4975891, 1.360345, 1.946154, 1.1914523, 2.8442073, 1.1309273, 1.3646202, 1.0097046, 1.9232479, + 1.4124821, 2.8230648, 1.0690129, 1.0964175, 1.1216284, 1.1700155, 1.7266308, 1.2081257, 1.3215622, 2.7799578, + 1.354491, 1.4508772, 1.38787, 1.136249, 1.6166995, 1.0731878, 1.1354407, 1.9153483, 1.1877631, 5.129723, + 1.4402089, 1.3740011, 1.0785251, 1.3433695, 3.184171, 2.2259936, 2.1731458, 1.3236732, 1.9115276, 1.4698606, + 1.7407284, 1.4935143, 1.0831035, 1.53221, 1.1870555, 4.5793757, 1.1710228, 1.3261391, 1.7842731, 1.4781446, + 1.0256082, 2.1267269, 1.2367013, 1.0376652, 1.8538822, 1.2253274, 1.1220074, 1.0871813, 1.0854336, 1.0338845, + 1.0106416, 1.1135662, 1.2680652, 1.2848178, 5.2989373, 7.149812, 1.4292521, 1.1643043, 1.1189762, 2.7674034, + 1.4375502, 1.6797514, 1.1195164, 9.813601, 2.2462554, 2.5669067, 4.183121, 1.3082682, 1.2363808, 1.4108802, + 1.2486367, 6.0103245, 1.0744752, 2.956876, 8.572339, 1.0991303, 1.7924088, 1.410575, 1.3510141, 3.072228, + 1.1708659, 1.0062462, 1.1452183, 2.237072, 3.510853, 1.1011289, 1.3245777, 1.7480283, 1.0790907, 3.335536, + 1.3010768, 1.4218552, 1.3359499, 39.87803, 4.1562276, 1.2451257, 1.515071, 1.1710352, 1.3147447, 1.0843279, + 1.5225531, 1.6185967 +}; + +static const float s_ref_in_0[4032] = { + 0.14618397, 0.2867409, 0.94878876, 0.8778479, 0.2423389, 0.9472041, 0.5261754, 0.72053826, 0.058787346, 0.49566472, + 0.12019169, 0.6360508, 0.87616384, 0.8672563, 0.1648854, 0.48972738, 0.5384394, 0.34197867, 0.24381447, 0.9071003, + 0.23109055, 0.5115583, 0.6859114, 0.05858493, 0.58334756, 0.48981428, 0.78869855, 0.81242836, 0.26231766, 0.30784774, + 0.6578913, 0.29020727, 0.17950463, 0.1269033, 0.049821377, 0.5024359, 0.9429736, 0.57450294, 0.79509366, 0.91042876, + 0.20761216, 0.25200891, 0.637131, 0.77253544, 0.59981537, 0.50379455, 0.8741013, 0.80215263, 0.67548287, 0.48758972, + 0.26549864, 0.3976283, 0.72940314, 0.11589944, 0.52574766, 0.17078555, 0.3960458, 0.6873716, 0.1692419, 0.33227956, + 0.58960617, 0.52057993, 0.1514678, 0.44508815, 0.9472834, 0.20103192, 0.71621895, 0.85655403, 0.36587036, 0.13266957, + 0.5188894, 0.014623523, 0.060558796, 0.5228709, 0.26606596, 0.60790765, 0.8369957, 0.45134723, 0.42153955, 0.6357393, + 0.8697103, 0.003365159, 0.46691394, 0.13539338, 0.32760108, 0.6707729, 0.15996289, 0.8058306, 0.30049706, 0.029111505, + 0.017216086, 0.20062315, 0.6449708, 0.13029003, 0.8607447, 0.81735134, 0.8169619, 0.15476966, 0.44087553, 0.79855084, + 0.9356158, 0.719545, 0.62401736, 0.61350656, 0.9779434, 0.94396436, 0.4328307, 0.5625764, 0.83936477, 0.9993535, + 0.23672128, 0.603428, 0.8039149, 0.19707918, 0.58137774, 0.7182447, 0.31236553, 0.48389184, 0.95724225, 0.18444312, + 0.2171359, 0.90245664, 0.05480492, 0.072820544, 0.31941426, 0.41292393, 0.82136035, 0.58180976, 0.18805873, 0.65741956, + 0.3595364, 0.860726, 0.41476429, 0.03501463, 0.7657932, 0.71543825, 0.5637342, 0.62986803, 0.14593697, 0.7386236, + 0.6021682, 0.65864253, 0.08243656, 0.47732103, 0.3819188, 0.1258856, 0.4892949, 0.058517218, 0.30291712, 0.42110872, + 0.4341458, 0.2811017, 0.2605071, 0.124412894, 0.4566865, 0.954705, 0.14903533, 0.8787432, 0.90299904, 0.32592833, + 0.4590472, 0.25427723, 0.2657826, 0.41287947, 0.9071531, 0.16873443, 0.3145212, 0.41932917, 0.63518834, 0.46207833, + 0.073432446, 0.8294289, 0.021820664, 0.4430946, 0.025459051, 0.7777184, 0.9222456, 0.49163663, 0.06992519, 0.956108, + 0.6156266, 0.32717967, 0.839661, 0.09685385, 0.9864936, 0.9252995, 0.8257799, 0.84512436, 0.63323104, 0.9636568, + 0.15649354, 0.8017216, 0.7045872, 0.7690811, 0.48541582, 0.9984547, 0.9750502, 0.39986396, 0.43193328, 0.0460608, + 0.28557122, 0.97732973, 0.07401228, 0.41481495, 0.085512996, 0.51483774, 0.1309334, 0.98234296, 0.9108467, 0.15338075, + 0.7435571, 0.29864597, 0.56746244, 0.8695605, 0.13984585, 0.14609063, 0.25105214, 0.32714355, 0.12763655, 0.33177567, + 0.5357561, 0.4887185, 0.34666252, 0.83220375, 0.9390613, 0.4112568, 0.5319817, 0.6511208, 0.5284251, 0.563903, + 0.6482848, 0.689553, 0.19241643, 0.053543568, 0.39434075, 0.037158966, 0.7661253, 0.93058896, 0.6009239, 0.6207708, + 0.40320694, 0.26619172, 0.6249912, 0.74605584, 0.15035391, 0.49252915, 0.05867827, 0.41700006, 0.74616814, 0.02242446, + 0.6809459, 0.9103576, 0.71145296, 0.29716074, 0.9954051, 0.83517396, 0.7848995, 0.06800139, 0.081447005, 0.3900107, + 0.3762287, 0.60312164, 0.013373733, 0.4307649, 0.8924992, 0.45379794, 0.7411636, 0.112737775, 0.2916696, 0.969517, + 0.42696023, 0.5111892, 0.9314183, 0.6346985, 0.1391784, 0.8552675, 0.65765023, 0.46423638, 0.020133615, 0.6428442, + 0.80327594, 0.7592454, 0.253088, 0.7462336, 0.45896542, 0.9417676, 0.5948856, 0.55398476, 0.03802347, 0.2776543, + 0.9198183, 0.00032746792, 0.86656225, 0.31015027, 0.5747558, 0.23492754, 0.26090574, 0.07140434, 0.36459506, 0.7736604, + 0.1276921, 0.18336308, 0.1693815, 0.32433724, 0.49980354, 0.3072945, 0.7493602, 0.3428545, 0.55652153, 0.9534029, + 0.91336083, 0.30541372, 0.49116087, 0.4778931, 0.23059225, 0.9578333, 0.9327779, 0.29333782, 0.3347752, 0.16005051, + 0.6249747, 0.73005545, 0.7008352, 0.6531007, 0.15892601, 0.44973242, 0.65922654, 0.28918576, 0.4395789, 0.3349954, + 0.12681282, 0.48668742, 0.94259834, 0.41928017, 0.57942164, 0.45756853, 0.70084417, 0.28012264, 0.7145947, 0.46183324, + 0.36994267, 0.5031431, 0.11192584, 0.824425, 0.92571914, 0.59422934, 0.80167735, 0.28721154, 0.16703892, 0.93913484, + 0.8540288, 0.14778805, 0.24213731, 0.45836437, 0.53182733, 0.03056407, 0.31948137, 0.8096216, 0.82119024, 0.31052494, + 0.289186, 0.55651975, 0.22405207, 0.9713429, 0.49175406, 0.77020943, 0.61855316, 0.8665271, 0.9920796, 0.47228253, + 0.44980776, 0.24647903, 0.20559967, 0.99461234, 0.5335778, 0.24434805, 0.44482672, 0.47276187, 0.6863786, 0.36850452, + 0.3158437, 0.64940166, 0.8421205, 0.25340295, 0.14546978, 0.0072436333, 0.065300345, 0.48591185, 0.5629468, 0.8309349, + 0.8610606, 0.46136558, 0.24149549, 0.6567795, 0.032738566, 0.015084028, 0.16856349, 0.12601483, 0.5879525, 0.8175335, + 0.53713465, 0.22262573, 0.9059044, 0.8211371, 0.6597762, 0.8800945, 0.77304316, 0.7794106, 0.38948512, 0.21919072, + 0.3542298, 0.15475535, 0.10005748, 0.6737132, 0.38270152, 0.70252776, 0.810074, 0.91325283, 0.882632, 0.9473468, + 0.9635247, 0.2603296, 0.17242336, 0.103046775, 0.501207, 0.47481894, 0.69623816, 0.8591964, 0.9348732, 0.9875964, + 0.37924123, 0.7303299, 0.42844343, 0.07529557, 0.44496644, 0.30598664, 0.17823279, 0.09806478, 0.5806906, 0.9429842, + 0.49712443, 0.38580143, 0.19739902, 0.5290296, 0.03451276, 0.08942807, 0.5878093, 0.48074055, 0.48907018, 0.89467144, + 0.5711397, 0.74236894, 0.04253781, 0.9881815, 0.06397569, 0.5952277, 0.9709308, 0.5870209, 0.06988156, 0.54104555, + 0.5404321, 0.71460843, 0.6962935, 0.79231334, 0.27976584, 0.31427515, 0.9947226, 0.95170486, 0.354774, 0.93269014, + 0.36218858, 0.5351994, 0.99461067, 0.3620366, 0.758438, 0.70167446, 0.47475457, 0.16990721, 0.18677175, 0.8244853, + 0.46281934, 0.08556199, 0.033439517, 0.17382324, 0.991119, 0.3267039, 0.8480073, 0.5201738, 0.34102035, 0.5824523, + 0.84653246, 0.042194605, 0.8293911, 0.3494531, 0.851966, 0.3163873, 0.20804358, 0.15729833, 0.5969641, 0.3198173, + 0.6254301, 0.5915395, 0.51273406, 0.2708012, 0.90464497, 0.7401856, 0.025305152, 0.6108351, 0.79811144, 0.24850953, + 0.067798495, 0.86463344, 0.2972051, 0.25878572, 0.46420634, 0.732582, 0.5166428, 0.7979208, 0.9001385, 0.14882588, + 0.2632475, 0.51443636, 0.9458604, 0.59612334, 0.25676024, 0.8521848, 0.5349784, 0.45656395, 0.16473532, 0.17140996, + 0.6769781, 0.2631886, 0.2839347, 0.29820228, 0.41069508, 0.5356455, 0.71746135, 0.35698152, 0.05139494, 0.13131392, + 0.816463, 0.61201096, 0.2239778, 0.52262163, 0.058599353, 0.064409494, 0.942973, 0.022078633, 0.17818701, 0.23950827, + 0.8534074, 0.6814637, 0.9383421, 0.6421218, 0.02247858, 0.340281, 0.91020954, 0.7773018, 0.90180504, 0.5116112, + 0.1472249, 0.81342924, 0.36924422, 0.36140895, 0.3380972, 0.64267194, 0.82837903, 0.67067564, 0.36155927, 0.8257859, + 0.83122087, 0.20373833, 0.29003596, 0.2440989, 0.22686589, 0.9406892, 0.8452642, 0.3422681, 0.6200223, 0.3502084, + 0.21136594, 0.057701826, 0.8630605, 0.085130334, 0.92665446, 0.75407183, 0.6826974, 0.97964764, 0.4121455, 0.75868344, + 0.657727, 0.9192002, 0.9046594, 0.17510748, 0.59209025, 0.04465711, 0.6342207, 0.6488582, 0.91381216, 0.4303838, + 0.32329273, 0.2554363, 0.23527026, 0.83551, 0.48379838, 0.3679831, 0.1266936, 0.40701914, 0.04337871, 0.7203393, + 0.7459991, 0.95934427, 0.78847814, 0.54069805, 0.76192844, 0.30653572, 0.38274896, 0.15430355, 0.6223062, 0.75912344, + 0.41758096, 0.57099426, 0.062910795, 0.16951632, 0.63413596, 0.25997055, 0.64580345, 0.80837536, 0.17436075, 0.52744627, + 0.955565, 0.51343966, 0.62880766, 0.80154395, 0.57402396, 0.5378729, 0.2837156, 0.08935535, 0.40625834, 0.90769875, + 0.6222819, 0.99333835, 0.23151124, 0.4399693, 0.8487252, 0.44415307, 0.48564982, 0.63850284, 0.82027614, 0.6349807, + 0.5439743, 0.28974473, 0.1226114, 0.9292244, 0.14872587, 0.12393737, 0.9353409, 0.9837874, 0.48682022, 0.6605383, + 0.29459906, 0.5734551, 0.6143441, 0.25978744, 0.36347532, 0.77854705, 0.32766378, 0.614403, 0.9644079, 0.11686623, + 0.051603794, 0.95754385, 0.46563375, 0.44404888, 0.17785072, 0.53456295, 0.39662576, 0.20839465, 0.18283057, 0.12542367, + 0.5992795, 0.44598722, 0.5507462, 0.13081741, 0.24746835, 0.70167947, 0.32917213, 0.8043244, 0.19199884, 0.07340634, + 0.7442012, 0.88634276, 0.106375694, 0.38769078, 0.55993474, 0.027311444, 0.8926519, 0.4126073, 0.43509483, 0.6757555, + 0.7970394, 0.39435184, 0.0713017, 0.9555242, 0.6644647, 0.2204603, 0.7532644, 0.46175587, 0.15524721, 0.9886024, + 0.6884768, 0.85867834, 0.83411133, 0.17189991, 0.834586, 0.21264017, 0.8354089, 0.18901348, 0.6105324, 0.7500992, + 0.4349656, 0.38917565, 0.66454935, 0.07188952, 0.01780808, 0.63985014, 0.7271215, 0.9278964, 0.018743634, 0.6934997, + 0.4796555, 0.005860567, 0.7641336, 0.36682153, 0.2765975, 0.055095434, 0.44382596, 0.85261595, 0.25821137, 0.81936467, + 0.4753747, 0.46313643, 0.58951306, 0.6862515, 0.4983195, 0.030605793, 0.2909112, 0.26098228, 0.6158941, 0.497563, + 0.68160117, 0.3560202, 0.5948249, 0.59420073, 0.014111161, 0.70223486, 0.53195155, 0.015529633, 0.7690458, 0.6813828, + 0.86218953, 0.7945342, 0.8031179, 0.6942755, 0.12994158, 0.6324631, 0.70717144, 0.24366546, 0.4453174, 0.23089767, + 0.8018273, 0.9510478, 0.19186187, 0.5064938, 0.2818396, 0.7556248, 0.8412019, 0.02706194, 0.36871946, 0.31256533, + 0.07072449, 0.47538555, 0.5169723, 0.58680916, 0.2745508, 0.44358885, 0.98345363, 0.084415555, 0.94610643, 0.90275955, + 0.56138587, 0.19335258, 0.111162424, 0.48781037, 0.83486354, 0.7152647, 0.7376859, 0.22149491, 0.3911556, 0.9310167, + 0.2752142, 0.6454352, 0.6867063, 0.3670882, 0.697564, 0.9827224, 0.65915406, 0.16054177, 0.76347816, 0.8311596, + 0.45128322, 0.047348976, 0.04549074, 0.11028159, 0.7409146, 0.72053325, 0.20907164, 0.4394951, 0.4722756, 0.40478623, + 0.78474116, 0.44272053, 0.27849746, 0.7060088, 0.1260184, 0.76329994, 0.7949623, 0.12067616, 0.5728675, 0.2810943, + 0.6756816, 0.7156848, 0.14772165, 0.0797075, 0.23348069, 0.44562554, 0.6477512, 0.4411887, 0.70219386, 0.7154974, + 0.33100903, 0.08568573, 0.5068952, 0.40485716, 0.011946917, 0.19870389, 0.65183485, 0.34053588, 0.014977455, 0.36772335, + 0.91862583, 0.54903805, 0.23894227, 0.111138225, 0.76426375, 0.6404178, 0.25521934, 0.88357925, 0.39441752, 0.11788273, + 0.24329996, 0.15256369, 0.9619615, 0.52103984, 0.15511465, 0.14600134, 0.4528278, 0.0041983128, 0.5283141, 0.23477387, + 0.6610452, 0.49740827, 0.4481287, 0.9431176, 0.6245978, 0.29591775, 0.8304014, 0.4774865, 0.94169974, 0.7296426, + 0.32872498, 0.21623337, 0.31946468, 0.031734586, 0.25602412, 0.4922452, 0.11047828, 0.83048904, 0.6758214, 0.18131244, + 0.69741976, 0.87804425, 0.31939888, 0.15764487, 0.09893918, 0.009761333, 0.5156286, 0.20970821, 0.35494757, 0.09442341, + 0.49190474, 0.32849014, 0.6588496, 0.3740158, 0.40432227, 0.03463137, 0.75054336, 0.21622634, 0.056013107, 0.746395, + 0.9980216, 0.49939704, 0.6625389, 0.016431093, 0.13236976, 0.7328259, 0.56832695, 0.35170567, 0.6608324, 0.8765904, + 0.42412055, 0.4276601, 0.72216094, 0.7539902, 0.061876297, 0.5732645, 0.08953977, 0.19347811, 0.8963697, 0.11450446, + 0.29080236, 0.11356735, 0.68413234, 0.9422358, 0.6160947, 0.34431648, 0.881781, 0.5902381, 0.98752284, 0.8230339, + 0.22673213, 0.019929767, 0.33634377, 0.5873562, 0.47152317, 0.47071123, 0.71857977, 0.25593734, 0.6894473, 0.5973226, + 0.8476708, 0.33640194, 0.27925384, 0.4054302, 0.85734904, 0.15632057, 0.15821159, 0.62935865, 0.6540277, 0.62904286, + 0.84898174, 0.15478921, 0.8864474, 0.9519924, 0.29451346, 0.67696726, 0.12704432, 0.31840634, 0.9285346, 0.44603455, + 0.16312885, 0.8684312, 0.30971074, 0.7599555, 0.19094026, 0.012725472, 0.354509, 0.81747174, 0.49734163, 0.025734782, + 0.12851524, 0.093672276, 0.6405555, 0.18543065, 0.58747256, 0.71158063, 0.17222822, 0.048950434, 0.08505535, 0.8416915, + 0.33020413, 0.09960747, 0.25812685, 0.33848286, 0.5805198, 0.07212055, 0.38205433, 0.30827212, 0.27770185, 0.8527981, + 0.55425227, 0.7883303, 0.57440233, 0.1511774, 0.37137794, 0.24041712, 0.279397, 0.97124946, 0.1144166, 0.9279351, + 0.32142508, 0.6315216, 0.8040507, 0.79869354, 0.8604784, 0.43671775, 0.3609692, 0.3727386, 0.81151724, 0.3273605, + 0.8342643, 0.78927994, 0.7386817, 0.21210217, 0.607185, 0.074275374, 0.22218573, 0.72348917, 0.6727958, 0.36972976, + 0.041228294, 0.9265106, 0.5363116, 0.9358785, 0.57502234, 0.24857318, 0.2824955, 0.7045808, 0.34444773, 0.7045897, + 0.9218527, 0.9551153, 0.5743766, 0.7627282, 0.61280906, 0.10266864, 0.6106193, 0.04589486, 0.72128665, 0.89373183, + 0.95856214, 0.39901018, 0.72399974, 0.15778804, 0.43795228, 0.84974074, 0.21161151, 0.96944284, 0.13352, 0.46957636, + 0.478243, 0.015688539, 0.605837, 0.97211254, 0.52398705, 0.6332265, 0.5095302, 0.16539657, 0.8218174, 0.015690207, + 0.31285608, 0.6918832, 0.03302002, 0.28348088, 0.9560195, 0.29644978, 0.1871177, 0.92262244, 0.09197247, 0.13974404, + 0.69789135, 0.029397845, 0.98480356, 0.19825423, 0.29304338, 0.38458562, 0.5714431, 0.68952703, 0.7567693, 0.50896156, + 0.2000227, 0.51699114, 0.80132234, 0.5298228, 0.316535, 0.2887758, 0.92835784, 0.35692036, 0.52835834, 0.20589733, + 0.7112398, 0.27981007, 0.5109384, 0.3547132, 0.6262708, 0.4847225, 0.42585826, 0.98732257, 0.84461117, 0.21232617, + 0.53845537, 0.67480576, 0.6037221, 0.53723097, 0.5940857, 0.44536424, 0.08896923, 0.6166723, 0.22585225, 0.6198033, + 0.47839844, 0.83490825, 0.60896194, 0.6491686, 0.35188508, 0.71943736, 0.4374386, 0.27780712, 0.2398318, 0.5398191, + 0.72725236, 0.7961432, 0.5676062, 0.29175377, 0.1403892, 0.83639014, 0.5130267, 0.748925, 0.44885826, 0.02487421, + 0.8026062, 0.655838, 0.8067317, 0.6445738, 0.33280754, 0.23956144, 0.5526843, 0.9612994, 0.277331, 0.4771024, + 0.24758732, 0.73545337, 0.839947, 0.5268049, 0.028115869, 0.04903519, 0.57568324, 0.6612463, 0.61287296, 0.40442133, + 0.2977829, 0.85185266, 0.6052873, 0.38442016, 0.56634676, 0.7382108, 0.75316393, 0.90563583, 0.919719, 0.6332716, + 0.08157194, 0.26395345, 0.22111869, 0.117441416, 0.340047, 0.91731584, 0.79152966, 0.22739625, 0.8944266, 0.52084243, + 0.29368675, 0.6366463, 0.8816589, 0.03091538, 0.45720637, 0.8618498, 0.55700827, 0.34830284, 0.73910964, 0.7620152, + 0.43112147, 0.36171293, 0.5104506, 0.44388855, 0.01574421, 0.9944941, 0.91709507, 0.24325037, 0.6865269, 0.86856294, + 0.7012013, 0.5565945, 0.41113782, 0.683805, 0.5298022, 0.53780174, 0.18666196, 0.5736418, 0.76191497, 0.75119495, + 0.35070503, 0.6711445, 0.8153758, 0.7853663, 0.85426176, 0.84250987, 0.087068915, 0.4668008, 0.47638965, 0.75997984, + 0.71615434, 0.90159905, 0.78579473, 0.9680548, 0.71292746, 0.5589421, 0.18893087, 0.17948163, 0.115719676, 0.9197506, + 0.08338475, 0.616781, 0.804981, 0.5508243, 0.039471745, 0.55158305, 0.13551891, 0.855652, 0.89375615, 0.69537234, + 0.08188152, 0.6223254, 0.8552971, 0.9302217, 0.5388168, 0.10642862, 0.85319805, 0.7420707, 0.10802531, 0.9671242, + 0.718472, 0.87362397, 0.7683494, 0.82467294, 0.5873301, 0.66737235, 0.038029194, 0.2899145, 0.96235776, 0.50241756, + 0.5470295, 0.30472577, 0.37776458, 0.2669505, 0.698493, 0.22798026, 0.97103655, 0.3354299, 0.24576819, 0.047673106, + 0.52921, 0.8117347, 0.98924935, 0.73586464, 0.37598693, 0.39350164, 0.81917846, 0.998649, 0.6417353, 0.8903322, + 0.46651673, 0.23584998, 0.33319163, 0.79923236, 0.83747625, 0.5343089, 0.7443042, 0.78657484, 0.738397, 0.37031865, + 0.0030778646, 0.37311518, 0.48297358, 0.54841936, 0.24646723, 0.11862123, 0.59019625, 0.15992844, 0.5449046, 0.3090706, + 0.4943446, 0.54624724, 0.17694855, 0.7658179, 0.22369087, 0.8557756, 0.88607943, 0.42113984, 0.091416, 0.52473176, + 0.8515595, 0.8438989, 0.67039955, 0.24939859, 0.94291914, 0.08018947, 0.31803405, 0.8203814, 0.98842347, 0.75908494, + 0.015782475, 0.19791031, 0.63223255, 0.31199002, 0.62816715, 0.6786376, 0.57546043, 0.07393181, 0.6122651, 0.15861511, + 0.52861166, 0.5836936, 0.064639926, 0.9265189, 0.18180525, 0.5943655, 0.51276624, 0.042227626, 0.089913964, 0.18521214, + 0.72757673, 0.501415, 0.8572358, 0.5705321, 0.7490289, 0.17366755, 0.36672843, 0.6178845, 0.2091974, 0.94561493, + 0.76138747, 0.35082257, 0.19139922, 0.06558108, 0.37775517, 0.22158921, 0.77584445, 0.29588556, 0.13562012, 0.24709344, + 0.03603387, 0.72824323, 0.29223502, 0.03518009, 0.3911494, 0.4981786, 0.024398446, 0.3603208, 0.10245907, 0.2578137, + 0.4318664, 0.04043913, 0.7485409, 0.9726323, 0.62593293, 0.5647639, 0.055208445, 0.9240315, 0.41791523, 0.19060326, + 0.042542458, 0.05962789, 0.69759905, 0.7579099, 0.76185393, 0.12025678, 0.33541143, 0.001075387, 0.23920286, 0.90003896, + 0.5296136, 0.0028681755, 0.78455734, 0.23484981, 0.70681477, 0.02527225, 0.42518055, 0.05063665, 0.022149444, 0.75088584, + 0.9095608, 0.94822466, 0.35212266, 0.33531058, 0.27303326, 0.7847185, 0.5990069, 0.9269346, 0.11433494, 0.7002108, + 0.43017793, 0.37953484, 0.48553193, 0.08081639, 0.32281876, 0.01116991, 0.49833214, 0.21468651, 0.4632269, 0.7275182, + 0.9304296, 0.98571086, 0.123325825, 0.8939614, 0.98891366, 0.7725787, 0.3819965, 0.090581775, 0.88050497, 0.19276714, + 0.7276703, 0.5255976, 0.87660396, 0.009100199, 0.8593335, 0.5782666, 0.7234534, 0.028552294, 0.9157082, 0.5533469, + 0.3717202, 0.6486821, 0.54823554, 0.56534064, 0.31027877, 0.28286624, 0.79128885, 0.5542624, 0.4781673, 0.43149328, + 0.5684221, 0.49034524, 0.85906816, 0.806088, 0.67974794, 0.4946109, 0.7554163, 0.14170301, 0.50648475, 0.0582788, + 0.49654472, 0.8766638, 0.6141406, 0.45045555, 0.31969285, 0.71179783, 0.8709283, 0.6920043, 0.025787711, 0.7813592, + 0.8946247, 0.13359535, 0.53838336, 0.49897218, 0.8130735, 0.16234899, 0.27389753, 0.5241703, 0.22068858, 0.6978365, + 0.5904192, 0.38652158, 0.10600114, 0.12798262, 0.15990579, 0.88547266, 0.93217814, 0.68338037, 0.8671917, 0.7152933, + 0.68956625, 0.14015365, 0.33275032, 0.90480506, 0.82067955, 0.99259865, 0.19425917, 0.67310965, 0.6042056, 0.04504621, + 0.95180774, 0.93462515, 0.082999825, 0.1489985, 0.42435837, 0.666795, 0.5135591, 0.42355657, 0.39397228, 0.6141639, + 0.37718678, 0.15454769, 0.49552345, 0.34481514, 0.6977755, 0.011367559, 0.611006, 0.5113392, 0.8001766, 0.8808273, + 0.122484446, 0.29189074, 0.17856741, 0.98978746, 0.1437614, 0.73477244, 0.61726964, 0.06380391, 0.91560566, 0.97842276, + 0.75268006, 0.78507257, 0.41300213, 0.3555951, 0.8253411, 0.5657227, 0.33011603, 0.8406342, 0.040947795, 0.52445614, + 0.61388946, 0.1996162, 0.9019338, 0.23502958, 0.32894504, 0.57632315, 0.54247403, 0.14475358, 0.49748206, 0.079687834, + 0.08797252, 0.4425949, 0.20791495, 0.43396866, 0.6632776, 0.6829692, 0.9401679, 0.041894674, 0.83087134, 0.6552795, + 0.02779305, 0.78489006, 0.9712775, 0.20532, 0.89487445, 0.93043315, 0.70217776, 0.871485, 0.07885587, 0.23344958, + 0.43122983, 0.17272627, 0.7453574, 0.13840139, 0.38422048, 0.8079119, 0.5059979, 0.34371614, 0.90171206, 0.84900105, + 0.6326765, 0.25811613, 0.049816847, 0.82696414, 0.68981624, 0.071273565, 0.14720738, 0.35850942, 0.5725751, 0.06359327, + 0.24401522, 0.74947214, 0.9767562, 0.030699134, 0.47930956, 0.96732354, 0.95353067, 0.5626503, 0.44130802, 0.33570445, + 0.95328057, 0.31819034, 0.33608043, 0.43649864, 0.97357833, 0.51410115, 0.80121577, 0.30437458, 0.81207097, 0.47390246, + 0.6694138, 0.2956494, 0.015133619, 0.17068005, 0.6703154, 0.26955235, 0.6318829, 0.52841294, 0.13756728, 0.27718115, + 0.3768357, 0.8991393, 0.20209599, 0.5726234, 0.070804715, 0.79802024, 0.1963607, 0.3506465, 0.915431, 0.46312678, + 0.3309301, 0.47637522, 0.46132588, 0.01874721, 0.4520576, 0.75304234, 0.053877234, 0.80086064, 0.7810049, 0.4971987, + 0.49297273, 0.2883451, 0.30665278, 0.0493623, 0.89043176, 0.988698, 0.19157207, 0.25613952, 0.29669082, 0.7936405, + 0.09355295, 0.6040616, 0.7927896, 0.9343045, 0.5342717, 0.25656772, 0.13076806, 0.9430548, 0.32580793, 0.92087424, + 0.35988677, 0.2800274, 0.07443559, 0.67547905, 0.3707763, 0.49510753, 0.48547828, 0.3660332, 0.987169, 0.1791482, + 0.52333426, 0.02522552, 0.7719941, 0.11929548, 0.9683417, 0.17846775, 0.7042968, 0.006574869, 0.06395185, 0.49776518, + 0.018683076, 0.43396664, 0.13850296, 0.41140115, 0.13274002, 0.29551983, 0.25847626, 0.13167393, 0.15831089, 0.8580946, + 0.25644636, 0.11476886, 0.46916175, 0.7050644, 0.05730605, 0.64031506, 0.12440121, 0.8967531, 0.062045813, 0.32802165, + 0.46647608, 0.06457937, 0.27824306, 0.5225817, 0.79185855, 0.6242821, 0.26541054, 0.040977836, 0.78520536, 0.046996593, + 0.53879666, 0.9759579, 0.5412892, 0.45345402, 0.63502705, 0.85081875, 0.07262981, 0.17546833, 0.70350015, 0.91222584, + 0.1751529, 0.3063239, 0.34686363, 0.30367815, 0.55981255, 0.19336653, 0.75074804, 0.5322423, 0.9560909, 0.8808918, + 0.8719697, 0.27360296, 0.88394284, 0.44862592, 0.9761331, 0.5863266, 0.73995256, 0.23181856, 0.030474424, 0.10563278, + 0.85380185, 0.9586954, 0.585382, 0.9102448, 0.8255738, 0.38647103, 0.57847536, 0.94781435, 0.48173237, 0.3026744, + 0.43523872, 0.5172758, 0.2824775, 0.6265929, 0.00547421, 0.41751218, 0.3776729, 0.06383693, 0.043819547, 0.0077608824, + 0.64894056, 0.68476844, 0.7487658, 0.604094, 0.3441106, 0.65578127, 0.40794468, 0.9540199, 0.9876665, 0.54194736, + 0.81349385, 0.8960943, 0.47141564, 0.1728189, 0.023175716, 0.5964273, 0.47476602, 0.8971374, 0.31239295, 0.0068258047, + 0.82177603, 0.13877666, 0.010460615, 0.01832056, 0.7250948, 0.4211986, 0.15723062, 0.3607731, 0.31589437, 0.15157664, + 0.9086088, 0.66513, 0.71218777, 0.82628787, 0.91778207, 0.3773092, 0.6409985, 0.9112637, 0.7706226, 0.40254426, + 0.35741782, 0.6029804, 0.22935736, 0.33165526, 0.6333555, 0.82496476, 0.030705571, 0.63878965, 0.31329453, 0.58998036, + 0.71059203, 0.94953597, 0.046227813, 0.9365388, 0.6840464, 0.28607416, 0.4500121, 0.6866846, 0.5909487, 0.11210072, + 0.1103307, 0.42058563, 0.2368058, 0.008660674, 0.89059186, 0.21762168, 0.7351476, 0.9993504, 0.9959886, 0.1063391, + 0.09356964, 0.6624726, 0.18301463, 0.696224, 0.7050519, 0.96778977, 0.41426873, 0.2221731, 0.15795946, 0.06914687, + 0.69111, 0.083158135, 0.7456162, 0.92250824, 0.041266203, 0.09774029, 0.11052513, 0.4053638, 0.83990693, 0.5996897, + 0.8906064, 0.8555409, 0.78848875, 0.28732538, 0.7476531, 0.030461788, 0.8049388, 0.7106006, 0.99458826, 0.120414615, + 0.618992, 0.732239, 0.2739781, 0.40457046, 0.53054225, 0.31508696, 0.51425946, 0.18728113, 0.2363702, 0.08930063, + 0.52513695, 0.35101533, 0.14695764, 0.22912455, 0.9037862, 0.12885118, 0.12467635, 0.5806235, 0.44423962, 0.8083011, + 0.6481397, 0.5311742, 0.9270346, 0.40661597, 0.10972333, 0.7266029, 0.23428237, 0.6322063, 0.035403013, 0.7842696, + 0.70838356, 0.15987456, 0.033396363, 0.6620045, 0.46336937, 0.17668915, 0.5044614, 0.109010816, 0.64547443, 0.18090737, + 0.23758185, 0.74317896, 0.6342877, 0.9855989, 0.07065606, 0.390517, 0.97366583, 0.3847704, 0.32387924, 0.14415443, + 0.72286177, 0.6640918, 0.21319008, 0.35465574, 0.04106164, 0.6930089, 0.38214076, 0.18263817, 0.120888114, 0.91627276, + 0.48528802, 0.73559034, 0.4476652, 0.74854374, 0.70258737, 0.15923786, 0.34445202, 0.7570344, 0.5644314, 0.5534462, + 0.76895976, 0.3592192, 0.3036486, 0.6397557, 0.56466424, 0.60368705, 0.3774371, 0.86235917, 0.34447408, 0.5552199, + 0.44478714, 0.8028388, 0.14580369, 0.056139708, 0.86080873, 0.558231, 0.32234323, 0.842317, 0.7524468, 0.4838388, + 0.9507102, 0.71060336, 0.003720522, 0.041124582, 0.6000831, 0.095710635, 0.89782095, 0.66741765, 0.63313246, 0.41027045, + 0.28755915, 0.6291976, 0.13256586, 0.45300066, 0.962762, 0.8540492, 0.8685849, 0.8112565, 0.26700842, 0.5497582, + 0.3821007, 0.14665675, 0.32487833, 0.51548433, 0.33827555, 0.31055593, 0.34621072, 0.5538776, 0.3008393, 0.67891276, + 0.16333401, 0.559163, 0.8063803, 0.15381634, 0.6390219, 0.9391507, 0.016887546, 0.83752024, 0.6055795, 0.619449, + 0.5570717, 0.16456771, 0.58242726, 0.38279378, 0.069501996, 0.9105377, 0.5580727, 0.988559, 0.6141422, 0.07285142, + 0.6663115, 0.9232218, 0.19583762, 0.3639723, 0.43874633, 0.9679744, 0.63199234, 0.82048273, 0.5863162, 0.9389484, + 0.38804603, 0.3196013, 0.71210074, 0.37190568, 0.34513593, 0.9193224, 0.34673405, 0.33127916, 0.17532718, 0.37646174, + 0.60818017, 0.40575743, 0.83085954, 0.8557794, 0.14016843, 0.617718, 0.75873506, 0.24297798, 0.7481657, 0.43712246, + 0.35065222, 0.81084096, 0.62352026, 0.37436676, 0.77083063, 0.7847092, 0.4324957, 0.9557135, 0.4218378, 0.92131793, + 0.55303574, 0.7187419, 0.8675792, 0.57046103, 0.38549185, 0.77889824, 0.7139721, 0.984007, 0.5461241, 0.47925794, + 0.4152075, 0.41369438, 0.728559, 0.6706697, 0.036333323, 0.59346676, 0.8634473, 0.6683911, 0.22677302, 0.04654312, + 0.90984786, 0.9581218, 0.22460055, 0.5758486, 0.45485234, 0.41362286, 0.794464, 0.25549304, 0.03472662, 0.3553369, + 0.57665336, 0.1279118, 0.6459384, 0.469741, 0.72146153, 0.3962214, 0.53111744, 0.6590177, 0.8073834, 0.18562567, + 0.989416, 0.9177935, 0.0095665455, 0.50436616, 0.96901166, 0.25255597, 0.2602415, 0.8452184, 0.08408558, 0.3925941, + 0.2861662, 0.5905421, 0.38091075, 0.30424786, 0.8636844, 0.7346792, 0.2583505, 0.008626342, 0.7472192, 0.32531214, + 0.25280833, 0.09190476, 0.23163939, 0.4166125, 0.31742144, 0.8833345, 0.3063625, 0.43987083, 0.05561173, 0.24516499, + 0.5457225, 0.017105937, 0.33140385, 0.40275574, 0.8718505, 0.5272844, 0.042399168, 0.5011121, 0.06540847, 0.5303607, + 0.5874903, 0.05206418, 0.39980268, 0.119243264, 0.24241436, 0.64655995, 0.38258946, 0.3144492, 0.26858854, 0.21042073, + 0.57962847, 0.8303269, 0.40360355, 0.27780104, 0.6136911, 0.12562108, 0.3202498, 0.7312546, 0.9425826, 0.67212975, + 0.82645, 0.8645599, 0.8534951, 0.87337244, 0.6205795, 0.69331336, 0.49546087, 0.015071273, 0.5482869, 0.43831277, + 0.90358734, 0.575771, 0.72531235, 0.4884565, 0.13953233, 0.45709264, 0.4120674, 0.38694692, 0.41616583, 0.31270397, + 0.20690763, 0.19586754, 0.7196951, 0.86629677, 0.8909025, 0.591066, 0.57817864, 0.084812164, 0.48980522, 0.39633775, + 0.36117005, 0.28894174, 0.5929427, 0.8878174, 0.41028976, 0.6326628, 0.1294061, 0.15639889, 0.3941946, 0.42888868, + 0.5433066, 0.39753962, 0.4632026, 0.24067068, 0.42807567, 0.035683274, 0.8961402, 0.74549544, 0.70986176, 0.34891653, + 0.9861194, 0.50052106, 0.42497253, 0.1139009, 0.1145277, 0.37502134, 0.12224281, 0.66156876, 0.3823924, 0.30841112, + 0.35388982, 0.18243992, 0.23659694, 0.7722671, 0.32780266, 0.8767257, 0.22730339, 0.7475523, 0.5625973, 0.42547214, + 0.88211656, 0.47869205, 0.92450714, 0.7295604, 0.5315031, 0.35869944, 0.9411527, 0.50154257, 0.55904186, 0.53222203, + 0.79450166, 0.15558457, 0.16689801, 0.81611, 0.25091338, 0.21953273, 0.6244092, 0.12556744, 0.91251504, 0.23553741, + 0.83064604, 0.8392587, 0.6288334, 0.25636792, 0.9647114, 0.49071515, 0.6952883, 0.75947285, 0.30187035, 0.64635956, + 0.50833523, 0.32529938, 0.07899833, 0.6759312, 0.19690871, 0.5898783, 0.15009427, 0.721825, 0.6453445, 0.4863286, + 0.6321099, 0.90430593, 0.9571543, 0.069999814, 0.64040816, 0.6447439, 0.7679794, 0.38806236, 0.8262229, 0.5652633, + 0.89214027, 0.94770694, 0.08394647, 0.742852, 0.77750075, 0.18635476, 0.32295096, 0.86118245, 0.35514307, 0.38267207, + 0.24131835, 0.9882927, 0.7282318, 0.496464, 0.9180844, 0.6173309, 0.63722825, 0.034676313, 0.83454144, 0.24473429, + 0.47459352, 0.28216588, 0.12796378, 0.66252863, 0.94008434, 0.49747276, 0.05932045, 0.73446155, 0.31850886, 0.63200283, + 0.1819247, 0.031088948, 0.23594022, 0.52276325, 0.12613297, 0.16525531, 0.83500373, 0.6399615, 0.6245507, 0.97396815, + 0.48528826, 0.64660203, 0.99606943, 0.5675732, 0.47032917, 0.12408829, 0.9496292, 0.5127709, 0.879315, 0.38930273, + 0.064664125, 0.8333659, 0.6193286, 0.6174785, 0.6654451, 0.84807265, 0.8534857, 0.8494061, 0.5994992, 0.029694796, + 0.55890834, 0.46317005, 0.18731773, 0.5103376, 0.38963473, 0.83246815, 0.18412971, 0.8647071, 0.71584547, 0.33451712, + 0.029054284, 0.44782352, 0.32525563, 0.20829141, 0.30182922, 0.32140112, 0.6175065, 0.3386942, 0.27213967, 0.73392403, + 0.7337438, 0.72843766, 0.93421566, 0.37941396, 0.14596903, 0.3532803, 0.43827975, 0.21399975, 0.24997973, 0.7173469, + 0.26380086, 0.94008005, 0.063246965, 0.42009163, 0.7526399, 0.9561336, 0.07120144, 0.65143514, 0.30060327, 0.6978173, + 0.15539145, 0.3703748, 0.71513, 0.9123484, 0.18302286, 0.86906695, 0.38449657, 0.2344768, 0.63189864, 0.38360524, + 0.3119539, 0.8919158, 0.71597254, 0.8597268, 0.028058052, 0.5733756, 0.2040633, 0.8875146, 0.17834413, 0.2933513, + 0.3154148, 0.8897525, 0.22210026, 0.42190576, 0.2348417, 0.8213141, 0.630142, 0.91756713, 0.5948069, 0.5735388, + 0.0017411709, 0.06508756, 0.91466737, 0.7841996, 0.44958484, 0.21038806, 0.03233552, 0.64601445, 0.23226535, 0.9789239, + 0.40043008, 0.9007944, 0.11791861, 0.5314971, 0.99768186, 0.5448891, 0.5002023, 0.99646854, 0.03828442, 0.8371755, + 0.99282193, 0.693604, 0.6591588, 0.42008364, 0.49760926, 0.68455255, 0.8923695, 0.5689285, 0.17675567, 0.38440323, + 0.0022345781, 0.47063565, 0.318568, 0.88059425, 0.011461139, 0.9187517, 0.54680645, 0.57725835, 0.480363, 0.8263724, + 0.55709434, 0.20502198, 0.4567654, 0.5825442, 0.2511413, 0.26175332, 0.6423383, 0.62668157, 0.49162805, 0.5162821, + 0.046515346, 0.08727801, 0.05831015, 0.1878401, 0.67503774, 0.50753534, 0.2079165, 0.7297895, 0.50069344, 0.8677982, + 0.67793274, 0.31541038, 0.2264322, 0.8540213, 0.8309455, 0.008723021, 0.23057032, 0.5027199, 0.06404722, 0.113770485, + 0.41573644, 0.69402087, 0.15275991, 0.66282415, 0.4839456, 0.95415056, 0.6816684, 0.5700717, 0.9130838, 0.22481441, + 0.3932804, 0.6314676, 0.2120148, 0.15018713, 0.9940871, 0.13616621, 0.021256208, 0.06395042, 0.8720964, 0.74397314, + 0.5395341, 0.2962333, 0.60470164, 0.41833138, 0.54921305, 0.15927267, 0.8956554, 0.6057761, 0.0762862, 0.63290596, + 0.771742, 0.22465694, 0.11943281, 0.023544312, 0.9806918, 0.94767845, 0.73642385, 0.38626754, 0.35590303, 0.13351583, + 0.60190797, 0.54608774, 0.5621543, 0.62281764, 0.6069634, 0.997664, 0.41410935, 0.45969343, 0.48508072, 0.9554707, + 0.9325818, 0.64323545, 0.061731577, 0.26067746, 0.5530982, 0.10328853, 0.70898163, 0.24436891, 0.28356314, 0.31847048, + 0.35427904, 0.38639057, 0.3723017, 0.18108428, 0.75702524, 0.9857061, 0.57433426, 0.4265653, 0.20089579, 0.28066194, + 0.22247875, 0.96558213, 0.91309786, 0.24605513, 0.89949834, 0.99586415, 0.2774359, 0.64021313, 0.8599446, 0.027357578, + 0.36352313, 0.6442684, 0.53779364, 0.44097924, 0.17694068, 0.27518308, 0.11995351, 0.29838705, 0.10782707, 0.6049943, + 0.20321107, 0.83364654, 0.7877829, 0.05647874, 0.2730447, 0.16717827, 0.7819642, 0.39185905, 0.86071944, 0.7518023, + 0.35460663, 0.8211409, 0.54548335, 0.8493583, 0.6487541, 0.6798259, 0.94961035, 0.77307415, 0.3178085, 0.72384334, + 0.51640797, 0.5412574, 0.25732565, 0.03090179, 0.32508278, 0.4501145, 0.5862789, 0.6069275, 0.3977332, 0.74229586, + 0.46339643, 0.9188107, 0.27716494, 0.13868976, 0.25718236, 0.46637976, 0.9694152, 0.48906195, 0.46407545, 0.023825884, + 0.5283948, 0.08825421, 0.95693696, 0.6224762, 0.56843865, 0.43331468, 0.9695796, 0.9405464, 0.12378049, 0.43416715, + 0.07658827, 0.574275, 0.9483731, 0.24193203, 0.6950865, 0.98315334, 0.14461303, 0.4016899, 0.7650684, 0.3788998, + 0.28827643, 0.060182452, 0.48568237, 0.51714313, 0.7081181, 0.33150804, 0.40075958, 0.87001514, 0.73710334, 0.058862448, + 0.948974, 0.8049164, 0.17090058, 0.1396985, 0.96039605, 0.9232738, 0.91312885, 0.74735165, 0.15138459, 0.047783256, + 0.21095634, 0.31530535, 0.90841234, 0.6325146, 0.44696426, 0.4350165, 0.0694921, 0.16361928, 0.939888, 0.39202154, + 0.41315746, 0.34595764, 0.6774734, 0.55146074, 0.58091295, 0.30141282, 0.118180275, 0.86616004, 0.73203695, 0.03618169, + 0.9751437, 0.5217582, 0.3371153, 0.54555285, 0.7450892, 0.49612403, 0.17038059, 0.664919, 0.9997505, 0.14109015, + 0.4119022, 0.33592784, 0.15437007, 0.08401692, 0.5600014, 0.65622044, 0.2889936, 0.7714193, 0.60641813, 0.4496895, + 0.061199903, 0.5719433, 0.9599842, 0.22224689, 0.2227776, 0.7527323, 0.686733, 0.12617111, 0.7095275, 0.29884648, + 0.14009833, 0.52664995, 0.61742854, 0.020469546, 0.11463332, 0.6880728, 0.6962459, 0.5507709, 0.27928233, 0.6804135, + 0.70108795, 0.020131946, 0.89853346, 0.53065515, 0.9758806, 0.4400301, 0.20929801, 0.47667885, 0.12577796, 0.3594947, + 0.2673025, 0.53454053, 0.79574645, 0.8261862, 0.66477644, 0.9239379, 0.31145084, 0.8880626, 0.75125206, 0.6447078, + 0.15325177, 0.613145, 0.985993, 0.48242867, 0.40972102, 0.97727835, 0.28121352, 0.21973133, 0.15444279, 0.20758474, + 0.74273753, 0.78547215, 0.21592331, 0.2043755, 0.53266644, 0.45060158, 0.98712325, 0.35790896, 0.2770121, 0.8769958, + 0.18156731, 0.92520535, 0.15342689, 0.26509893, 0.26494217, 0.14585638, 0.225456, 0.022874951, 0.707212, 0.07958126, + 0.21103764, 0.14773512, 0.5403155, 0.99073935, 0.26471972, 0.33912814, 0.8808024, 0.11260116, 0.5960436, 0.94802904, + 0.5219017, 0.4619658, 0.69143033, 0.8791307, 0.113346696, 0.9281982, 0.86161125, 0.8878095, 0.20753789, 0.28451967, + 0.93486285, 0.29887676, 0.3497349, 0.35303068, 0.18445003, 0.31840456, 0.2863921, 0.97237206, 0.73536146, 0.6584841, + 0.5074253, 0.12153077, 0.08019495, 0.14261198, 0.77308464, 0.96275437, 0.6180546, 0.5908065, 0.6450465, 0.56620085, + 0.4150418, 0.24493563, 0.6161063, 0.6891333, 0.18454576, 0.16773558, 0.51949537, 0.26248598, 0.9845811, 0.6866524, + 0.3678037, 0.113915086, 0.42257965, 0.3644868, 0.14000738, 0.90079963, 0.44996786, 0.17689216, 0.7578169, 0.8760164, + 0.11300993, 0.7232106, 0.55123186, 0.7387514, 0.61544394, 0.10095847, 0.75984156, 0.5863813, 0.68230975, 0.860633, + 0.8310212, 0.23383915, 0.5577806, 0.6911721, 0.96827996, 0.50994563, 0.7436837, 0.6357583, 0.36465776, 0.38452375, + 0.95579445, 0.7888119, 0.99932885, 0.6856854, 0.733325, 0.26323152, 0.2918421, 0.8427998, 0.81952703, 0.95172954, + 0.69079137, 0.18690813, 0.8647493, 0.1851269, 0.048691273, 0.30197394, 0.9392736, 0.37051558, 0.35517645, 0.6906197, + 0.21519315, 0.17867374, 0.9134257, 0.6055409, 0.019968629, 0.87757146, 0.8783028, 0.18589413, 0.6776031, 0.5502838, + 0.3927275, 0.18606365, 0.78671074, 0.47549713, 0.32636678, 0.8159418, 0.47174108, 0.21751547, 0.97376645, 0.30582094, + 0.047374964, 0.5587448, 0.6268387, 0.6501833, 0.49434412, 0.14269078, 0.1680361, 0.30492032, 0.94329906, 0.34936094, + 0.14466536, 0.16301215, 0.98242176, 0.91589224, 0.46527874, 0.22920132, 0.4979874, 0.3941685, 0.76656985, 0.3039831, + 0.9452089, 0.6096324, 0.9994203, 0.47152734, 0.52069414, 0.79390895, 0.6446867, 0.49992883, 0.27029717, 0.092381835, + 0.7844249, 0.44262648, 0.9510298, 0.79124415, 0.53164196, 0.97782874, 0.8547815, 0.36111605, 0.24613309, 0.22507453, + 0.30934417, 0.94160473, 0.82935345, 0.03495598, 0.5373862, 0.31731164, 0.9104061, 0.59294665, 0.071294665, 0.9882016, + 0.8394655, 0.8361442, 0.7365334, 0.41259003, 0.2704543, 0.707814, 0.52892375, 0.18335176, 0.95862794, 0.3832779, + 0.7244257, 0.37162983, 0.98916066, 0.27160752, 0.8411654, 0.7197684, 0.66521835, 0.21680069, 0.048986554, 0.9028177, + 0.2756474, 0.18758607, 0.19506586, 0.99402773, 0.78308845, 0.3965609, 0.2733184, 0.76973474, 0.9161016, 0.4647504, + 0.44799626, 0.17247057, 0.7125654, 0.92414045, 0.5980288, 0.3492272, 0.8344171, 0.5402223, 0.09782314, 0.8785144, + 0.19327247, 0.41778266, 0.05793953, 0.76029825, 0.82229304, 0.44936085, 0.8398199, 0.24516094, 0.2626642, 0.035540342, + 0.05193448, 0.946926, 0.07071781, 0.6331221, 0.6586585, 0.09387994, 0.08587599, 0.034860015, 0.694023, 0.98517394, + 0.6626153, 0.35834038, 0.50896, 0.7014741, 0.11710918, 0.59879386, 0.2148031, 0.10131347, 0.04168558, 0.18615699, + 0.08424783, 0.9774436, 0.13989484, 0.96090615, 0.5834956, 0.9899963, 0.8457025, 0.5406213, 0.6587424, 0.8619002, + 0.80786693, 0.29252613, 0.6500509, 0.7847725, 0.6266576, 0.23898244, 0.9238975, 0.6020783, 0.37427557, 0.19663656, + 0.042768836, 0.81899714, 0.12598991, 0.42444098, 0.7339133, 0.64314497, 0.043818235, 0.38594162, 0.9867952, 0.7578242, + 0.98607945, 0.8985684, 0.36851597, 0.53013587, 0.14084077, 0.42991245, 0.07751989, 0.62328553, 0.8200983, 0.5555885, + 0.11834848, 0.5952728, 0.7240963, 0.61059165, 0.6676949, 0.4952109, 0.08346188, 0.48778784, 0.52742743, 0.053282022, + 0.5374453, 0.6230675, 0.85758626, 0.6406976, 0.49813986, 0.37785494, 0.8450171, 0.78908587, 0.42790747, 0.8745462, + 0.75856376, 0.52884495, 0.4241221, 0.1258446, 0.75770104, 0.65104127, 0.7231051, 0.9360664, 0.4995638, 0.48699093, + 0.031516314, 0.4047488, 0.86456275, 0.68007946, 0.10198605, 0.746765, 0.4207703, 0.39970458, 0.43246794, 0.87141144, + 0.8622104, 0.23365545, 0.65856266, 0.2689767, 0.32029748, 0.90215087, 0.76512945, 0.4295777, 0.36715996, 0.05452478, + 0.48919034, 0.8288255, 0.9224317, 0.13793659, 0.6749599, 0.052672386, 0.41985595, 0.9861038, 0.3642863, 0.49956644, + 0.11207521, 0.5639417, 0.94257236, 0.32539642, 0.55226016, 0.29219294, 0.680253, 0.78523433, 0.8467716, 0.557497, + 0.68164957, 0.07598972, 0.52896, 0.61256135, 0.44124162, 0.676757, 0.03527975, 0.87092364, 0.608618, 0.69751966, + 0.841974, 0.246598, 0.71116877, 0.4066956, 0.36267054, 0.35163987, 0.52587664, 0.6749693, 0.8194766, 0.22605336, + 0.95037544, 0.6836966, 0.8660017, 0.9106624, 0.2564187, 0.38855135, 0.06364298, 0.20807707, 0.13247705, 0.18793833, + 0.7854843, 0.21154523, 0.19440114, 0.9220687, 0.77175224, 0.15666866, 0.37804484, 0.886747, 0.015437722, 0.06376016, + 0.13255394, 0.78438795, 0.08267939, 0.36213052, 0.17714214, 0.05074513, 0.8890313, 0.3803022, 0.9192661, 0.64585364, + 0.07874191, 0.26479268, 0.0420928, 0.8807844, 0.01080966, 0.31815243, 0.0026453733, 0.99630046, 0.91653156, 0.3731253, + 0.10803795, 0.48371446, 0.87298477, 0.41568255, 0.7158135, 0.6714237, 0.6230571, 0.46036792, 0.25786686, 0.26752293, + 0.66929066, 0.40476263, 0.3101461, 0.52475, 0.8316717, 0.17815745, 0.4568745, 0.3852811, 0.69265926, 0.38589418, + 0.17604494, 0.63527226, 0.6034739, 0.56178474, 0.56384075, 0.7176814, 0.9763982, 0.90890396, 0.5579599, 0.96569955, + 0.32902694, 0.16800904, 0.4890604, 0.38910985, 0.6266439, 0.38513482, 0.81284714, 0.57885575, 0.5160018, 0.18379843, + 0.17220831, 0.30555046, 0.25671792, 0.58956933, 0.298679, 0.24536943, 0.5808079, 0.89229465, 0.40765834, 0.111299515, + 0.83085084, 0.8697618, 0.10349774, 0.14749348, 0.7381973, 0.5386931, 0.16365027, 0.22439766, 0.60834503, 0.6325109, + 0.8387178, 0.42383432, 0.68734574, 0.7922901, 0.9894073, 0.88251615, 0.7738519, 0.2207843, 0.24383414, 0.50753236, + 0.602895, 0.49796987, 0.7928108, 0.77240014, 0.09995389, 0.51543605, 0.7170874, 0.5424297, 0.56477785, 0.4379598, + 0.13067782, 0.011431932, 0.63457394, 0.37795782, 0.0064485073, 0.60061836, 0.83225954, 0.12862313, 0.017816782, 0.7459837, + 0.38415492, 0.56335294, 0.24408364, 0.93227184, 0.71103454, 0.75147414, 0.47258162, 0.19353592, 0.62608063, 0.6454886, + 0.39011407, 0.5135088, 0.04001105, 0.8942952, 0.8346454, 0.07126176, 0.24956965, 0.4036256, 0.768458, 0.16418457, + 0.2399658, 0.8745997, 0.383505, 0.15229332, 0.31909597, 0.77732587, 0.19169462, 0.17216742, 0.47752964, 0.89891326, + 0.7328955, 0.17774093, 0.8145282, 0.84876883, 0.22609675, 0.6062846, 0.80669487, 0.5823301, 0.63287437, 0.5601853, + 0.28424466, 0.28250992, 0.271927, 0.34061468, 0.18500876, 0.41001213, 0.6518301, 0.48217356, 0.21719861, 0.5224457, + 0.208781, 0.26664186, 0.33027256, 0.85210264, 0.611325, 0.73039615, 0.25543785, 0.9301505, 0.8835528, 0.5831796, + 0.71608925, 0.4858955, 0.015086532, 0.8556404, 0.5066911, 0.13155174, 0.28481805, 0.41526437, 0.66886735, 0.48466468, + 0.020262122, 0.9230609, 0.30206764, 0.47152627, 0.92936563, 0.9544251, 0.19461036, 0.31860602, 0.023904562, 0.5612248, + 0.3773607, 0.4695164, 0.2242229, 0.6227046, 0.79354155, 0.3833034, 0.43986416, 0.5140382, 0.81387246, 0.4656968, + 0.34056973, 0.35884953, 0.19053543, 0.06488466, 0.8671222, 0.48168087, 0.8818903, 0.43210506, 0.9649105, 0.25000894, + 0.84994924, 0.49345934, 0.05926037, 0.80483043, 0.36683297, 0.71413255, 0.07119179, 0.8318815, 0.7588639, 0.63426733, + 0.25331688, 0.31843078, 0.2069987, 0.823998, 0.458879, 0.4751315, 0.3584149, 0.03881824, 0.4215088, 0.14042509, + 0.37484384, 0.7824042, 0.72175753, 0.7830949, 0.36283278, 0.47387362, 0.313599, 0.59452, 0.80680895, 0.7013614, + 0.6989523, 0.365322, 0.7881067, 0.7505758, 0.9909531, 0.7252116, 0.26314843, 0.638862, 0.35831416, 0.06385887, + 0.7291535, 0.21287882, 0.9664341, 0.98041224, 0.704165, 0.85278034, 0.8105992, 0.14321578, 0.49429703, 0.42203867, + 0.2516687, 0.41349137, 0.017283082, 0.5018637, 0.19594955, 0.28377736, 0.4807955, 0.758705, 0.57171583, 0.9294312, + 0.8941779, 0.8328208, 0.23086154, 0.93649924, 0.72978985, 0.21779764, 0.7641566, 0.12250829, 0.13366926, 0.13501132, + 0.6759684, 0.9853369, 0.14985764, 0.47732806, 0.09692609, 0.7564479, 0.0010457039, 0.20277464, 0.88071406, 0.31658983, + 0.7705258, 0.69654214, 0.14192033, 0.035719514, 0.8837836, 0.60428274, 0.31511903, 0.6907859, 0.28617346, 0.41179943, + 0.27526045, 0.91372466, 0.83744335, 0.6220734, 0.6509093, 0.93512976, 0.67177224, 0.7028675, 0.29096806, 0.122779965, + 0.88115096, 0.5249462, 0.19483793, 0.096999645, 0.54639494, 0.8518169, 0.033777, 0.028592229, 0.56623304, 0.19235635, + 0.48999906, 0.1601237, 0.25475705, 0.0136550665, 0.4685501, 0.76969945, 0.4802127, 0.70152414, 0.77193916, 0.36136794, + 0.36773753, 0.36730134, 0.5173873, 0.98329043, 0.2666577, 0.1910845, 0.10475743, 0.76984, 0.46394265, 0.0866791, + 0.42938077, 0.9078214, 0.3938179, 0.800786, 0.91018474, 0.035619497, 0.82867086, 0.8901681, 0.96312034, 0.5975976, + 0.4613533, 0.6077858, 0.0046687126, 0.3986143, 0.99488616, 0.18110085, 0.59204483, 0.39211488, 0.5939071, 0.29595447, + 0.20189154, 0.525403, 0.10260868, 0.69615364, 0.8862001, 0.658746, 0.09010017, 0.13732123, 0.32578182, 0.30788386, + 0.07608771, 0.41351378, 0.1124593, 0.4224267, 0.28457642, 0.19279015, 0.35440564, 0.0926584, 0.3208859, 0.56310666, + 0.9207728, 0.21995807, 0.65776217, 0.48097312, 0.2984382, 0.16064715, 0.88856924, 0.43568063, 0.3926226, 0.39277303, + 0.944013, 0.57909906, 0.27410316, 0.99433684, 0.8614173, 0.8040894, 0.104700804, 0.048357964, 0.6116742, 0.3589568, + 0.9572971, 0.048621535, 0.94050443, 0.013103485, 0.9529121, 0.66240716, 0.4573828, 0.40285826, 0.922863, 0.3793528, + 0.6248914, 0.38189375, 0.57484233, 0.6099533, 0.9405302, 0.067231774, 0.97706664, 0.44482255, 0.7441789, 0.18083537, + 0.5414437, 0.09510803, 0.8745649, 0.857267, 0.59444773, 0.33723772, 0.12716413, 0.16987765, 0.12452304, 0.78940964, + 0.8204962, 0.5058116, 0.25208783, 0.025403857, 0.0855242, 0.7452266, 0.033691764, 0.6907518, 0.39951205, 0.40237582, + 0.69878745, 0.7652558, 0.5505564, 0.64405346, 0.6349654, 0.9509027, 0.79684436, 0.7504288, 0.38537526, 0.57795715, + 0.85694265, 0.6184151, 0.5526118, 0.08801544, 0.2539624, 0.8339616, 0.31156075, 0.8841839, 0.5043874, 0.97991943, + 0.66865826, 0.22173464, 0.6291752, 0.91981816, 0.5494572, 0.77072287, 0.12779546, 0.7436887, 0.6100608, 0.88423276, + 0.60395813, 0.49974513, 0.29835713, 0.36831808, 0.29997158, 0.22770953, 0.5261229, 0.6418719, 0.38363516, 0.6815362, + 0.09736955, 0.053799152, 0.331079, 0.66102064, 0.85473585, 0.68381464, 0.12568581, 0.8971633, 0.69253194, 0.080273986, + 0.41746008, 0.5746176, 0.081890464, 0.7322663, 0.48565876, 0.08104527, 0.30449498, 0.08962965, 0.030967593, 0.26247108, + 0.6289511, 0.16217327, 0.27914572, 0.026766062, 0.47894418, 0.27360117, 0.47164953, 0.23992729, 0.555388, 0.80336964, + 0.9121735, 0.21777499, 0.6515883, 0.030278563, 0.47883928, 0.07885468, 0.67519367, 0.72339916, 0.6533371, 0.5025941, + 0.7962762, 0.07853532, 0.7879008, 0.9134555, 0.09968138, 0.23040044, 0.23775756, 0.4200685, 0.44180226, 0.42208028, + 0.53807235, 0.25786185, 0.20149636, 0.38230252, 0.15871441, 0.122398615, 0.66587543, 0.17836237, 0.7163366, 0.8839128, + 0.38296807, 0.11847615, 0.48658192, 0.40956068, 0.06724894, 0.4488485, 0.18802822, 0.6544223, 0.72048795, 0.3555869, + 0.5368583, 0.75729835, 0.8507323, 0.02333486, 0.14404678, 0.11379838, 0.87337923, 0.7624563, 0.27943587, 0.43368137, + 0.90195763, 0.48816907, 0.26899505, 0.68732893, 0.59448874, 0.37496805, 0.38687932, 0.8609613, 0.1980567, 0.9780446, + 0.015794277, 0.48167646, 0.32003093, 0.15970862, 0.79450905, 0.5020082, 0.9972888, 0.35642457, 0.47327363, 0.21727347, + 0.5188397, 0.7477071, 0.32053077, 0.23842144, 0.3859632, 0.22748613, 0.916072, 0.92352676, 0.16297579, 0.9158236, + 0.98434496, 0.7126945, 0.30842745, 0.023742199, 0.4651612, 0.028235316, 0.25442505, 0.5547457, 0.058312416, 0.8117981, + 0.36559772, 0.30213034, 0.9423951, 0.65017664, 0.17994988, 0.92882705, 0.6850617, 0.5491092, 0.044909716, 0.44837093, + 0.86723566, 0.27774394, 0.43017948, 0.9418509, 0.20219278, 0.45884204, 0.036159396, 0.9813055, 0.4268788, 0.5804392, + 0.8897264, 0.5686681, 0.6735867, 0.5581703, 0.525555, 0.6063334, 0.38077796, 0.72023046, 0.28340173, 0.02014947, + 0.75983524, 0.1273824, 0.013360381, 0.34550357, 0.5075822, 0.6906681, 0.0041058064, 0.49272525, 0.8213881, 0.25890815, + 0.5251869, 0.8439983, 0.14531255, 0.6182512, 0.6312945, 0.64082325, 0.6797135, 0.08134115, 0.23285913, 0.95172894, + 0.9430857, 0.7771647, 0.66030145, 0.007511258, 0.1363231, 0.39072716, 0.2668364, 0.14457786, 0.35033524, 0.22830856, + 0.8876238, 0.62496185, 0.19380009, 0.9179133, 0.052157283, 0.6986841, 0.09063363, 0.16796839, 0.09384322, 0.96232677, + 0.82190824, 0.16792607, 0.68979466, 0.46559167, 0.7605387, 0.6543157, 0.95174205, 0.77839625, 0.59512866, 0.96859956, + 0.94992507, 0.51034224, 0.29740417, 0.160393, 0.9483266, 0.27509212, 0.553867, 0.17221606, 0.17879903, 0.83465075, + 0.1871767, 0.28166938, 0.7601222, 0.49564457, 0.42312026, 0.9762759, 0.99854255, 0.814535, 0.14334571, 0.7971066, + 0.8789493, 0.33365428, 0.5632467, 0.7452531, 0.2082839, 0.5275605, 0.7717143, 0.95500207, 0.813725, 0.21611607, + 0.10197985, 0.91323495, 0.6191075, 0.8823669, 0.4312731, 0.49838233, 0.7093209, 0.6828797, 0.14880669, 0.8535619, + 0.8059912, 0.3616749, 0.8086072, 0.5584649, 0.083572626, 0.09712732, 0.01748693, 0.34984708, 0.56870353, 0.42032278, + 0.85661197, 0.90813804, 0.00559175, 0.030344367, 0.4834677, 0.8992288, 0.7630571, 0.47449827, 0.39364445, 0.8671212, + 0.44717908, 0.7430545, 0.9642993, 0.8111954, 0.58385336, 0.9178393, 0.14373207, 0.83182395, 0.17798793, 0.52375877, + 0.16472232, 0.4525261, 0.9741368, 0.8364115, 0.9785439, 0.41322792, 0.041105866, 0.1917938, 0.21944118, 0.6153575, + 0.54132366, 0.6190038, 0.70702195, 0.62466264, 0.4165722, 0.31138337, 0.33914018, 0.32833517, 0.6663208, 0.5930176, + 0.78802025, 0.26484644, 0.40883315, 0.58139694, 0.23609316, 0.9143275, 0.01327312, 0.9019114, 0.016840696, 0.21848202, + 0.2693733, 0.15682495, 0.8895991, 0.67823935, 0.060312986, 0.94318354, 0.8743143, 0.36535156, 0.8975414, 0.8230499, + 0.79172385, 0.4458766, 0.5403832, 0.26402533, 0.7044443, 0.123616815, 0.78186285, 0.53700256, 0.98086977, 0.2703519, + 0.50122654, 0.12547529, 0.87505245, 0.8318558, 0.7948806, 0.73049426, 0.3354293, 0.6851343, 0.5725651, 0.1293968, + 0.5450642, 0.47504926, 0.51916134, 0.7745564, 0.38259685, 0.8682574, 0.77565956, 0.27258658, 0.70882714, 0.03800249, + 0.48211312, 0.5296949, 0.8596853, 0.5541266, 0.098629594, 0.20181441, 0.21174943, 0.5707401, 0.27367735, 0.46285796, + 0.33001828, 0.44831288, 0.8524325, 0.4259547, 0.7096726, 0.047685623, 0.72923803, 0.5686196, 0.31410682, 0.4576844, + 0.9506856, 0.22109377, 0.6538384, 0.92872155, 0.29096162, 0.6660329, 0.79434395, 0.84605014, 0.8487768, 0.93552613, + 0.9790518, 0.80643237, 0.6218947, 0.60578275, 0.035614133, 0.019561887, 0.4895333, 0.7376783, 0.79865324, 0.13057351, + 0.48389816, 0.35441327, 0.7978829, 0.010383487, 0.19818997, 0.15176785, 0.05714774, 0.58426034, 0.6541773, 0.50236535, + 0.6413983, 0.027682424, 0.8661779, 0.11437571, 0.013608217, 0.82775486, 0.31126177, 0.5025828, 0.5478734, 0.10594809, + 0.72943354, 0.9876236, 0.7624713, 0.19982052, 0.08112872, 0.82475245, 0.56996095, 0.32726765, 0.8587843, 0.08988118, + 0.590737, 0.49464, 0.5602988, 0.000628829, 0.0578897, 0.6450206, 0.4356463, 0.72922254, 0.5785183, 0.85050845, + 0.43137515, 0.38170052 +}; + +static const float s_ref_in_1[80] = { + 0.0714519, 0.12623775, 0.18709707, 0.38457298, 0.51552844, 0.058009863, 0.59970665, 0.13472438, 0.12888086, 0.22097993, + 0.5381597, 0.12162638, 0.4304577, 0.7628957, 0.3952452, 0.8830744, 0.96445954, 0.76154673, 0.98054266, 0.004019499, + 0.87109864, 0.9475188, 0.40564144, 0.70299184, 0.6117927, 0.120667934, 0.69452477, 0.62411535, 0.38336444, 0.5133339, + 0.36120117, 0.56116617, 0.9694761, 0.99701285, 0.66396403, 0.88994443, 0.7282429, 0.79826057, 0.04243207, 0.90528893, + 0.51193845, 0.5379157, 0.38144886, 0.061935186, 0.37478077, 0.8003477, 0.15145504, 0.32193863, 0.4462744, 0.31686866, + 0.48822606, 0.023732662, 0.96425056, 0.6253836, 0.84943163, 0.71095276, 0.589314, 0.8142407, 0.30682087, 0.7972348, + 0.8022146, 0.98187447, 0.69415593, 0.38742268, 0.15843844, 0.5912219, 0.6598525, 0.68742585, 0.422688, 0.2071805, + 0.44676173, 0.8743541, 0.7957927, 0.23278022, 0.80306983, 0.06347573, 0.74019456, 0.16609263, 0.17528033, 0.0690223 + +}; + + +static const float s_ref_out_1[80] = { + 3.7410464, 2.8145263, 2.3118865, 1.6125404, 1.3927516, 4.151921, 1.2913103, 2.724438, 2.7855167, 2.1272745, + 1.3631525, 2.8673856, 1.5241747, 1.1448996, 1.5906209, 1.0641463, 1.0182583, 1.1459131, 1.009873, 15.772991, + 1.0714362, 1.0273207, 1.5701054, 1.1926825, 1.2784914, 2.8787508, 1.1999307, 1.2658073, 1.6150801, 1.3957254, + 1.6638931, 1.334917, 1.0156205, 1.0014968, 1.227235, 1.0600309, 1.1718227, 1.1192514, 4.8545933, 1.0510088, + 1.3976265, 1.3634615, 1.6191305, 4.0181975, 1.6334705, 1.1177912, 2.5695562, 1.7624364, 1.4969214, 1.7764801, + 1.4311643, 6.491226, 1.0183687, 1.264523, 1.0850152, 1.185986, 1.3026465, 1.1082139, 1.805334, 1.1199713, + 1.1164896, 1.0091878, 1.2002494, 1.606599, 2.5122895, 1.300543, 1.2310524, 1.2061104, 1.5381193, 2.1969774, + 1.4961047, 1.0694396, 1.1209855, 2.0726547, 1.115895, 3.9691372, 1.1623235, 2.453719, 2.3885448, 3.8063197 + +}; + +static const float s_ref_in_2[315] = { + 0.5354309, 0.5706959, 0.08582878, 0.7716477, 0.7846799, 0.19903004, 0.45012188, 0.08129561, 0.32640302, 0.7038741, + 0.046449542, 0.7598001, 0.63784873, 0.24925351, 0.8694285, 0.6427438, 0.04301381, 0.626596, 0.89536023, 0.8174894, + 0.12152302, 0.17870092, 0.78407276, 0.8414233, 0.57177854, 0.48625302, 0.05350697, 0.23532856, 0.9123963, 0.9605961, + 0.21086526, 0.73622227, 0.7652298, 0.90483284, 0.9876783, 0.62834454, 0.09401584, 0.20044458, 0.78477526, 0.90805626, + 0.55349874, 0.90292907, 0.10652912, 0.85312605, 0.4148997, 0.2313087, 0.2782197, 0.16207528, 0.22736609, 0.97628677, + 0.21293616, 0.6487589, 0.097210646, 0.74700654, 0.8401308, 0.26393652, 0.6438315, 0.5333104, 0.6876273, 0.83873856, + 0.560572, 0.7845613, 0.72653925, 0.05183983, 0.7894952, 0.2194041, 0.94158745, 0.4947139, 0.5587926, 0.47701478, + 0.49289846, 0.7288871, 0.035939097, 0.9242413, 0.44019568, 0.562335, 0.5044346, 0.19014919, 0.7126119, 0.23769414, + 0.21881127, 0.017138004, 0.78003407, 0.8023052, 0.5781249, 0.5684179, 0.38109505, 0.31951964, 0.2749182, 0.41673183, + 0.73603547, 0.19665337, 0.85111713, 0.07795882, 0.9726027, 0.50708675, 0.45485806, 0.17524278, 0.25191045, 0.14121091, + 0.2763902, 0.25920975, 0.3862301, 0.91366863, 0.13487446, 0.13194227, 0.9160392, 0.1821326, 0.80802774, 0.76237357, + 0.43206477, 0.6723207, 0.65332353, 0.3526684, 0.9178188, 0.42246497, 0.8255503, 0.18206525, 0.3980322, 0.9673563, + 0.2263031, 0.11401403, 0.16470885, 0.2298305, 0.62977314, 0.35112357, 0.18998921, 0.41820943, 0.163926, 0.42576826, + 0.5392035, 0.9224622, 0.5082998, 0.45811272, 0.32295084, 0.6324642, 0.62504387, 0.4425254, 0.7310704, 0.19160092, + 0.23115385, 0.6742743, 0.6753521, 0.04122877, 0.8539281, 0.529572, 0.2730304, 0.034256935, 0.19930458, 0.5972066, + 0.88354266, 0.19321322, 0.4382187, 0.9258901, 0.528438, 0.6784861, 0.61599135, 0.5774728, 0.1455524, 0.77443266, + 0.4308859, 0.4474635, 0.70211864, 0.78242016, 0.87218356, 0.44771576, 0.32596874, 0.81004906, 0.8207288, 0.12623632, + 0.47389424, 0.19992828, 0.5337106, 0.40851927, 0.21927512, 0.5075737, 0.88335276, 0.20100081, 0.7772665, 0.364439, + 0.0025515556, 0.9023489, 0.15650678, 0.14470422, 0.34163475, 0.40104342, 0.12134564, 0.46136415, 0.11972165, 0.8410375, + 0.029690266, 0.9787234, 0.7614236, 0.27507997, 0.15340817, 0.25746202, 0.35459936, 0.69697416, 0.37098598, 0.9866402, + 0.48803425, 0.5515444, 0.8105136, 0.5403311, 0.96023977, 0.21188116, 0.5412921, 0.15898585, 0.007098794, 0.8128096, + 0.92877805, 0.7140355, 0.24916804, 0.1546346, 0.08551681, 0.64278543, 0.08582747, 0.8459058, 0.68326473, 0.6286442, + 0.7514545, 0.31526327, 0.8225237, 0.80733705, 0.28956318, 0.72692573, 0.27075148, 0.88366115, 0.09420836, 0.5059111, + 0.8815049, 0.624176, 0.40416753, 0.66228116, 0.8977046, 0.033474922, 0.28803778, 0.44661343, 0.8945348, 0.91121185, + 0.16841066, 0.1187495, 0.41342342, 0.89796555, 0.98599434, 0.50317943, 0.8126558, 0.51442575, 0.33303964, 0.8089168, + 0.39373648, 0.020447493, 0.42672384, 0.65305257, 0.3910576, 0.5421792, 0.055668473, 0.06792641, 0.69302773, 0.6945785, + 0.4411093, 0.02286303, 0.5321884, 0.73990464, 0.59460723, 0.25752735, 0.12906373, 0.6920619, 0.22273242, 0.067554474, + 0.6739532, 0.5523802, 0.4651184, 0.7635666, 0.8839631, 0.911078, 0.57708454, 0.049878716, 0.9037883, 0.52949417, + 0.67093325, 0.29871237, 0.23468554, 0.5750108, 0.29468834, 0.8259256, 0.7657645, 0.39826298, 0.60791755, 0.3141173, + 0.13440597, 0.17416406, 0.71300006, 0.048197865, 0.24844909, 0.22503221, 0.65346766, 0.80012405, 0.23312247, 0.44725537, + 0.8239305, 0.88067615, 0.36532688, 0.0024797916, 0.08369565, 0.9838147, 0.45748472, 0.015620589, 0.62834024, 0.909263, + 0.23793268, 0.061614394, 0.22974575, 0.28789353, 0.9109963 +}; + +static const float s_ref_out_2[315] = { + 1.3666216, 1.3237245, 3.413371, 1.1383884, 1.1288954, 2.24151, 1.4905101, 3.5072477, 1.7503419, 1.1919348, + 4.6399074, 1.1472294, 1.2521061, 2.0029924, 1.0724648, 1.247329, 4.821654, 1.2632991, 1.0568202, 1.1060097, + 2.868605, 2.3655744, 1.1293324, 1.0901662, 1.3224707, 1.434065, 4.323096, 2.0614018, 1.0469073, 1.0203041, + 2.1776972, 1.165455, 1.1431522, 1.0512738, 1.0062183, 1.26154, 3.2613657, 2.233587, 1.1288267, 1.0494062, + 1.3441312, 1.0523814, 3.0638382, 1.0826633, 1.5524887, 2.079237, 1.895859, 2.4839427, 2.097187, 1.0120717, + 2.1670816, 1.2415332, 3.207326, 1.1570117, 1.0910045, 1.9464813, 1.2462751, 1.3693358, 1.2059337, 1.0919096, + 1.3356242, 1.1289808, 1.1731957, 4.3920593, 1.1254475, 2.1349006, 1.0305514, 1.421749, 1.3377491, 1.447885, + 1.4243649, 1.1713047, 5.2749267, 1.0401772, 1.5072217, 1.3335289, 1.4079833, 2.2932572, 1.1846048, 2.0511184, + 2.1377907, 7.6387076, 1.1322522, 1.1164266, 1.315192, 1.3263744, 1.6198819, 1.7690953, 1.9072088, 1.5490721, + 1.1656029, 2.2550142, 1.0839403, 3.58152, 1.0139867, 1.4042968, 1.48273, 2.3888009, 1.9924016, 2.6611285, + 1.9021235, 1.9641485, 1.6090773, 1.0461781, 2.7229214, 2.7530115, 1.0448235, 2.3431826, 1.1124662, 1.1452917, + 1.5213375, 1.2195841, 1.2371885, 1.6839017, 1.0438101, 1.5385253, 1.1005967, 2.343616, 1.5850426, 1.0167326, + 2.1021066, 2.961562, 2.4640048, 2.085913, 1.2601085, 1.687602, 2.2942226, 1.5463332, 2.4698813, 1.5325453, + 1.3618323, 1.0411797, 1.4026197, 1.4774536, 1.7596723, 1.2574248, 1.2648666, 1.5032489, 1.1695544, 2.2845528, + 2.0799334, 1.217816, 1.2168438, 4.9249268, 1.0821548, 1.3741605, 1.913791, 5.4028854, 2.2399657, 1.29401, + 1.0638642, 2.2750008, 1.5106176, 1.0392505, 1.3756342, 1.2140303, 1.2741269, 1.3159344, 2.6211407, 1.1363397, + 1.5234172, 1.4949311, 1.193424, 1.1305244, 1.0707697, 1.4945099, 1.7515075, 1.1110774, 1.1038249, 2.8145425, + 1.4526443, 2.236469, 1.3688223, 1.5645654, 2.1355283, 1.4036229, 1.0639787, 2.2304943, 1.1342663, 1.6564852, + 19.796913, 1.0527196, 2.5277457, 2.6288114, 1.7108777, 1.5790807, 2.8707006, 1.4722382, 2.8901052, 1.0904163, + 5.8035398, 1.0108111, 1.146006, 1.906648, 2.5531466, 1.9708039, 1.6793106, 1.1978203, 1.6418037, 1.0067475, + 1.4314456, 1.3465105, 1.110759, 1.3604106, 1.0204933, 2.17247, 1.3592025, 2.5079608, 11.868824, 1.109189, + 1.0376337, 1.1834233, 2.0033362, 2.5430017, 3.4195917, 1.2472887, 3.4133973, 1.0872741, 1.2097775, 1.2612393, + 1.1535825, 1.7809974, 1.1026198, 1.1129421, 1.8583534, 1.1728837, 1.921828, 1.063793, 3.2580316, 1.4059273, + 1.0650933, 1.2657456, 1.5729657, 1.2287931, 1.0554394, 5.4656296, 1.8632678, 1.4963533, 1.0573076, 1.0475875, + 2.4367738, 2.9019113, 1.555258, 1.0552859, 1.0070772, 1.4097385, 1.109294, 1.3942436, 1.7328143, 1.1118548, + 1.5936655, 6.993264, 1.5308286, 1.2374451, 1.5991147, 1.35809, 4.2383356, 3.8369017, 1.2012259, 1.1998842, + 1.5056598, 6.6135263, 1.3707784, 1.1625513, 1.2968355, 1.9705539, 2.7835429, 1.2020638, 2.1188893, 3.8474495, + 1.2181062, 1.3454914, 1.4662843, 1.1443965, 1.0636111, 1.0476644, 1.3163769, 4.47757, 1.0518811, 1.3742616, + 1.2208444, 1.8296727, 2.064224, 1.3187486, 1.8421224, 1.1003467, 1.142753, 1.5845832, 1.2825598, 1.7842432, + 2.727663, 2.396187, 1.1842822, 4.554976, 2.0062325, 2.1080344, 1.237052, 1.1179473, 2.0711327, 1.4952788, + 1.101678, 1.0655943, 1.6544712, 20.081327, 3.4565957, 1.0081922, 1.4784671, 8.001129, 1.2615445, 1.0487095, + 2.05009, 4.028644, 2.0862978, 1.8637344, 1.0477115 +}; + + +static const float s_ref_in_3[63] = { + 0.5791794, 0.8733411, 0.8453586, 0.51857257, 0.068139195, 0.5324079, 0.60879815, 0.7256423, 0.14692831, 0.8674985, + 0.29180813, 0.8902134, 0.64316845, 0.73019934, 0.26884735, 0.99293077, 0.023704052, 0.9068496, 0.48417532, 0.28190506, + 0.1008935, 0.23307681, 0.14699912, 0.82567847, 0.80686843, 0.9491637, 0.75170374, 0.5627792, 0.13389075, 0.42160153, + 0.25540173, 0.8414289, 0.08418059, 0.5961586, 0.98014593, 0.462718, 0.59378016, 0.031244874, 0.56282103, 0.26272094, + 0.020642042, 0.51890624, 0.90061283, 0.26496375, 0.24705374, 0.0038696527, 0.49684858, 0.5104109, 0.006249666, 0.24472594, + 0.7588073, 0.10402942, 0.06712484, 0.7021766, 0.919343, 0.093617916, 0.09531379, 0.15898287, 0.19267154, 0.77865076, + 0.8584075, 0.39687288, 0.12596667 +}; + +static const float s_ref_out_3[63] = { + 1.3139942, 1.0700598, 1.0876259, 1.3886577, 3.8309062, 1.3704959, 1.2816321, 1.1739205, 2.6088388, 1.0736572, + 1.8511912, 1.0598708, 1.2469171, 1.1702516, 1.928622, 1.0035534, 6.495143, 1.0501041, 1.4371387, 1.8834261, + 3.1482441, 2.0713356, 2.6082106, 1.1005113, 1.1132652, 1.0264302, 1.1533912, 1.3330026, 2.732906, 1.5401, + 1.9787368, 1.0901626, 3.4466248, 1.295147, 1.0100774, 1.4700829, 1.2977383, 5.657318, 1.332953, 1.9509791, + 6.9602313, 1.3882111, 1.0537338, 1.9427048, 2.0118902, 16.075481, 1.4186914, 1.3997163, 12.649447, 2.021436, + 1.1479796, 3.10043, 3.8597424, 1.1933746, 1.0429446, 3.2682893, 3.2390833, 2.5079844, 2.2781968, 1.1332576, + 1.0793276, 1.5873559, 2.8175535 +}; + + + +static const float s_ref_out_4[540] = { + 2.0626745, 1.3757447, 2.4035306, 1.2767605, 2.0165412, 1.870952, 1.1758473, 2.9100406, 1.6332598, 11.422995, + 1.3245044, 1.3527055, 2.225012, 2.198758, 2.6285663, 1.1240159, 4.2854285, 1.075842, 2.704463, 2.0511966, + 1.1511587, 1.9665362, 1.2358102, 1.1683834, 1.6254263, 1.4059877, 5.003717, 1.6117826, 1.8121971, 1.0414851, + 1.0093573, 6.432194, 1.126725, 1.5871071, 2.1211343, 1.3618971, 1.457987, 3.122314, 1.3764304, 1.2884133, + 1.4328839, 1.0969249, 1.3343709, 2.4985254, 1.0331993, 1.0550616, 1.6038557, 1.0290797, 1.2016362, 2.0825315, + 1.2126997, 1.0244088, 1.1701843, 1.472176, 1.2521183, 1.3675023, 1.0061092, 1.7922156, 16.130236, 1.0553181, + 1.0910031, 1.0498873, 1.2889358, 1.9056972, 1.8288897, 1.0776074, 1.2268339, 1.0044394, 1.1644065, 1.1501403, + 1.6262465, 2.6113539, 1.2117401, 1.9363229, 3.1915977, 1.4567232, 1.1154531, 1.6470877, 1.0000335, 1.0310073, + 1.6454293, 2.161959, 1.027221, 2.055492, 1.6399598, 1.4800228, 1.4100174, 1.0169388, 2.4333065, 1.171675, + 1.040884, 1.042112, 1.502844, 3.2317073, 4.055541, 1.5605311, 2.9287686, 3.9137099, 2.0973878, 2.908677, + 1.4072286, 1.0738316, 2.30354, 2.811878, 1.287568, 1.1830577, 1.0645667, 1.737841, 1.2068229, 5.890191, + 1.9532069, 1.4085927, 1.1429209, 1.066124, 1.9369173, 3.4435103, 1.0613708, 2.0936127, 1.1084231, 1.2007766, + 1.924209, 1.4450746, 1.5827194, 1.1758689, 1.052018, 1.1013676, 2.1684668, 2.0138597, 1.1030911, 1.2556024, + 1.1456525, 1.2168527, 1.122964, 1.0293113, 1.021221, 3.005051, 1.0297853, 1.3238235, 1.4425057, 4.224153, + 1.2356782, 1.2791672, 1.4848621, 1.1616862, 1.1476674, 2.211874, 1.2599818, 2.7543654, 1.9874514, 1.5998554, + 2.1176646, 1.5760059, 1.7480079, 1.022117, 2.8958359, 3.195595, 1.0314232, 1.0066103, 1.1471924, 12.961765, + 1.2641777, 1.8241689, 2.9348488, 1.0571674, 1.0360056, 1.4780183, 1.4729158, 1.1863534, 1.5353522, 1.3385284, + 1.1049706, 1.3476654, 1.3151941, 1.4451356, 1.768401, 18.168413, 1.1078858, 1.877059, 1.2995818, 1.5534023, + 1.2462038, 1.0323951, 1.2331318, 1.8356155, 1.1972278, 1.2166631, 1.8046325, 1.4789225, 1.2960656, 2.0066905, + 1.4434648, 1.039861, 1.3156812, 1.0087554, 1.1758102, 1.0683596, 1.088053, 1.083002, 1.4094586, 6.4981327, + 1.1299689, 1.8111197, 1.0069056, 2.547985, 1.241241, 1.0041013, 1.1669868, 1.3891885, 1.4797331, 4.2020845, + 1.3519951, 2.4738061, 1.5881884, 1.1950935, 1.9037837, 2.02002, 1.2598444, 1.3041217, 1.6309483, 1.2173853, + 1.0839283, 1.0045539, 1.5700022, 1.22965, 1.0276359, 1.1223928, 1.4653816, 2.2132232, 1.3598087, 2.5778735, + 1.3961089, 1.0468982, 1.0310295, 2.4572797, 1.0097613, 7.6898804, 1.112431, 2.6717017, 1.1494099, 10.571599, + 8.86551, 3.7374096, 1.3369695, 1.0994929, 1.1336765, 1.644182, 1.0315963, 2.3437803, 1.1448107, 2.2846403, + 1.0093718, 1.4116843, 1.3457617, 2.6145682, 1.9096984, 1.0125806, 2.495668, 1.1711853, 1.0113872, 2.0196345, + 1.0531262, 1.1322964, 2.1851888, 1.3198335, 3.592051, 1.109537, 2.7026818, 1.0957063, 1.6971716, 13.122005, + 1.0876538, 2.2981443, 1.4707042, 6.7504234, 1.0666971, 6.885638, 1.0947702, 1.1534613, 2.315602, 1.0055053, + 1.0807523, 1.2536515, 1.2671982, 1.6123018, 1.1263804, 1.0560803, 1.4934716, 1.1926678, 1.6893387, 1.8022323, + 1.0108602, 1.756772, 3.2550714, 1.1364474, 3.2283828, 1.0013753, 1.1892772, 1.6671216, 1.7250608, 1.2321414, + 1.4592445, 1.4059243, 3.5033095, 1.9416701, 1.12842, 1.1145383, 3.2638848, 1.160097, 1.8483434, 1.201578, + 1.0389098, 1.0400556, 8.284067, 1.0019523, 1.4478053, 1.0843546, 1.4217663, 3.4844596, 1.9762157, 1.1801493, + 2.761386, 1.429483, 1.2663672, 2.0792744, 1.5488228, 1.222745, 1.150107, 1.0392138, 1.1497881, 18.715883, + 1.2877945, 1.2194674, 2.8331945, 2.5034578, 1.1425112, 1.560225, 5.6449046, 1.2148772, 1.0629485, 4.7681704, + 1.5807865, 1.2584258, 1.5779754, 1.9831275, 1.8729521, 4.046305, 1.1754289, 1.3697711, 1.2466861, 2.871434, + 6.02829, 2.0594146, 1.4234277, 7.5442376, 1.2133754, 1.0700374, 4.4955325, 1.0297946, 1.2888685, 1.7108867, + 1.3413868, 1.4466594, 1.0360558, 1.7752748, 2.2701278, 1.3993206, 1.1871761, 1.5403805, 1.2501658, 2.8977456, + 1.5305321, 1.1920822, 3.147216, 1.0975988, 1.6652528, 1.0620317, 2.5241761, 6.0789847, 1.9809648, 1.1773614, + 2.7411208, 2.1084168, 1.0256639, 1.1833591, 1.3072637, 1.1260488, 2.7400084, 1.2794892, 12.492334, 1.2693629, + 3.9458816, 2.5878842, 1.412023, 1.4246888, 1.2155728, 1.6618562, 1.0520887, 1.7393299, 1.2083539, 2.3105524, + 1.556021, 3.949376, 1.4287602, 2.6165972, 1.0091175, 2.515494, 1.4350383, 1.0713443, 1.40587, 1.0266142, + 2.1634686, 1.8356798, 1.1197585, 1.6779069, 1.5015451, 1.0178915, 2.7366767, 1.7660401, 1.1080211, 1.5176939, + 5.1396565, 1.0802255, 1.0582317, 1.1813534, 1.9270691, 1.3626716, 5.160279, 2.546552, 1.7635537, 2.7792375, + 1.181691, 1.0029644, 1.4163834, 1.3510113, 1.9332927, 1.4004866, 1.6927123, 1.8164705, 1.3619349, 3.0449195, + 1.0581859, 1.0455642, 5.9030833, 1.1073112, 1.5917798, 1.5781837, 2.3232942, 11.913018, 2.5379803, 1.6973319, + 1.223552, 1.0933895, 1.3464831, 1.2181442, 1.1547506, 1.4921824, 2.2070138, 1.4809239, 4.453658, 1.1254771, + 1.0654131, 2.7021008, 1.058515, 1.7278204, 1.3256723, 1.0025882, 1.1125354, 1.6264408, 1.121413, 1.2124856, + 1.6359154, 2.0873876, 1.4064584, 1.0301061, 2.5560977, 1.0145518, 1.0148243, 2.0213778, 6.277102, 1.0144906, + 3.114441, 4.5911093, 1.8340713, 2.3571534, 2.5375857, 2.1372411, 1.354841, 4.017281, 2.42324, 4.4197607, + 1.1543607, 1.2606053, 1.4946947, 2.1438656, 2.66782, 1.7280138, 1.2077395, 2.7006707, 1.0756756, 1.4669523, + 1.111834, 1.3193457, 1.3340853, 1.7425953, 1.5014317, 1.9714041, 1.0210835, 1.4920087, 2.0544047, 4.9387407, + 1.4859357, 1.8736597, 2.614316, 1.4905329, 1.1119473, 1.144899, 1.0723094, 1.9219047, 3.4817724, 1.3141596, + 1.0496585, 2.846015, 1.0605841, 1.1761864, 1.9862597, 2.2261443, 1.6031121, 2.7794049, 3.875186, 1.6542884, + 1.1099429, 1.2349973, 1.5194987, 1.276289, 2.5227702, 1.3138906, 2.8143687, 5.2074966, 1.2818736, 14.191117 + +}; + +static const float s_ref_in_4[540] = { + 0.23503828, 0.5283531, 0.17310143, 0.6134527, 0.24591541, 0.2856766, 0.72326624, 0.118086934, 0.37487757, 0.007663727, + 0.570024, 0.54650426, 0.20199251, 0.20684505, 0.14473116, 0.7915075, 0.054451704, 0.8639785, 0.13672185, 0.23767602, + 0.7546221, 0.25858068, 0.6547816, 0.73253655, 0.37849963, 0.5058676, 0.039940596, 0.38493478, 0.3045013, 0.9219214, + 0.98154473, 0.02417028, 0.787706, 0.39699733, 0.22226119, 0.53915226, 0.4704275, 0.102576256, 0.5278268, 0.6024064, + 0.48705494, 0.8310863, 0.5616256, 0.16018891, 0.93676734, 0.8983474, 0.38874912, 0.9442824, 0.6925546, 0.23057747, + 0.67997575, 0.95291317, 0.7302835, 0.46140313, 0.6378362, 0.5347413, 0.9878926, 0.3113289, 0.0038434267, 0.89791095, + 0.8401331, 0.9072242, 0.6019181, 0.2753545, 0.2989682, 0.86115015, 0.6643981, 0.9911798, 0.7375487, 0.7559593, + 0.37811792, 0.14664543, 0.68105316, 0.26671314, 0.098171115, 0.4712441, 0.80370605, 0.36860955, 0.9999329, 0.9407549, + 0.36935294, 0.21394646, 0.947703, 0.23668373, 0.3718207, 0.45652354, 0.50298035, 0.96696424, 0.16889095, 0.72842634, + 0.9229865, 0.9208125, 0.44276392, 0.09574938, 0.060799837, 0.41063416, 0.11658156, 0.0652864, 0.22732258, 0.11819768, + 0.5049759, 0.8672166, 0.18845534, 0.12647569, 0.6031977, 0.7144768, 0.88237715, 0.33111584, 0.6866144, 0.028823137, + 0.26212204, 0.5039984, 0.76553965, 0.8798013, 0.26654947, 0.08433294, 0.88769877, 0.2281431, 0.81393325, 0.6935464, + 0.27008188, 0.47887206, 0.3992014, 0.72323966, 0.9035531, 0.82439506, 0.21266425, 0.2465707, 0.821821, 0.63430154, + 0.76189315, 0.6753423, 0.79299104, 0.94385767, 0.9588717, 0.11073792, 0.942989, 0.57061064, 0.48057914, 0.05604291, + 0.6549214, 0.61114657, 0.45355272, 0.741007, 0.7592205, 0.20439923, 0.62989986, 0.13181257, 0.2531669, 0.39069557, + 0.22299016, 0.40260983, 0.32727528, 0.9571912, 0.11924827, 0.09792566, 0.93999624, 0.9869095, 0.7598493, 0.00595212, + 0.6257255, 0.30051756, 0.116099, 0.89477193, 0.9316994, 0.4577626, 0.46093976, 0.71051276, 0.42421293, 0.5581422, + 0.8190278, 0.5505996, 0.578123, 0.47883165, 0.31977057, 0.0030294657, 0.814723, 0.28382075, 0.5920969, 0.41441178, + 0.64390516, 0.93822753, 0.657629, 0.2967813, 0.69766414, 0.67555285, 0.3070594, 0.45720315, 0.5953139, 0.24833572, + 0.47994077, 0.9248034, 0.577695, 0.98271656, 0.72331166, 0.8761231, 0.844695, 0.85259247, 0.5033792, 0.023682237, + 0.78318965, 0.3048637, 0.9863305, 0.15403032, 0.6490644, 0.99184763, 0.73429084, 0.5181763, 0.45670235, 0.056633115, + 0.5470786, 0.16340625, 0.39645684, 0.70015824, 0.27590835, 0.24506915, 0.63003707, 0.5879816, 0.37594092, 0.67475164, + 0.85113573, 0.99095404, 0.40569484, 0.6613585, 0.9469379, 0.79379845, 0.4656917, 0.20415008, 0.5408095, 0.15047932, + 0.513052, 0.91241217, 0.9407145, 0.16561162, 0.9807596, 0.016910672, 0.8080789, 0.14009547, 0.7569202, 0.008947849, + 0.012723088, 0.07159102, 0.5594444, 0.8272089, 0.77807534, 0.36991358, 0.93968093, 0.18203974, 0.7630142, 0.19158626, + 0.9815166, 0.50179327, 0.55215836, 0.14628506, 0.27420187, 0.97530556, 0.16055596, 0.7290355, 0.9776087, 0.24516273, + 0.90165246, 0.77997327, 0.20942187, 0.5740658, 0.07750237, 0.81229997, 0.1369021, 0.8329359, 0.347175, 0.005807638, + 0.8453152, 0.1893413, 0.46232712, 0.021945119, 0.87885606, 0.0210917, 0.8343612, 0.7516123, 0.18649709, 0.9890796, + 0.8561456, 0.6362771, 0.622746, 0.38468683, 0.78818786, 0.896615, 0.4483385, 0.7030091, 0.350402, 0.3078779, + 0.9786285, 0.324018, 0.09437978, 0.7742858, 0.09594667, 0.99725497, 0.7070234, 0.35980356, 0.33604014, 0.65868664, + 0.469617, 0.50591326, 0.08147848, 0.26524615, 0.7853414, 0.8050262, 0.09387076, 0.74303865, 0.29270804, 0.6926216, + 0.9264978, 0.9244572, 0.014571786, 0.99610686, 0.47706735, 0.8504667, 0.49470186, 0.08236241, 0.2560538, 0.7180027, + 0.13114321, 0.48937523, 0.6235635, 0.23130035, 0.41686606, 0.66884923, 0.7560029, 0.9259558, 0.7564223, 0.002854824, + 0.6029855, 0.67244935, 0.12457967, 0.1595583, 0.7660886, 0.41079533, 0.03138244, 0.6775404, 0.8850658, 0.043984175, + 0.4001783, 0.6314584, 0.40160537, 0.2542721, 0.28506684, 0.061077714, 0.7237812, 0.5329715, 0.64340687, 0.12128365, + 0.027517676, 0.23578298, 0.49354768, 0.0175699, 0.67921865, 0.8733777, 0.049480915, 0.94297194, 0.6019809, 0.34163117, + 0.555766, 0.47782338, 0.9316089, 0.31729913, 0.19404364, 0.5106995, 0.7095282, 0.421448, 0.63983023, 0.11909115, + 0.42688906, 0.70369995, 0.10095942, 0.8300662, 0.36061156, 0.88659453, 0.15694976, 0.027060628, 0.25482762, 0.7214072, + 0.13308942, 0.22495055, 0.9505826, 0.71411276, 0.5851586, 0.7886523, 0.13319755, 0.6108389, 0.006407857, 0.6206236, + 0.06422615, 0.14931738, 0.5015526, 0.49267435, 0.6767652, 0.36208713, 0.90343165, 0.33054912, 0.6848756, 0.1873132, + 0.4130181, 0.064112544, 0.48987055, 0.14605832, 0.9820113, 0.15803504, 0.48559356, 0.87124836, 0.5059525, 0.9488237, + 0.21364796, 0.29676056, 0.7975378, 0.3551929, 0.4435302, 0.96515477, 0.13352203, 0.32062614, 0.81452405, 0.43414176, + 0.037855744, 0.8569809, 0.8929732, 0.71653974, 0.2692808, 0.5385394, 0.037553787, 0.15420377, 0.32153082, 0.12946391, + 0.7161305, 0.99409735, 0.49846923, 0.54787576, 0.26754987, 0.5098494, 0.34900665, 0.3030702, 0.5391222, 0.10785699, + 0.89305043, 0.914742, 0.028697371, 0.81556857, 0.3946699, 0.4014994, 0.18526423, 0.0070462227, 0.15524709, 0.34710944, + 0.6679671, 0.83646953, 0.55156696, 0.6739111, 0.74993503, 0.4491136, 0.20530045, 0.45596814, 0.050415754, 0.78945374, + 0.8809756, 0.13696098, 0.8924953, 0.3349676, 0.56902015, 0.9948437, 0.80792737, 0.37802756, 0.79518616, 0.68021595, + 0.37366152, 0.2295059, 0.50552917, 0.94240177, 0.15305412, 0.9715195, 0.9709979, 0.24474001, 0.02537942, 0.97163665, + 0.10309553, 0.047442198, 0.29728127, 0.17998004, 0.15529537, 0.2189238, 0.54478276, 0.06196344, 0.17029703, 0.051192045, + 0.7504417, 0.62927675, 0.44760513, 0.21757293, 0.1405034, 0.33489263, 0.6855726, 0.13710606, 0.8642458, 0.46469498, + 0.80894697, 0.5744904, 0.56186604, 0.3293115, 0.4435972, 0.25730526, 0.95913017, 0.44921815, 0.2369343, 0.04099846, + 0.45289755, 0.28485155, 0.14631331, 0.45010817, 0.8087821, 0.76289654, 0.8696805, 0.2707299, 0.08248961, 0.5790335, + 0.9076196, 0.123459816, 0.8890165, 0.722849, 0.25347078, 0.20178711, 0.38910985, 0.1294483, 0.066590905, 0.3654076, + 0.8117058, 0.6556438, 0.43311107, 0.613906, 0.15712476, 0.5792707, 0.12625194, 0.036875844, 0.60856867, 0.0049655437 + +}; + +#endif \ No newline at end of file diff --git a/TESTS/operators/constants_sum.hpp b/TESTS/operators/constants_sum.hpp new file mode 100644 index 00000000..49e136f2 --- /dev/null +++ b/TESTS/operators/constants_sum.hpp @@ -0,0 +1,638 @@ +#ifndef constants_sum_hpp +#define constants_sum_hpp +static const float s_ref_in_0[756] = { + 0.3201108, 0.8462242, 0.45321774, 0.05781412, 0.28890228, 0.69911206, 0.9515259, 0.15497255, 0.0019938946, 0.53279877, + 0.096054435, 0.4124447, 0.56492233, 0.99994206, 0.8695247, 0.5112628, 0.38242018, 0.83944154, 0.35629117, 0.60769963, + 0.56769145, 0.4697497, 0.81455433, 0.3423711, 0.021919847, 0.6643195, 0.82845306, 0.8964473, 0.7944603, 0.09168422, + 0.9741379, 0.12533653, 0.13818347, 0.4106716, 0.73002267, 0.012872219, 0.3486116, 0.3416617, 0.13793719, 0.36776948, + 0.17339242, 0.18864226, 0.98261106, 0.4711045, 0.07876778, 0.7381846, 0.9967779, 0.47219443, 0.5495007, 0.39821255, + 0.15759528, 0.32816255, 0.7105688, 0.39509702, 0.68333185, 0.51213133, 0.7289976, 0.6609323, 0.67559886, 0.010752201, + 0.46638942, 0.017047167, 0.12187958, 0.53290045, 0.14634824, 0.4584769, 0.78035975, 0.6602942, 0.6005914, 0.75033605, + 0.62090933, 0.6646265, 0.762733, 0.74551344, 0.7248739, 0.26720357, 0.05411887, 0.10385108, 0.7696469, 0.05176556, + 0.38741565, 0.44307995, 0.9088018, 0.84940743, 0.25168848, 0.1388694, 0.8471917, 0.91401994, 0.4175824, 0.07619274, + 0.29732263, 0.17147243, 0.54777503, 0.3981365, 0.5058286, 0.8732132, 0.15999389, 0.005717635, 0.1773665, 0.7955036, + 0.98867714, 0.34362113, 0.4651227, 0.5519836, 0.7300525, 0.08323276, 0.2114464, 0.31209302, 0.5910089, 0.8919735, + 0.6822376, 0.8928462, 0.6048739, 0.9956442, 0.2796471, 0.08406305, 0.59412646, 0.48955512, 0.57204247, 0.85063744, + 0.1939714, 0.026566029, 0.59685147, 0.7475815, 0.89551175, 0.8155868, 0.1622231, 0.8645314, 0.32707405, 0.8044021, + 0.9966531, 0.15688825, 0.2646922, 0.752831, 0.11029267, 0.10227275, 0.2649566, 0.2596619, 0.30033588, 0.6444144, + 0.63906515, 0.97144127, 0.99109626, 0.7887485, 0.35871947, 0.11237514, 0.25581646, 0.38393342, 0.10473716, 0.82236207, + 0.7291142, 0.3906281, 0.409675, 0.116689086, 0.23459804, 0.23663807, 0.2541008, 0.11934435, 0.8726764, 0.44477677, + 0.4149952, 0.7361202, 0.57763064, 0.18329859, 0.19863343, 0.8962023, 0.012652636, 0.54531837, 0.21916318, 0.73300374, + 0.5364926, 0.8280308, 0.18671274, 0.70468485, 0.18469107, 0.6326901, 0.59046257, 0.81039274, 0.23726869, 0.25435793, + 0.8438401, 0.091780186, 0.1746651, 0.23794413, 0.76478267, 0.51032495, 0.5067159, 0.19963467, 0.27861786, 0.5993335, + 0.560488, 0.1276735, 0.97277594, 0.16557717, 0.69699645, 0.4365393, 0.38201082, 0.22074401, 0.42611945, 0.8226911, + 0.88933, 0.9835646, 0.94331634, 0.40300167, 0.85663664, 0.9018047, 0.7870029, 0.2197746, 0.9257941, 0.22534204, + 0.39006197, 0.021277547, 0.74179375, 0.27260888, 0.3349893, 0.8223225, 0.542935, 0.8238139, 0.6513518, 0.701447, + 0.19076312, 0.36566675, 0.8698275, 0.4356717, 0.8180909, 0.280326, 0.702922, 0.48065245, 0.6437632, 0.8244258, + 0.33009636, 0.7106042, 0.43051064, 0.08355892, 0.84309864, 0.17157638, 0.892491, 0.96224356, 0.69551504, 0.97517467, + 0.65242934, 0.9408585, 0.9751333, 0.58877766, 0.1567558, 0.080137014, 0.3296033, 0.7637298, 0.81439066, 0.21529722, + 0.8411279, 0.9236121, 0.2290355, 0.09911132, 0.8108201, 0.82079196, 0.62663007, 0.36482644, 0.289019, 0.39896476, + 0.080970526, 0.3460586, 0.46570528, 0.27263153, 0.36844027, 0.85090613, 0.74423003, 0.30476546, 0.9529275, 0.4093573, + 0.87477016, 0.77651227, 0.018203616, 0.56174624, 0.43807566, 0.3859564, 0.5867473, 0.41894925, 0.60881627, 0.1696918, + 0.92640555, 0.9231465, 0.20958745, 0.74865115, 0.76607895, 0.5131135, 0.6072719, 0.7548181, 0.34592617, 0.7143289, + 0.47029698, 0.88289523, 0.36869144, 0.85284007, 0.14824402, 0.4176036, 0.44949067, 0.9251429, 0.5809412, 0.4604001, + 0.30581653, 0.2740214, 0.73404753, 0.9891491, 0.7153835, 0.8732363, 0.5523616, 0.35183275, 0.8106452, 0.921571, + 0.3564421, 0.9591706, 0.049067855, 0.9008503, 0.22968936, 0.65982926, 0.9433837, 0.91244113, 0.9918705, 0.7896551, + 0.97076905, 0.5681231, 0.6531013, 0.40662766, 0.9458256, 0.08326018, 0.9268582, 0.09280443, 0.91278446, 0.37608993, + 0.10651481, 0.49413216, 0.5277206, 0.923877, 0.89571023, 0.96263885, 0.25779796, 0.098638415, 0.8243109, 0.9475224, + 0.5717318, 0.59255767, 0.15278828, 0.5196067, 0.9340944, 0.839229, 0.7775911, 0.26397932, 0.41729462, 0.909765, + 0.27892768, 0.06577122, 0.24269783, 0.8844689, 0.31442738, 0.015246749, 0.0062276125, 0.07459605, 0.23701608, 0.58090556, + 0.5801548, 0.5831388, 0.03662598, 0.9673096, 0.46923888, 0.41123986, 0.9162891, 0.5087551, 0.500927, 0.46377015, + 0.55088687, 0.14046073, 0.7781142, 0.89290476, 0.7576946, 0.45207298, 0.5817133, 0.7944076, 0.039491653, 0.9135834, + 0.09654176, 0.64771414, 0.72585523, 0.61622095, 0.6006508, 0.6416316, 0.890342, 0.84797585, 0.7589201, 0.15424728, + 0.21751308, 0.41683865, 0.80176616, 0.1192857, 0.5377066, 0.515278, 0.23577642, 0.2617036, 0.35398877, 0.69440794, + 0.6836939, 0.57845736, 0.18507457, 0.48772514, 0.098758936, 0.15628457, 0.5765765, 0.76701546, 0.42719305, 0.3286389, + 0.44640923, 0.83448493, 0.08973503, 0.5619441, 0.6508064, 0.42868567, 0.035826564, 0.9509809, 0.38160026, 0.5325321, + 0.87759674, 0.51010656, 0.13178778, 0.4896903, 0.34128046, 0.23869002, 0.1515373, 0.28971756, 0.8806046, 0.62122655, + 0.71656835, 0.091904044, 0.708321, 0.062829375, 0.47487283, 0.41126084, 0.10275459, 0.04618752, 0.8928987, 0.8753369, + 0.8651948, 0.09802151, 0.78063, 0.4035406, 0.2987963, 0.15558922, 0.42263305, 0.13016438, 0.49344945, 0.11709833, + 0.023563623, 0.4593693, 0.08605552, 0.44111347, 0.111312866, 0.60637534, 0.79617786, 0.88953567, 0.63400054, 0.7207922, + 0.65261674, 0.7396432, 0.19964993, 0.08656037, 0.08211732, 0.7889334, 0.84555304, 0.7119423, 0.18508351, 0.05621457, + 0.9794259, 0.10693669, 0.28730989, 0.18352997, 0.8997121, 0.07139051, 0.16465676, 0.69615173, 0.6164819, 0.23176706, + 0.33144128, 0.9375702, 0.38451242, 0.9174901, 0.43443382, 0.31675696, 0.23924637, 0.8278173, 0.33539677, 0.5200212, + 0.21600771, 0.35576212, 0.85695374, 0.25055182, 0.81883943, 0.34779346, 0.69498146, 0.81869555, 0.6773902, 0.4598186, + 0.5222025, 0.377028, 0.5156156, 0.31265438, 0.29038537, 0.5654985, 0.4013039, 0.5813179, 0.48750114, 0.81595886, + 0.6976347, 0.9846709, 0.1971041, 0.31045926, 0.1718303, 0.77557254, 0.609766, 0.32981527, 0.4014567, 0.91359234, + 0.4078598, 0.32230783, 0.21556032, 0.618685, 0.88887334, 0.9341277, 0.3921839, 0.61806154, 0.82043636, 0.8746705, + 0.5336981, 0.68230045, 0.008471131, 0.94081557, 0.41509557, 0.5041913, 0.7626926, 0.85475695, 0.2769382, 0.31066978, + 0.7373221, 0.7582482, 0.89209604, 0.09000349, 0.45603752, 0.5071733, 0.2154069, 0.09907794, 0.8452704, 0.018251538, + 0.88569033, 0.3906387, 0.22425675, 0.23794115, 0.22231829, 0.3434887, 0.20270467, 0.3325714, 0.092543006, 0.5037341, + 0.57644594, 0.44342983, 0.7411494, 0.9429698, 0.3866346, 0.7622912, 0.41746306, 0.14723647, 0.9096427, 0.023991108, + 0.247388, 0.3562405, 0.16277122, 0.9118353, 0.661111, 0.5430155, 0.45648134, 0.7547393, 0.987285, 0.69402325, + 0.48858213, 0.47030413, 0.31375337, 0.56758237, 0.8470379, 0.44549537, 0.51655245, 0.23093057, 0.65977323, 0.032735467, + 0.122360826, 0.5929595, 0.9585198, 0.7076056, 0.12442541, 0.8365421, 0.32673275, 0.14667535, 0.35522258, 0.8065045, + 0.5741041, 0.56877947, 0.4769714, 0.77324855, 0.5570607, 0.8056296, 0.11344838, 0.18434417, 0.84286284, 0.2797464, + 0.7064458, 0.53275275, 0.1283611, 0.49539268, 0.6738422, 0.09924507, 0.4589944, 0.11817658, 0.91218984, 0.4745971, + 0.679795, 0.9110093, 0.67358315, 0.1384052, 0.98417604, 0.053039193, 0.6251972, 0.8439343, 0.21441221, 0.54539645, + 0.69887686, 0.7720424, 0.15387046, 0.39991343, 0.14929414, 0.20599616, 0.24233031, 0.8791245, 0.8469268, 0.463879, + 0.68758583, 0.65248656, 0.6558335, 0.9625877, 0.6598948, 0.7799735, 0.9905311, 0.291914, 0.284873, 0.5389708, + 0.34289372, 0.47061253, 0.016644716, 0.0844512, 0.12629735, 0.47175562, 0.86187196, 0.216591, 0.39447463, 0.5261643, + 0.2164849, 0.8001003, 0.534533, 0.7928693, 0.42522, 0.940431, 0.9879527, 0.8088058, 0.7593359, 0.7298678, + 0.4412111, 0.12742984, 0.7883868, 0.6391194, 0.46703196, 0.6329733, 0.6749922, 0.7891321, 0.5974753, 0.8014935, + 0.65329194, 0.32609963, 0.3113047, 0.32964063, 0.13854718, 0.785112, 0.09087467, 0.8607018, 0.92764235, 0.50508857, + 0.44607925, 0.68823385, 0.15913153, 0.8986262, 0.07795119, 0.041403055, 0.32688403, 0.88108087, 0.76158154, 0.8454503, + 0.13635027, 0.25127447, 0.36257136, 0.0838387, 0.14311779, 0.29693568, 0.05142927, 0.8789524, 0.6201925, 0.49330652, + 0.76433456, 0.09707928, 0.40498948, 0.017602444, 0.06799281, 0.5670825, 0.6386429, 0.9474447, 0.5144155, 0.94022393, + 0.4202919, 0.39301372, 0.8567779, 0.66104794, 0.959044, 0.2068361, 0.47792387, 0.45508683, 0.29350972, 0.63454974, + 0.81996036, 0.36304796, 0.14907551, 0.09901166, 0.43101776, 0.91226697, 0.7093183, 0.9330503, 0.26806736, 0.93720376, + 0.023975253, 0.5450885, 0.79197156, 0.9473301, 0.8005451, 0.79782045, 0.08498812, 0.59906304, 0.7763226, 0.06396508, + 0.43774593, 0.69104385, 0.26854563, 0.43475223, 0.31525457, 0.12294364 +}; + +static const int32_t s_ref_axis_0[1] = { + 2 +}; + + +static const float s_ref_out_0[108] = { + 2.1479607, 5.0515876, 4.3696213, 2.9830122, 2.7934852, 2.564154, 4.662414, 2.289571, 3.146594, 3.179237, + 4.6020703, 3.0369499, 3.6867783, 1.9377437, 3.1865163, 4.511132, 3.1452065, 4.144247, 3.0180457, 3.450389, + 2.3799262, 3.7745345, 3.6735847, 2.9733417, 3.8563552, 3.615097, 2.8973176, 2.7168703, 4.529263, 3.7935452, + 4.402669, 3.426186, 4.4084315, 3.3868468, 4.7174964, 4.614127, 2.8629546, 3.0509553, 4.2314363, 3.1293142, + 3.8777928, 5.075829, 3.3027506, 4.60535, 5.1601963, 4.6862125, 4.160187, 4.364858, 3.0099988, 3.9823937, + 2.6216874, 3.3603415, 3.786106, 4.0059156, 4.098073, 3.8959074, 2.3727503, 2.9572952, 3.1321626, 4.2601295, + 4.0745482, 1.7326508, 3.570928, 2.6916146, 2.5828102, 3.2160687, 3.693218, 2.7633667, 3.3400664, 3.9167752, + 3.4680934, 3.453103, 3.7019262, 4.1528378, 2.8136678, 5.174201, 3.2367551, 3.6497583, 3.0000882, 2.2418041, + 3.8275957, 3.8120863, 3.8847024, 3.4819984, 4.0474143, 3.0365648, 2.5727167, 3.825597, 3.4211643, 3.5591462, + 4.561901, 3.861442, 3.2243252, 4.090386, 3.8178935, 3.4895515, 3.6688762, 4.824259, 2.7522986, 4.1998963, + 3.322629, 2.6064134, 3.0954452, 3.6833115, 3.0212922, 3.5082378, 3.149006, 4.572899 +}; + +static const int32_t s_ref_axis_1[1] = { + 0 +}; + +static const float s_ref_out_1[112] = { + 1.2661625, 1.1679456, 1.7865634, 0.9199115, 1.9298116, 1.8487812, 2.7281868, 0.93562424, 1.9525447, 1.9562559, + 1.8266389, 1.5007539, 0.8453138, 1.1202079, 1.9195278, 2.872138, 2.296008, 2.7217617, 1.8311902, 1.1361334, + 1.906253, 3.1016588, 2.6285043, 2.8396573, 1.468084, 2.1114373, 2.1069136, 1.9598225, 1.6062702, 2.7835827, + 2.1052873, 1.7623259, 3.0900254, 1.7208568, 1.1170847, 1.8880303, 1.9906486, 0.64239573, 2.0422616, 2.9632454, + 2.7769406, 2.8777516, 2.1796112, 1.3240033, 2.2894955, 1.5517868, 2.7756681, 2.0727267, 2.0661707, 1.8274451, + 2.5533843, 1.943889, 1.7302248, 1.1355287, 2.8312235, 1.8119285, 2.812398, 2.511435, 1.9611019, 1.9923534, + 2.4442039, 1.2393918, 1.6456362, 0.50690424, 1.3384854, 1.3740332, 0.60457134, 1.5131338, 1.1669035, 1.9978784, + 1.0530516, 2.583045, 2.1414735, 2.1525557, 2.240097, 1.4734211, 2.8136399, 2.5209146, 1.4370964, 1.7587214, + 2.0789084, 3.2916775, 1.6756729, 1.719876, 1.6671932, 3.4650178, 2.6400461, 1.6108619, 2.4159288, 1.8183124, + 2.262708, 3.0646224, 2.310889, 2.9017344, 2.8780107, 2.8361738, 2.1597433, 1.4421095, 1.0419885, 1.2992737, + 0.9932656, 3.0112586, 2.0156975, 3.1235242, 2.49526, 2.0384774, 1.8305293, 2.808711, 2.4078684, 1.5454414, + 1.1143576, 0.9288205 +}; + +static const float s_ref_in_1[448] = { + 0.27241743, 0.1422466, 0.55070436, 0.42356098, 0.78549945, 0.1721437, 0.8950968, 0.06953764, 0.21758449, 0.26146472, + 0.60098994, 0.26340437, 0.24021506, 0.48227704, 0.24195278, 0.30572116, 0.558522, 0.2461443, 0.32235014, 0.12818742, + 0.49981594, 0.8058655, 0.8851656, 0.6153375, 0.5724913, 0.35898697, 0.63837063, 0.03238249, 0.23577476, 0.8752301, + 0.65256965, 0.32213223, 0.9218172, 0.5183779, 0.22082841, 0.1152066, 0.6262294, 0.17631006, 0.66853, 0.80904007, + 0.8492582, 0.82491004, 0.5660802, 0.16041708, 0.061729074, 0.44581115, 0.65907705, 0.50401616, 0.68807924, 0.10399306, + 0.65199697, 0.19057608, 0.7821579, 0.4357785, 0.9822079, 0.2375474, 0.21295321, 0.35430133, 0.19668126, 0.7777786, + 0.6867225, 0.027563334, 0.49602926, 0.26509082, 0.49371493, 0.83431756, 0.35535812, 0.47017503, 0.69448006, 0.76407576, + 0.499102, 0.69511485, 0.29760492, 0.24290371, 0.8999163, 0.09227705, 0.89521706, 0.9496908, 0.24704683, 0.29870045, + 0.7726308, 0.9662167, 0.27161133, 0.10911167, 0.27892327, 0.99936426, 0.2098608, 0.09738982, 0.41501188, 0.068009496, + 0.59958255, 0.7619164, 0.74425817, 0.9332905, 0.21608174, 0.76533425, 0.09055054, 0.5261586, 0.103499055, 0.10998368, + 0.16352189, 0.35913157, 0.81196725, 0.8384577, 0.68306196, 0.2748705, 0.70470977, 0.97056377, 0.4977926, 0.68832636, + 0.064106226, 0.34787714, 0.3214625, 0.6241952, 0.7076223, 0.23039067, 0.3050394, 0.6889725, 0.60047925, 0.07103014, + 0.69934976, 0.9518466, 0.224002, 0.9141375, 0.0036002398, 0.3584944, 0.64399004, 0.9471005, 0.8795419, 0.95878327, + 0.4609276, 0.5811573, 0.35574257, 0.9472375, 0.646237, 0.87627614, 0.036904216, 0.9406369, 0.22282565, 0.43935597, + 0.5223634, 0.9732647, 0.7100736, 0.6379981, 0.85281324, 0.6539619, 0.4687587, 0.8189647, 0.5907332, 0.06992018, + 0.80589604, 0.85599005, 0.77453387, 0.3050785, 0.6366787, 0.34820163, 0.9103657, 0.39386237, 0.8851894, 0.89399576, + 0.80531514, 0.02433753, 0.4619224, 0.71477985, 0.077210665, 0.26895857, 0.72337544, 0.41389644, 0.7112802, 0.9027637, + 0.7097677, 0.32098222, 0.48250735, 0.532248, 0.16788399, 0.04858792, 0.3905697, 0.17859387, 0.025931954, 0.18107712, + 0.16479301, 0.06713307, 0.13508439, 0.9540683, 0.5002433, 0.9469172, 0.3525045, 0.5565518, 0.9784173, 0.31359363, + 0.68637776, 0.15428638, 0.5586734, 0.97753215, 0.4367733, 0.25113487, 0.34428573, 0.9766295, 0.7479646, 0.8266356, + 0.63020766, 0.7241231, 0.99643517, 0.99315286, 0.6760348, 0.9729363, 0.8169929, 0.6317533, 0.6607039, 0.07196474, + 0.21094894, 0.33592236, 0.20258391, 0.8101138, 0.043835044, 0.7497524, 0.96093094, 0.57015264, 0.49645448, 0.4653777, + 0.4164704, 0.10667503, 0.31941307, 0.092072606, 0.2556374, 0.3466661, 0.26669228, 0.14031887, 0.7473595, 0.89958537, + 0.99727523, 0.6668943, 0.92143786, 0.08649337, 0.630365, 0.26284456, 0.3082776, 0.01827836, 0.58912885, 0.9673784, + 0.18660796, 0.8107115, 0.79472363, 0.3304366, 0.13860583, 0.7090795, 0.25982547, 0.87166893, 0.44676113, 0.056670666, + 0.32919085, 0.6918086, 0.2906866, 0.10725379, 0.3141718, 0.7190839, 0.55417717, 0.14706194, 0.049167633, 0.91350937, + 0.12663412, 0.3114351, 0.29777277, 0.5169487, 0.9864764, 0.91419184, 0.8406942, 0.14239514, 0.54104996, 0.24663985, + 0.8931582, 0.042024016, 0.43624663, 0.71559846, 0.44112563, 0.4581585, 0.2669357, 0.31407857, 0.2732656, 0.44182825, + 0.964386, 0.7098886, 0.49677634, 0.09770262, 0.6422751, 0.26597965, 0.16827261, 0.12938643, 0.1726563, 0.00096416473, + 0.0864203, 0.56709206, 0.2337743, 0.97312856, 0.2597319, 0.04217589, 0.5250089, 0.70912397, 0.78542924, 0.34628654, + 0.279068, 0.8521625, 0.22902751, 0.47335804, 0.38167834, 0.7111242, 0.6358185, 0.46190238, 0.955374, 0.77256644, + 0.88337815, 0.12533641, 0.47030032, 0.57844794, 0.4382385, 0.75749207, 0.61164486, 0.9500388, 0.9764949, 0.9297992, + 0.6107044, 0.69705725, 0.58460987, 0.21156263, 0.14845204, 0.9556227, 0.26046526, 0.8692018, 0.80273664, 0.888953, + 0.6084446, 0.70315826, 0.51368225, 0.7258884, 0.62995946, 0.28276205, 0.41664517, 0.054837704, 0.26154447, 0.12564099, + 0.09191322, 0.08807969, 0.23533559, 0.12816215, 0.11417258, 0.6564512, 0.37128198, 0.060367465, 0.29322088, 0.2611581, + 0.4444561, 0.6519381, 0.6713363, 0.70612276, 0.25318885, 0.0963521, 0.91208863, 0.6394764, 0.8372762, 0.4763745, + 0.41192734, 0.7551427, 0.91652656, 0.7962755, 0.5574454, 0.8278341, 0.42847228, 0.083111644, 0.7612177, 0.40145504, + 0.37833, 0.040349603, 0.64705193, 0.08473039, 0.2700628, 0.78126657, 0.16667199, 0.8335712, 0.13615787, 0.6729895, + 0.77635086, 0.4654734, 0.3382436, 0.63269067, 0.13652968, 0.9835161, 0.9983393, 0.5803746, 0.6039206, 0.11671305, + 0.85237443, 0.7186564, 0.9237784, 0.5444813, 0.5578766, 0.79589, 0.6326988, 0.4136008, 0.81345034, 0.06383908, + 0.28154445, 0.3601576, 0.13686097, 0.29478955, 0.073856115, 0.19354105, 0.15913332, 0.89168584, 0.8186164, 0.25361085, + 0.20224702, 0.4783057, 0.66093755, 0.4054674, 0.27464426, 0.8323765, 0.3659259, 0.6368047, 0.33146977, 0.89772713, + 0.08861017, 0.7164577, 0.79884243, 0.5615001, 0.900409, 0.44773185, 0.22845173, 0.5520611, 0.27895117, 0.045468807, + 0.868441, 0.5092871, 0.79778445, 0.1469289, 0.14293063, 0.64180505, 0.4787078, 0.88639057, 0.8994298, 0.6661124, + 0.04853034, 0.30450118, 0.020920515, 0.66961145, 0.97992325, 0.02455163, 0.100878835, 0.20610869 +}; + + +static const int32_t s_ref_axis_2[1] = { + 3 +}; + + +static const float s_ref_out_2[360] = { + 4.6314526, 3.3901496, 5.294491, 4.326424, 4.0266924, 5.1668878, 5.09037, 6.542169, 5.692472, 4.9597254, + 3.4110997, 5.4234414, 5.035086, 3.87431, 6.3353195, 4.956802, 5.5664535, 6.8329544, 3.9345098, 3.912181, + 6.0116568, 7.535078, 7.7687616, 4.994485, 2.970294, 5.9649935, 5.5793805, 3.895461, 6.3028293, 5.8307247, + 4.4301653, 5.050832, 3.4681134, 5.4555225, 5.790288, 3.7416744, 5.954864, 4.5259514, 4.8755913, 5.840498, + 4.38002, 4.097321, 5.4937234, 4.587783, 4.2426534, 3.65559, 5.7567644, 4.8697476, 4.2803392, 4.7480483, + 3.6221828, 6.301096, 4.6530647, 4.403284, 5.9679346, 3.7276707, 4.8610144, 6.6647296, 4.310983, 5.3534265, + 5.615535, 4.555214, 3.5472596, 5.4671454, 3.2844844, 5.38472, 4.955546, 4.7539325, 5.806183, 2.9987295, + 4.050555, 4.983551, 4.437165, 5.5889945, 4.6807466, 5.2943797, 6.3407774, 2.989131, 5.5321674, 4.807746, + 5.443693, 6.1611824, 4.9719286, 4.693534, 5.3184886, 5.722538, 3.0137353, 5.668414, 3.176095, 4.6935797, + 5.8386354, 7.578068, 5.5032334, 4.5789013, 5.0962386, 5.3958626, 5.750371, 4.980014, 6.419579, 5.3583755, + 4.61578, 6.515646, 7.1421137, 3.9037275, 4.783474, 3.8281202, 5.7091546, 4.9268775, 4.6763315, 4.51723, + 5.0235257, 6.382867, 4.3904696, 6.370563, 4.97451, 6.7048225, 5.8687186, 5.4257255, 4.7253313, 5.315681, + 4.8488054, 3.972148, 5.875324, 5.483129, 6.971451, 3.9406495, 4.9879613, 3.2136765, 3.6527286, 5.2520266, + 5.019712, 4.4070444, 4.545953, 6.21807, 5.5579467, 5.7616434, 5.0374494, 4.8188357, 5.242651, 5.3159094, + 3.5839415, 4.1199436, 4.08148, 6.2988977, 4.4614983, 3.6224284, 4.4046063, 6.965977, 5.9370823, 4.461723, + 6.280719, 4.02496, 5.417304, 6.3477674, 5.6229615, 6.8539176, 3.111166, 5.5669165, 3.7148764, 4.6435657, + 4.6045775, 4.3003097, 5.503171, 4.2174177, 6.4472036, 3.8696156, 6.2742405, 4.1019616, 5.9461117, 4.886925, + 4.5387774, 5.0577264, 5.174202, 4.842995, 5.2499366, 2.8901367, 4.126834, 5.251418, 6.25564, 4.3523755, + 5.099201, 5.444023, 4.0101357, 4.3309603, 5.405243, 5.166344, 5.600432, 2.360314, 4.273644, 4.344634, + 5.128792, 3.9014041, 5.8765345, 5.501498, 5.504857, 6.8953786, 3.5118985, 5.156555, 4.043602, 5.334905, + 5.0163913, 3.6117973, 5.4926443, 5.06761, 5.190322, 3.4679158, 5.106953, 5.1057253, 4.9049125, 2.6610293, + 5.746148, 5.31465, 5.0299616, 5.0187416, 5.9699297, 5.042715, 6.0339026, 5.4471397, 4.6416016, 3.63677, + 4.9684844, 5.9431605, 5.1059146, 3.8780475, 3.6381674, 5.1605415, 4.5280514, 3.0720448, 5.2209716, 3.2253227, + 5.2857428, 4.7761, 5.8180475, 5.289606, 5.030465, 4.0288825, 6.789199, 4.276684, 4.14861, 6.7402453, + 3.7436094, 5.047489, 5.592845, 4.7784653, 6.5980234, 4.7825737, 5.240616, 4.431031, 6.899655, 6.110056, + 3.5972843, 4.121448, 5.232657, 4.6182976, 4.7434793, 6.8633175, 3.9607244, 5.399476, 4.2121625, 5.2934966, + 4.760248, 4.4562054, 5.910847, 5.243113, 3.5687232, 6.5690994, 4.2285805, 5.783585, 3.935553, 5.3451357, + 2.5869591, 3.6154685, 3.712494, 6.834568, 6.3170943, 4.399838, 4.0625134, 5.6300163, 5.232081, 6.670689, + 4.380413, 5.211981, 6.2875986, 5.2251034, 3.3762288, 6.637551, 4.650399, 4.355767, 5.3241253, 3.9049783, + 4.8787727, 5.336543, 5.293762, 3.1033487, 5.879508, 6.321685, 3.2628112, 6.25865, 6.282341, 4.692564, + 6.781967, 4.1940365, 4.4009395, 6.2249603, 3.8919258, 5.358093, 6.534253, 5.594706, 5.019779, 5.3748455, + 4.5058184, 5.741848, 5.2474794, 4.371116, 3.0388265, 5.2216744, 5.740961, 5.681837, 5.3905973, 6.011057, + 4.4717216, 6.0639343, 5.109643, 5.309008, 5.9510484, 4.8650093, 3.8410058, 3.5502245, 5.0973077, 5.237738, + 4.6245346, 4.4266977, 4.565054, 5.519083, 6.433197, 5.1200905, 6.6441164, 4.6909637, 3.9412248, 5.159569, + 5.896843, 4.9131694, 3.813469, 5.062227, 4.753413, 3.593276, 4.2971325, 5.1578197, 6.7750607, 5.8785467, + 5.721301, 4.5824227, 4.8705726, 7.273358, 5.4416604, 3.7172313, 4.584539, 4.2733927, 4.5546594, 4.6595955 + +}; + +static const float s_ref_in_2[3600] = { + 0.05338788, 0.53327465, 0.38554883, 0.77605987, 0.6835637, 0.8118249, 0.07482755, 0.3114159, 0.51885974, 0.48268938, + 0.6923772, 0.21619141, 0.030232906, 0.98164535, 0.14589095, 0.10841107, 0.13393903, 0.29073215, 0.06951475, 0.7212149, + 0.77889276, 0.48711956, 0.6235639, 0.47387552, 0.498816, 0.18380296, 0.9521822, 0.18732595, 0.6433939, 0.465518, + 0.8412818, 0.06647396, 0.4553547, 0.94103754, 0.123787284, 0.30554295, 0.21801889, 0.12576771, 0.82417953, 0.4249798, + 0.25863278, 0.5506661, 0.058689475, 0.5677924, 0.9250984, 0.24413824, 0.8171979, 0.1612767, 0.00835228, 0.4348482, + 0.52008545, 0.86259735, 0.24825168, 0.7592869, 0.89358926, 0.51786184, 0.14536107, 0.7472968, 0.22160125, 0.2509563, + 0.560653, 0.22908783, 0.19092155, 0.51687884, 0.3346951, 0.7167556, 0.9486921, 0.36208248, 0.81361294, 0.41699076, + 0.98455024, 0.96937454, 0.6181333, 0.6925013, 0.22782397, 0.4664942, 0.97488856, 0.52887046, 0.43901908, 0.6405134, + 0.80035293, 0.7552273, 0.3059199, 0.12455559, 0.4887805, 0.32202137, 0.9077922, 0.88685393, 0.8100312, 0.2909366, + 0.16754675, 0.75928295, 0.008126974, 0.20619142, 0.9110192, 0.39480472, 0.6323446, 0.30586517, 0.90345263, 0.6710906, + 0.6103233, 0.595232, 0.23644209, 0.15571702, 0.09187293, 0.89973426, 0.01775229, 0.3558756, 0.1678983, 0.28025186, + 0.56425357, 0.15725493, 0.63888025, 0.7902293, 0.66157734, 0.8131225, 0.73173904, 0.57783866, 0.48230958, 0.0062361956, + 0.25416982, 0.8891088, 0.10393989, 0.65278137, 0.70636916, 0.35162222, 0.25039482, 0.45185292, 0.5372422, 0.8376051, + 0.6883637, 0.15012777, 0.58172965, 0.25360692, 0.028959513, 0.29804814, 0.35031104, 0.5826851, 0.29512227, 0.64535594, + 0.49078786, 0.47510707, 0.30632663, 0.99111915, 0.37721658, 0.40398908, 0.678228, 0.98978055, 0.78455055, 0.8382143, + 0.70778096, 0.4665346, 0.7128408, 0.09071219, 0.70480096, 0.6030146, 0.52419865, 0.09176254, 0.5225699, 0.5325867, + 0.90014195, 0.7387774, 0.71732974, 0.356681, 0.01047802, 0.72970974, 0.7272601, 0.6271509, 0.37025535, 0.38866925, + 0.9366946, 0.9095262, 0.5738658, 0.71178865, 0.9557766, 0.5949906, 0.60609686, 0.62840617, 0.7652366, 0.15057182, + 0.58952343, 0.7452873, 0.2767061, 0.4416033, 0.79022026, 0.36353326, 0.13049114, 0.3995204, 0.1856947, 0.011929989, + 0.32960963, 0.15810418, 0.84280825, 0.241341, 0.15381503, 0.6759347, 0.6451962, 0.26296532, 0.4660555, 0.13635111, + 0.49833906, 0.7659172, 0.24095297, 0.21699023, 0.27686787, 0.9406104, 0.44943142, 0.9675294, 0.78507304, 0.86994505, + 0.28340387, 0.93033755, 0.62303925, 0.9045253, 0.76706684, 0.3126824, 0.8758615, 0.91010165, 0.9325273, 0.9955323, + 0.8058715, 0.9841894, 0.99383116, 0.64302087, 0.67546177, 0.91043556, 0.74984026, 0.76638746, 0.32851505, 0.91120887, + 0.714031, 0.9667351, 0.67158175, 0.7081578, 0.9435501, 0.24842548, 0.094512224, 0.22739244, 0.36736643, 0.052732944, + 0.106968045, 0.3738023, 0.47110844, 0.18571138, 0.5566442, 0.21550691, 0.02779293, 0.46477652, 0.40338182, 0.16460145, + 0.5878651, 0.7084272, 0.59980726, 0.8800658, 0.4808247, 0.6313894, 0.3531072, 0.16404891, 0.8049629, 0.75449514, + 0.4889418, 0.6986743, 0.25176942, 0.88964283, 0.58012974, 0.90689874, 0.5992484, 0.10781193, 0.9519961, 0.10426724, + 0.40665078, 0.22118556, 0.24760783, 0.21276486, 0.3899132, 0.7942964, 0.13238502, 0.33783758, 0.69051266, 0.4623071, + 0.13735783, 0.9413959, 0.45063055, 0.9156736, 0.8849255, 0.24030018, 0.6180475, 0.43265498, 0.73586774, 0.94597554, + 0.7257321, 0.20644438, 0.6258342, 0.5259335, 0.32504344, 0.20308006, 0.64423275, 0.8425683, 0.75613713, 0.97571874, + 0.24101448, 0.8037157, 0.36263263, 0.11313546, 0.29876244, 0.28820145, 0.89021516, 0.6905155, 0.062144518, 0.6798278, + 0.6794183, 0.09511745, 0.8656467, 0.6568285, 0.32577574, 0.25796008, 0.27901483, 0.5699465, 0.41636288, 0.90476096, + 0.029880404, 0.70896554, 0.21135962, 0.7216531, 0.30699384, 0.6803849, 0.24964929, 0.26004815, 0.2564404, 0.04273832, + 0.9055059, 0.5685711, 0.9509543, 0.07348192, 0.3302462, 0.75862885, 0.8924389, 0.103850484, 0.3011613, 0.5706837, + 0.6149541, 0.68695366, 0.62580776, 0.60371304, 0.5323329, 0.032447815, 0.88190556, 0.8457937, 0.17328882, 0.7930907, + 0.9760661, 0.12988198, 0.600477, 0.32472432, 0.043180108, 0.49072385, 0.12768388, 0.32121265, 0.12110293, 0.6066216, + 0.95810425, 0.60996056, 0.30545878, 0.7579678, 0.13801646, 0.93924165, 0.80441976, 0.7555567, 0.23953807, 0.44659972, + 0.28952265, 0.788602, 0.60553336, 0.4915353, 0.69760215, 0.04821968, 0.7530663, 0.007732749, 0.2498486, 0.59428847, + 0.5863098, 0.59331346, 0.16416132, 0.6980951, 0.85624766, 0.67378783, 0.054865837, 0.25060475, 0.62625694, 0.37194872, + 0.54311013, 0.97166574, 0.58582056, 0.82188714, 0.2639686, 0.040347815, 0.9626074, 0.9910282, 0.052432537, 0.60763013, + 0.6451775, 0.1226747, 0.6257342, 0.6320373, 0.42016482, 0.065021396, 0.293028, 0.86147475, 0.47686362, 0.23784399, + 0.6382475, 0.55132496, 0.6120926, 0.48279154, 0.939446, 0.17938626, 0.38176918, 0.013682723, 0.035885572, 0.26269484, + 0.87908065, 0.16413355, 0.19227827, 0.77581525, 0.6250849, 0.68134665, 0.77772343, 0.3721714, 0.13575137, 0.8903377, + 0.3148036, 0.2563522, 0.8996638, 0.05933118, 0.9253408, 0.16301012, 0.11328769, 0.08390081, 0.84523857, 0.92685425, + 0.27441978, 0.8460517, 0.48212397, 0.41194117, 0.24299312, 0.052200317, 0.79656494, 0.43228602, 0.3406216, 0.36345077, + 0.3144791, 0.085336804, 0.21166742, 0.866022, 0.21280158, 0.03535676, 0.44692338, 0.56498516, 0.76408505, 0.15393281, + 0.5879061, 0.15245426, 0.7949693, 0.7280108, 0.27058363, 0.73786366, 0.4885801, 0.93891895, 0.97367465, 0.08380306, + 0.14414358, 0.5960443, 0.78625333, 0.5693854, 0.10851097, 0.8229513, 0.45183575, 0.25359726, 0.18055964, 0.9564661, + 0.59412014, 0.06595147, 0.67271316, 0.09738171, 0.98867536, 0.18597925, 0.29307985, 0.378124, 0.8365605, 0.16775405, + 0.27543783, 0.5958394, 0.636698, 0.482517, 0.5378598, 0.092191815, 0.379519, 0.58329546, 0.61987424, 0.54481566, + 0.2510897, 0.7639048, 0.32046425, 0.40864575, 0.12744653, 0.118441105, 0.67558515, 0.1753912, 0.6355742, 0.14564002, + 0.4922818, 0.89547336, 0.8548031, 0.770777, 0.89475644, 0.845024, 0.30919552, 0.43075275, 0.6321547, 0.1758771, + 0.76777565, 0.932919, 0.49310172, 0.026759267, 0.8731743, 0.30319047, 0.09714377, 0.46491396, 0.1044054, 0.58968115, + 0.81293285, 0.23228168, 0.18371427, 0.3787198, 0.3876717, 0.23055375, 0.51932704, 0.7065933, 0.83884645, 0.11264312, + 0.19617355, 0.68095434, 0.7533941, 0.80699277, 0.73543644, 0.9518975, 0.5734329, 0.11459243, 0.5734956, 0.58156455, + 0.27599645, 0.87470865, 0.5541824, 0.20409143, 0.050843716, 0.5582495, 0.0698477, 0.34697437, 0.33687687, 0.4558996, + 0.9087175, 0.6257435, 0.42228913, 0.4544146, 0.17661607, 0.61935353, 0.20843184, 0.313514, 0.5013133, 0.6306206, + 0.9630933, 0.48180854, 0.38110352, 0.908895, 0.36585867, 0.5423924, 0.51019347, 0.8339546, 0.8249662, 0.85246384, + 0.52898896, 0.5753976, 0.99089503, 0.4603685, 0.1077373, 0.6929743, 0.25539386, 0.018425703, 0.2433995, 0.4374025, + 0.28977323, 0.99002266, 0.81024706, 0.58248043, 0.5514201, 0.6746683, 0.028779864, 0.48861825, 0.39077783, 0.54663885, + 0.84474456, 0.7412145, 0.8193674, 0.5905963, 0.38943863, 0.8623228, 0.52549815, 0.1511668, 0.17786884, 0.5133172, + 0.055423856, 0.72411215, 0.8118733, 0.16154039, 0.45078516, 0.8882407, 0.004402876, 0.13221526, 0.8456714, 0.4809487, + 0.20351255, 0.5397172, 0.8593813, 0.15425324, 0.48141134, 0.5546061, 0.08750987, 0.10755098, 0.1098243, 0.44949257, + 0.08541024, 0.9734521, 0.07400274, 0.7280836, 0.69340694, 0.9425883, 0.914503, 0.64560056, 0.004334092, 0.40576386, + 0.2874545, 0.6111239, 0.344836, 0.2880516, 0.036996007, 0.46369922, 0.4130844, 0.3350768, 0.2971394, 0.20702255, + 0.5122565, 0.19153905, 0.013921142, 0.46467018, 0.64104974, 0.23453593, 0.64267874, 0.966133, 0.8984891, 0.8194463, + 0.4205259, 0.5826622, 0.86243176, 0.35729146, 0.502838, 0.187338, 0.51917005, 0.22522616, 0.9439242, 0.35413826, + 0.016472816, 0.32803178, 0.46308947, 0.48721647, 0.85403264, 0.36779618, 0.48978603, 0.34078145, 0.8293803, 0.5773454, + 0.04373324, 0.4423046, 0.3868202, 0.96255004, 0.39996195, 0.51010287, 0.8616303, 0.621879, 0.8424163, 0.734784, + 0.023580432, 0.8235264, 0.7030287, 0.6257827, 0.16483319, 0.20242226, 0.011038542, 0.1812787, 0.03737402, 0.22586465, + 0.28033423, 0.66035974, 0.3358873, 0.012434125, 0.013985753, 0.524987, 0.41161942, 0.99624264, 0.57698035, 0.23772454, + 0.68829656, 0.27378082, 0.27983916, 0.71483564, 0.95584714, 0.2692021, 0.063765526, 0.4610331, 0.9968724, 0.28007853, + 0.31052268, 0.12741435, 0.24655724, 0.44912386, 0.3871801, 0.3199308, 0.13290274, 0.830225, 0.7290795, 0.90422857, + 0.43018568, 0.394933, 0.32261467, 0.29196942, 0.36234558, 0.93110573, 0.7408093, 0.58748317, 0.77218103, 0.7553668, + 0.9042233, 0.7671069, 0.9834844, 0.11783457, 0.5234262, 0.0717845, 0.47552752, 0.25108957, 0.38970888, 0.19656062, + 0.65593517, 0.33749068, 0.93375385, 0.26395726, 0.9532844, 0.59961665, 0.93017054, 0.009052634, 0.019179225, 0.5919391, + 0.88269484, 0.8896333, 0.07228851, 0.9861102, 0.94508004, 0.6336192, 0.5574509, 0.7377317, 0.41453612, 0.2216326, + 0.13869834, 0.5669918, 0.07152462, 0.4020505, 0.32384634, 0.23308337, 0.22926235, 0.5528232, 0.12453914, 0.3463112, + 0.5807766, 0.643407, 0.24506867, 0.8628808, 0.79203, 0.29488778, 0.02862823, 0.75167334, 0.7285366, 0.6042788, + 0.3315766, 0.45344615, 0.6006973, 0.84762716, 0.5658089, 0.6534269, 0.43183398, 0.22819579, 0.45819557, 0.23693764, + 0.7256324, 0.7792978, 0.11758578, 0.0022194386, 0.23370838, 0.3862368, 0.74948144, 0.791242, 0.68624437, 0.9720448, + 0.69776034, 0.5188911, 0.45230544, 0.91786206, 0.40764832, 0.9096074, 0.89006054, 0.29187274, 0.29315984, 0.7820145, + 0.17715728, 0.6848273, 0.16961956, 0.52626514, 0.8133384, 0.92281973, 0.25973296, 0.48408294, 0.79071605, 0.1433686, + 0.4851141, 0.3333125, 0.3349017, 0.7650391, 0.6105232, 0.95183444, 0.15465546, 0.36886525, 0.050993323, 0.6382946, + 0.6195655, 0.36611533, 0.8112352, 0.97155666, 0.2351023, 0.7001647, 0.40842104, 0.32018244, 0.80329883, 0.082846284, + 0.7082591, 0.75320935, 0.72287285, 0.8350178, 0.41559255, 0.29724967, 0.32392383, 0.96970356, 0.6896795, 0.0070302486, + 0.03976488, 0.09442413, 0.6563957, 0.055316687, 0.22115028, 0.28366423, 0.18290877, 0.44673216, 0.7863656, 0.24701285, + 0.62238955, 0.5568316, 0.51779675, 0.92030334, 0.2847886, 0.08319402, 0.79893327, 0.8892267, 0.6618495, 0.33310068, + 0.22273576, 0.18489039, 0.08447981, 0.8591956, 0.40707552, 0.26070046, 0.28650582, 0.23292923, 0.27950203, 0.35808027, + 0.58742404, 0.6393957, 0.3046435, 0.2689923, 0.48160446, 0.40666997, 0.8839054, 0.16171539, 0.93607736, 0.023151517, + 0.3565464, 0.77685285, 0.050717115, 0.66158175, 0.9285915, 0.7764232, 0.04458821, 0.5685246, 0.9218457, 0.7529645, + 0.5150918, 0.5459441, 0.95426595, 0.9547696, 0.8196323, 0.8476658, 0.58370745, 0.4615879, 0.9301264, 0.9652765, + 0.6969838, 0.86634505, 0.2064606, 0.6792345, 0.38931274, 0.33010733, 0.6534066, 0.34296083, 0.54236555, 0.7960563, + 0.9948636, 0.3104217, 0.45983863, 0.9606466, 0.08412993, 0.21350765, 0.8767365, 0.09073269, 0.58666205, 0.0013617277, + 0.3488449, 0.57402587, 0.6927465, 0.5764477, 0.25428903, 0.30107033, 0.41499603, 0.6308689, 0.9370655, 0.36588395, + 0.70017385, 0.062515736, 0.72438526, 0.33671403, 0.92918324, 0.04602623, 0.8050573, 0.822634, 0.43422186, 0.534951, + 0.5907061, 0.42558825, 0.71307063, 0.11955571, 0.9142189, 0.3917849, 0.77613103, 0.5828601, 0.27712607, 0.95932865, + 0.99412286, 0.33553386, 0.15722406, 0.72461796, 0.97319794, 0.51078427, 0.0055435896, 0.4340316, 0.34114254, 0.5038153, + 0.7766564, 0.8668872, 0.6807647, 0.7488723, 0.7954216, 0.7801273, 0.19302571, 0.48994505, 0.18600571, 0.901873, + 0.023107886, 0.17637968, 0.9419825, 0.07883179, 0.935163, 0.64799285, 0.81623054, 0.683048, 0.88972056, 0.16591895, + 0.8575858, 0.4613818, 0.20869291, 0.692376, 0.59870183, 0.21636558, 0.78621745, 0.38449764, 0.26173544, 0.14822543, + 0.29211807, 0.89387846, 0.2220813, 0.55910015, 0.9502146, 0.8080107, 0.16924953, 0.9570216, 0.9776013, 0.6863704, + 0.7817261, 0.78018844, 0.71725786, 0.8116455, 0.869027, 0.5829407, 0.95367336, 0.8743063, 0.2706939, 0.50065434, + 0.09018266, 0.10824859, 0.8982787, 0.1768384, 0.6856251, 0.18264937, 0.08615756, 0.20641124, 0.59923327, 0.8701029, + 0.58536065, 0.35222208, 0.12516928, 0.47634685, 0.9228983, 0.12137878, 0.8544849, 0.36826432, 0.53755975, 0.43978882, + 0.28538346, 0.16112328, 0.5982611, 0.014742136, 0.026756167, 0.1362611, 0.38576555, 0.54181874, 0.9827788, 0.69522977, + 0.7139063, 0.264539, 0.9946592, 0.7463875, 0.41069114, 0.63434565, 0.97708344, 0.18349242, 0.4196328, 0.3644172, + 0.20782077, 0.8793026, 0.19882822, 0.90065396, 0.49229062, 0.55321705, 0.14427948, 0.8159728, 0.22799003, 0.5065218, + 0.75467443, 0.6611012, 0.07586563, 0.37493885, 0.15202773, 3.0517578e-05, 0.68459475, 0.96836483, 0.18465328, 0.82008004, + 0.07469225, 0.9601003, 0.046043873, 0.2753358, 0.6767521, 0.31431222, 0.5492983, 0.62965834, 0.95362246, 0.03741443, + 0.22456527, 0.7896837, 0.06382227, 0.73836875, 0.028351784, 0.8166436, 0.7819146, 0.76755214, 0.13432658, 0.6782968, + 0.36512828, 0.85190976, 0.7224643, 0.9986874, 0.43727362, 0.5910783, 0.54073226, 0.6111964, 0.49059045, 0.773806, + 0.22783864, 0.557788, 0.710438, 0.991006, 0.7734835, 0.62139237, 0.14259076, 0.030434608, 0.28887427, 0.04662299, + 0.28035986, 0.71295226, 0.61225367, 0.8404217, 0.82808006, 0.63743675, 0.99126124, 0.12438774, 0.670889, 0.6725209, + 0.29241133, 0.8699088, 0.100467086, 0.5471461, 0.42417943, 0.64534223, 0.42065728, 0.5543214, 0.55903184, 0.56104493, + 0.51506186, 0.79960597, 0.85172606, 0.26914096, 0.98191035, 0.80255723, 0.73988426, 0.8881335, 0.3465433, 0.5102589, + 0.0024399757, 0.84398186, 0.41104007, 0.97834396, 0.3582815, 0.28221226, 0.7538636, 0.82187617, 0.46439528, 0.9522842, + 0.98968625, 0.54569674, 0.7416853, 0.25720274, 0.7386141, 0.51273155, 0.92034984, 0.20103037, 0.0018063784, 0.51692235, + 0.77992153, 0.096181035, 0.077481985, 0.6441437, 0.2677076, 0.3460499, 0.7858621, 0.26977623, 0.5474616, 0.91074574, + 0.6311351, 0.9143299, 0.63659656, 0.9971094, 0.11050427, 0.80656683, 0.08400345, 0.78834283, 0.1351676, 0.21192515, + 0.046553135, 0.7892258, 0.77173185, 0.65169764, 0.9159827, 0.16493905, 0.21018708, 0.50409627, 0.7438711, 0.050520897, + 0.1514256, 0.6413971, 0.9331708, 0.17371643, 0.13074172, 0.85771966, 0.23751998, 0.08022988, 0.5173471, 0.24887979, + 0.14303231, 0.5853329, 0.41598082, 0.50099444, 0.89950025, 0.8051206, 0.9076984, 0.13294923, 0.70561993, 0.77909505, + 0.10683048, 0.17451715, 0.81043947, 0.63642156, 0.20819736, 0.55720425, 0.99082077, 0.41748822, 0.5949615, 0.98624814, + 0.914356, 0.589224, 0.8957373, 0.98555446, 0.90177155, 0.6147895, 0.21345699, 0.36278725, 0.7352588, 0.7585145, + 0.7812885, 0.5494627, 0.2527635, 0.24361539, 0.3350861, 0.2299937, 0.57615197, 0.5571872, 0.026614666, 0.3884859, + 0.62638724, 0.22102797, 0.82251275, 0.24282229, 0.56534183, 0.41435504, 0.8058554, 0.008076668, 0.31674504, 0.96483696, + 0.0036722422, 0.30464602, 0.0498451, 0.15107799, 0.6351663, 0.0821321, 0.6328051, 0.33805108, 0.7468116, 0.26946902, + 0.008346677, 0.6201843, 0.72999024, 0.18597221, 0.31186008, 0.27696884, 0.28282452, 0.5392021, 0.22431934, 0.47306013, + 0.97167265, 0.70468986, 0.6213577, 0.6244855, 0.5355427, 0.76277196, 0.3527596, 0.11873245, 0.3867787, 0.17323482, + 0.8752866, 0.58124256, 0.566615, 0.8131281, 0.11323595, 0.050239682, 0.9186964, 0.49102938, 0.49906456, 0.11117351, + 0.74266386, 0.082047105, 0.3961805, 0.90810466, 0.12492943, 0.62403107, 0.524845, 0.118376255, 0.22479963, 0.6610671, + 0.6688267, 0.1868211, 0.2449578, 0.3070413, 0.0035446882, 0.91785085, 0.37267637, 0.90682554, 0.43464327, 0.5027652, + 0.7326404, 0.8669666, 0.9169364, 0.79049134, 0.63582265, 0.23339379, 0.14591634, 0.8765527, 0.57817054, 0.44117904, + 0.7636498, 0.90421295, 0.304242, 0.5523784, 0.9938531, 0.2621634, 0.8135421, 0.10262132, 0.067290306, 0.79399335, + 0.44680035, 0.12662601, 0.38810122, 0.93097115, 0.7592342, 0.31137538, 0.9421387, 0.6344526, 0.8770789, 0.34486473, + 0.78392565, 0.6293162, 0.2406218, 0.6144471, 0.9818666, 0.19417119, 0.45903134, 0.63446784, 0.2492429, 0.25035834, + 0.82125485, 0.6784874, 0.12828827, 0.32775068, 0.4518, 0.6961206, 0.40835845, 0.19204438, 0.41124833, 0.70348287, + 0.7077348, 0.8921907, 0.9495231, 0.2691691, 0.6489984, 0.19629204, 0.21326542, 0.38734674, 0.45541644, 0.52271426, + 0.7051685, 0.5772383, 0.84789824, 0.841887, 0.5496808, 0.23395228, 0.06230092, 0.0875721, 0.73094153, 0.6792693, + 0.2582475, 0.049636245, 0.2852062, 0.32567334, 0.612864, 0.9920256, 0.50795555, 0.114962935, 0.24068129, 0.19668889, + 0.14616048, 0.91603553, 0.6150583, 0.8056741, 0.37068808, 0.035991907, 0.3996414, 0.1493485, 0.439546, 0.2417996, + 0.26057386, 0.18546665, 0.5638945, 0.6546043, 0.16363168, 0.66931, 0.17198408, 0.57299197, 0.8363092, 0.0027139187, + 0.7483021, 0.7402736, 0.83327913, 0.79789615, 0.26365983, 0.33445787, 0.82715774, 0.8514973, 0.079747915, 0.8226265, + 0.7882786, 0.91611445, 0.19671309, 0.7948278, 0.52869654, 0.74227226, 0.005864978, 0.056674123, 0.16427672, 0.26777995, + 0.1157676, 0.13946283, 0.19586003, 0.60996985, 0.99474084, 0.35092437, 0.36949253, 0.782254, 0.053942442, 0.010013938, + 0.25491416, 0.36287475, 0.27344787, 0.771368, 0.97703624, 0.32092106, 0.4669119, 0.53380847, 0.29385364, 0.14947021, + 0.9470762, 0.5531417, 0.6269984, 0.6124122, 0.5770017, 0.14757478, 0.79482424, 0.9143239, 0.98675454, 0.80586934, + 0.6792681, 0.34178138, 0.62485003, 0.71117187, 0.8276361, 0.34993446, 0.5935061, 0.43402278, 0.6073034, 0.7676077, + 0.35981333, 0.5897325, 0.99388885, 0.44033468, 0.59909153, 0.17113638, 0.3399433, 0.037410736, 0.5956106, 0.3347609, + 0.634133, 0.5040333, 0.98190093, 0.75298023, 0.8233497, 0.6208886, 0.66836476, 0.30626953, 0.6501658, 0.33863306, + 0.9033451, 0.122396946, 0.8050717, 0.11865997, 0.005946994, 0.593683, 0.1656245, 0.38930643, 0.7498045, 0.171121, + 0.12839544, 0.9428444, 0.4282006, 0.85549057, 0.2725712, 0.8494272, 0.4413259, 0.61274767, 0.64283395, 0.24346709, + 0.37192512, 0.26858616, 0.9837848, 0.5807588, 0.9813533, 0.9262183, 0.25052953, 0.63576984, 0.53413177, 0.8147098, + 0.87779987, 0.5048512, 0.23181331, 0.91634357, 0.31307125, 0.22807157, 0.4434905, 0.54325247, 0.74545264, 0.8188149, + 0.5581975, 0.92756784, 0.45664704, 0.60477674, 0.8597052, 0.9742577, 0.4074036, 0.93269145, 0.91867983, 0.21399045, + 0.38356173, 0.047356486, 0.2016623, 0.15571868, 0.15731311, 0.42723453, 0.87440944, 0.21972167, 0.5750023, 0.069185495, + 0.9616288, 0.5884545, 0.47309518, 0.44084752, 0.27182698, 0.72217333, 0.7299384, 0.39775252, 0.19970095, 0.7814982, + 0.2901188, 0.100337744, 0.26153314, 0.47814703, 0.4385054, 0.33292675, 0.6204461, 0.963243, 0.15368092, 0.07593739, + 0.24942994, 0.3542031, 0.8646345, 0.31434095, 0.5643883, 0.6068319, 0.46717894, 0.687353, 0.058402896, 0.4768021, + 0.34411168, 0.17198193, 0.24417043, 0.32249582, 0.2590382, 0.912886, 0.8556826, 0.91358113, 0.33505607, 0.24557388, + 0.018204331, 0.40480876, 0.9495534, 0.59072244, 0.42886972, 0.45545912, 0.1488992, 0.5295303, 0.7625712, 0.011691332, + 0.4603845, 0.8796458, 0.587458, 0.5254934, 0.89566755, 0.014761925, 0.6583179, 0.4517964, 0.9488832, 0.08076239, + 0.16287708, 0.28614402, 0.68821144, 0.81519735, 0.28239393, 0.16196215, 0.0029393435, 0.5602875, 0.81873524, 0.43866932, + 0.606763, 0.49302936, 0.31008124, 0.90874815, 0.87819195, 0.36834884, 0.7841091, 0.9117651, 0.7318628, 0.45430386, + 0.35772836, 0.55437124, 0.100630164, 0.77114594, 0.094901204, 0.2865703, 0.47497487, 0.25685966, 0.9425465, 0.029887319, + 0.07836223, 0.9242526, 0.67121136, 0.9908116, 0.7356689, 0.50391364, 0.3360654, 0.97230005, 0.37260938, 0.68904567, + 0.71923625, 0.5154693, 0.3211763, 0.14385068, 0.72710204, 0.57916486, 0.008303404, 0.061687946, 0.79869795, 0.22727287, + 0.38508332, 0.7432704, 0.7662873, 0.37220562, 0.9539901, 0.6041137, 0.33417356, 0.65024686, 0.7726158, 0.36412513, + 0.3907938, 0.8529533, 0.4795549, 0.96793914, 0.36191595, 0.30755746, 0.5438132, 0.5007429, 0.36279774, 0.118857026, + 0.55855846, 0.4437002, 0.14894056, 0.48293424, 0.95782566, 0.8036921, 0.28501987, 0.12654912, 0.365744, 0.36581326, + 0.66963637, 0.9659089, 0.82623756, 0.06783128, 0.5704379, 0.70359135, 0.2910174, 0.12992609, 0.55779076, 0.27534866, + 0.10464096, 0.6660743, 0.05568087, 0.13560736, 0.8776313, 0.92405856, 0.42314005, 0.44264567, 0.5472832, 0.9974396, + 0.9741874, 0.09415567, 0.53906894, 0.15336716, 0.29060173, 0.3387171, 0.64941645, 0.8255943, 0.74538577, 0.23250067, + 0.9626887, 0.24806964, 0.8060491, 0.2969842, 0.79090047, 0.33829534, 0.6336843, 0.4518528, 0.6915723, 0.029839754, + 0.16647506, 0.39573956, 0.08862412, 0.016178966, 0.052921057, 0.21782756, 0.6218153, 0.50709486, 0.32802796, 0.49543226, + 0.049818635, 0.53848016, 0.8173803, 0.23538697, 0.20066202, 0.9021071, 0.5141934, 0.32053828, 0.54631877, 0.0019482374, + 0.533844, 0.7678509, 0.6088238, 0.74461114, 0.5792794, 0.1659739, 0.24033475, 0.412637, 0.547732, 0.6503308, + 0.8846328, 0.45547724, 0.36146247, 0.9499599, 0.73945606, 0.29144657, 0.53612494, 0.9637383, 0.93161035, 0.14173126, + 0.3059044, 0.06322336, 0.47358847, 0.1634872, 0.3452301, 0.8622345, 0.91130364, 0.48902917, 0.26508844, 0.47328615, + 0.50762093, 0.66342235, 0.65169156, 0.2931292, 0.2012496, 0.41731787, 0.74583375, 0.59053123, 0.39286196, 0.635543, + 0.99667823, 0.06353879, 0.70077395, 0.3093922, 0.58273935, 0.343161, 0.2715422, 0.7438059, 0.66015184, 0.7722397, + 0.9147043, 0.73979557, 0.050675273, 0.15575731, 0.047237754, 0.10236144, 0.7199383, 0.6555284, 0.23744094, 0.38669658, + 0.595615, 0.61655796, 0.20261288, 0.25504458, 0.97712874, 0.082057476, 0.7008244, 0.13255, 0.33376753, 0.43480158, + 0.82233584, 0.9893441, 0.054785967, 0.26241326, 0.9525125, 0.87277627, 0.11326623, 0.011104226, 0.43593526, 0.89076924, + 0.11505926, 0.4572612, 0.8960165, 0.6806023, 0.96788037, 0.43750703, 0.12562001, 0.94301593, 0.5034176, 0.0399642, + 0.9716402, 0.10844755, 0.9369637, 0.6975038, 0.73210967, 0.36686063, 0.5703528, 0.088079095, 0.7104292, 0.41804564, + 0.121742606, 0.35850537, 0.6504594, 0.13200223, 0.2678467, 0.009881973, 0.049093366, 0.006628871, 0.67125773, 0.092895746, + 0.05418849, 0.1702931, 0.9489049, 0.6399064, 0.7612647, 0.27210438, 0.7364912, 0.05863142, 0.41485822, 0.21700108, + 0.28951347, 0.0656178, 0.67589235, 0.20911777, 0.41150534, 0.76864326, 0.46809888, 0.75869155, 0.2380637, 0.45948982, + 0.7511587, 0.5838133, 0.68924844, 0.34272063, 0.77698886, 0.4730569, 0.09202576, 0.57735693, 0.6268717, 0.21555054, + 0.80967045, 0.18879807, 0.4520861, 0.14313209, 0.0545125, 0.5299039, 0.07047796, 0.14857888, 0.75658166, 0.7476624, + 0.78879356, 0.0596478, 0.7126292, 0.9082972, 0.59186876, 0.9666004, 0.4277525, 0.18683302, 0.6938858, 0.54022586, + 0.54279315, 0.8275379, 0.9431139, 0.45086205, 0.521386, 0.531656, 0.779323, 0.27156937, 0.46507335, 0.16818368, + 0.7115723, 0.44442344, 0.3785144, 0.86182106, 0.98573875, 0.26274478, 0.49428654, 0.3988204, 0.05621147, 0.9107237, + 0.5459734, 0.9698428, 0.63981783, 0.49870348, 0.79262006, 0.34285808, 0.8736379, 0.58428955, 0.89621973, 0.7514156, + 0.2500229, 0.37044156, 0.17858624, 0.011668563, 0.1610508, 0.23095572, 0.43932176, 0.89876246, 0.40001154, 0.571077, + 0.28762877, 0.8468907, 0.23359406, 0.15186179, 0.71721065, 0.28672147, 0.34740615, 0.63810694, 0.67104757, 0.97608745, + 0.45288944, 0.81503356, 0.5194274, 0.25501657, 0.23005784, 0.23724163, 0.60981274, 0.6684809, 0.25304246, 0.0025992393, + 0.5854924, 0.36654103, 0.7113495, 0.4678247, 0.20158696, 0.5570767, 0.72576034, 0.8576778, 0.27661097, 0.58498454, + 0.07861769, 0.27565598, 0.6329297, 0.99668837, 0.99829257, 0.7041129, 0.55665255, 0.32900393, 0.15544593, 0.28899145, + 0.18146074, 0.4333825, 0.25522923, 0.56290853, 0.43915153, 0.0011008978, 0.44239974, 0.26880503, 0.60295415, 0.42440474, + 0.58854914, 0.3556373, 0.45344055, 0.8514602, 0.7754861, 0.066423535, 0.20454073, 0.56293416, 0.8492116, 0.78496075, + 0.19457912, 0.9618577, 0.1472565, 0.32801235, 0.71831644, 0.15783572, 0.11309576, 0.9319098, 0.6244559, 0.89029074, + 0.8221022, 0.8559654, 0.024967074, 0.06750584, 0.17022657, 0.55600274, 0.74315274, 0.96926713, 0.32544243, 0.65568984, + 0.08838022, 0.44170523, 0.18168104, 0.9115685, 0.7397616, 0.09368813, 0.14046764, 0.31007802, 0.5585172, 0.0020680428, + 0.06978297, 0.93712807, 0.84556496, 0.28471506, 0.512676, 0.6666, 0.68012655, 0.39698267, 0.27655137, 0.43682575, + 0.56988037, 0.9146124, 0.45821953, 0.3103994, 0.096473694, 0.59808254, 0.28097808, 0.36081588, 0.86763895, 0.6486243, + 0.45206463, 0.16312313, 0.25862706, 0.9772004, 0.36955166, 0.44093156, 0.9953301, 0.5002159, 0.5319911, 0.21587682, + 0.34766114, 0.25480068, 0.71190965, 0.15587234, 0.015319586, 0.30078864, 0.06905615, 0.41275513, 0.17785001, 0.215016, + 0.37261415, 0.6511587, 0.79052985, 0.6817529, 0.060821652, 0.5524225, 0.92593646, 0.22843814, 0.80642426, 0.67604935, + 0.7701262, 0.120652795, 0.56832147, 0.9189483, 0.37761378, 0.2701757, 0.8007511, 0.7996105, 0.49731266, 0.19113767, + 0.19066262, 0.5072293, 0.18622017, 0.8377557, 0.36327875, 0.77997506, 0.67428935, 0.76877546, 0.33302844, 0.38874686, + 0.7992499, 0.69803965, 0.3103609, 0.47553337, 0.22880018, 0.23313534, 0.42834187, 0.75218356, 0.34107912, 0.7520176, + 0.6987015, 0.92401946, 0.91179013, 0.47521555, 0.90081465, 0.44400644, 0.17522144, 0.99085236, 0.11477697, 0.3345312, + 0.2159152, 0.21531558, 0.857708, 0.03550732, 0.91260266, 0.58104765, 0.62081146, 0.8006053, 0.44487727, 0.35832453, + 0.50761557, 0.44910872, 0.7147782, 0.72367764, 0.9326123, 0.29223096, 0.45186317, 0.9503292, 0.6678194, 0.34386754, + 0.7693442, 0.66958714, 0.73360956, 0.4611708, 0.09887314, 0.200418, 0.69692683, 0.702603, 0.762849, 0.35175812, + 0.049579978, 0.67362833, 0.0015245676, 0.6285583, 0.91239023, 0.031867385, 0.9244741, 0.41512072, 0.9253615, 0.079096675, + 0.72723925, 0.39360988, 0.24304521, 0.15560818, 0.041139245, 0.3362348, 0.55622256, 0.59740293, 0.3870716, 0.19919634, + 0.08506644, 0.20412779, 0.24865675, 0.8515825, 0.14244354, 0.52828646, 0.74260414, 0.62648404, 0.719769, 0.81946385, + 0.43523777, 0.5222846, 0.48170733, 0.9578924, 0.78787875, 0.45989263, 0.976284, 0.8507621, 0.14487004, 0.32635033, + 0.020331979, 0.71688056, 0.67764735, 0.25449133, 0.9653505, 0.7624005, 0.61675406, 0.07801354, 0.07414389, 0.939901, + 0.67883706, 0.1387366, 0.77622104, 0.417269, 0.17931628, 0.34446836, 0.26415932, 0.54243934, 0.21575785, 0.32084274, + 0.6471205, 0.45512283, 0.32815123, 0.89469707, 0.21433556, 0.33858073, 0.21323228, 0.33407354, 0.1776073, 0.035246134, + 0.61234796, 0.27119362, 0.82145226, 0.6387135, 0.25996387, 0.0697701, 0.98357904, 0.5879369, 0.010895252, 0.9046893, + 0.77307105, 0.8458985, 0.3633685, 0.061897755, 0.28181386, 0.5076786, 0.39590287, 0.24668634, 0.22664952, 0.82508445, + 0.591334, 0.41541588, 0.25864935, 0.1826005, 0.02313137, 0.008282304, 0.0048879385, 0.18609309, 0.5629295, 0.83872104, + 0.7212565, 0.47568202, 0.35148954, 0.94599664, 0.08950424, 0.7302642, 0.15857792, 0.8009268, 0.28207195, 0.66520166, + 0.11818099, 0.56556606, 0.110533476, 0.23367023, 0.2237742, 0.7091341, 0.8498024, 0.19684374, 0.17544961, 0.042367935, + 0.9026221, 0.50952935, 0.745612, 0.31593084, 0.4930358, 0.5662211, 0.50048554, 0.8616395, 0.28437138, 0.10629499, + 0.48341417, 0.3240255, 0.830407, 0.9078181, 0.33372712, 0.2166543, 0.7898146, 0.26945138, 0.21408248, 0.40670586, + 0.52459204, 0.9730145, 0.98859024, 0.3205608, 0.66442394, 0.9879652, 0.096597314, 0.97039676, 0.18528306, 0.10662317, + 0.8001981, 0.6392633, 0.4304719, 0.73661184, 0.519614, 0.24754465, 0.54828334, 0.49313915, 0.5481732, 0.32630658, + 0.6885487, 0.28220093, 0.41675127, 0.471164, 0.74139, 0.40644932, 0.5696535, 0.33590627, 0.88720393, 0.23119736, + 0.20439911, 0.93422973, 0.320832, 0.040211678, 0.6009095, 0.27113092, 0.50428104, 0.09738898, 0.9304968, 0.12500286, + 0.7253587, 0.77314067, 0.8222766, 0.7705921, 0.8456888, 0.5937691, 0.34165144, 0.80231774, 0.19782233, 0.91658163, + 0.45833957, 0.16372633, 0.012993574, 0.6201712, 0.50650346, 0.30319488, 0.41727006, 0.66326535, 0.8777932, 0.25342643, + 0.16228962, 0.35682857, 0.5185491, 0.9329219, 0.7185948, 0.790326, 0.17167485, 0.047770023, 0.20763743, 0.24201787, + 0.9704912, 0.32009995, 0.77360904, 0.91753995, 0.42023146, 0.20573366, 0.71165097, 0.7367796, 0.8849925, 0.7991166, + 0.0797441, 0.29323936, 0.56809735, 0.28626192, 0.34367692, 0.94077945, 0.014205813, 0.2437911, 0.32021797, 0.65359545, + 0.8953661, 0.8638629, 0.7597617, 0.41426885, 0.06926119, 0.022209525, 0.8160584, 0.65363705, 0.46859086, 0.084472656, + 0.73416436, 0.97773695, 0.008449793, 0.5773548, 0.015250921, 0.64889693, 0.49060917, 0.93346095, 0.7749996, 0.43192148, + 0.59193385, 0.35592484, 0.0619812, 0.4197998, 0.49389052, 0.7293259, 0.6834229, 0.9246514, 0.43536437, 0.08217096, + 0.76871145, 0.80069375, 0.8416091, 0.68635464, 0.21184516, 0.35141182, 0.99809146, 0.9484662, 0.020008206, 0.9708315, + 0.99975777, 0.24562728, 0.95811963, 0.21620011, 0.4759972, 0.49087214, 0.40292585, 0.012907028, 0.64766896, 0.3324976, + 0.6859852, 0.39522672, 0.50135624, 0.7005676, 0.56725395, 0.3606707, 0.82294166, 0.6958443, 0.028547883, 0.48222136, + 0.7454958, 0.98710036, 0.56120026, 0.022181034, 0.47856998, 0.387388, 0.20176756, 0.6172484, 0.22061276, 0.20946646, + 0.8644031, 0.46223748, 0.4677019, 0.95789456, 0.6448493, 0.9817474, 0.83187544, 0.37631416, 0.7259364, 0.5866953, + 0.9955276, 0.71437216, 0.42719805, 0.47605515, 0.08072281, 0.56777525, 0.9490675, 0.3731315, 0.9098238, 0.61638224, + 0.108293414, 0.50029206, 0.20072448, 0.022334218, 0.47025228, 0.53747463, 0.8185706, 0.08620751, 0.44721687, 0.40591836, + 0.5803696, 0.32710493, 0.06909239, 0.16926217, 0.14675915, 0.0289855, 0.73988926, 0.7999917, 0.47605908, 0.78393435, + 0.9887701, 0.81081617, 0.17400634, 0.18963432, 0.9175476, 0.52773356, 0.050842643, 0.6016879, 0.22880054, 0.74281764, + 0.58084464, 0.3536929, 0.14166236, 0.55028105, 0.4038279, 0.70922494, 0.81550205, 0.5256995, 0.36231518, 0.17524743, + 0.7051867, 0.68845963, 0.14774966, 0.50851524, 0.03838575, 0.065110445, 0.44824362, 0.7539233, 0.41282284, 0.9750819, + 0.8848063, 0.37257445, 0.69432616, 0.65052664, 0.7557012, 0.86297655, 0.7490624, 0.12573159, 0.9204507, 0.8471613, + 0.36207902, 0.5129626, 0.598577, 0.05498767, 0.029197931, 0.57306445, 0.90776634, 0.19494438, 0.57786655, 0.1492784, + 0.4311267, 0.21654284, 0.93990374, 0.2689036, 0.40368485, 0.9250324, 0.08921909, 0.30957043, 0.9360858, 0.87940645, + 0.5357337, 0.042562604, 0.34196544, 0.93424726, 0.5225965, 0.52984285, 0.008500218, 0.6969304, 0.02931106, 0.57047236, + 0.34011793, 0.8885436, 0.8241571, 0.7340013, 0.21657479, 0.52565885, 0.24682546, 0.75489104, 0.64444137, 0.11828494, + 0.41928017, 0.23310828, 0.57989, 0.17396772, 0.12329781, 0.8526362, 0.7721447, 0.7505028, 0.40826082, 0.4471599, + 0.36693966, 0.5178678, 0.2886076, 0.02278626, 0.846614, 0.2645439, 0.095194936, 0.97863424, 0.8181387, 0.2568785, + 0.28641045, 0.4889834, 0.24015939, 0.6903932, 0.89565694, 0.4596367, 0.8553127, 0.9475155, 0.42796624, 0.6188129, + 0.15538669, 0.63190484, 0.22089481, 0.80139244, 0.36802673, 0.42290604, 0.7579931, 0.5564873, 0.71794677, 0.6101744, + 0.2916416, 0.13165009, 0.07844138, 0.18229365, 0.22042692, 0.13051033, 0.92585886, 0.18179, 0.46223855, 0.96387184, + 0.92967045, 0.54464746, 0.54909503, 0.40820765, 0.6034552, 0.4849373, 0.8806232, 0.45460653, 0.94596195, 0.76789486, + 0.7525495, 0.39198256, 0.3405038, 0.12069368, 0.07573581, 0.44571078, 0.99672365, 0.076937556, 0.31034887, 0.71739423, + 0.5207726, 0.90379906, 0.7604362, 0.5337447, 0.21497571, 0.33771574, 0.1105541, 0.7266669, 0.93214536, 0.7427747, + 0.649253, 0.3724674, 0.20541167, 0.336074, 0.35409713, 0.92259586, 0.13476443, 0.016726613, 0.30847168, 0.6356913, + 0.22577512, 0.9356338, 0.29006386, 0.78581965, 0.22405219, 0.49781108, 0.38500845, 0.6081706, 0.5482172, 0.844584, + 0.107258916, 0.029871702, 0.5950588, 0.16126382, 0.2148968, 0.25681114, 0.38993943, 0.2638409, 0.31440854, 0.25360918, + 0.45148408, 0.23758805, 0.76283145, 0.21877289, 0.27119386, 0.17510188, 0.43231833, 0.19550347, 0.6240896, 0.24658513, + 0.2768948, 0.27051163, 0.08016729, 0.29234338, 0.4884851, 0.105314255, 0.61312294, 0.20885098, 0.9360819, 0.44072163, + 0.76933587, 0.7898004, 0.84014237, 0.16236186, 0.93231857, 0.83791053, 0.31689513, 0.58383787, 0.97360396, 0.6283616, + 0.8871347, 0.9355371, 0.7892976, 0.16497624, 0.40144575, 0.94361997, 0.9268329, 0.38516915, 0.26197922, 0.62110186, + 0.8354622, 0.5244837, 0.1371696, 0.54713035, 0.61866355, 0.09861398, 0.26882958, 0.3907975, 0.8408997, 0.13778782, + 0.10430908, 0.116101265, 0.12059653, 0.34904003, 0.6231868, 0.619643, 0.0013849735, 0.53576565, 0.7704475, 0.8220384, + 0.1876508, 0.86109877, 0.41957748, 0.5335779, 0.6672065, 0.5576868, 0.7813809, 0.2063669, 0.46574867, 0.94972146, + 0.43765378, 0.45001614, 0.026944876, 0.88066113, 0.5768014, 0.48079944, 0.38284016, 0.6798645, 0.36824822, 0.9482515, + 0.3091761, 0.5590097, 0.6593752, 0.90113246, 0.514802, 0.9560946, 0.50078034, 0.8689424, 0.7627641, 0.6386123, + 0.3201511, 0.22144413, 0.2507975, 0.45111573, 0.5909728, 0.10912359, 0.74913573, 0.6820383, 0.86003816, 0.14559615, + 0.22996259, 0.7000786, 0.6488491, 0.6788682, 0.18922877, 0.009787202, 0.77192426, 0.6581255, 0.46968567, 0.85547125, + 0.5157434, 0.8101891, 0.57122254, 0.5764102, 0.41633463, 0.21107543, 0.794575, 0.6766341, 0.8160944, 0.89932036, + 0.91537666, 0.49353898, 0.086411595, 0.3039322, 0.4832096, 0.8194516, 0.42615807, 0.52318573, 0.5634495, 0.61038935, + 0.38167262, 0.6688714, 0.7709342, 0.10772765, 0.022864103, 0.076440334, 0.4725951, 0.21984506, 0.09468317, 0.56059504, + 0.7469039, 0.8534874, 0.16971433, 0.97212374, 0.9277178, 0.4824443, 0.56515443, 0.596933, 0.7391671, 0.58390474, + 0.0427289, 0.6832173, 0.80663383, 0.6726949, 0.7654358, 0.15631545, 0.9927794, 0.20932317, 0.114006996, 0.20726359, + 0.49297774, 0.45377624, 0.423419, 0.2909317, 0.23791242, 0.93831575, 0.001095891, 0.40030026, 0.59970605, 0.51733184, + 0.94346035, 0.44343746, 0.8788154, 0.61663294, 0.34536695, 0.02020359, 0.8278016, 0.65676355, 0.16409159, 0.4275515, + 0.49438393, 0.44802868, 0.16625655, 0.01475811, 0.459383, 0.5862576, 0.72364306, 0.38105404, 0.19342422, 0.43778896, + 0.05640912, 0.9452152, 0.30429935, 0.66409945, 0.39489388, 0.8718662, 0.6038215, 0.09846556, 0.4612807, 0.47842145, + 0.121831894, 0.00070881844, 0.6774461, 0.760697, 0.7117437, 0.59560335, 0.18447375, 0.91430414, 0.62669504, 0.74303913, + 0.43605864, 0.791168, 0.9077883, 0.22808754, 0.45315087, 0.122772336, 0.48727643, 0.8492012, 0.869167, 0.14909208, + 0.24115813, 0.57733524, 0.19908369, 0.07013595, 0.45881724, 0.49765182, 0.046831965, 0.5400802, 0.3832965, 0.088957906, + 0.014243722, 0.21020424, 0.7503433, 0.531387, 0.9593154, 0.88402915, 0.95254135, 0.34550583, 0.86739373, 0.36454403, + 0.5213088, 0.006765604, 0.87643635, 0.9247074, 0.11978483, 0.5260029, 0.8386898, 0.6797445, 0.87760556, 0.95063937, + 0.12240076, 0.124458075, 0.79591465, 0.05779648, 0.04845822, 0.016687155, 0.17982793, 0.5697781, 0.70284796, 0.64464176, + 0.28357232, 0.9072015, 0.8424399, 0.9739506, 0.678208, 0.76438975, 0.59557724, 0.5829319, 0.44698572, 0.183393, + 0.59334457, 0.06800926, 0.9876615, 0.79772663, 0.919809, 0.90150774, 0.1509527, 0.9302163, 0.8679247, 0.06518853, + 0.5927969, 0.608407, 0.13817918, 0.8603718, 0.66343343, 0.03555572, 0.7141932, 0.08824396, 0.09285283, 0.8985299, + 0.75657153, 0.43066394, 0.7900647, 0.44234407, 0.815158, 0.7902192, 0.4556408, 0.9930748, 0.8909048, 0.41732585, + 0.9028381, 0.34595764, 0.65539896, 0.18453026, 0.42251718, 0.51510155, 0.4712125, 0.36520648, 0.02726376, 0.3040099, + 0.96063113, 0.3893, 0.9566742, 0.466707, 0.26739275, 0.12741292, 0.27436984, 0.32078397, 0.40955245, 0.2281152, + 0.705045, 0.92129445, 0.76109457, 0.9052019, 0.9625423, 0.4054731, 0.105170965, 0.27116776, 0.9384192, 0.24955094, + 0.18520916, 0.1030426, 0.23659754, 0.94052076, 0.48046243, 0.177477, 0.116348624, 0.6327851, 0.57965004, 0.43983245, + 0.95717335, 0.93491626, 0.008707523, 0.1698432, 0.68292904, 0.21637177, 0.64623034, 0.92905736, 0.421605, 0.39125884, + 0.8234204, 0.4644438, 0.7849318, 0.0735594, 0.93446565, 0.9430226, 0.774366, 0.6115508, 0.5996156, 0.52487695, + 0.29699385, 0.73536265, 0.95668054, 0.72458816, 0.9434711, 0.54205775, 0.86730003, 0.2012335, 0.19012618, 0.1368922, + 0.91701853, 0.40248477, 0.50191724, 0.42969358, 0.2998339, 0.686345, 0.085552454, 0.5717921, 0.9024024, 0.22273898, + 0.3062564, 0.40420365, 0.4601513, 0.72295094, 0.21332383, 0.6330874, 0.42494392, 0.55386245, 0.93205774, 0.7240075, + 0.38994503, 0.7331388, 0.017596245, 0.65458107, 0.75389266, 0.29891574, 0.5539452, 0.16041231, 0.51121676, 0.4321748, + 0.6975839, 0.8136159, 0.5909631, 0.7386161, 0.42331982, 0.84611726, 0.0012364388, 0.66423917, 0.06563008, 0.90052605, + 0.5343683, 0.5688654, 0.72081804, 0.46366632, 0.42951798, 0.64402866, 0.19868255, 0.007995129, 0.83389807, 0.84563875, + 0.41091383, 0.39566553, 0.5355325, 0.30539954, 0.3262943, 0.23791778, 0.55150783, 0.78128076, 0.48648095, 0.3401233, + 0.5557368, 0.5267644, 0.2746433, 0.17450154, 0.45250857, 0.008645892, 0.44412065, 0.45932293, 0.12946475, 0.01311779, + 0.48381984, 0.95043206, 0.5438169, 0.19742835, 0.25955737, 0.97381735, 0.13950944, 0.7052485, 0.850088, 0.11795664, + 0.7665411, 0.8391706, 0.5571674, 0.4419526, 0.32868838, 0.111050844, 0.75159836, 0.82800066, 0.31243265, 0.80435836, + 0.9318341, 0.52065635, 0.3272395, 0.36172557, 0.492517, 0.9463693, 0.31988358, 0.18364322, 0.7006897, 0.8972788, + 0.05028975, 0.36960185, 0.9271432, 0.42299652, 0.5702206, 0.79333806, 0.31106317, 0.9732926, 0.48309302, 0.48955822, + 0.5659355, 0.7616854, 0.8699939, 0.6049628, 0.4572158, 0.6602361, 0.505618, 0.9234036, 0.06651187, 0.59549403, + 0.8385047, 0.11908007, 0.6052959, 0.50332916, 0.52623165, 0.90001917, 0.4979142, 0.19105422, 0.044943452, 0.2453494, + 0.4253081, 0.09380293, 0.9299675, 0.9823271, 0.26787484, 0.9325211, 0.89249635, 0.5023407, 0.48697495, 0.55032027, + 0.9985539, 0.37058365, 0.8050616, 0.40203428, 0.2159729, 0.19033504, 0.8998989, 0.040631652, 0.61069584, 0.57587504, + 0.29204154, 0.8592011, 0.600723, 0.46155024, 0.78079545, 0.9797622, 0.011621833, 0.11545873, 0.5472075, 0.6606462, + 0.0764637, 0.34509456, 0.84131634, 0.62546873, 0.9698156, 0.426867, 0.1457076, 0.9963372, 0.7396401, 0.7843375, + 0.38063633, 0.1989615, 0.018760085, 0.4072814, 0.77375185, 0.9957533, 0.3130213, 0.8634138, 0.46897125, 0.44445825, + 0.60939884, 0.021061897, 0.9488238, 0.2880453, 0.040649176, 0.18815732, 0.6432431, 0.13030005, 0.34577537, 0.62555087, + 0.24145854, 0.27260077, 0.20891404, 0.4307456, 0.06295693, 0.3063556, 0.2869178, 0.8136598, 0.8914851, 0.03513038, + 0.5325296, 0.6547828, 0.6385778, 0.71722865, 0.12591541, 0.16604686, 0.762993, 0.7598791, 0.41634893, 0.32300568, + 0.6897869, 0.29830158, 0.8400191, 0.5499227, 0.322325, 0.27235377, 0.49730468, 0.5058465, 0.81801045, 0.4438672, + 0.3366102, 0.020214558, 0.9574443, 0.7129102, 0.10075188, 0.45588088, 0.3848461, 0.06718004, 0.7314944, 0.8572018, + 0.41633606, 0.0027153492, 0.79847944, 0.33917463, 0.8741555, 0.26820993, 0.20650315, 0.0060925484, 0.58488476, 0.9301466, + 0.72300136, 0.1710285, 0.53218925, 0.2261734, 0.7663491, 0.0004452467, 0.14710498, 0.31834936, 0.75150156, 0.9289111, + 0.7560625, 0.4394393, 0.43180132, 0.35200167, 0.17655265, 0.94999945, 0.8517543, 0.9587712, 0.38932836, 0.21337259, + 0.2781713, 0.24972236, 0.5211731, 0.86335886, 0.5984459, 0.6260141, 0.8805593, 0.9998236, 0.6133126, 0.8026165, + 0.7797748, 0.10139835, 0.45289183, 0.60841537, 0.6397393, 0.2869295, 0.95750105, 0.00014054775, 0.74664557, 0.54665434, + 0.7873961, 0.9973109, 0.36070728, 0.9382651, 0.5291873, 0.7578443, 0.92896414, 0.72396815, 0.13711345, 0.48335958, + 0.79642713, 0.88767684, 0.54553497, 0.009688735, 0.46796072, 0.22365952, 0.33790672, 0.58301675, 0.79072046, 0.04837179, + 0.5035169, 0.747615, 0.05338967, 0.5268462, 0.21020186, 0.22541499, 0.035803318, 0.090353966, 0.8952265, 0.6528566, + 0.64126635, 0.026224017, 0.9919175, 0.5730021, 0.7291974, 0.7752149, 0.3218732, 0.06379342, 0.5928781, 0.44420183, + 0.5895004, 0.81038094, 0.81207883, 0.7418941, 0.24261343, 0.18539095, 0.46753752, 0.6900375, 0.58825374, 0.76915586, + 0.8843223, 0.7434628, 0.41890657, 0.30091333, 0.7525383, 0.022969842, 0.8184351, 0.07255125, 0.32981515, 0.5692545, + 0.065372944, 0.53784287, 0.7921468, 0.045265317, 0.34530377, 0.89636993, 0.43792808, 0.31964493, 0.10664272, 0.26695156, + 0.5958868, 0.33832574, 0.36951315, 0.86327815, 0.12636626, 0.67303085, 0.4760201, 0.8411715, 0.07911563, 0.69951844, + 0.7567936, 0.36490297, 0.18722332, 0.98485494, 0.13600576, 0.73340607, 0.7770513, 0.2200756, 0.42526639, 0.16783321, + 0.53869474, 0.086185455, 0.8837999, 0.081128955, 0.20998955, 0.7118223, 0.29446614, 0.5951327, 0.17610145, 0.015954852, + 0.53358555, 0.95286286, 0.29186308, 0.2535367, 0.31155562, 0.027576923, 0.8789197, 0.36013925, 0.6637299, 0.023362756, + 0.39644432, 0.8587805, 0.42137432, 0.6198008, 0.14239597, 0.75332475, 0.14649141, 0.6961322, 0.6209277, 0.50214756, + 0.67862093, 0.690362, 0.3325237, 0.64408624, 0.8476635, 0.5807227, 0.8634039, 0.7017826, 0.7690264, 0.66686857, + 0.3434931, 0.8126197, 0.6636872, 0.6014049, 0.5313623, 0.5992073, 0.62506247, 0.56315434, 0.80882037, 0.32973516, + 0.54395664, 0.7178421, 0.07294989, 0.21406496, 0.9502369, 0.6122458, 0.4108026, 0.49830854, 0.8116578, 0.8892354, + 0.5088432, 0.5419935, 0.89436376, 0.6524111, 0.03276515, 0.17632914, 0.20731139, 0.2939378, 0.8230814, 0.45138645, + 0.9188534, 0.35317135, 0.04680252, 0.849031, 0.7454829, 0.633018, 0.004293561, 0.9773097, 0.21971393, 0.122896075, + 0.477409, 0.9217073, 0.9424641, 0.9307542, 0.5092119, 0.8585882, 0.8774098, 0.28767657, 0.86791396, 0.6002227, + 0.66517127, 0.24726725, 0.7403469, 0.6707703, 0.4279331, 0.16843295, 0.5631764, 0.8463224, 0.8061552, 0.30608463, + 0.09159422, 0.34705913, 0.25008285, 0.6757778, 0.4244634, 0.095475554, 0.713598, 0.23027503, 0.3249942, 0.5639111, + 0.03611076, 0.8020971, 0.9565375, 0.32208312, 0.8502139, 0.33968234, 0.18326402, 0.04271996, 0.070637584, 0.9811927, + 0.71214604, 0.44660413, 0.34602487, 0.77315485, 0.30251884, 0.08101797, 0.6046778, 0.63996565, 0.25666034, 0.11062181, + 0.7577908, 0.33282351, 0.27553737, 0.6404567, 0.515092, 0.063676596, 0.25581837, 0.4907714, 0.8881253, 0.3345673, + 0.009430647, 0.65420735, 0.047246218, 0.6041722, 0.3078146, 0.9908116, 0.31711686, 0.64722896, 0.48887944, 0.5926876 + +}; + + +static const float s_ref_in_3[15] = { + 0.27463865, 0.096559644, 0.8262538, 0.23872852, 0.92823386, 0.45637512, 0.80588424, 0.5794023, 0.25774014, 0.20805216, + 0.33264327, 0.6097946, 0.5922972, 0.3169762, 0.62389123 +}; + +static const float s_ref_out_3[3] = { + 2.1196008, 2.2538152, 2.774055 +}; + +static const int32_t s_ref_axis_3[1] = { + 0 +}; + +static const int32_t s_ref_axis_4[1] = { + 0 +}; + + +static const float s_ref_in_4[300] = { + 0.3170308, 0.8508799, 0.9343252, 0.8132678, 0.5227629, 0.21126235, 0.92412066, 0.10437608, 0.18218088, 0.6430415, + 0.5644717, 0.5894418, 0.58074737, 0.6289016, 0.32241344, 0.5440862, 0.94226587, 0.08141625, 0.817104, 0.84937406, + 0.0446862, 0.009930611, 0.60297406, 0.53378, 0.8734963, 0.6648531, 0.45676994, 0.761294, 0.33146477, 0.18020976, + 0.776297, 0.3275261, 0.87975717, 0.46862662, 0.662956, 0.5930047, 0.94778407, 0.5102533, 0.14388645, 0.538784, + 0.78650653, 0.00745368, 0.6087724, 0.6740788, 0.35517633, 0.9212018, 0.30038893, 0.87381756, 0.24262011, 0.6031513, + 0.13945389, 0.6855658, 0.87102735, 0.20698678, 0.17658365, 0.08452821, 0.62391746, 0.5239303, 0.56989825, 0.1773547, + 0.23231065, 0.9755815, 0.56677246, 0.14534903, 0.86095953, 0.5557097, 0.06940591, 0.5534991, 0.855415, 0.16414607, + 0.7956674, 0.59989774, 0.56404924, 0.64413357, 0.6370214, 0.7640848, 0.1919483, 0.90493333, 0.20431185, 0.5117775, + 0.52189744, 0.43821025, 0.9084207, 0.4896598, 0.07568598, 0.5355047, 0.025326371, 0.8135778, 0.62005603, 0.52170265, + 0.5187191, 0.41446662, 0.75057614, 0.22039866, 0.82781684, 0.8618771, 0.9300208, 0.69949245, 0.24139881, 0.27396226, + 0.37665844, 0.34122193, 0.60290253, 0.936252, 0.55714095, 0.36943734, 0.92629683, 0.28148174, 0.4201311, 0.911554, + 0.6824775, 0.6495658, 0.732386, 0.97551954, 0.234622, 0.97549677, 0.8019662, 0.81195724, 0.07082605, 0.3794918, + 0.6119499, 0.9404409, 0.7625637, 0.26998615, 0.7007446, 0.9497868, 0.77031374, 0.007848978, 0.20176983, 0.18416655, + 0.24470484, 0.50242543, 0.99647284, 0.20376778, 0.80554926, 0.6916096, 0.0064691305, 0.16321182, 0.0127260685, 0.669057, + 0.8938961, 0.015486479, 0.36056662, 0.20944774, 0.6651372, 0.898602, 0.018214941, 0.34747863, 0.6577898, 0.75690603, + 0.67638934, 0.22101557, 0.11049986, 0.8873645, 0.34674406, 0.5510068, 0.9055104, 0.9703289, 0.21821213, 0.102954626, + 0.2856635, 0.05311644, 0.29634058, 0.62760556, 0.8043922, 0.15966845, 0.9692236, 0.045668483, 0.52900004, 0.27069032, + 0.04701066, 0.43083227, 0.09155667, 0.98857355, 0.7760577, 0.503634, 0.5997704, 0.05111015, 0.4164847, 0.96176744, + 0.16809094, 0.36865163, 0.5046464, 0.3645177, 0.8678794, 0.24195063, 0.29044032, 0.6307188, 0.28084433, 0.97022915, + 0.53154147, 0.48737955, 0.8557004, 0.6537808, 0.3470304, 0.2673335, 0.5647875, 0.48689818, 0.01156199, 0.6453538, + 0.20649052, 0.3405944, 0.6891035, 0.7325407, 0.99459994, 0.19894266, 0.38924754, 0.8408427, 0.61956334, 0.16466117, + 0.9208207, 0.76318324, 0.9032278, 0.7271446, 0.95521414, 0.5179807, 0.7391707, 0.4750682, 0.43809187, 0.5902872, + 0.32094955, 0.59650695, 0.59523094, 0.75387585, 0.15434158, 0.36689627, 0.00055265427, 0.5290612, 0.75206745, 0.8270756, + 0.94942105, 0.17100441, 0.8264818, 0.4557017, 0.2755264, 0.778563, 0.6249919, 0.604941, 0.4510038, 0.48278296, + 0.9564177, 0.23501337, 0.6366111, 0.79314137, 0.32816005, 0.08045864, 0.24302256, 0.7602745, 0.7687428, 0.60064423, + 0.35666192, 0.9503472, 0.23301601, 0.83359265, 0.36721122, 0.56076133, 0.042044282, 0.48969078, 0.7619554, 0.048397303, + 0.79028904, 0.9264736, 0.48806155, 0.19924653, 0.75378203, 0.0044254065, 0.37891197, 0.3862599, 0.20245063, 0.32678223, + 0.24842799, 0.7213844, 0.19563437, 0.91932726, 0.0626992, 0.22989249, 0.47125208, 0.78004, 0.7733439, 0.8498181, + 0.3680172, 0.65390253, 0.51022327, 0.84815395, 0.18831241, 0.87922335, 0.25881302, 0.23769987, 0.34320986, 0.29735625, + 0.4676571, 0.805629, 0.39954078, 0.10411632, 0.65849113, 0.87334347, 0.4593916, 0.07336342, 0.08414376, 0.3175645 + +}; + +static const float s_ref_out_4[30] = { + 5.4264536, 5.8181434, 6.244614, 5.6091237, 6.1359367, 4.7929296, 6.291041, 5.4919004, 4.1038857, 4.9180336, + 4.630842, 4.781693, 5.843456, 6.804143, 4.5385895, 5.524303, 4.20279, 4.093879, 4.0946875, 5.6337867, + 4.7432795, 4.4732924, 5.970119, 4.8955727, 5.483982, 5.5178933, 4.378508, 5.214755, 4.023681, 4.269223 + +}; + +#endif \ No newline at end of file diff --git a/TESTS/operators/test_rsqrt.cpp b/TESTS/operators/test_rsqrt.cpp new file mode 100644 index 00000000..1c205912 --- /dev/null +++ b/TESTS/operators/test_rsqrt.cpp @@ -0,0 +1,200 @@ +#include +#include + +#include "uTensor.h" +#include "gtest/gtest.h" + +#include "constants_rsqrt.hpp" +using std::cout; +using std::endl; + +using namespace uTensor; +using namespace uTensor::ReferenceOperators; + +SimpleErrorHandler mErrHandler(10); + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceRsqrt, random_gen_rsqrt__0) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<4032*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor out = new RamTensor({ 8,9,8,7 }, flt); + Tensor out_ref = new RomTensor({ 8,9,8,7 }, flt, s_ref_out_0); + Tensor input = new RomTensor({ 8,9,8,7 }, flt, s_ref_in_0); + + uTensor::ReferenceOperators::RsqrtOperator rsqrt_op; + rsqrt_op + .set_inputs({ + { uTensor::ReferenceOperators::RsqrtOperator::input, input } + }).set_outputs({ + { uTensor::ReferenceOperators::RsqrtOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 4032; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceRsqrt, random_gen_rsqrt__1) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<80*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor input = new RomTensor({ 4,5,4 }, flt, s_ref_in_1); + Tensor out = new RamTensor({ 4,5,4 }, flt); + Tensor out_ref = new RomTensor({ 4,5,4 }, flt, s_ref_out_1); + + uTensor::ReferenceOperators::RsqrtOperator rsqrt_op; + rsqrt_op + .set_inputs({ + { uTensor::ReferenceOperators::RsqrtOperator::input, input } + }).set_outputs({ + { uTensor::ReferenceOperators::RsqrtOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 80; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceRsqrt, random_gen_rsqrt__2) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<315*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor input = new RomTensor({ 5,9,7 }, flt, s_ref_in_2); + Tensor out_ref = new RomTensor({ 5,9,7 }, flt, s_ref_out_2); + Tensor out = new RamTensor({ 5,9,7 }, flt); + + uTensor::ReferenceOperators::RsqrtOperator rsqrt_op; + rsqrt_op + .set_inputs({ + { uTensor::ReferenceOperators::RsqrtOperator::input, input } + }).set_outputs({ + { uTensor::ReferenceOperators::RsqrtOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 315; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceRsqrt, random_gen_rsqrt__3) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<63*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor input = new RomTensor({ 7,9 }, flt, s_ref_in_3); + Tensor out_ref = new RomTensor({ 7,9 }, flt, s_ref_out_3); + Tensor out = new RamTensor({ 7,9 }, flt); + + uTensor::ReferenceOperators::RsqrtOperator rsqrt_op; + rsqrt_op + .set_inputs({ + { uTensor::ReferenceOperators::RsqrtOperator::input, input } + }).set_outputs({ + { uTensor::ReferenceOperators::RsqrtOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 63; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceRsqrt, random_gen_rsqrt__4) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<540*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor out = new RamTensor({ 6,10,9 }, flt); + Tensor out_ref = new RomTensor({ 6,10,9 }, flt, s_ref_out_4); + Tensor input = new RomTensor({ 6,10,9 }, flt, s_ref_in_4); + + uTensor::ReferenceOperators::RsqrtOperator rsqrt_op; + rsqrt_op + .set_inputs({ + { uTensor::ReferenceOperators::RsqrtOperator::input, input } + }).set_outputs({ + { uTensor::ReferenceOperators::RsqrtOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 540; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + diff --git a/TESTS/operators/test_sum.cpp b/TESTS/operators/test_sum.cpp new file mode 100644 index 00000000..af6d13c3 --- /dev/null +++ b/TESTS/operators/test_sum.cpp @@ -0,0 +1,210 @@ +#include +#include + +#include "uTensor.h" +#include "gtest/gtest.h" + +#include "constants_sum.hpp" +using std::cout; +using std::endl; + +using namespace uTensor; +using namespace uTensor::ReferenceOperators; + +SimpleErrorHandler mErrHandler(10); + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceSum, random_gen_reduce_sum__0) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<108*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor input = new RomTensor({ 3,9,7,4 }, flt, s_ref_in_0); + Tensor axis = new RomTensor({ 1 }, i32, s_ref_axis_0); + Tensor out = new RamTensor({ 3,9,4 }, flt); + Tensor out_ref = new RomTensor({ 3,9,4 }, flt, s_ref_out_0); + + uTensor::ReferenceOperators::SumOperator sum_op; + sum_op + .set_inputs({ + { uTensor::ReferenceOperators::SumOperator::input, input }, + { uTensor::ReferenceOperators::SumOperator::axis, axis } + }).set_outputs({ + { uTensor::ReferenceOperators::SumOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 108; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceSum, random_gen_reduce_sum__1) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<112*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor axis = new RomTensor({ 1 }, i32, s_ref_axis_1); + Tensor out_ref = new RomTensor({ 7,4,4 }, flt, s_ref_out_1); + Tensor input = new RomTensor({ 4,7,4,4 }, flt, s_ref_in_1); + Tensor out = new RamTensor({ 7,4,4 }, flt); + + uTensor::ReferenceOperators::SumOperator sum_op; + sum_op + .set_inputs({ + { uTensor::ReferenceOperators::SumOperator::input, input }, + { uTensor::ReferenceOperators::SumOperator::axis, axis } + }).set_outputs({ + { uTensor::ReferenceOperators::SumOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 112; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceSum, random_gen_reduce_sum__2) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<360*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor axis = new RomTensor({ 1 }, i32, s_ref_axis_2); + Tensor out = new RamTensor({ 9,8,5 }, flt); + Tensor out_ref = new RomTensor({ 9,8,5 }, flt, s_ref_out_2); + Tensor input = new RomTensor({ 9,8,5,10 }, flt, s_ref_in_2); + + uTensor::ReferenceOperators::SumOperator sum_op; + sum_op + .set_inputs({ + { uTensor::ReferenceOperators::SumOperator::input, input }, + { uTensor::ReferenceOperators::SumOperator::axis, axis } + }).set_outputs({ + { uTensor::ReferenceOperators::SumOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 360; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceSum, random_gen_reduce_sum__3) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<3*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor out = new RamTensor({ 3 }, flt); + Tensor input = new RomTensor({ 5,3 }, flt, s_ref_in_3); + Tensor out_ref = new RomTensor({ 3 }, flt, s_ref_out_3); + Tensor axis = new RomTensor({ 1 }, i32, s_ref_axis_3); + + uTensor::ReferenceOperators::SumOperator sum_op; + sum_op + .set_inputs({ + { uTensor::ReferenceOperators::SumOperator::input, input }, + { uTensor::ReferenceOperators::SumOperator::axis, axis } + }).set_outputs({ + { uTensor::ReferenceOperators::SumOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 3; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + +/*************************************** + * Generated Test + ***************************************/ + +TEST(ReferenceSum, random_gen_reduce_sum__4) { + // Make sure no errors get thrown + bool got_error = false; + mErrHandler.set_onError([&got_error](Error* err){ + got_error = true; + }); + + localCircularArenaAllocator<1024> meta_allocator; + localCircularArenaAllocator<30*2*sizeof(float), uint32_t> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Context::get_default_context()->set_ErrorHandler(&mErrHandler); + + Tensor axis = new RomTensor({ 1 }, i32, s_ref_axis_4); + Tensor out = new RamTensor({ 5,6 }, flt); + Tensor input = new RomTensor({ 10,5,6 }, flt, s_ref_in_4); + Tensor out_ref = new RomTensor({ 5,6 }, flt, s_ref_out_4); + + uTensor::ReferenceOperators::SumOperator sum_op; + sum_op + .set_inputs({ + { uTensor::ReferenceOperators::SumOperator::input, input }, + { uTensor::ReferenceOperators::SumOperator::axis, axis } + }).set_outputs({ + { uTensor::ReferenceOperators::SumOperator::output, out } + }).eval(); + + // Make sure no errors got thrown + ASSERT_EQ(got_error, false); + + for(int i = 0; i < 30; i++) { + EXPECT_NEAR(static_cast( out(i) ), static_cast( out_ref(i) ), 0.001); +} +} + diff --git a/TESTS/pytest/conftest.py b/TESTS/pytest/conftest.py new file mode 100644 index 00000000..284e6708 --- /dev/null +++ b/TESTS/pytest/conftest.py @@ -0,0 +1,72 @@ +import os +from random import choice, randint, random + +import pytest + +os.environ["TF_CPP_MIN_LOG_LEVEL"] = "3" + + +@pytest.fixture(scope="function") +def random_broadcastable_shapes(): + pairs = [] + # 1D + for _ in range(10): + shape_a = (randint(1, 10),) + shape_b = choice([(1,), shape_a, (1,) + shape_a]) + pairs.append((shape_a, shape_b)) + # ND + for _ in range(20): + shape_a = tuple(randint(1, 10) for _ in range(randint(1, 4))) + shape_b = tuple(d if random() > 0.5 else 1 for d in shape_a) + pairs.append((shape_a, shape_b)) + if len(shape_a) < 4: + shape_b = tuple(1 for _ in range(randint(1, 4 - len(shape_a)))) + shape_a + pairs.append((shape_a, shape_b)) + else: + pairs.append((shape_a, shape_a[-randint(1, 3) :])) + + return pairs + + +@pytest.fixture(scope="function") +def random_conv_input(): + import numpy as np + + inputs = [] + rand_max = 10 + + for _ in range(100): + B, H, W, Cin = ( + randint(1, rand_max), + randint(1, rand_max), + randint(1, rand_max), + randint(1, rand_max), + ) + kernelH, kernelW, Cout = randint(1, H), randint(1, W), randint(1, rand_max) + bias = np.random.rand(Cout).astype(np.float32) + strides = [1, randint(1, 3), randint(1, 3), 1] + padding = choice(["VALID", "SAME"]) + input_tensor = np.random.rand(B, H, W, Cin).astype(np.float32) + filter_tensor = np.random.rand(kernelH, kernelW, Cin, Cout).astype(np.float32) + inputs.append((input_tensor, filter_tensor, bias, strides, padding)) + + return inputs + +@pytest.fixture(scope="function") +def random_4d_input(): + import numpy as np + + inputs = [] + rand_max = 10 + + for _ in range(100): + B, H, W, Cin = ( + randint(1, rand_max), + randint(1, rand_max), + randint(1, rand_max), + randint(1, rand_max), + ) + input_tensor = np.random.rand(B, H, W, Cin).astype(np.float32) + inputs.append(input_tensor) + + return inputs \ No newline at end of file diff --git a/TESTS/pytest/test_arithmetic_kernels.py b/TESTS/pytest/test_arithmetic_kernels.py new file mode 100644 index 00000000..b312d61d --- /dev/null +++ b/TESTS/pytest/test_arithmetic_kernels.py @@ -0,0 +1,78 @@ +from typing import List + + +def test_broadcast_add(random_broadcastable_shapes: List[tuple]): + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(100*1024) + pyuTensor.set_meta_total(100*1024) + for shape_a, shape_b in random_broadcastable_shapes: + a = np.arange(np.prod(shape_a)).reshape(shape_a).astype(np.float32) + b = np.arange(np.prod(shape_b)).reshape(shape_b).astype(np.float32) + + uT_1 = pyuTensor.add(a, b) + np_1 = a + b + tf_1 = tf.add(a, b).numpy() + + assert np.allclose(np_1, tf_1) + assert np.allclose(uT_1, tf_1) + +def test_broadcast_mul(random_broadcastable_shapes: List[tuple]): + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(100*1024) + pyuTensor.set_meta_total(100*1024) + for shape_a, shape_b in random_broadcastable_shapes: + a = np.arange(np.prod(shape_a)).reshape(shape_a).astype(np.float32) + b = np.arange(np.prod(shape_b)).reshape(shape_b).astype(np.float32) + + uT_1 = pyuTensor.matmul(a, b) + np_1 = a * b + tf_1 = tf.multiply(a, b).numpy() + + assert np.allclose(np_1, tf_1) + assert np.allclose(uT_1, tf_1) + +def test_add(): + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(4096) + pyuTensor.set_meta_total(4096) + + a_setting = (5, 5, 3) + a = np.arange(np.prod(a_setting)).reshape(a_setting).astype(np.float32) + b_setting = a_setting + b = np.arange(np.prod(b_setting)).reshape(b_setting).astype(np.float32) + + uT_1 = pyuTensor.add(a, b) + np_1 = a + b + tf_1 = tf.add(a, b).numpy() + + assert np.allclose(np_1, tf_1) + assert np.allclose(uT_1, tf_1) + +def test_mul(): + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(4096) + pyuTensor.set_meta_total(4096) + + a_setting = (5, 5, 3) + a = np.arange(np.prod(a_setting)).reshape(a_setting).astype(np.float32) + b_setting = a_setting + b = np.arange(np.prod(b_setting)).reshape(b_setting).astype(np.float32) + + uT_1 = pyuTensor.matmul(a, b) + np_1 = a * b + tf_1 = tf.multiply(a, b).numpy() + + assert np.allclose(np_1, tf_1) + assert np.allclose(uT_1, tf_1) \ No newline at end of file diff --git a/TESTS/pytest/test_broadcast.py b/TESTS/pytest/test_broadcast.py new file mode 100644 index 00000000..379eb4c9 --- /dev/null +++ b/TESTS/pytest/test_broadcast.py @@ -0,0 +1,11 @@ +from typing import List + +def test_broadcast_shapes(random_broadcastable_shapes: List[tuple]): + import pyuTensor + import numpy as np + + for shape_a, shape_b in random_broadcastable_shapes: + bc = pyuTensor.Broadcaster(shape_a, shape_b) + uT_1 = bc.get_output_shape() + np_1 = np.broadcast_shapes(shape_a, shape_b) + assert uT_1 == np_1 \ No newline at end of file diff --git a/TESTS/pytest/test_conv.py b/TESTS/pytest/test_conv.py new file mode 100644 index 00000000..7a77115f --- /dev/null +++ b/TESTS/pytest/test_conv.py @@ -0,0 +1,47 @@ +def test_conv(random_conv_input): + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(1000 * 1024) + pyuTensor.set_meta_total(100 * 1024) + + for input_tensor, filter_tensor, bias, strides, padding in random_conv_input: + uT_res = pyuTensor.conv2d( + input_tensor, filter_tensor.transpose(3, 0, 1, 2), bias=bias, strides=strides, padding=padding, + ) + tf_res = ( + tf.nn.conv2d( + input_tensor, filter_tensor, strides=strides, padding=padding + ).numpy() + + bias + ) + + assert np.allclose(uT_res, tf_res) + +def test_maxpool(random_4d_input): + from random import choice, randint + + import numpy as np + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(1000 * 1024) + pyuTensor.set_meta_total(100 * 1024) + + for input_tensor in random_4d_input: + padding = choice(["VALID", "SAME"]) + h, w = input_tensor.shape[1:3] + k_h, k_w = randint(1, h), randint(1, w) + uT_res = pyuTensor.max_pool2d(input_tensor, [k_h, k_w], [1, 2, 2, 1], padding) + tf_res = tf.nn.max_pool2d( + input_tensor, ksize=[1, k_h, k_w, 1], strides=[1, 2, 2, 1], padding=padding + ).numpy() + + assert np.allclose(uT_res, tf_res) + + uT_res = pyuTensor.max_pool2d(input_tensor, [k_h, k_w], [1, 1, 1, 1], padding) + tf_res = tf.nn.max_pool2d( + input_tensor, ksize=[1, k_h, k_w, 1], strides=[1, 1, 1, 1], padding=padding + ).numpy() + assert np.allclose(uT_res, tf_res) \ No newline at end of file diff --git a/TESTS/pytest/test_relu.py b/TESTS/pytest/test_relu.py new file mode 100644 index 00000000..f3bffdd3 --- /dev/null +++ b/TESTS/pytest/test_relu.py @@ -0,0 +1,20 @@ +from random import randint + +import numpy as np +import pytest + +_NUM_TESTS = 10 + +@pytest.mark.parametrize("arr", [ + np.random.randn(*tuple(randint(1, 6) for _ in range(randint(1, 4)))).astype(np.float32) for _ in range(_NUM_TESTS) +], ids=[i for i in range(_NUM_TESTS)]) +def test_relu_f(arr): + import pyuTensor + import tensorflow as tf + + pyuTensor.set_ram_total(1024*1000) + pyuTensor.set_meta_total(1024*1000) + out = pyuTensor.relu(arr) + tf_out = tf.nn.relu(arr).numpy() + + assert np.allclose(out, tf_out) diff --git a/TESTS/tensors/test_ramtensor.cpp b/TESTS/tensors/test_ramtensor.cpp index 5a82dca8..a76123c6 100644 --- a/TESTS/tensors/test_ramtensor.cpp +++ b/TESTS/tensors/test_ramtensor.cpp @@ -1,6 +1,6 @@ -#include "gtest/gtest.h" #include "uTensor.h" #include "uTensor/errorHandlers/SimpleErrorHandler.hpp" +#include "gtest/gtest.h" #include using std::cout; @@ -10,7 +10,7 @@ using namespace uTensor; SimpleErrorHandler mErrHandler(10); -void setup_context(){ +void setup_context() { localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); @@ -18,7 +18,7 @@ void setup_context(){ } TEST(RAM_Tensor, constructor) { - //setup_context(); + // setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); @@ -27,20 +27,20 @@ TEST(RAM_Tensor, constructor) { } TEST(RAM_Tensor, read_write_u8) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, u8); - r(2,2) = (uint8_t) 5; - uint8_t read = r(2,2); + r(2, 2) = (uint8_t)5; + uint8_t read = r(2, 2); EXPECT_EQ(read, 5); cout << "Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; } TEST(RAM_Tensor, read_write_u8_multi_tensor) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<512> meta_allocator; localCircularArenaAllocator<512> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); @@ -48,85 +48,85 @@ TEST(RAM_Tensor, read_write_u8_multi_tensor) { RamTensor r1({10, 10}, u8); RamTensor r2({10, 10}, u8); RamTensor r3({10, 10}, u8); - r1(2,2) = (uint8_t) 5; - r2(2,2) = (uint8_t) 5; - r3(2,2) = (uint8_t) r1(2,2) + (uint8_t) r2(2,2); - EXPECT_EQ((uint8_t)r3(2,2), 10); + r1(2, 2) = (uint8_t)5; + r2(2, 2) = (uint8_t)5; + r3(2, 2) = (uint8_t)r1(2, 2) + (uint8_t)r2(2, 2); + EXPECT_EQ((uint8_t)r3(2, 2), 10); cout << "Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; } TEST(RAM_Tensor, read_write_u8_2x) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, u8); - r(2,2) = (uint8_t) 5; - uint8_t read = r(2,2); + r(2, 2) = (uint8_t)5; + uint8_t read = r(2, 2); EXPECT_EQ(read, 5); - r(2,2) = (uint8_t) 15; - EXPECT_EQ((uint8_t)r(2,2), 15); + r(2, 2) = (uint8_t)15; + EXPECT_EQ((uint8_t)r(2, 2), 15); } TEST(RAM_Tensor, read_write_u8_contig) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, u8); - r(2,2) = (uint8_t) 5; - r(3,2) = (uint8_t) 35; - uint8_t read = r(2,2); + r(2, 2) = (uint8_t)5; + r(3, 2) = (uint8_t)35; + uint8_t read = r(2, 2); EXPECT_EQ(read, 5); - r(2,2) = (uint8_t) 15; - EXPECT_EQ((uint8_t)r(2,2), 15); - EXPECT_EQ((uint8_t)r(3,2), 35); + r(2, 2) = (uint8_t)15; + EXPECT_EQ((uint8_t)r(2, 2), 15); + EXPECT_EQ((uint8_t)r(3, 2), 35); } TEST(RAM_Tensor, read_write_i8) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, i8); - r(2,2) = (int8_t) -5; - int8_t read = r(2,2); + r(2, 2) = (int8_t)-5; + int8_t read = r(2, 2); EXPECT_EQ(read, -5); cout << "i8 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; cout << "Sizeof RamTensor " << sizeof(r) << endl; } TEST(RAM_Tensor, read_write_u16) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, u16); - r(2,2) = (uint16_t) 5; - r(3,2) = (uint16_t) 15; - uint16_t read = r(2,2); + r(2, 2) = (uint16_t)5; + r(3, 2) = (uint16_t)15; + uint16_t read = r(2, 2); EXPECT_EQ(read, 5); - read = r(3,2); + read = r(3, 2); EXPECT_EQ(read, 15); cout << "uint16 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; } TEST(RAM_Tensor, read_write_i16) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor r({10, 10}, i16); - r(2,2) = (int16_t) 5; - r(3,2) = (int16_t) -15; - int16_t read = r(2,2); + r(2, 2) = (int16_t)5; + r(3, 2) = (int16_t)-15; + int16_t read = r(2, 2); EXPECT_EQ(read, 5); - read = r(3,2); + read = r(3, 2); EXPECT_EQ(read, -15); cout << "uint16 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; } @@ -155,11 +155,11 @@ TEST(RAM_Tensor, resize_bigger_then_back) { TEST(RAM_Tensor, out_of_memory) { localCircularArenaAllocator<256> meta_allocator; - localCircularArenaAllocator<20*sizeof(float)> ram_allocator; + localCircularArenaAllocator<20 * sizeof(float)> ram_allocator; bool is_oom = false; - mErrHandler.set_onError([&is_oom](Error* err){ - if(*err == OutOfMemError()) { - is_oom = true; + mErrHandler.set_onError([&is_oom](Error *err) { + if (*err == OutOfMemError()) { + is_oom = true; } }); Context::get_default_context()->set_metadata_allocator(&meta_allocator); @@ -173,13 +173,32 @@ TEST(RAM_Tensor, out_of_memory) { TEST(RAM_Tensor, move_to_fit) { localCircularArenaAllocator<256> meta_allocator; - localCircularArenaAllocator<25*sizeof(float)> ram_allocator; + localCircularArenaAllocator<25 * sizeof(float)> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); RamTensor a({5, 2}, flt); RamTensor b({2, 5}, flt); - const void* ori_ptr = b.get_address(); + const void *ori_ptr = b.get_address(); a.resize({5, 5}); - const void* new_ptr = b.get_address(); + const void *new_ptr = b.get_address(); EXPECT_NE(ori_ptr, new_ptr); } + +TEST(RAM_Tensor, view) { + localCircularArenaAllocator<256> meta_allocator; + localCircularArenaAllocator<100 * sizeof(int32_t)> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + Tensor a = new RamTensor({10, 10}, i32); + for (int32_t i = 0; i < 100; i++) { + a(i) = i; + } + Tensor view = a.view({1, 8, 2}, {2, 10, 2}); + int32_t read = view(0, 0); + EXPECT_EQ(read, 12); + read = view(2, 1); + EXPECT_EQ(read, 54); + a(12) = static_cast(100); + read = view(0, 0); + EXPECT_EQ(read, 100); +} \ No newline at end of file diff --git a/TESTS/tensors/test_romtensor.cpp b/TESTS/tensors/test_romtensor.cpp index 5ea9fb39..5394fbf9 100644 --- a/TESTS/tensors/test_romtensor.cpp +++ b/TESTS/tensors/test_romtensor.cpp @@ -1,7 +1,5 @@ +#include "uTensor.h" #include "gtest/gtest.h" -#include "arenaAllocator.hpp" -#include "uTensor/core/context.hpp" -#include "RomTensor.hpp" #include using std::cout; @@ -9,7 +7,7 @@ using std::endl; using namespace uTensor; -void setup_context(){ +void setup_context() { localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); @@ -17,73 +15,73 @@ void setup_context(){ } TEST(Rom_Tensor, constructor) { - //setup_context(); + // setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - uint8_t* buffer = new uint8_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + uint8_t *buffer = new uint8_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, u8, buffer); delete[] buffer; } TEST(Rom_Tensor, fixed_constructor) { - //setup_context(); + // setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - uint8_t buffer[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + uint8_t buffer[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, buffer); } TEST(Rom_Tensor, read_write_u8) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - uint8_t* buffer = new uint8_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + uint8_t *buffer = new uint8_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, u8, buffer); - uint8_t read = r(2,2); + uint8_t read = r(2, 2); EXPECT_EQ(read, 22); cout << "Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; delete[] buffer; } TEST(Rom_Tensor, read_write_u8_2x) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - uint8_t* buffer = new uint8_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + uint8_t *buffer = new uint8_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, u8, buffer); - uint8_t read = r(2,2); + uint8_t read = r(2, 2); EXPECT_EQ(read, 22); - EXPECT_EQ((uint8_t)r(3,2), 32); - delete[] buffer; + EXPECT_EQ((uint8_t)r(3, 2), 32); + delete[] buffer; } TEST(Rom_Tensor, read_write_i8) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - int8_t* buffer = new int8_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + int8_t *buffer = new int8_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, i8, buffer); - int8_t read = r(2,2); + int8_t read = r(2, 2); EXPECT_EQ(read, 22); cout << "i8 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; cout << "Sizeof RomTensor " << sizeof(r) << endl; @@ -91,37 +89,57 @@ TEST(Rom_Tensor, read_write_i8) { } TEST(Rom_Tensor, read_write_u16) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - uint16_t* buffer = new uint16_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + uint16_t *buffer = new uint16_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, u16, buffer); - uint16_t read = r(2,2); + uint16_t read = r(2, 2); EXPECT_EQ(read, 22); - read = r(3,2); + read = r(3, 2); EXPECT_EQ(read, 32); cout << "uint16 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; delete[] buffer; } TEST(Rom_Tensor, read_write_i16) { - ///setup_context(); + /// setup_context(); localCircularArenaAllocator<256> meta_allocator; localCircularArenaAllocator<256> ram_allocator; Context::get_default_context()->set_metadata_allocator(&meta_allocator); Context::get_default_context()->set_ram_data_allocator(&ram_allocator); - int16_t* buffer = new int16_t[10*10]; - for(int i = 0; i < 100; i++) - buffer[i] = i; + int16_t *buffer = new int16_t[10 * 10]; + for (int i = 0; i < 100; i++) + buffer[i] = i; const RomTensor r({10, 10}, i16, buffer); - int16_t read = r(2,2); + int16_t read = r(2, 2); EXPECT_EQ(read, 22); - read = r(3,2); + read = r(3, 2); EXPECT_EQ(read, 32); cout << "uint16 Sizeof IntegralValue " << sizeof(IntegralValue(5)) << endl; delete[] buffer; } + +TEST(Rom_Tensor, view) { + localCircularArenaAllocator<256> meta_allocator; + localCircularArenaAllocator<256> ram_allocator; + Context::get_default_context()->set_metadata_allocator(&meta_allocator); + Context::get_default_context()->set_ram_data_allocator(&ram_allocator); + int32_t buffer[100]; + for (int32_t i = 0; i < 100; i++) { + buffer[i] = i; + } + Tensor a = new RomTensor({10, 10}, i32, buffer); + Tensor view = a.view({1, 8, 2}, {2, 10, 2}); + int32_t read = view(0, 0); + EXPECT_EQ(read, 12); + read = view(2, 1); + EXPECT_EQ(read, 54); + a(12) = static_cast(100); + read = view(0, 0); + EXPECT_EQ(read, 100); +} diff --git a/extern/googletest b/extern/googletest index 703bd9ca..b796f7d4 160000 --- a/extern/googletest +++ b/extern/googletest @@ -1 +1 @@ -Subproject commit 703bd9caab50b139428cea1aaff9974ebee5742e +Subproject commit b796f7d44681514f58a683a3a71ff17c94edb0c1 diff --git a/extern/pybind11 b/extern/pybind11 new file mode 160000 index 00000000..eeac2f45 --- /dev/null +++ b/extern/pybind11 @@ -0,0 +1 @@ +Subproject commit eeac2f45728633d7ee6fe792bea2890345697119 diff --git a/python/.lldb-cmds b/python/.lldb-cmds new file mode 100644 index 00000000..1548f6e9 --- /dev/null +++ b/python/.lldb-cmds @@ -0,0 +1 @@ +breakpoint set -f python/cpp/impl/conv.cpp -l 22 \ No newline at end of file diff --git a/python/.pipenv-d/Pipfile.3.8.linux-aarch64.lock b/python/.pipenv-d/Pipfile.3.8.linux-aarch64.lock new file mode 100644 index 00000000..50292d51 --- /dev/null +++ b/python/.pipenv-d/Pipfile.3.8.linux-aarch64.lock @@ -0,0 +1,1279 @@ +{ + "_meta": { + "hash": { + "sha256": "d068ed0fa34be6cafadc3c81f6175c6e95bddfc5a680d3bbe3fc2ef479375798" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "numpy": { + "hashes": [ + "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", + "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", + "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", + "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", + "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", + "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", + "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", + "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", + "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", + "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", + "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", + "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", + "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", + "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", + "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", + "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", + "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", + "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", + "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", + "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", + "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", + "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", + "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", + "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", + "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", + "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", + "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", + "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.4" + }, + "pyutensor": { + "editable": true, + "file": "." + } + }, + "develop": { + "absl-py": { + "hashes": [ + "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.0" + }, + "asttokens": { + "hashes": [ + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" + ], + "version": "==2.4.1" + }, + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, + "backcall": { + "hashes": [ + "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" + ], + "version": "==0.2.0" + }, + "black": { + "hashes": [ + "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474", + "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1", + "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0", + "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8", + "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96", + "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1", + "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04", + "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021", + "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94", + "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d", + "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c", + "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7", + "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c", + "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc", + "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", + "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", + "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c", + "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741", + "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce", + "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb", + "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063", + "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==24.4.2" + }, + "cachetools": { + "hashes": [ + "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" + ], + "markers": "python_version >= '3.7'", + "version": "==5.3.3" + }, + "certifi": { + "hashes": [ + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.6.2" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "decorator": { + "hashes": [ + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" + ], + "markers": "python_version >= '3.5'", + "version": "==5.1.1" + }, + "exceptiongroup": { + "hashes": [ + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.1" + }, + "executing": { + "hashes": [ + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + ], + "markers": "python_version >= '3.5'", + "version": "==2.0.1" + }, + "filelock": { + "hashes": [ + "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8", + "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac" + ], + "markers": "python_version >= '3.8'", + "version": "==3.15.1" + }, + "flake8": { + "hashes": [ + "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a", + "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.1.0" + }, + "flatbuffers": { + "hashes": [ + "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812", + "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4" + ], + "version": "==24.3.25" + }, + "fsspec": { + "hashes": [ + "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee", + "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2" + ], + "markers": "python_version >= '3.8'", + "version": "==2024.6.0" + }, + "gast": { + "hashes": [ + "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1", + "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.4.0" + }, + "google-auth": { + "hashes": [ + "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5", + "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688" + ], + "markers": "python_version >= '3.7'", + "version": "==2.30.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb", + "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "google-pasta": { + "hashes": [ + "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", + "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" + ], + "version": "==0.2.0" + }, + "grpcio": { + "hashes": [ + "sha256:03b43d0ccf99c557ec671c7dede64f023c7da9bb632ac65dbc57f166e4970040", + "sha256:0a12ddb1678ebc6a84ec6b0487feac020ee2b1659cbe69b80f06dbffdb249122", + "sha256:0a2813093ddb27418a4c99f9b1c223fab0b053157176a64cc9db0f4557b69bd9", + "sha256:0cc79c982ccb2feec8aad0e8fb0d168bcbca85bc77b080d0d3c5f2f15c24ea8f", + "sha256:1257b76748612aca0f89beec7fa0615727fd6f2a1ad580a9638816a4b2eb18fd", + "sha256:1262402af5a511c245c3ae918167eca57342c72320dffae5d9b51840c4b2f86d", + "sha256:19264fc964576ddb065368cae953f8d0514ecc6cb3da8903766d9fb9d4554c33", + "sha256:198908f9b22e2672a998870355e226a725aeab327ac4e6ff3a1399792ece4762", + "sha256:1de403fc1305fd96cfa75e83be3dee8538f2413a6b1685b8452301c7ba33c294", + "sha256:20405cb8b13fd779135df23fabadc53b86522d0f1cba8cca0e87968587f50650", + "sha256:2981c7365a9353f9b5c864595c510c983251b1ab403e05b1ccc70a3d9541a73b", + "sha256:2c3c1b90ab93fed424e454e93c0ed0b9d552bdf1b0929712b094f5ecfe7a23ad", + "sha256:39b9d0acaa8d835a6566c640f48b50054f422d03e77e49716d4c4e8e279665a1", + "sha256:3b64ae304c175671efdaa7ec9ae2cc36996b681eb63ca39c464958396697daff", + "sha256:4657d24c8063e6095f850b68f2d1ba3b39f2b287a38242dcabc166453e950c59", + "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4", + "sha256:55260032b95c49bee69a423c2f5365baa9369d2f7d233e933564d8a47b893027", + "sha256:55697ecec192bc3f2f3cc13a295ab670f51de29884ca9ae6cd6247df55df2502", + "sha256:5841dd1f284bd1b3d8a6eca3a7f062b06f1eec09b184397e1d1d43447e89a7ae", + "sha256:58b1041e7c870bb30ee41d3090cbd6f0851f30ae4eb68228955d973d3efa2e61", + "sha256:5e42634a989c3aa6049f132266faf6b949ec2a6f7d302dbb5c15395b77d757eb", + "sha256:5e56462b05a6f860b72f0fa50dca06d5b26543a4e88d0396259a07dc30f4e5aa", + "sha256:5f8b75f64d5d324c565b263c67dbe4f0af595635bbdd93bb1a88189fc62ed2e5", + "sha256:62b4e6eb7bf901719fce0ca83e3ed474ae5022bb3827b0a501e056458c51c0a1", + "sha256:6503b64c8b2dfad299749cad1b595c650c91e5b2c8a1b775380fcf8d2cbba1e9", + "sha256:6c024ffc22d6dc59000faf8ad781696d81e8e38f4078cb0f2630b4a3cf231a90", + "sha256:73819689c169417a4f978e562d24f2def2be75739c4bed1992435d007819da1b", + "sha256:75dbbf415026d2862192fe1b28d71f209e2fd87079d98470db90bebe57b33179", + "sha256:8caee47e970b92b3dd948371230fcceb80d3f2277b3bf7fbd7c0564e7d39068e", + "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a", + "sha256:940e3ec884520155f68a3b712d045e077d61c520a195d1a5932c531f11883489", + "sha256:a011ac6c03cfe162ff2b727bcb530567826cec85eb8d4ad2bfb4bd023287a52d", + "sha256:a3a035c37ce7565b8f4f35ff683a4db34d24e53dc487e47438e434eb3f701b2a", + "sha256:a5e771d0252e871ce194d0fdcafd13971f1aae0ddacc5f25615030d5df55c3a2", + "sha256:ac15b6c2c80a4d1338b04d42a02d376a53395ddf0ec9ab157cbaf44191f3ffdd", + "sha256:b1a82e0b9b3022799c336e1fc0f6210adc019ae84efb7321d668129d28ee1efb", + "sha256:bac71b4b28bc9af61efcdc7630b166440bbfbaa80940c9a697271b5e1dabbc61", + "sha256:bbc5b1d78a7822b0a84c6f8917faa986c1a744e65d762ef6d8be9d75677af2ca", + "sha256:c1a786ac592b47573a5bb7e35665c08064a5d77ab88a076eec11f8ae86b3e3f6", + "sha256:c84ad903d0d94311a2b7eea608da163dace97c5fe9412ea311e72c3684925602", + "sha256:d4d29cc612e1332237877dfa7fe687157973aab1d63bd0f84cf06692f04c0367", + "sha256:e3d9f8d1221baa0ced7ec7322a981e28deb23749c76eeeb3d33e18b72935ab62", + "sha256:e7cd5c1325f6808b8ae31657d281aadb2a51ac11ab081ae335f4f7fc44c1721d", + "sha256:ed6091fa0adcc7e4ff944090cf203a52da35c37a130efa564ded02b7aff63bcd", + "sha256:ee73a2f5ca4ba44fa33b4d7d2c71e2c8a9e9f78d53f6507ad68e7d2ad5f64a22", + "sha256:f10193c69fc9d3d726e83bbf0f3d316f1847c3071c8c93d8090cf5f326b14309" + ], + "markers": "python_version >= '3.8'", + "version": "==1.64.1" + }, + "h5py": { + "hashes": [ + "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e", + "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731", + "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892", + "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3", + "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1", + "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea", + "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b", + "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62", + "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150", + "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007", + "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00", + "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9", + "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76", + "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab", + "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb", + "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba", + "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5", + "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3", + "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972", + "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc", + "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0" + ], + "markers": "python_version >= '3.8'", + "version": "==3.11.0" + }, + "idna": { + "hashes": [ + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + ], + "markers": "python_version >= '3.5'", + "version": "==3.7" + }, + "importlib-metadata": { + "hashes": [ + "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" + ], + "markers": "python_version < '3.10'", + "version": "==7.1.0" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "ipython": { + "hashes": [ + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.12.3" + }, + "isort": { + "hashes": [ + "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118", + "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.0'", + "version": "==6.0.0b2" + }, + "jedi": { + "hashes": [ + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" + ], + "markers": "python_version >= '3.6'", + "version": "==0.19.1" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "keras": { + "hashes": [ + "sha256:5ce5f706f779fa7330e63632f327b75ce38144a120376b2ae1917c00fa6136af", + "sha256:5df12cc241a015a11b65ddb452c0eeb2744fce21d9b54ba48db87492568ccc68" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.1" + }, + "libclang": { + "hashes": [ + "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8", + "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb", + "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", + "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", + "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5", + "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8", + "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", + "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", + "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe" + ], + "version": "==18.1.1" + }, + "markdown": { + "hashes": [ + "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + ], + "markers": "python_version >= '3.8'", + "version": "==3.6" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "matplotlib-inline": { + "hashes": [ + "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + ], + "markers": "python_version >= '3.8'", + "version": "==0.1.7" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "mpmath": { + "hashes": [ + "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", + "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + ], + "markers": "python_version >= '3.8'", + "version": "==1.3.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "networkx": { + "hashes": [ + "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36", + "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61" + ], + "markers": "python_version >= '3.8'", + "version": "==3.1" + }, + "numpy": { + "hashes": [ + "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", + "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", + "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", + "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", + "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", + "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", + "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", + "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", + "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", + "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", + "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", + "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", + "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", + "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", + "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", + "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", + "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", + "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", + "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", + "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", + "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", + "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", + "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", + "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", + "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", + "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", + "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", + "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.4" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, + "opt-einsum": { + "hashes": [ + "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", + "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3.0" + }, + "packaging": { + "hashes": [ + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1" + }, + "parso": { + "hashes": [ + "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.4" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "pexpect": { + "hashes": [ + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" + ], + "markers": "sys_platform != 'win32'", + "version": "==4.9.0" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "pillow": { + "hashes": [ + "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", + "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", + "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", + "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", + "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", + "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", + "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", + "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", + "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", + "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", + "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", + "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", + "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", + "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", + "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", + "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", + "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", + "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", + "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", + "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", + "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", + "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", + "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", + "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", + "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", + "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", + "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", + "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", + "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", + "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", + "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", + "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", + "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", + "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", + "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", + "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", + "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", + "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", + "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", + "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", + "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", + "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", + "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", + "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", + "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", + "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", + "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", + "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", + "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", + "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", + "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", + "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", + "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", + "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", + "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", + "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", + "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", + "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", + "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", + "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", + "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", + "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", + "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", + "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", + "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", + "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", + "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", + "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", + "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" + ], + "markers": "python_version >= '3.8'", + "version": "==10.3.0" + }, + "platformdirs": { + "hashes": [ + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.2" + }, + "pluggy": { + "hashes": [ + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.47" + }, + "protobuf": { + "hashes": [ + "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", + "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", + "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", + "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", + "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", + "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + ], + "markers": "python_version >= '3.8'", + "version": "==4.25.3" + }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "version": "==0.7.0" + }, + "pure-eval": { + "hashes": [ + "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", + "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + ], + "version": "==0.2.2" + }, + "pyasn1": { + "hashes": [ + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c", + "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + ], + "markers": "python_version >= '3.8'", + "version": "==2.12.0" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "pygments": { + "hashes": [ + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.18.0" + }, + "pytest": { + "hashes": [ + "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.2.2" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==4.9" + }, + "setuptools": { + "hashes": [ + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" + ], + "markers": "python_version >= '3.8'", + "version": "==70.0.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "stack-data": { + "hashes": [ + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + ], + "version": "==0.6.3" + }, + "sympy": { + "hashes": [ + "sha256:ce46688c9811cbea827dc01128e65a8f97061eaf34ab0802be2152cfa371cafe", + "sha256:df307fd8bbfcba5f5616f93f9f07e0281b6de7a31897c8493e357c9f7af8e05a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.13.0rc2" + }, + "tensorboard": { + "hashes": [ + "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.0" + }, + "tensorboard-data-server": { + "hashes": [ + "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530" + ], + "markers": "python_version >= '3.7'", + "version": "==0.7.2" + }, + "tensorflow": { + "hashes": [ + "sha256:01d987c55f2472595e351a1ff467be99836d51aed0621db0d28f0b0a7813ca1a", + "sha256:149184a24f8646f0ab78b2b24a0aecb8538769e515358ea7139709e6bcef9171", + "sha256:189134fe744692f92b547f4a4a9f1e254fcc0623bf082f4510dfda5eb966bfb9", + "sha256:190fadd1e8e48ab6bc12c88fccd7029109ea9d0f0ea46a0b5747c2319a03745c", + "sha256:1c99a65b120747c511ea0945c6cf6d83dd74e63c92e8898d0e07c3befe00f6f2", + "sha256:24f0ffb2e95da565a9132f9a9bd8d0c400d54de0a70165a3a8a7fba3a9f2304e", + "sha256:2c32bd4ccb9f2c0b81489fb2d664bfaa06eb8a2fb4d0647694cd8078505276c0", + "sha256:3818a57638e21149e0b827ad0c7db2facfd21a8d71068038ec02071a0fe571f8", + "sha256:498e786ee3f50ca4599a4cf2adbe517c78df26081fda6198e73165cb5ab804f5", + "sha256:4d790fd74639a611b0b2284bccd0cdb331cb41621c980b14fbf0a22451b75f5a", + "sha256:567eed51f20c769dd123ee1c85ff0962f77e52414fc0cd85e8dd446f4ab1d529", + "sha256:584b2448d9895e84f88761d630a07bdd38c35ad00cab4fe6e9e8cfe027c4a7c2", + "sha256:5f4a4e3372c22bc957f3c51ccd1a11f2dfe8ce63d7970dd9ace909aa007a45a3", + "sha256:897c37b2ffac1dca6b1c88cf66c5941ef0ad29deaa8bb75e9310c35738624f9d", + "sha256:8b873e52f67d61226106a74c2fe70b16e21caf868ec597b37759c77b517e04a0", + "sha256:8bf1ec1f2008560487577b8dfb95fe2a601b719a7ba1e6a6cc6c9b3858e5c528", + "sha256:8cb7063cba29253290e17933c8439e9a15195d837ed53378849b5eaed978de8b", + "sha256:c49fb147a5c8fdf7dc11df94fc3498e749e32b990f336e14777fae41dad34e6c", + "sha256:e26443a066c964ea8c8fc3bd262974ccdd612541f4738ab4be08be855abd274c", + "sha256:ffb8d18c06ed7d91a4d312ac1824ffa91ef38577eae27f8e1bd139019777ea8f" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.13.0rc0" + }, + "tensorflow-cpu-aws": { + "hashes": [ + "sha256:195b636d6b56649e23c4975f6a4b648e756bc9bbb153e666af3f8bacdae3a93f", + "sha256:9ac6994a0d01962a9665b420c2cbde7d25b9bf6b0dd1c2d732b0c46e1aa3edf5", + "sha256:a0c1a03a5f67fc7402edcbce2895b3421494cf7aea2ae2b1b3256df52a715cae", + "sha256:d37fd1829639aa39cfe0bc4be97d65b4e3fb58f7a135a7456ec95b2b2b7b7def" + ], + "markers": "platform_system == 'Linux' and (platform_machine == 'arm64' or platform_machine == 'aarch64')", + "version": "==2.13.0rc0" + }, + "tensorflow-estimator": { + "hashes": [ + "sha256:6f868284eaa654ae3aa7cacdbef2175d0909df9fcf11374f5166f8bf475952aa" + ], + "markers": "python_version >= '3.7'", + "version": "==2.13.0" + }, + "tensorflow-io-gcs-filesystem": { + "hashes": [ + "sha256:0fce1466bdb91096b6d22e7df17358ba228bcb92db5cff83f2f9f1c68eb26788", + "sha256:1856fe321fdb75f3386d92109c60db6ef097f610b450f9cc69d76444fb9980d1", + "sha256:35b6eca7225c815d962254327195f191d88c3c9c2278a5ab23e0ac834acbadbb", + "sha256:5521721b38105496d4b43a4ffb0af5b04cc4873d464f26fbceddf8d63815ce98", + "sha256:6e997389bfe008210cbd97c0c738d64282a2f03ad4d0536013bb0a9efde0c283", + "sha256:ac8f1de60fdf9c734aea967b98555e366ac8743f77bca15c49eff023f587076b", + "sha256:b8fb3402fb1457482c386ea19371bc76383412ae9ea4396edb1e8adb4ba76f21", + "sha256:c4f786eebd98d401565374722f2e67f3878675b0d87489cbaa13c70ee6ac370a", + "sha256:dd8f30908bf8b7b2a017d6b145720d105aff7f998422671b71729708ec7b2fe4", + "sha256:eb6bf8f5b40207ecb17e7fdc3b4fc824a8361267c14e9528c1688e16de135cb7" + ], + "markers": "platform_machine != 'arm64' or platform_system != 'Darwin'", + "version": "==0.35.0" + }, + "termcolor": { + "hashes": [ + "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63", + "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "torch": { + "hashes": [ + "sha256:07e9ba746832b8d069cacb45f312cadd8ad02b81ea527ec9766c0e7404bb3feb", + "sha256:224259821fe3e4c6f7edf1528e4fe4ac779c77addaa74215eb0b63a5c474d66c", + "sha256:2bb5af780c55be68fe100feb0528d2edebace1d55cb2e351de735809ba7391eb", + "sha256:32b05fe0d1ada7f69c9f86c14ff69b0ef1957a5a54199bacba63d22d8fab720b", + "sha256:3c333dc2ebc189561514eda06e81df22bf8fb64e2384746b2cb9f04f96d1d4c8", + "sha256:3d7a7f7ef21a7520510553dc3938b0c57c116a7daee20736a9e25cbc0e832bdc", + "sha256:462d1c07dbf6bb5d9d2f3316fee73a24f3d12cd8dacf681ad46ef6418f7f6626", + "sha256:4777f6cefa0c2b5fa87223c213e7b6f417cf254a45e5829be4ccd1b2a4ee1011", + "sha256:490cc3d917d1fe0bd027057dfe9941dc1d6d8e3cae76140f5dd9a7e5bc7130ab", + "sha256:5802530783bd465fe66c2df99123c9a54be06da118fbd785a25ab0a88123758a", + "sha256:605a25b23944be5ab7c3467e843580e1d888b8066e5aaf17ff7bf9cc30001cc3", + "sha256:7c09a94362778428484bcf995f6004b04952106aee0ef45ff0b4bab484f5498d", + "sha256:a486c0b1976a118805fc7c9641d02df7afbb0c21e6b555d3bb985c9f9601b61a", + "sha256:a7dd4ed388ad1f3d502bf09453d5fe596c7b121de7e0cfaca1e2017782e9bbac", + "sha256:aaa872abde9a3d4f91580f6396d54888620f4a0b92e3976a6034759df4b961ad", + "sha256:b2ec81b61bb094ea4a9dee1cd3f7b76a44555375719ad29f05c0ca8ef596ad39", + "sha256:bee0bd33dc58aa8fc8a7527876e9b9a0e812ad08122054a5bff2ce5abf005b10", + "sha256:e5fdccbf6f1334b2203a61a0e03821d5845f1421defe311dabeae2fc8fbeac2d", + "sha256:f2357eb0965583a0954d6f9ad005bba0091f956aef879822274b1bcdb11bd308", + "sha256:ff60bf7ce3de1d43ad3f6969983f321a31f0a45df3690921720bcad6a8596cc4" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.0'", + "version": "==2.3.1" + }, + "torchvision": { + "hashes": [ + "sha256:02085a2ffc7461f5c0edb07d6f3455ee1806561f37736b903da820067eea58c7", + "sha256:0b3bda0aa5b416eeb547143b8eeaf17720bdba9cf516dc991aacb81811aa96a5", + "sha256:13d24d904f65e62d66a1e0c41faec630bc193867b8a4a01166769e8a8e8df8e9", + "sha256:2be6f0bf7c455c89a51a1dbb6f668d36c6edc479f49ac912d745d10df5715657", + "sha256:3e694e54b0548dad99c12af6bf0c8e4f3350137d391dcd19af22a1c5f89322b3", + "sha256:52f7436140045dc2239cdc502aa76b2bd8bd676d64244ff154d304aa69852046", + "sha256:54bfcd352abb396d5c9c237d200167c178bd136051b138e1e8ef46ce367c2773", + "sha256:573ff523c739405edb085f65cb592f482d28a30e29b0be4c4ba08040b3ae785f", + "sha256:5c8366a1aeee49e9ea9e64b30d199debdf06b1bd7610a76165eb5d7869c3bde5", + "sha256:64a2662dbf30db9055d8b201d6e56f312a504e5ccd9d144c57c41622d3c524cb", + "sha256:80b5d794dd0fdba787adc22f1a367a5ead452327686473cb260dd94364bc56a6", + "sha256:9077cf590cdb3a5e8fdf5cdb71797f8c67713f974cf0228ecb17fcd670ab42f9", + "sha256:9726c316a2501df8503e5a5dc46a631afd4c515a958972e5b7f7b9c87d2125c0", + "sha256:975b8594c0f5288875408acbb74946eea786c5b008d129c0d045d0ead23742bc", + "sha256:b1c3864fa9378c88bce8ad0ef3599f4f25397897ce612e1c245c74b97092f35e", + "sha256:ceb993a882f1ae7ae373ed39c28d7e3e802205b0e59a7ed84ef4028f0bba8d7f", + "sha256:da83c8bbd34d8bee48bfa1d1b40e0844bc3cba10ed825a5a8cbe3ce7b62264cd", + "sha256:ed6340b69a63a625e512a66127210d412551d9c5f2ad2978130c6a45bf56cd4a", + "sha256:ef7bbbc60b38e831a75e547c66ca1784f2ac27100f9e4ddbe9614cef6cbcd942", + "sha256:f118d887bfde3a948a41d56587525401e5cac1b7db2eaca203324d6ed2b1caca" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.18.1" + }, + "traitlets": { + "hashes": [ + "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + ], + "markers": "python_version >= '3.8'", + "version": "==5.14.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version < '3.10'", + "version": "==4.12.2" + }, + "urllib3": { + "hashes": [ + "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.2" + }, + "wcwidth": { + "hashes": [ + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" + ], + "version": "==0.2.13" + }, + "werkzeug": { + "hashes": [ + "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", + "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.3" + }, + "wheel": { + "hashes": [ + "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85", + "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81" + ], + "markers": "python_version >= '3.8'", + "version": "==0.43.0" + }, + "wrapt": { + "hashes": [ + "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3", + "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b", + "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4", + "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2", + "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656", + "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3", + "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9", + "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff", + "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9", + "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310", + "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224", + "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a", + "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57", + "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069", + "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335", + "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383", + "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe", + "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204", + "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87", + "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d", + "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b", + "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907", + "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be", + "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f", + "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0", + "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28", + "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1", + "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853", + "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc", + "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf", + "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3", + "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3", + "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164", + "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1", + "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c", + "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1", + "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7", + "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1", + "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320", + "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed", + "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1", + "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248", + "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c", + "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456", + "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77", + "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef", + "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1", + "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7", + "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86", + "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4", + "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d", + "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d", + "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8", + "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8", + "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5", + "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a", + "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471", + "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00", + "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68", + "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3", + "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d", + "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735", + "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d", + "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569", + "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7", + "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59", + "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5", + "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb", + "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b", + "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f", + "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55", + "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462", + "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015", + "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.14.1" + }, + "zipp": { + "hashes": [ + "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" + ], + "markers": "python_version >= '3.8'", + "version": "==3.19.2" + } + } +} diff --git a/python/.pipenv-d/Pipfile.3.8.linux-x86_64.lock b/python/.pipenv-d/Pipfile.3.8.linux-x86_64.lock new file mode 100644 index 00000000..4d902fd0 --- /dev/null +++ b/python/.pipenv-d/Pipfile.3.8.linux-x86_64.lock @@ -0,0 +1,989 @@ +{ + "_meta": { + "hash": { + "sha256": "6b46bfc84985007832cd72cbaea1683434e715586b48c2c89a9642797c8bbdda" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "absl-py": { + "hashes": [ + "sha256:72d782fbeafba66ba3e525d46bccac949b9a174dbf66233e50ece09ee688dc81", + "sha256:ea907384af023a7e681368bedb896159ab100c7db593efbbd5cde22af11270cd" + ], + "version": "==0.15.0" + }, + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, + "cachetools": { + "hashes": [ + "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" + ], + "markers": "python_version >= '3.7'", + "version": "==5.3.3" + }, + "certifi": { + "hashes": [ + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.2.2" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "dataclasses": { + "hashes": [ + "sha256:454a69d788c7fda44efd71e259be79577822f5e3f53f029a22d08004e951dc9f", + "sha256:6988bd2b895eef432d562370bb707d540f32f7360ab13da45340101bc2307d84" + ], + "version": "==0.6" + }, + "flatbuffers": { + "hashes": [ + "sha256:63bb9a722d5e373701913e226135b28a6f6ac200d5cc7b4d919fa38d73b44610", + "sha256:9e9ef47fa92625c4721036e7c4124182668dc6021d9e7c73704edd395648deb9" + ], + "version": "==1.12" + }, + "future": { + "hashes": [ + "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216", + "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05" + ], + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.0.0" + }, + "gast": { + "hashes": [ + "sha256:8f46f5be57ae6889a4e16e2ca113b1703ef17f2b0abceb83793eaba9e1351a45", + "sha256:b881ef288a49aa81440d2c5eb8aeefd4c2bb8993d5f50edae7413a85bfdb3b57" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.3.3" + }, + "google-auth": { + "hashes": [ + "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360", + "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415" + ], + "markers": "python_version >= '3.7'", + "version": "==2.29.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:3f2a6e802eebbb6fb736a370fbf3b055edcb6b52878bf2f26330b5e041316c73", + "sha256:a90a072f6993f2c327067bf65270046384cda5a8ecb20b94ea9a687f1f233a7a" + ], + "markers": "python_version >= '3.6'", + "version": "==0.4.6" + }, + "google-pasta": { + "hashes": [ + "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", + "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" + ], + "version": "==0.2.0" + }, + "grpcio": { + "hashes": [ + "sha256:01d3046fe980be25796d368f8fc5ff34b7cf5e1444f3789a017a7fe794465639", + "sha256:07b430fa68e5eecd78e2ad529ab80f6a234b55fc1b675fe47335ccbf64c6c6c8", + "sha256:0e3edd8cdb71809d2455b9dbff66b4dd3d36c321e64bfa047da5afdfb0db332b", + "sha256:0f3f09269ffd3fded430cd89ba2397eabbf7e47be93983b25c187cdfebb302a7", + "sha256:1376a60f9bfce781b39973f100b5f67e657b5be479f2fd8a7d2a408fc61c085c", + "sha256:14c0f017bfebbc18139551111ac58ecbde11f4bc375b73a53af38927d60308b6", + "sha256:182c64ade34c341398bf71ec0975613970feb175090760ab4f51d1e9a5424f05", + "sha256:1ada89326a364a299527c7962e5c362dbae58c67b283fe8383c4d952b26565d5", + "sha256:1ce6f5ff4f4a548c502d5237a071fa617115df58ea4b7bd41dac77c1ab126e9c", + "sha256:1d384a61f96a1fc6d5d3e0b62b0a859abc8d4c3f6d16daba51ebf253a3e7df5d", + "sha256:25959a651420dd4a6fd7d3e8dee53f4f5fd8c56336a64963428e78b276389a59", + "sha256:28677f057e2ef11501860a7bc15de12091d40b95dd0fddab3c37ff1542e6b216", + "sha256:378fe80ec5d9353548eb2a8a43ea03747a80f2e387c4f177f2b3ff6c7d898753", + "sha256:3afb058b6929eba07dba9ae6c5b555aa1d88cb140187d78cc510bd72d0329f28", + "sha256:4396b1d0f388ae875eaf6dc05cdcb612c950fd9355bc34d38b90aaa0665a0d4b", + "sha256:4775bc35af9cd3b5033700388deac2e1d611fa45f4a8dcb93667d94cb25f0444", + "sha256:5bddf9d53c8df70061916c3bfd2f468ccf26c348bb0fb6211531d895ed5e4c72", + "sha256:6d869a3e8e62562b48214de95e9231c97c53caa7172802236cd5d60140d7cddd", + "sha256:6f7947dad606c509d067e5b91a92b250aa0530162ab99e4737090f6b17eb12c4", + "sha256:7cda998b7b551503beefc38db9be18c878cfb1596e1418647687575cdefa9273", + "sha256:99bac0e2c820bf446662365df65841f0c2a55b0e2c419db86eaf5d162ddae73e", + "sha256:9c0d8f2346c842088b8cbe3e14985b36e5191a34bf79279ba321a4bf69bd88b7", + "sha256:a8004b34f600a8a51785e46859cd88f3386ef67cccd1cfc7598e3d317608c643", + "sha256:ac7028d363d2395f3d755166d0161556a3f99500a5b44890421ccfaaf2aaeb08", + "sha256:be98e3198ec765d0a1e27f69d760f69374ded8a33b953dcfe790127731f7e690", + "sha256:c31e8a219650ddae1cd02f5a169e1bffe66a429a8255d3ab29e9363c73003b62", + "sha256:c4966d746dccb639ef93f13560acbe9630681c07f2b320b7ec03fe2c8f0a1f15", + "sha256:c58825a3d8634cd634d8f869afddd4d5742bdb59d594aea4cea17b8f39269a55", + "sha256:ce617e1c4a39131f8527964ac9e700eb199484937d7a0b3e52655a3ba50d5fb9", + "sha256:e28e4c0d4231beda5dee94808e3a224d85cbaba3cfad05f2192e6f4ec5318053", + "sha256:e467af6bb8f5843f5a441e124b43474715cfb3981264e7cd227343e826dcc3ce", + "sha256:e6786f6f7be0937614577edcab886ddce91b7c1ea972a07ef9972e9f9ecbbb78", + "sha256:e811ce5c387256609d56559d944a974cc6934a8eea8c76e7c86ec388dc06192d", + "sha256:ec10d5f680b8e95a06f1367d73c5ddcc0ed04a3f38d6e4c9346988fb0cea2ffa", + "sha256:ef9bd7fdfc0a063b4ed0efcab7906df5cae9bbcf79d05c583daa2eba56752b00", + "sha256:f03dfefa9075dd1c6c5cc27b1285c521434643b09338d8b29e1d6a27b386aa82", + "sha256:f12900be4c3fd2145ba94ab0d80b7c3d71c9e6414cfee2f31b1c20188b5c281f", + "sha256:f53f2dfc8ff9a58a993e414a016c8b21af333955ae83960454ad91798d467c7b", + "sha256:f7d508691301027033215d3662dab7e178f54d5cca2329f26a71ae175d94b83f" + ], + "version": "==1.32.0" + }, + "h5py": { + "hashes": [ + "sha256:063947eaed5f271679ed4ffa36bb96f57bc14f44dd4336a827d9a02702e6ce6b", + "sha256:13c87efa24768a5e24e360a40e0bc4c49bcb7ce1bb13a3a7f9902cec302ccd36", + "sha256:16ead3c57141101e3296ebeed79c9c143c32bdd0e82a61a2fc67e8e6d493e9d1", + "sha256:3dad1730b6470fad853ef56d755d06bb916ee68a3d8272b3bab0c1ddf83bb99e", + "sha256:51ae56894c6c93159086ffa2c94b5b3388c0400548ab26555c143e7cfa05b8e5", + "sha256:54817b696e87eb9e403e42643305f142cd8b940fe9b3b490bbf98c3b8a894cf4", + "sha256:549ad124df27c056b2e255ea1c44d30fb7a17d17676d03096ad5cd85edb32dc1", + "sha256:64f74da4a1dd0d2042e7d04cf8294e04ddad686f8eba9bb79e517ae582f6668d", + "sha256:6998be619c695910cb0effe5eb15d3a511d3d1a5d217d4bd0bebad1151ec2262", + "sha256:6ef7ab1089e3ef53ca099038f3c0a94d03e3560e6aff0e9d6c64c55fb13fc681", + "sha256:769e141512b54dee14ec76ed354fcacfc7d97fea5a7646b709f7400cf1838630", + "sha256:79b23f47c6524d61f899254f5cd5e486e19868f1823298bc0c29d345c2447172", + "sha256:7be5754a159236e95bd196419485343e2b5875e806fe68919e087b6351f40a70", + "sha256:84412798925dc870ffd7107f045d7659e60f5d46d1c70c700375248bf6bf512d", + "sha256:86868dc07b9cc8cb7627372a2e6636cdc7a53b7e2854ad020c9e9d8a4d3fd0f5", + "sha256:8bb1d2de101f39743f91512a9750fb6c351c032e5cd3204b4487383e34da7f75", + "sha256:a5f82cd4938ff8761d9760af3274acf55afc3c91c649c50ab18fcff5510a14a5", + "sha256:aac4b57097ac29089f179bbc2a6e14102dd210618e94d77ee4831c65f82f17c0", + "sha256:bffbc48331b4a801d2f4b7dac8a72609f0b10e6e516e5c480a3e3241e091c878", + "sha256:c0d4b04bbf96c47b6d360cd06939e72def512b20a18a8547fa4af810258355d5", + "sha256:c54a2c0dd4957776ace7f95879d81582298c5daf89e77fb8bee7378f132951de", + "sha256:cbf28ae4b5af0f05aa6e7551cee304f1d317dbed1eb7ac1d827cee2f1ef97a99", + "sha256:d35f7a3a6cefec82bfdad2785e78359a0e6a5fbb3f605dd5623ce88082ccd681", + "sha256:d3c59549f90a891691991c17f8e58c8544060fdf3ccdea267100fa5f561ff62f", + "sha256:d7ae7a0576b06cb8e8a1c265a8bc4b73d05fdee6429bffc9a26a6eb531e79d72", + "sha256:ecf4d0b56ee394a0984de15bceeb97cbe1fe485f1ac205121293fc44dcf3f31f", + "sha256:f0e25bb91e7a02efccb50aba6591d3fe2c725479e34769802fcdd4076abfa917", + "sha256:f23951a53d18398ef1344c186fb04b26163ca6ce449ebd23404b153fd111ded9", + "sha256:ff7d241f866b718e4584fa95f520cb19405220c501bd3a53ee11871ba5166ea2" + ], + "version": "==2.10.0" + }, + "idna": { + "hashes": [ + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + ], + "markers": "python_version >= '3.5'", + "version": "==3.6" + }, + "importlib-metadata": { + "hashes": [ + "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" + ], + "markers": "python_version < '3.10'", + "version": "==7.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.3" + }, + "keras-preprocessing": { + "hashes": [ + "sha256:7b82029b130ff61cc99b55f3bd27427df4838576838c5b2f65940e4fcec99a7b", + "sha256:add82567c50c8bc648c14195bf544a5ce7c1f76761536956c3d2978970179ef3" + ], + "version": "==1.1.2" + }, + "markdown": { + "hashes": [ + "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + ], + "markers": "python_version >= '3.8'", + "version": "==3.6" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "numpy": { + "hashes": [ + "sha256:012426a41bc9ab63bb158635aecccc7610e3eff5d31d1eb43bc099debc979d94", + "sha256:06fab248a088e439402141ea04f0fffb203723148f6ee791e9c75b3e9e82f080", + "sha256:0eef32ca3132a48e43f6a0f5a82cb508f22ce5a3d6f67a8329c81c8e226d3f6e", + "sha256:1ded4fce9cfaaf24e7a0ab51b7a87be9038ea1ace7f34b841fe3b6894c721d1c", + "sha256:2e55195bc1c6b705bfd8ad6f288b38b11b1af32f3c8289d6c50d47f950c12e76", + "sha256:2ea52bd92ab9f768cc64a4c3ef8f4b2580a17af0a5436f6126b08efbd1838371", + "sha256:36674959eed6957e61f11c912f71e78857a8d0604171dfd9ce9ad5cbf41c511c", + "sha256:384ec0463d1c2671170901994aeb6dce126de0a95ccc3976c43b0038a37329c2", + "sha256:39b70c19ec771805081578cc936bbe95336798b7edf4732ed102e7a43ec5c07a", + "sha256:400580cbd3cff6ffa6293df2278c75aef2d58d8d93d3c5614cd67981dae68ceb", + "sha256:43d4c81d5ffdff6bae58d66a3cd7f54a7acd9a0e7b18d97abb255defc09e3140", + "sha256:50a4a0ad0111cc1b71fa32dedd05fa239f7fb5a43a40663269bb5dc7877cfd28", + "sha256:603aa0706be710eea8884af807b1b3bc9fb2e49b9f4da439e76000f3b3c6ff0f", + "sha256:6149a185cece5ee78d1d196938b2a8f9d09f5a5ebfbba66969302a778d5ddd1d", + "sha256:759e4095edc3c1b3ac031f34d9459fa781777a93ccc633a472a5468587a190ff", + "sha256:7fb43004bce0ca31d8f13a6eb5e943fa73371381e53f7074ed21a4cb786c32f8", + "sha256:811daee36a58dc79cf3d8bdd4a490e4277d0e4b7d103a001a4e73ddb48e7e6aa", + "sha256:8b5e972b43c8fc27d56550b4120fe6257fdc15f9301914380b27f74856299fea", + "sha256:99abf4f353c3d1a0c7a5f27699482c987cf663b1eac20db59b8c7b061eabd7fc", + "sha256:a0d53e51a6cb6f0d9082decb7a4cb6dfb33055308c4c44f53103c073f649af73", + "sha256:a12ff4c8ddfee61f90a1633a4c4afd3f7bcb32b11c52026c92a12e1325922d0d", + "sha256:a4646724fba402aa7504cd48b4b50e783296b5e10a524c7a6da62e4a8ac9698d", + "sha256:a76f502430dd98d7546e1ea2250a7360c065a5fdea52b2dffe8ae7180909b6f4", + "sha256:a9d17f2be3b427fbb2bce61e596cf555d6f8a56c222bd2ca148baeeb5e5c783c", + "sha256:ab83f24d5c52d60dbc8cd0528759532736b56db58adaa7b5f1f76ad551416a1e", + "sha256:aeb9ed923be74e659984e321f609b9ba54a48354bfd168d21a2b072ed1e833ea", + "sha256:c843b3f50d1ab7361ca4f0b3639bf691569493a56808a0b0c54a051d260b7dbd", + "sha256:cae865b1cae1ec2663d8ea56ef6ff185bad091a5e33ebbadd98de2cfa3fa668f", + "sha256:cc6bd4fd593cb261332568485e20a0712883cf631f6f5e8e86a52caa8b2b50ff", + "sha256:cf2402002d3d9f91c8b01e66fbb436a4ed01c6498fffed0e4c7566da1d40ee1e", + "sha256:d051ec1c64b85ecc69531e1137bb9751c6830772ee5c1c426dbcfe98ef5788d7", + "sha256:d6631f2e867676b13026e2846180e2c13c1e11289d67da08d71cacb2cd93d4aa", + "sha256:dbd18bcf4889b720ba13a27ec2f2aac1981bd41203b3a3b27ba7a33f88ae4827", + "sha256:df609c82f18c5b9f6cb97271f03315ff0dbe481a2a02e56aeb1b1a985ce38e60" + ], + "markers": "python_version >= '3.6'", + "version": "==1.19.5" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, + "opt-einsum": { + "hashes": [ + "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", + "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3.0" + }, + "pillow": { + "hashes": [ + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" + ], + "markers": "python_version >= '3.8'", + "version": "==10.2.0" + }, + "protobuf": { + "hashes": [ + "sha256:03038ac1cfbc41aa21f6afcbcd357281d7521b4157926f30ebecc8d4ea59dcb7", + "sha256:28545383d61f55b57cf4df63eebd9827754fd2dc25f80c5253f9184235db242c", + "sha256:2e3427429c9cffebf259491be0af70189607f365c2f41c7c3764af6f337105f2", + "sha256:398a9e0c3eaceb34ec1aee71894ca3299605fa8e761544934378bbc6c97de23b", + "sha256:44246bab5dd4b7fbd3c0c80b6f16686808fab0e4aca819ade6e8d294a29c7050", + "sha256:447d43819997825d4e71bf5769d869b968ce96848b6479397e29fc24c4a5dfe9", + "sha256:67a3598f0a2dcbc58d02dd1928544e7d88f764b47d4a286202913f0b2801c2e7", + "sha256:74480f79a023f90dc6e18febbf7b8bac7508420f2006fabd512013c0c238f454", + "sha256:819559cafa1a373b7096a482b504ae8a857c89593cf3a25af743ac9ecbd23480", + "sha256:899dc660cd599d7352d6f10d83c95df430a38b410c1b66b407a6b29265d66469", + "sha256:8c0c984a1b8fef4086329ff8dd19ac77576b384079247c770f29cc8ce3afa06c", + "sha256:9aae4406ea63d825636cc11ffb34ad3379335803216ee3a856787bcf5ccc751e", + "sha256:a7ca6d488aa8ff7f329d4c545b2dbad8ac31464f1d8b1c87ad1346717731e4db", + "sha256:b6cc7ba72a8850621bfec987cb72623e703b7fe2b9127a161ce61e61558ad905", + "sha256:bf01b5720be110540be4286e791db73f84a2b721072a3711efff6c324cdf074b", + "sha256:c02ce36ec760252242a33967d51c289fd0e1c0e6e5cc9397e2279177716add86", + "sha256:d9e4432ff660d67d775c66ac42a67cf2453c27cb4d738fc22cb53b5d84c135d4", + "sha256:daa564862dd0d39c00f8086f88700fdbe8bc717e993a21e90711acfed02f2402", + "sha256:de78575669dddf6099a8a0f46a27e82a1783c557ccc38ee620ed8cc96d3be7d7", + "sha256:e64857f395505ebf3d2569935506ae0dfc4a15cb80dc25261176c784662cdcc4", + "sha256:f4bd856d702e5b0d96a00ec6b307b0f51c1982c2bf9c0052cf9019e9a544ba99", + "sha256:f4c42102bc82a51108e449cbb32b19b180022941c727bac0cfd50170341f16ee" + ], + "markers": "python_version >= '3.7'", + "version": "==3.20.3" + }, + "pyasn1": { + "hashes": [ + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.0" + }, + "pyutensor": { + "editable": true, + "file": "." + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==4.9" + }, + "setuptools": { + "hashes": [ + "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e", + "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c" + ], + "markers": "python_version >= '3.8'", + "version": "==69.2.0" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.15.0" + }, + "tensorboard": { + "hashes": [ + "sha256:cbaa2210c375f3af1509f8571360a19ccc3ded1d9641533414874b5deca47e89" + ], + "markers": "python_version >= '3.7'", + "version": "==2.11.2" + }, + "tensorboard-data-server": { + "hashes": [ + "sha256:809fe9887682d35c1f7d1f54f0f40f98bb1f771b14265b453ca051e2ce58fca7", + "sha256:d8237580755e58eff68d1f3abefb5b1e39ae5c8b127cc40920f9c4fb33f4b98a", + "sha256:fa8cef9be4fcae2f2363c88176638baf2da19c5ec90addb49b1cde05c95c88ee" + ], + "markers": "python_version >= '3.6'", + "version": "==0.6.1" + }, + "tensorboard-plugin-wit": { + "hashes": [ + "sha256:ff26bdd583d155aa951ee3b152b3d0cffae8005dc697f72b44a8e8c2a77a8cbe" + ], + "version": "==1.8.1" + }, + "tensorflow": { + "hashes": [ + "sha256:18325c0de3547438d699dac4c5a75aa8a8593162dd4e68d63ea5ef4576f1c6ff", + "sha256:3e0094895778e48df293ff15528dc8c326f5fa4bc8978e455977b06efabc5e1f", + "sha256:61707169c42c24d801bf625874ebb2b1f3a83dc2a6b15aa5bd1747e50b11a828", + "sha256:7ef4d5f4dfd653152962a81b85c1ae8c9c3f3c83f183371448ff8b2cb8eb8bce", + "sha256:a2b1a9f3ccbd3d6b51dc5934616d1eab5456e0c2e220a3ba1e587e093928c829", + "sha256:a7b5572b5221e7260efe8a2e4af8a24b8b1f6fd120ae2138a719a89db1e355f3", + "sha256:b72de6816d57086097f0a58aac73588fa8f3fa3ff0dff0dde355beac57018cef", + "sha256:d130f829e6245fd825262d191d222e31f29d19cf9f7824401bee5e40350bef86", + "sha256:d5e1fe9dcbc3094a824b26a6e5e3faaa0755993e7e1c7ef2ff9c41092c7cbb74" + ], + "version": "==2.4.4" + }, + "tensorflow-estimator": { + "hashes": [ + "sha256:5b7b7bf2debe19a8794adacc43e8ba6459daa4efaf54d3302623994a359b17f0" + ], + "version": "==2.4.0" + }, + "termcolor": { + "hashes": [ + "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b" + ], + "version": "==1.1.0" + }, + "torch": { + "hashes": [ + "sha256:11054f26eee5c3114d217201dba5b3a35f1745d11133c123c077c5981bc95997", + "sha256:1520c48430dea38e5845b7b3defc9054edad45f1f245808aa268ade840bb2c2a", + "sha256:6b0c9b56cb56afe3ecbac79351d21c6f7172dffc7b7daa8c365f660541baf1a5", + "sha256:83538fd7920bd02c8b6403ebe4ecee3e0641fe7bb6a18efc4585d2e1375ad1de", + "sha256:89cb8774243750bd3fd2b3b3d09bab6e3be68b1785ad48b8411f1eb4fc7acdba", + "sha256:a29a7aab6fa161259219c8aaa88b25abbf214ec098a002c4499660c23e0f6c33", + "sha256:b609b30b09627409612461b247531cf50894256e8b026105f1bc3858d67c2fa7", + "sha256:b8000e39600e101b2f19dbbab75de663a3b78e3979c3e1720b7136aae1c35ce2", + "sha256:e8cc3b2c3937b7ae036a3b447a189af049bfc006bca054fc1d8ae78766ca3105" + ], + "markers": "python_full_version >= '3.6.1'", + "version": "==1.7.0" + }, + "torchvision": { + "hashes": [ + "sha256:307daa1daa4cc1a2380dd26f81d3a9670535fff8927f1049dc76d4e47253fb8e", + "sha256:337820e680e5193872903369d8177d5ea681e7156d370d89d487b0e0f1e56238", + "sha256:469e0b831bfe17c46159966b5dc7ba09c87eaeecbed6f9a4d6ec4e691b0c8827", + "sha256:80b1c6d0a97e86454c15cf9f1afcf0751761273b7687c3d0910336ea87cca8d4", + "sha256:95b0ce59e631e2c97e6069dff126a43232cca859b18a1b505e5b02dd1a65dd0f", + "sha256:b58262a2bd2d419d94d7bf8aaa3a532b9283f4995e766723cc4cc3a52d8883c8" + ], + "version": "==0.8.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", + "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", + "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" + ], + "version": "==3.7.4.3" + }, + "urllib3": { + "hashes": [ + "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", + "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.1" + }, + "werkzeug": { + "hashes": [ + "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc", + "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.1" + }, + "wheel": { + "hashes": [ + "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85", + "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81" + ], + "markers": "python_version >= '3.8'", + "version": "==0.43.0" + }, + "wrapt": { + "hashes": [ + "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" + ], + "version": "==1.12.1" + }, + "zipp": { + "hashes": [ + "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", + "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" + ], + "markers": "python_version >= '3.8'", + "version": "==3.18.1" + } + }, + "develop": { + "asttokens": { + "hashes": [ + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" + ], + "version": "==2.4.1" + }, + "backcall": { + "hashes": [ + "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" + ], + "version": "==0.2.0" + }, + "black": { + "hashes": [ + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==24.3.0" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "decorator": { + "hashes": [ + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" + ], + "markers": "python_version >= '3.5'", + "version": "==5.1.1" + }, + "executing": { + "hashes": [ + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + ], + "markers": "python_version >= '3.5'", + "version": "==2.0.1" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "ipython": { + "hashes": [ + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.12.3" + }, + "isort": { + "hashes": [ + "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118", + "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.0'", + "version": "==6.0.0b2" + }, + "jedi": { + "hashes": [ + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" + ], + "markers": "python_version >= '3.6'", + "version": "==0.19.1" + }, + "matplotlib-inline": { + "hashes": [ + "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", + "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + ], + "markers": "python_version >= '3.5'", + "version": "==0.1.6" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + ], + "markers": "python_version >= '3.7'", + "version": "==24.0" + }, + "parso": { + "hashes": [ + "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", + "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.3" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "pexpect": { + "hashes": [ + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" + ], + "markers": "sys_platform != 'win32'", + "version": "==4.9.0" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "platformdirs": { + "hashes": [ + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.43" + }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "version": "==0.7.0" + }, + "pure-eval": { + "hashes": [ + "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", + "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + ], + "version": "==0.2.2" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "pygments": { + "hashes": [ + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + ], + "markers": "python_version >= '3.7'", + "version": "==2.17.2" + }, + "six": { + "hashes": [ + "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", + "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.15.0" + }, + "stack-data": { + "hashes": [ + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + ], + "version": "==0.6.3" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "traitlets": { + "hashes": [ + "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", + "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" + ], + "markers": "python_version >= '3.8'", + "version": "==5.14.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", + "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", + "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" + ], + "version": "==3.7.4.3" + }, + "wcwidth": { + "hashes": [ + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" + ], + "version": "==0.2.13" + } + } +} diff --git a/python/.pipenv-d/Pipfile.3.8.macosx-13.2-x86_64.lock b/python/.pipenv-d/Pipfile.3.8.macosx-13.2-x86_64.lock new file mode 100644 index 00000000..17f0c1a0 --- /dev/null +++ b/python/.pipenv-d/Pipfile.3.8.macosx-13.2-x86_64.lock @@ -0,0 +1,1079 @@ +{ + "_meta": { + "hash": { + "sha256": "d068ed0fa34be6cafadc3c81f6175c6e95bddfc5a680d3bbe3fc2ef479375798" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "numpy": { + "hashes": [ + "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", + "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", + "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", + "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", + "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", + "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", + "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", + "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", + "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", + "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", + "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", + "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", + "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", + "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", + "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", + "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", + "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", + "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", + "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", + "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", + "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", + "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", + "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", + "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", + "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", + "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", + "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", + "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.4" + }, + "pyutensor": { + "editable": true, + "file": "." + } + }, + "develop": { + "absl-py": { + "hashes": [ + "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.0" + }, + "appnope": { + "hashes": [ + "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", + "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c" + ], + "markers": "sys_platform == 'darwin'", + "version": "==0.1.4" + }, + "asttokens": { + "hashes": [ + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" + ], + "version": "==2.4.1" + }, + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, + "backcall": { + "hashes": [ + "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" + ], + "version": "==0.2.0" + }, + "black": { + "hashes": [ + "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7", + "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d", + "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==24.4.2" + }, + "cachetools": { + "hashes": [ + "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" + ], + "markers": "python_version >= '3.7'", + "version": "==5.3.3" + }, + "certifi": { + "hashes": [ + "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516", + "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.6.2" + }, + "charset-normalizer": { + "hashes": [ + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "decorator": { + "hashes": [ + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" + ], + "markers": "python_version >= '3.5'", + "version": "==5.1.1" + }, + "exceptiongroup": { + "hashes": [ + "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", + "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.1" + }, + "executing": { + "hashes": [ + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + ], + "markers": "python_version >= '3.5'", + "version": "==2.0.1" + }, + "filelock": { + "hashes": [ + "sha256:58a2549afdf9e02e10720eaa4d4470f56386d7a6f72edd7d0596337af8ed7ad8", + "sha256:71b3102950e91dfc1bb4209b64be4dc8854f40e5f534428d8684f953ac847fac" + ], + "markers": "python_version >= '3.8'", + "version": "==3.15.1" + }, + "flake8": { + "hashes": [ + "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a", + "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.1.0" + }, + "flatbuffers": { + "hashes": [ + "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812", + "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4" + ], + "version": "==24.3.25" + }, + "fsspec": { + "extras": [ + "http" + ], + "hashes": [ + "sha256:58d7122eb8a1a46f7f13453187bfea4972d66bf01618d37366521b1998034cee", + "sha256:f579960a56e6d8038a9efc8f9c77279ec12e6299aa86b0769a7e9c46b94527c2" + ], + "markers": "python_version >= '3.8'", + "version": "==2024.6.0" + }, + "gast": { + "hashes": [ + "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1", + "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.4.0" + }, + "google-auth": { + "hashes": [ + "sha256:8df7da660f62757388b8a7f249df13549b3373f24388cb5d2f1dd91cc18180b5", + "sha256:ab630a1320f6720909ad76a7dbdb6841cdf5c66b328d690027e4867bdfb16688" + ], + "markers": "python_version >= '3.7'", + "version": "==2.30.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb", + "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "google-pasta": { + "hashes": [ + "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", + "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" + ], + "version": "==0.2.0" + }, + "grpcio": { + "hashes": [ + "sha256:4d6dab6124225496010bd22690f2d9bd35c7cbb267b3f14e7a3eb05c911325d4", + "sha256:8d51dd1c59d5fa0f34266b80a3805ec29a1f26425c2a54736133f6d87fc4968a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.64.1" + }, + "h5py": { + "hashes": [ + "sha256:083e0329ae534a264940d6513f47f5ada617da536d8dccbafc3026aefc33c90e", + "sha256:1625fd24ad6cfc9c1ccd44a66dac2396e7ee74940776792772819fc69f3a3731", + "sha256:21dbdc5343f53b2e25404673c4f00a3335aef25521bd5fa8c707ec3833934892", + "sha256:52c416f8eb0daae39dabe71415cb531f95dce2d81e1f61a74537a50c63b28ab3", + "sha256:55106b04e2c83dfb73dc8732e9abad69d83a436b5b82b773481d95d17b9685e1", + "sha256:67462d0669f8f5459529de179f7771bd697389fcb3faab54d63bf788599a48ea", + "sha256:6c4b760082626120031d7902cd983d8c1f424cdba2809f1067511ef283629d4b", + "sha256:731839240c59ba219d4cb3bc5880d438248533366f102402cfa0621b71796b62", + "sha256:754c0c2e373d13d6309f408325343b642eb0f40f1a6ad21779cfa9502209e150", + "sha256:75bd7b3d93fbeee40860fd70cdc88df4464e06b70a5ad9ce1446f5f32eb84007", + "sha256:77b19a40788e3e362b54af4dcf9e6fde59ca016db2c61360aa30b47c7b7cef00", + "sha256:7b7e8f78072a2edec87c9836f25f34203fd492a4475709a18b417a33cfb21fa9", + "sha256:8ec9df3dd2018904c4cc06331951e274f3f3fd091e6d6cc350aaa90fa9b42a76", + "sha256:a76cae64080210389a571c7d13c94a1a6cf8cb75153044fd1f822a962c97aeab", + "sha256:aa6ae84a14103e8dc19266ef4c3e5d7c00b68f21d07f2966f0ca7bdb6c2761fb", + "sha256:bbd732a08187a9e2a6ecf9e8af713f1d68256ee0f7c8b652a32795670fb481ba", + "sha256:c072655ad1d5fe9ef462445d3e77a8166cbfa5e599045f8aa3c19b75315f10e5", + "sha256:d9c944d364688f827dc889cf83f1fca311caf4fa50b19f009d1f2b525edd33a3", + "sha256:ef4e2f338fc763f50a8113890f455e1a70acd42a4d083370ceb80c463d803972", + "sha256:f3736fe21da2b7d8a13fe8fe415f1272d2a1ccdeff4849c1421d2fb30fd533bc", + "sha256:f4e025e852754ca833401777c25888acb96889ee2c27e7e629a19aee288833f0" + ], + "markers": "python_version >= '3.8'", + "version": "==3.11.0" + }, + "idna": { + "hashes": [ + "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", + "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" + ], + "markers": "python_version >= '3.5'", + "version": "==3.7" + }, + "importlib-metadata": { + "hashes": [ + "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" + ], + "markers": "python_version < '3.10'", + "version": "==7.1.0" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "ipython": { + "hashes": [ + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.12.3" + }, + "isort": { + "hashes": [ + "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118", + "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.0'", + "version": "==6.0.0b2" + }, + "jedi": { + "hashes": [ + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" + ], + "markers": "python_version >= '3.6'", + "version": "==0.19.1" + }, + "jinja2": { + "hashes": [ + "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", + "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.4" + }, + "keras": { + "hashes": [ + "sha256:5ce5f706f779fa7330e63632f327b75ce38144a120376b2ae1917c00fa6136af", + "sha256:5df12cc241a015a11b65ddb452c0eeb2744fce21d9b54ba48db87492568ccc68" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.1" + }, + "libclang": { + "hashes": [ + "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8", + "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb", + "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", + "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", + "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5", + "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8", + "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", + "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", + "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe" + ], + "version": "==18.1.1" + }, + "markdown": { + "hashes": [ + "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + ], + "markers": "python_version >= '3.8'", + "version": "==3.6" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "matplotlib-inline": { + "hashes": [ + "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", + "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" + ], + "markers": "python_version >= '3.8'", + "version": "==0.1.7" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "mpmath": { + "hashes": [ + "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", + "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c" + ], + "markers": "python_version >= '3.8'", + "version": "==1.3.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "networkx": { + "hashes": [ + "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36", + "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61" + ], + "markers": "python_version >= '3.8'", + "version": "==3.1" + }, + "numpy": { + "hashes": [ + "sha256:04640dab83f7c6c85abf9cd729c5b65f1ebd0ccf9de90b270cd61935eef0197f", + "sha256:1452241c290f3e2a312c137a9999cdbf63f78864d63c79039bda65ee86943f61", + "sha256:222e40d0e2548690405b0b3c7b21d1169117391c2e82c378467ef9ab4c8f0da7", + "sha256:2541312fbf09977f3b3ad449c4e5f4bb55d0dbf79226d7724211acc905049400", + "sha256:31f13e25b4e304632a4619d0e0777662c2ffea99fcae2029556b17d8ff958aef", + "sha256:4602244f345453db537be5314d3983dbf5834a9701b7723ec28923e2889e0bb2", + "sha256:4979217d7de511a8d57f4b4b5b2b965f707768440c17cb70fbf254c4b225238d", + "sha256:4c21decb6ea94057331e111a5bed9a79d335658c27ce2adb580fb4d54f2ad9bc", + "sha256:6620c0acd41dbcb368610bb2f4d83145674040025e5536954782467100aa8835", + "sha256:692f2e0f55794943c5bfff12b3f56f99af76f902fc47487bdfe97856de51a706", + "sha256:7215847ce88a85ce39baf9e89070cb860c98fdddacbaa6c0da3ffb31b3350bd5", + "sha256:79fc682a374c4a8ed08b331bef9c5f582585d1048fa6d80bc6c35bc384eee9b4", + "sha256:7ffe43c74893dbf38c2b0a1f5428760a1a9c98285553c89e12d70a96a7f3a4d6", + "sha256:80f5e3a4e498641401868df4208b74581206afbee7cf7b8329daae82676d9463", + "sha256:95f7ac6540e95bc440ad77f56e520da5bf877f87dca58bd095288dce8940532a", + "sha256:9667575fb6d13c95f1b36aca12c5ee3356bf001b714fc354eb5465ce1609e62f", + "sha256:a5425b114831d1e77e4b5d812b69d11d962e104095a5b9c3b641a218abcc050e", + "sha256:b4bea75e47d9586d31e892a7401f76e909712a0fd510f58f5337bea9572c571e", + "sha256:b7b1fc9864d7d39e28f41d089bfd6353cb5f27ecd9905348c24187a768c79694", + "sha256:befe2bf740fd8373cf56149a5c23a0f601e82869598d41f8e188a0e9869926f8", + "sha256:c0bfb52d2169d58c1cdb8cc1f16989101639b34c7d3ce60ed70b19c63eba0b64", + "sha256:d11efb4dbecbdf22508d55e48d9c8384db795e1b7b51ea735289ff96613ff74d", + "sha256:dd80e219fd4c71fc3699fc1dadac5dcf4fd882bfc6f7ec53d30fa197b8ee22dc", + "sha256:e2926dac25b313635e4d6cf4dc4e51c8c0ebfed60b801c799ffc4c32bf3d1254", + "sha256:e98f220aa76ca2a977fe435f5b04d7b3470c0a2e6312907b37ba6068f26787f2", + "sha256:ed094d4f0c177b1b8e7aa9cba7d6ceed51c0e569a5318ac0ca9a090680a6a1b1", + "sha256:f136bab9c2cfd8da131132c2cf6cc27331dd6fae65f95f69dcd4ae3c3639c810", + "sha256:f3a86ed21e4f87050382c7bc96571755193c4c1392490744ac73d660e8f564a9" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.4" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, + "opt-einsum": { + "hashes": [ + "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", + "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3.0" + }, + "packaging": { + "hashes": [ + "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", + "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + ], + "markers": "python_version >= '3.8'", + "version": "==24.1" + }, + "parso": { + "hashes": [ + "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", + "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.4" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "pexpect": { + "hashes": [ + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" + ], + "markers": "sys_platform != 'win32'", + "version": "==4.9.0" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "pillow": { + "hashes": [ + "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c", + "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2", + "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb", + "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d", + "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa", + "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3", + "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1", + "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a", + "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd", + "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8", + "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999", + "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599", + "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936", + "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375", + "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d", + "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b", + "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60", + "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572", + "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3", + "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced", + "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f", + "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b", + "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19", + "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f", + "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d", + "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383", + "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795", + "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355", + "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57", + "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09", + "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b", + "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462", + "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf", + "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f", + "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a", + "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad", + "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9", + "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d", + "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45", + "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994", + "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d", + "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338", + "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463", + "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451", + "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591", + "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c", + "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd", + "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32", + "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9", + "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf", + "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5", + "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828", + "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3", + "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5", + "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2", + "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b", + "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2", + "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475", + "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3", + "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb", + "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef", + "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015", + "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002", + "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170", + "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84", + "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57", + "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f", + "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27", + "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a" + ], + "markers": "python_version >= '3.8'", + "version": "==10.3.0" + }, + "platformdirs": { + "hashes": [ + "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", + "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.2" + }, + "pluggy": { + "hashes": [ + "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", + "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" + ], + "markers": "python_version >= '3.8'", + "version": "==1.5.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", + "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.47" + }, + "protobuf": { + "hashes": [ + "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", + "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", + "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", + "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", + "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", + "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + ], + "markers": "python_version >= '3.8'", + "version": "==4.25.3" + }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "version": "==0.7.0" + }, + "pure-eval": { + "hashes": [ + "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", + "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + ], + "version": "==0.2.2" + }, + "pyasn1": { + "hashes": [ + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.0" + }, + "pycodestyle": { + "hashes": [ + "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c", + "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4" + ], + "markers": "python_version >= '3.8'", + "version": "==2.12.0" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "pygments": { + "hashes": [ + "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", + "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.18.0" + }, + "pytest": { + "hashes": [ + "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", + "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.2.2" + }, + "requests": { + "hashes": [ + "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", + "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" + ], + "markers": "python_version >= '3.8'", + "version": "==2.32.3" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==4.9" + }, + "setuptools": { + "hashes": [ + "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4", + "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0" + ], + "markers": "python_version >= '3.8'", + "version": "==70.0.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" + }, + "stack-data": { + "hashes": [ + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + ], + "version": "==0.6.3" + }, + "sympy": { + "hashes": [ + "sha256:ce46688c9811cbea827dc01128e65a8f97061eaf34ab0802be2152cfa371cafe", + "sha256:df307fd8bbfcba5f5616f93f9f07e0281b6de7a31897c8493e357c9f7af8e05a" + ], + "markers": "python_version >= '3.8'", + "version": "==1.13.0rc2" + }, + "tensorboard": { + "hashes": [ + "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.0" + }, + "tensorboard-data-server": { + "hashes": [ + "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530" + ], + "markers": "python_version >= '3.7'", + "version": "==0.7.2" + }, + "tensorflow": { + "hashes": [ + "sha256:07ad240fd8b495617a57764ab1d5ddfde373992d2826337a1fcad201af236109", + "sha256:1a49bb67f671c5758bd99ba3727ea8556c009691bab3f69330906fc5471aa002", + "sha256:28c4a328e2fb8e4e6324193e82f147a8c4bedd923aa94226780d5b3f93ad0846", + "sha256:354b94c6f94faa83cde034bbf4b5b9436966657b8fbe77520e9c40dd1db441f5", + "sha256:48f9dad6f834044687e15b3b50c48374d6844d81a5d6c16f60b5df99bb311b2c", + "sha256:53ce5c8bfe5a5cc02bb5e20a89570d93e07636599633e53b3b6c46de4f226f31", + "sha256:570ace9756a3343b6b0f207396033f2ad4674dd68d17042bef0b1a53ff2c69fa", + "sha256:5f12a69b11e70bbf67271a26317d4d44f59f6907cdae6fea68f52bdb28cf5783", + "sha256:67fb4dd44d20ef929c9f3962d4dca8e75907affe6cd38849c5f77fb77796e192", + "sha256:7a813424963fcfd5f0deaea0398b49b48ec5d9597943a8d06d29484d064c0a88", + "sha256:88613a1b00dd0679a49e76c7297ad61d1bac959a475332ae73415d95e76dca4d", + "sha256:8d5c675cfdb1cc39f88e29933c131dd4dd5ba45b064469bcbaced5f959c54a9f", + "sha256:a0c26b6c6f6898a4a7651bffa7d93ce15b8f9ac64f590e2b406158dddbd13da0", + "sha256:ba86c0282fbec230e799731dba3e565aa55c65e850b310c1cfe51c5089ea074c", + "sha256:bb79e1e164480f56398995c382ead82a353ff7a8d58d4c6ba1f4e922f62d0f8f", + "sha256:bd0d5df8a1f317769bc2a1393edaa727dae0414f9c44c80ee1e1a07fd3d59879", + "sha256:c2a30b0e8ab94b4cf162c93b07c446c4b05d15f36106b621a0f69258521346eb", + "sha256:cb2bce43363e51b56ecb59d5a1db61e7975b0dff8f21e4ee7e93398ec8acc9b7", + "sha256:cc42c587a13fa7eae8fab4bfe1f6c5cf07e157c1b097c4bb7228af2b62e36631", + "sha256:e709c7128561450533daa83403b795692fe72d1e74389217a76fe96dbe09a43f" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==2.13.0rc1" + }, + "tensorflow-estimator": { + "hashes": [ + "sha256:6f868284eaa654ae3aa7cacdbef2175d0909df9fcf11374f5166f8bf475952aa" + ], + "markers": "python_version >= '3.7'", + "version": "==2.13.0" + }, + "tensorflow-io-gcs-filesystem": { + "hashes": [ + "sha256:027a07553367187f918a99661f63ae0506b91b77a70bee9c7ccaf3920bf7cfe7", + "sha256:0dafed144673e1173528768fe208a7c5a6e8edae40208381cac420ee7c918ec9", + "sha256:182b0fbde7e9a537fda0b354c28b0b6c035736728de8fe2db7ef49cf90352014", + "sha256:2b035f4c92639657b6d376929d550ac3dee9e6c0523eb434eefe0a27bae3d05b", + "sha256:396bfff61b49f80b86ddebe0c76ae0f2731689cee49ad7d782625180b50b13af", + "sha256:3f346b287ed2400e09b13cfd8524222fd70a66aadb9164c645286c2087007e9f", + "sha256:44ad387a812a78e7424bb8bee3820521ae1c044bddf72b1e163e8df95c124a74", + "sha256:5813c336b4f7cb0a01ff4cc6cbd3edf11ef67305baf0e3cf634911b702f493f8", + "sha256:6e6353123a5b51397950138a118876af833a7db66b531123bb86f82e80ab0e72", + "sha256:7f60183473f0ca966451bb1d1bb5dc29b3cf9c74d1d0e7f2ed46760ed56bd4af", + "sha256:8d8664bddbe4e7b56ce94db8b93ea9077a158fb5e15364e11e29f93015ceea24", + "sha256:a17a616d2c7fae83de4424404815843507d40d4eb0d507c636a5493a20c3d958", + "sha256:b20622f8572fcb6c93e8f7d626327472f263e47ebd63d2153ef09162ef5ef7b5", + "sha256:b9a93fcb01db269bc845a1ced431f3c61201755ce5f9ec4885760f30122276ef", + "sha256:cbe26c4a3332589c7b724f147df453b5c226993aa8d346a15536358d77b364c4", + "sha256:d3feba2dd76f7c188137c34642d68d378f0eed81636cb95090ecb1496722707c", + "sha256:d831702fbb270996b27cda7fde06e0825b2ea81fd8dd3ead35242f4f8b3889b8", + "sha256:ec4604c99cbb5b708f4516dee27aa655abae222b876c98b740f4c2f89dd5c001", + "sha256:f211d2b3db8f9931765992b607b71cbfb98c8cd6169079d004a67a94ab10ecb4" + ], + "markers": "platform_machine != 'arm64' or platform_system != 'Darwin'", + "version": "==0.34.0" + }, + "termcolor": { + "hashes": [ + "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63", + "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "torch": { + "hashes": [ + "sha256:11e8fe261233aeabd67696d6b993eeb0896faa175c6b41b9a6c9f0334bdad1c5", + "sha256:15dffa4cc3261fa73d02f0ed25f5fa49ecc9e12bf1ae0a4c1e7a88bbfaad9030", + "sha256:31f4310210e7dda49f1fb52b0ec9e59382cfcb938693f6d5378f25b43d7c1d29", + "sha256:32827fa1fbe5da8851686256b4cd94cc7b11be962862c2293811c94eea9457bf", + "sha256:3a4dd910663fd7a124c056c878a52c2b0be4a5a424188058fe97109d4436ee42", + "sha256:3dbcd563a9b792161640c0cffe17e3270d85e8f4243b1f1ed19cca43d28d235b", + "sha256:451331406b760f4b1ab298ddd536486ab3cfb1312614cfe0532133535be60bea", + "sha256:49aa4126ede714c5aeef7ae92969b4b0bbe67f19665106463c39f22e0a1860d1", + "sha256:539d5ef6c4ce15bd3bd47a7b4a6e7c10d49d4d21c0baaa87c7d2ef8698632dfb", + "sha256:67dcd726edff108e2cd6c51ff0e416fd260c869904de95750e80051358680d24", + "sha256:877b3e6593b5e00b35bbe111b7057464e76a7dd186a287280d941b564b0563c2", + "sha256:89ddac2a8c1fb6569b90890955de0c34e1724f87431cacff4c1979b5f769203c", + "sha256:95b9b44f3bcebd8b6cd8d37ec802048c872d9c567ba52c894bba90863a439059", + "sha256:a6e5770d68158d07456bfcb5318b173886f579fdfbf747543901ce718ea94782", + "sha256:ad4c03b786e074f46606f4151c0a1e3740268bcf29fbd2fdf6666d66341c1dcb", + "sha256:b2e2200b245bd9f263a0d41b6a2dab69c4aca635a01b30cca78064b0ef5b109e", + "sha256:b421448d194496e1114d87a8b8d6506bce949544e513742b097e2ab8f7efef32", + "sha256:bc889d311a855dd2dfd164daf8cc903a6b7273a747189cebafdd89106e4ad585", + "sha256:bf9558da7d2bf7463390b3b2a61a6a3dbb0b45b161ee1dd5ec640bf579d479fc", + "sha256:c795feb7e8ce2e0ef63f75f8e1ab52e7fd5e1a4d7d0c31367ade1e3de35c9e95", + "sha256:cd2bf7697c9e95fb5d97cc1d525486d8cf11a084c6af1345c2c2c22a6b0029d0", + "sha256:cf12cdb66c9c940227ad647bc9cf5dba7e8640772ae10dfe7569a0c1e2a28aca", + "sha256:dff696de90d6f6d1e8200e9892861fd4677306d0ef604cb18f2134186f719f82", + "sha256:eb4d6e9d3663e26cd27dc3ad266b34445a16b54908e74725adb241aa56987533", + "sha256:f9ef0a648310435511e76905f9b89612e45ef2c8b023bee294f5e6f7e73a3e7c" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.0'", + "version": "==2.2.2" + }, + "torchvision": { + "hashes": [ + "sha256:067095e87a020a7a251ac1d38483aa591c5ccb81e815527c54db88a982fc9267", + "sha256:14fd1d4a033c325bdba2d03a69c3450cab6d3a625f85cc375781d9237ca5d04d", + "sha256:1ece40557e122d79975860a005aa7e2a9e2e6c350a03e78a00ec1450083312fd", + "sha256:1f2910fe3c21ad6875b2720d46fad835b2e4b336e9553d31ca364d24c90b1d4f", + "sha256:2f69570f50b1d195e51bc03feffb7b7728207bc36efcfb1f0813712b2379d881", + "sha256:32dbeba3987e20f2dc1bce8d1504139fff582898346dfe8ad98d649f97ca78fa", + "sha256:35ba5c1600c3203549d2316422a659bd20c0cfda1b6085eec94fb9f35f55ca43", + "sha256:3bbc24b7713e8f22766992562547d8b4b10001208d372fe599255af84bfd1a69", + "sha256:3f784381419f3ed3f2ec2aa42fb4aeec5bf4135e298d1631e41c926e6f1a0dff", + "sha256:4868bbfa55758c8107e69a0e7dd5e77b89056035cd38b767ad5b98cdb71c0f0d", + "sha256:6835897df852fad1015e6a106c167c83848114cbcc7d86112384a973404e4431", + "sha256:77d680adf6ce367166a186d2c7fda3a73807ab9a03b2c31a03fa8812c8c5335b", + "sha256:7dc85b397f6c6d9ef12716ce0d6e11ac2b803f5cccff6fe3966db248e7774478", + "sha256:833fd2e4216ced924c8aca0525733fe727f9a1af66dfad7c5be7257e97c39678", + "sha256:9b83e55ee7d0a1704f52b9c0ac87388e7a6d1d98a6bde7b0b35f9ab54d7bda54", + "sha256:9c3acbebbe379af112b62b535820174277b1f3eed30df264a4e458d58ee4e5b2", + "sha256:b83aac8d78f48981146d582168d75b6c947cfb0a7693f76e219f1926f6e595a3", + "sha256:ba2e62f233eab3d42b648c122a3a29c47cc108ca314dfd5cbb59cd3a143fd623", + "sha256:d506854c5acd69b20a8b6641f01fe841685a21c5406b56813184f1c9fc94279e", + "sha256:e031004a1bc432c980a7bd642f6c189a3efc316e423fc30b5569837166a4e28d", + "sha256:e9e4bed404af33dfc92eecc2b513d21ddc4c242a7fd8708b3b09d3a26aa6f444", + "sha256:ecc1c503fa8a54fbab777e06a7c228032b8ab78efebf35b28bc8f22f544f51f1", + "sha256:efd6d0dd0668e15d01a2cffadc74068433b32cbcf5692e0c4aa15fc5cb250ce7", + "sha256:f1c9ab3152cfb27f83aca072cac93a3a4c4e4ab0261cf0f2d516b9868a4e96f3", + "sha256:f400145fc108833e7c2fc28486a04989ca742146d7a2a2cc48878ebbb40cdbbd" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==0.17.2" + }, + "traitlets": { + "hashes": [ + "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", + "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" + ], + "markers": "python_version >= '3.8'", + "version": "==5.14.3" + }, + "typing-extensions": { + "hashes": [ + "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", + "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" + ], + "markers": "python_version >= '3.8'", + "version": "==4.12.2" + }, + "urllib3": { + "hashes": [ + "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", + "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.2" + }, + "wcwidth": { + "hashes": [ + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" + ], + "version": "==0.2.13" + }, + "werkzeug": { + "hashes": [ + "sha256:097e5bfda9f0aba8da6b8545146def481d06aa7d3266e7448e2cccf67dd8bd18", + "sha256:fc9645dc43e03e4d630d23143a04a7f947a9a3b5727cd535fdfe155a17cc48c8" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.3" + }, + "wheel": { + "hashes": [ + "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85", + "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81" + ], + "markers": "python_version >= '3.8'", + "version": "==0.43.0" + }, + "wrapt": { + "hashes": [ + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1" + ], + "markers": "python_version >= '3.6'", + "version": "==1.16.0" + }, + "zipp": { + "hashes": [ + "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", + "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" + ], + "markers": "python_version >= '3.8'", + "version": "==3.19.2" + } + } +} diff --git a/python/.pipenv-d/Pipfile.3.8.macosx-14.0-arm64.lock b/python/.pipenv-d/Pipfile.3.8.macosx-14.0-arm64.lock new file mode 100644 index 00000000..fd195b0a --- /dev/null +++ b/python/.pipenv-d/Pipfile.3.8.macosx-14.0-arm64.lock @@ -0,0 +1,1224 @@ +{ + "_meta": { + "hash": { + "sha256": "a78f7964705875a3f032372952e04bd6936cb864ff09b593b633b52ebb56493a" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.8" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "absl-py": { + "hashes": [ + "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308", + "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.0" + }, + "astunparse": { + "hashes": [ + "sha256:5ad93a8456f0d084c3456d059fd9a92cce667963232cbf763eac3bc5b7940872", + "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8" + ], + "version": "==1.6.3" + }, + "cachetools": { + "hashes": [ + "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", + "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" + ], + "markers": "python_version >= '3.7'", + "version": "==5.3.3" + }, + "certifi": { + "hashes": [ + "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f", + "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1" + ], + "markers": "python_version >= '3.6'", + "version": "==2024.2.2" + }, + "charset-normalizer": { + "hashes": [ + "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", + "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", + "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", + "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", + "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", + "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", + "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", + "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", + "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", + "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", + "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", + "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", + "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", + "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", + "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", + "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", + "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", + "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", + "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", + "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", + "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", + "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", + "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", + "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", + "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", + "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", + "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", + "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", + "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", + "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", + "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", + "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", + "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", + "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", + "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", + "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", + "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", + "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", + "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", + "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", + "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", + "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", + "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", + "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", + "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", + "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", + "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", + "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", + "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", + "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", + "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", + "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", + "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", + "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", + "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", + "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", + "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", + "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", + "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", + "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", + "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", + "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", + "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", + "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", + "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", + "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", + "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", + "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", + "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", + "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", + "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", + "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", + "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", + "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", + "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", + "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", + "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", + "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", + "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", + "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", + "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", + "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", + "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", + "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", + "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", + "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", + "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", + "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", + "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", + "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.3.2" + }, + "filelock": { + "hashes": [ + "sha256:5ffa845303983e7a0b7ae17636509bc97997d58afeafa72fb141a17b152284cb", + "sha256:a79895a25bbefdf55d1a2a0a80968f7dbb28edcd6d4234a0afb3f37ecde4b546" + ], + "markers": "python_version >= '3.8'", + "version": "==3.13.3" + }, + "flatbuffers": { + "hashes": [ + "sha256:8dbdec58f935f3765e4f7f3cf635ac3a77f83568138d6a2311f524ec96364812", + "sha256:de2ec5b203f21441716617f38443e0a8ebf3d25bf0d9c0bb0ce68fa00ad546a4" + ], + "version": "==24.3.25" + }, + "fsspec": { + "hashes": [ + "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512", + "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9" + ], + "markers": "python_version >= '3.8'", + "version": "==2024.3.1" + }, + "gast": { + "hashes": [ + "sha256:40feb7b8b8434785585ab224d1568b857edb18297e5a3047f1ba012bc83b42c1", + "sha256:b7adcdd5adbebf1adf17378da5ba3f543684dbec47b1cda1f3997e573cd542c4" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==0.4.0" + }, + "google-auth": { + "hashes": [ + "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360", + "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415" + ], + "markers": "python_version >= '3.7'", + "version": "==2.29.0" + }, + "google-auth-oauthlib": { + "hashes": [ + "sha256:95880ca704928c300f48194d1770cf5b1462835b6e49db61445a520f793fd5fb", + "sha256:e375064964820b47221a7e1b7ee1fd77051b6323c3f9e3e19785f78ab67ecfc5" + ], + "markers": "python_version >= '3.6'", + "version": "==1.0.0" + }, + "google-pasta": { + "hashes": [ + "sha256:4612951da876b1a10fe3960d7226f0c7682cf901e16ac06e473b267a5afa8954", + "sha256:b32482794a366b5366a32c92a9a9201b107821889935a02b3e51f6b432ea84ed", + "sha256:c9f2c8dfc8f96d0d5808299920721be30c9eec37f2389f28904f454565c8a16e" + ], + "version": "==0.2.0" + }, + "grpcio": { + "hashes": [ + "sha256:12859468e8918d3bd243d213cd6fd6ab07208195dc140763c00dfe901ce1e1b4", + "sha256:1714e7bc935780bc3de1b3fcbc7674209adf5208ff825799d579ffd6cd0bd505", + "sha256:179bee6f5ed7b5f618844f760b6acf7e910988de77a4f75b95bbfaa8106f3c1e", + "sha256:1f1e7b36bdff50103af95a80923bf1853f6823dd62f2d2a2524b66ed74103e49", + "sha256:1faa02530b6c7426404372515fe5ddf66e199c2ee613f88f025c6f3bd816450c", + "sha256:22bccdd7b23c420a27fd28540fb5dcbc97dc6be105f7698cb0e7d7a420d0e362", + "sha256:23e2e04b83f347d0aadde0c9b616f4726c3d76db04b438fd3904b289a725267f", + "sha256:3227c667dccbe38f2c4d943238b887bac588d97c104815aecc62d2fd976e014b", + "sha256:359f821d4578f80f41909b9ee9b76fb249a21035a061a327f91c953493782c31", + "sha256:3952b581eb121324853ce2b191dae08badb75cd493cb4e0243368aa9e61cfd41", + "sha256:407b26b7f7bbd4f4751dbc9767a1f0716f9fe72d3d7e96bb3ccfc4aace07c8de", + "sha256:4187201a53f8561c015bc745b81a1b2d278967b8de35f3399b84b0695e281d5f", + "sha256:482ae2ae78679ba9ed5752099b32e5fe580443b4f798e1b71df412abf43375db", + "sha256:48611e4fa010e823ba2de8fd3f77c1322dd60cb0d180dc6630a7e157b205f7ea", + "sha256:48f7135c3de2f298b833be8b4ae20cafe37091634e91f61f5a7eb3d61ec6f660", + "sha256:4b49fd8fe9f9ac23b78437da94c54aa7e9996fbb220bac024a67469ce5d0825f", + "sha256:58f6c693d446964e3292425e1d16e21a97a48ba9172f2d0df9d7b640acb99243", + "sha256:5bd90b8c395f39bc82a5fb32a0173e220e3f401ff697840f4003e15b96d1befc", + "sha256:60dcd824df166ba266ee0cfaf35a31406cd16ef602b49f5d4dfb21f014b0dedd", + "sha256:6696ffe440333a19d8d128e88d440f91fb92c75a80ce4b44d55800e656a3ef1d", + "sha256:6c455e008fa86d9e9a9d85bb76da4277c0d7d9668a3bfa70dbe86e9f3c759947", + "sha256:71f11fd63365ade276c9d4a7b7df5c136f9030e3457107e1791b3737a9b9ed6a", + "sha256:73db2dc1b201d20ab7083e7041946910bb991e7e9761a0394bbc3c2632326483", + "sha256:77c339403db5a20ef4fed02e4d1a9a3d9866bf9c0afc77a42234677313ea22f3", + "sha256:833379943d1728a005e44103f17ecd73d058d37d95783eb8f0b28ddc1f54d7b2", + "sha256:83a17b303425104d6329c10eb34bba186ffa67161e63fa6cdae7776ff76df73f", + "sha256:83e7ccb85a74beaeae2634f10eb858a0ed1a63081172649ff4261f929bacfd22", + "sha256:844d1f3fb11bd1ed362d3fdc495d0770cfab75761836193af166fee113421d66", + "sha256:882020c87999d54667a284c7ddf065b359bd00251fcd70279ac486776dbf84ec", + "sha256:8999bf1b57172dbc7c3e4bb3c732658e918f5c333b2942243f10d0d653953ba9", + "sha256:9084086190cc6d628f282e5615f987288b95457292e969b9205e45b442276407", + "sha256:960edebedc6b9ada1ef58e1c71156f28689978188cd8cff3b646b57288a927d9", + "sha256:973c49086cabab773525f6077f95e5a993bfc03ba8fc32e32f2c279497780585", + "sha256:978121758711916d34fe57c1f75b79cdfc73952f1481bb9583399331682d36f7", + "sha256:9bd5c8a1af40ec305d001c60236308a67e25419003e9bb3ebfab5695a8d0b369", + "sha256:a10383035e864f386fe096fed5c47d27a2bf7173c56a6e26cffaaa5a361addb1", + "sha256:a485f0c2010c696be269184bdb5ae72781344cb4e60db976c59d84dd6354fac9", + "sha256:a7f615270fe534548112a74e790cd9d4f5509d744dd718cd442bf016626c22e4", + "sha256:b134d5d71b4e0837fff574c00e49176051a1c532d26c052a1e43231f252d813b", + "sha256:b2a0e71b0a2158aa4bce48be9f8f9eb45cbd17c78c7443616d00abbe2a509f6d", + "sha256:b50b09b4dc01767163d67e1532f948264167cd27f49e9377e3556c3cba1268e1", + "sha256:b5a4ea906db7dec694098435d84bf2854fe158eb3cd51e1107e571246d4d1d70", + "sha256:b7209117bbeebdfa5d898205cc55153a51285757902dd73c47de498ad4d11332", + "sha256:bba97b8e8883a8038606480d6b6772289f4c907f6ba780fa1f7b7da7dfd76f06", + "sha256:be0477cb31da67846a33b1a75c611f88bfbcd427fe17701b6317aefceee1b96f", + "sha256:c7fcc6a32e7b7b58f5a7d27530669337a5d587d4066060bcb9dee7a8c833dfb7", + "sha256:c8842ccbd8c0e253c1f189088228f9b433f7a93b7196b9e5b6f87dba393f5d5d", + "sha256:d1f6c96573dc09d50dbcbd91dbf71d5cf97640c9427c32584010fbbd4c0e0037", + "sha256:d9e52558b8b8c2f4ac05ac86344a7417ccdd2b460a59616de49eb6933b07a0bd", + "sha256:e3393b0823f938253370ebef033c9fd23d27f3eae8eb9a8f6264900c7ea3fb5a", + "sha256:e6c8c8693df718c5ecbc7babb12c69a4e3677fd11de8886f05ab22d4e6b1c43b", + "sha256:f8de7c8cef9261a2d0a62edf2ccea3d741a523c6b8a6477a340a1f2e417658de", + "sha256:fa7d28eb4d50b7cbe75bb8b45ed0da9a1dc5b219a0af59449676a29c2eed9698", + "sha256:fbe80577c7880911d3ad65e5ecc997416c98f354efeba2f8d0f9112a67ed65a5" + ], + "markers": "python_version >= '3.7'", + "version": "==1.62.1" + }, + "h5py": { + "hashes": [ + "sha256:012ab448590e3c4f5a8dd0f3533255bc57f80629bf7c5054cf4c87b30085063c", + "sha256:212bb997a91e6a895ce5e2f365ba764debeaef5d2dca5c6fb7098d66607adf99", + "sha256:2381e98af081b6df7f6db300cd88f88e740649d77736e4b53db522d8874bf2dc", + "sha256:2c8e4fda19eb769e9a678592e67eaec3a2f069f7570c82d2da909c077aa94339", + "sha256:3074ec45d3dc6e178c6f96834cf8108bf4a60ccb5ab044e16909580352010a97", + "sha256:3c97d03f87f215e7759a354460fb4b0d0f27001450b18b23e556e7856a0b21c3", + "sha256:43a61b2c2ad65b1fabc28802d133eed34debcc2c8b420cb213d3d4ef4d3e2229", + "sha256:492305a074327e8d2513011fa9fffeb54ecb28a04ca4c4227d7e1e9616d35641", + "sha256:5dfc65ac21fa2f630323c92453cadbe8d4f504726ec42f6a56cf80c2f90d6c52", + "sha256:667fe23ab33d5a8a6b77970b229e14ae3bb84e4ea3382cc08567a02e1499eedd", + "sha256:6c013d2e79c00f28ffd0cc24e68665ea03ae9069e167087b2adb5727d2736a52", + "sha256:781a24263c1270a62cd67be59f293e62b76acfcc207afa6384961762bb88ea03", + "sha256:86df4c2de68257b8539a18646ceccdcf2c1ce6b1768ada16c8dcfb489eafae20", + "sha256:90286b79abd085e4e65e07c1bd7ee65a0f15818ea107f44b175d2dfe1a4674b7", + "sha256:92273ce69ae4983dadb898fd4d3bea5eb90820df953b401282ee69ad648df684", + "sha256:93dd840bd675787fc0b016f7a05fc6efe37312a08849d9dd4053fd0377b1357f", + "sha256:9450464b458cca2c86252b624279115dcaa7260a40d3cb1594bf2b410a2bd1a3", + "sha256:ae2f0201c950059676455daf92700eeb57dcf5caaf71b9e1328e6e6593601770", + "sha256:aece0e2e1ed2aab076c41802e50a0c3e5ef8816d60ece39107d68717d4559824", + "sha256:b963fb772964fc1d1563c57e4e2e874022ce11f75ddc6df1a626f42bd49ab99f", + "sha256:ba9ab36be991119a3ff32d0c7cbe5faf9b8d2375b5278b2aea64effbeba66039", + "sha256:d4682b94fd36ab217352be438abd44c8f357c5449b8995e63886b431d260f3d3", + "sha256:d93adc48ceeb33347eb24a634fb787efc7ae4644e6ea4ba733d099605045c049", + "sha256:f42e6c30698b520f0295d70157c4e202a9e402406f50dc08f5a7bc416b24e52d", + "sha256:fd6f6d1384a9f491732cee233b99cd4bfd6e838a8815cc86722f9d2ee64032af" + ], + "markers": "python_version >= '3.8'", + "version": "==3.10.0" + }, + "idna": { + "hashes": [ + "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca", + "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f" + ], + "markers": "python_version >= '3.5'", + "version": "==3.6" + }, + "importlib-metadata": { + "hashes": [ + "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570", + "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2" + ], + "markers": "python_version < '3.10'", + "version": "==7.1.0" + }, + "jinja2": { + "hashes": [ + "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa", + "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90" + ], + "index": "pypi", + "markers": "python_version >= '3.7'", + "version": "==3.1.3" + }, + "keras": { + "hashes": [ + "sha256:5ce5f706f779fa7330e63632f327b75ce38144a120376b2ae1917c00fa6136af", + "sha256:5df12cc241a015a11b65ddb452c0eeb2744fce21d9b54ba48db87492568ccc68" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.1" + }, + "libclang": { + "hashes": [ + "sha256:3f0e1f49f04d3cd198985fea0511576b0aee16f9ff0e0f0cad7f9c57ec3c20e8", + "sha256:4dd2d3b82fab35e2bf9ca717d7b63ac990a3519c7e312f19fa8e86dcc712f7fb", + "sha256:54dda940a4a0491a9d1532bf071ea3ef26e6dbaf03b5000ed94dd7174e8f9592", + "sha256:69f8eb8f65c279e765ffd28aaa7e9e364c776c17618af8bff22a8df58677ff4f", + "sha256:6f14c3f194704e5d09769108f03185fce7acaf1d1ae4bbb2f30a72c2400cb7c5", + "sha256:83ce5045d101b669ac38e6da8e58765f12da2d3aafb3b9b98d88b286a60964d8", + "sha256:a1214966d08d73d971287fc3ead8dfaf82eb07fb197680d8b3859dbbbbf78250", + "sha256:c533091d8a3bbf7460a00cb6c1a71da93bffe148f172c7d03b1c31fbf8aa2a0b", + "sha256:cf4a99b05376513717ab5d82a0db832c56ccea4fd61a69dbb7bccf2dfb207dbe" + ], + "version": "==18.1.1" + }, + "markdown": { + "hashes": [ + "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f", + "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224" + ], + "markers": "python_version >= '3.8'", + "version": "==3.6" + }, + "markupsafe": { + "hashes": [ + "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", + "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", + "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", + "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", + "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", + "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", + "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", + "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", + "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", + "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", + "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", + "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", + "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", + "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", + "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", + "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", + "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", + "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", + "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", + "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", + "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", + "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", + "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", + "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", + "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", + "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", + "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", + "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", + "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", + "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", + "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", + "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", + "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", + "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", + "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", + "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", + "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", + "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", + "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", + "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", + "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", + "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", + "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", + "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", + "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", + "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", + "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", + "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", + "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", + "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", + "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", + "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", + "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", + "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", + "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", + "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", + "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", + "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", + "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", + "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" + ], + "markers": "python_version >= '3.7'", + "version": "==2.1.5" + }, + "mpmath": { + "hashes": [ + "sha256:1b60ef0e9ea0e13e11580e31dc0c47284b9a26b1384bcef577ddda5e29b2836b", + "sha256:deab7936447f8b705a8c5a8a393a0ecf37edcc0d948ef7414efa7314fe327111" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.0a0" + }, + "networkx": { + "hashes": [ + "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36", + "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61" + ], + "markers": "python_version >= '3.8'", + "version": "==3.1" + }, + "numpy": { + "hashes": [ + "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187", + "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812", + "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7", + "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4", + "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6", + "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0", + "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4", + "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570", + "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4", + "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f", + "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80", + "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289", + "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385", + "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078", + "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c", + "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463", + "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3", + "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950", + "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155", + "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7", + "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c", + "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096", + "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17", + "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf", + "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4", + "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02", + "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c", + "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.3" + }, + "oauthlib": { + "hashes": [ + "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca", + "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918" + ], + "markers": "python_version >= '3.6'", + "version": "==3.2.2" + }, + "opt-einsum": { + "hashes": [ + "sha256:2455e59e3947d3c275477df7f5205b30635e266fe6dc300e3d9f9646bfcea147", + "sha256:59f6475f77bbc37dcf7cd748519c0ec60722e91e63ca114e68821c0c54a46549" + ], + "markers": "python_version >= '3.5'", + "version": "==3.3.0" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + ], + "markers": "python_version >= '3.7'", + "version": "==24.0" + }, + "pillow": { + "hashes": [ + "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8", + "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39", + "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac", + "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869", + "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e", + "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04", + "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9", + "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e", + "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe", + "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef", + "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56", + "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa", + "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f", + "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f", + "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e", + "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a", + "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2", + "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2", + "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5", + "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a", + "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2", + "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213", + "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563", + "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591", + "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c", + "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2", + "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb", + "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757", + "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0", + "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452", + "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad", + "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01", + "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f", + "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5", + "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61", + "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e", + "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b", + "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068", + "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9", + "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588", + "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483", + "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f", + "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67", + "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7", + "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311", + "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6", + "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72", + "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6", + "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129", + "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13", + "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67", + "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c", + "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516", + "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e", + "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e", + "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364", + "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023", + "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1", + "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04", + "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d", + "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a", + "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7", + "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb", + "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4", + "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e", + "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1", + "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48", + "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868" + ], + "markers": "python_version >= '3.8'", + "version": "==10.2.0" + }, + "protobuf": { + "hashes": [ + "sha256:19b270aeaa0099f16d3ca02628546b8baefe2955bbe23224aaf856134eccf1e4", + "sha256:209ba4cc916bab46f64e56b85b090607a676f66b473e6b762e6f1d9d591eb2e8", + "sha256:25b5d0b42fd000320bd7830b349e3b696435f3b329810427a6bcce6a5492cc5c", + "sha256:7c8daa26095f82482307bc717364e7c13f4f1c99659be82890dcfc215194554d", + "sha256:c053062984e61144385022e53678fbded7aea14ebb3e0305ae3592fb219ccfa4", + "sha256:d4198877797a83cbfe9bffa3803602bbe1625dc30d8a097365dbc762e5790faa", + "sha256:e3c97a1555fd6388f857770ff8b9703083de6bf1f9274a002a332d65fbb56c8c", + "sha256:e7cb0ae90dd83727f0c0718634ed56837bfeeee29a5f82a7514c03ee1364c019", + "sha256:f0700d54bcf45424477e46a9f0944155b46fb0639d69728739c0e47bab83f2b9", + "sha256:f1279ab38ecbfae7e456a108c5c0681e4956d5b1090027c1de0f934dfdb4b35c", + "sha256:f4f118245c4a087776e0a8408be33cf09f6c547442c00395fbfb116fac2f8ac2" + ], + "markers": "python_version >= '3.8'", + "version": "==4.25.3" + }, + "pyasn1": { + "hashes": [ + "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c", + "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473" + ], + "markers": "python_version >= '3.8'", + "version": "==0.6.0" + }, + "pyasn1-modules": { + "hashes": [ + "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6", + "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b" + ], + "markers": "python_version >= '3.8'", + "version": "==0.4.0" + }, + "pyutensor": { + "editable": true, + "file": "." + }, + "requests": { + "hashes": [ + "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", + "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1" + ], + "markers": "python_version >= '3.7'", + "version": "==2.31.0" + }, + "requests-oauthlib": { + "hashes": [ + "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", + "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9" + ], + "markers": "python_version >= '3.4'", + "version": "==2.0.0" + }, + "rsa": { + "hashes": [ + "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7", + "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21" + ], + "markers": "python_version >= '3.6' and python_version < '4'", + "version": "==4.9" + }, + "setuptools": { + "hashes": [ + "sha256:0ff4183f8f42cd8fa3acea16c45205521a4ef28f73c6391d8a25e92893134f2e", + "sha256:c21c49fb1042386df081cb5d86759792ab89efca84cf114889191cd09aacc80c" + ], + "markers": "python_version >= '3.8'", + "version": "==69.2.0" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.16.0" + }, + "sympy": { + "hashes": [ + "sha256:73458a54ca141100cf45bc62746e243f6921a24810a4f928114016c1775c377f", + "sha256:8afeced428c6e1c1a6340cf1d3b34ed7172c334387d7235b065953681bdf44c2" + ], + "markers": "python_version >= '3.8'", + "version": "==1.12.1a1" + }, + "tensorboard": { + "hashes": [ + "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.0" + }, + "tensorboard-data-server": { + "hashes": [ + "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb", + "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60", + "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530" + ], + "markers": "python_version >= '3.7'", + "version": "==0.7.2" + }, + "tensorflow": { + "hashes": [ + "sha256:00060c5516a61e30c51936084ebc37091d116efe9ae74b2818cbd8b2006218e7", + "sha256:06559eeaa69e6561cccbe2d02b015bcec663e875c8bbc4643f55692476e52147", + "sha256:076d953a1508dc58bf95f30f58bcc9ee364b1353c61e143cb20c2dada91afb05", + "sha256:11ad6a7ff49b4a690fbf37a5adaf28ba2686350a859c5f13c58dc8d2cc670375", + "sha256:19ee67901702b26787ad685cca65730c163c101c0c2f238a2584d714e0fa8c25", + "sha256:2822ac48c38d69b7fb104e606dacbd763c4bf5d3b20791f25be16a5076d01912", + "sha256:5e0fdadec59de3d11c5b5129ddc38e739bde7aa13095b82e19d4380e14d04999", + "sha256:6fff426661d286a4c634da44275d2ea2b951f392f3e65c8603681e7cb040586a", + "sha256:72d68b8c2f382e2d01b956c8ba516c0a7d5dad98111dd351bf82bfa646aa1c72", + "sha256:7a08c0e2938ed5b642a8787678123827477b81d316055d5073fff82fa183eb82", + "sha256:89125443e998548059c4e4a129dfab2b1ff7f2fd4c8eaed97842c3cd9b663101", + "sha256:948003b5a23b72b3d89746d729e62ec5f01e47460f05521b2211d95069f569ba", + "sha256:9c04bc3023b6c4cfb9ee9759c3f03f21993891b4c345df52eb5519204fbf28c0", + "sha256:b2978b39e8b3919059b5fd9e28508d50a77965d06ed0b537ed71c97de22dabdf", + "sha256:cbb83561bb7d55859eaefc70c674e58713d4e10c10927423ed836a5289bbfa86", + "sha256:de77306c0c22c9d8754f54700752ac3a1efee895c5357308e6594436404bfbc0", + "sha256:e0cf94d36ceaba8f158c6e15404a81fd5b3aa4cb04147c674cf55bd1aec78154", + "sha256:e8f0b69ee2f800399fc6bc7ec55fecfa33662d136e425485959d90638f32a32a", + "sha256:fa7abe265cc3ebccc9b405a280bf674824c6d85df5e6ccfa985987b3c9d265b4", + "sha256:fb2ff1129c93e853c19897d6a22ed0ec56387f5c6290ec03dec1c6f7b80bc396" + ], + "markers": "python_version >= '3.8'", + "version": "==2.13.0" + }, + "tensorflow-estimator": { + "hashes": [ + "sha256:6f868284eaa654ae3aa7cacdbef2175d0909df9fcf11374f5166f8bf475952aa" + ], + "markers": "python_version >= '3.7'", + "version": "==2.13.0" + }, + "tensorflow-macos": { + "hashes": [ + "sha256:331cc23682374ca5f3f92e069bd7fbb6e4d48a50278a9cd05e5b33f16d9a31e7", + "sha256:5dca8291125c0151bf426a2789689e02c623ce4540432cf66a073d361d3d6870", + "sha256:b0cea604f50a032dc426d7a6a91dc53a9df001cfa94fc814972e9d4cf062d31b", + "sha256:d9571357a39cc8cdecfd22e67dfdcebf840be67a88a8c7464bd3b9b3e0aad446" + ], + "markers": "platform_system == 'Darwin' and platform_machine == 'arm64'", + "version": "==2.13.0" + }, + "termcolor": { + "hashes": [ + "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63", + "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a" + ], + "markers": "python_version >= '3.8'", + "version": "==2.4.0" + }, + "torch": { + "hashes": [ + "sha256:05b18594f60a911a0c4f023f38a8bda77131fba5fd741bda626e97dcf5a3dd0a", + "sha256:0e13034fd5fb323cbbc29e56d0637a3791e50dd589616f40c79adfa36a5a35a1", + "sha256:255b50bc0608db177e6a3cc118961d77de7e5105f07816585fa6f191f33a9ff3", + "sha256:33d59cd03cb60106857f6c26b36457793637512998666ee3ce17311f217afe2b", + "sha256:3a871edd6c02dae77ad810335c0833391c1a4ce49af21ea8cf0f6a5d2096eea8", + "sha256:6984cd5057c0c977b3c9757254e989d3f1124f4ce9d07caa6cb637783c71d42a", + "sha256:76d37967c31c99548ad2c4d3f2cf191db48476f2e69b35a0937137116da356a1", + "sha256:8e221deccd0def6c2badff6be403e0c53491805ed9915e2c029adbcdb87ab6b5", + "sha256:8f32ce591616a30304f37a7d5ea80b69ca9e1b94bba7f308184bf616fdaea155", + "sha256:9ca96253b761e9aaf8e06fb30a66ee301aecbf15bb5a303097de1969077620b6", + "sha256:a6ebbe517097ef289cc7952783588c72de071d4b15ce0f8b285093f0916b1162", + "sha256:bc195d7927feabc0eb7c110e457c955ed2ab616f3c7c28439dd4188cf589699f", + "sha256:bef6996c27d8f6e92ea4e13a772d89611da0e103b48790de78131e308cf73076", + "sha256:d93ba70f67b08c2ae5598ee711cbc546a1bc8102cef938904b8c85c2089a51a0", + "sha256:d9b535cad0df3d13997dbe8bd68ac33e0e3ae5377639c9881948e40794a61403", + "sha256:e0ee6cf90c8970e05760f898d58f9ac65821c37ffe8b04269ec787aa70962b69", + "sha256:e2d83f07b4aac983453ea5bf8f9aa9dacf2278a8d31247f5d9037f37befc60e4", + "sha256:e3225f47d50bb66f756fe9196a768055d1c26b02154eb1f770ce47a2578d3aa7", + "sha256:f41fe0c7ecbf903a568c73486139a75cfab287a0f6c17ed0698fdea7a1e8641d", + "sha256:f9a55d55af02826ebfbadf4e9b682f0f27766bc33df8236b48d28d705587868f" + ], + "markers": "python_full_version >= '3.8.0'", + "version": "==2.1.2" + }, + "torchvision": { + "hashes": [ + "sha256:335959c43b371c0474af34c1ef2a52efdc7603c45700d29e4475eeb02984170c", + "sha256:3f4bd5fcbc361476e2e78016636ac7d5509e59d9962521f06eb98e6803898182", + "sha256:41dd4fa9f176d563fe9f1b9adef3b7e582cdfb60ce8c9bc51b094a025be687c9", + "sha256:4b065143d1a720fe8a9077fd4be35d491f98819ec80b3dbbc3ec64d0b707a906", + "sha256:56115268b37f0b75364e3654e47ad9abc66ac34c1f9e5e3dfa89a22d6a40017a", + "sha256:67b1aaf8b8cb02ce75dd445f291a27c8036a502f8c0aa76e28c37a0faac2e153", + "sha256:7fd22d86e08eba321af70cad291020c2cdeac069b00ce88b923ca52e06174769", + "sha256:8199acdf8ab066a28b84a5b6f4d97b58976d9e164b1acc3a9d14fccfaf74bb3a", + "sha256:82805f8445b094f9d1e770390ee6cc86855e89955e08ce34af2e2274fc0e5c45", + "sha256:8692ab1e48807e9604046a6f4beeb67b523294cee1b00828654bb0df2cfce2b2", + "sha256:96c7583700112a410bdc4e1e4f118c429dab49c29c9a31a2cc3579bc9b08b19d", + "sha256:9f4032ebb3277fb07ff6a9b818d50a547fb8fcd89d958cfd9e773322454bb688", + "sha256:b024bd412df6d3a007dcebf311a894eb3c5c21e1af80d12be382bbcb097a7c3a", + "sha256:b82732dcf876a37c852772342aa6ee3480c03bb3e2a802ae109fc5f7e28d26e9", + "sha256:bc5f274e4ecd1b86062063cdf4fd385a1d39d147a3a2685fbbde9ff08bb720b8", + "sha256:bc86f2800cb2c0c1a09c581409cdd6bff66e62f103dc83fc63f73346264c3756", + "sha256:bef30d03e1d1c629761f4dca51d3b7d8a0dc0acce6f4068ab2a1634e8e7b64e0", + "sha256:e130b08cc9b3cc73a6c59d6edf032394a322f9579bfd21d14bc2e1d0999aa758", + "sha256:e59cc7b2bd1ab5c0ce4ae382e4e37be8f1c174e8b5de2f6a23c170de9ae28495", + "sha256:e89f10f3c8351972b6e3fda95bc3e479ea8dbfc9dfcfd2c32902dbad4ba5cfc5" + ], + "markers": "python_version >= '3.8'", + "version": "==0.16.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", + "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" + ], + "markers": "python_version >= '3.7'", + "version": "==4.5.0" + }, + "urllib3": { + "hashes": [ + "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d", + "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19" + ], + "markers": "python_version >= '3.8'", + "version": "==2.2.1" + }, + "werkzeug": { + "hashes": [ + "sha256:507e811ecea72b18a404947aded4b3390e1db8f826b494d76550ef45bb3b1dcc", + "sha256:90a285dc0e42ad56b34e696398b8122ee4c681833fb35b8334a095d82c56da10" + ], + "markers": "python_version >= '3.8'", + "version": "==3.0.1" + }, + "wheel": { + "hashes": [ + "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85", + "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81" + ], + "markers": "python_version >= '3.8'", + "version": "==0.43.0" + }, + "wrapt": { + "hashes": [ + "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc", + "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", + "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", + "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e", + "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", + "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", + "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", + "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", + "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40", + "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", + "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", + "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", + "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", + "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", + "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", + "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", + "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", + "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", + "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", + "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", + "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", + "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", + "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", + "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966", + "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", + "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", + "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", + "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", + "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", + "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", + "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", + "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", + "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", + "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", + "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", + "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", + "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", + "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", + "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", + "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39", + "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", + "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", + "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", + "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", + "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c", + "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", + "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", + "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", + "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465", + "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", + "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", + "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", + "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", + "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8", + "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", + "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e", + "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", + "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", + "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", + "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", + "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", + "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", + "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", + "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", + "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", + "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", + "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", + "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", + "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", + "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4" + ], + "markers": "python_version >= '3.6'", + "version": "==1.16.0" + }, + "zipp": { + "hashes": [ + "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b", + "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715" + ], + "markers": "python_version >= '3.8'", + "version": "==3.18.1" + } + }, + "develop": { + "appnope": { + "hashes": [ + "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", + "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c" + ], + "markers": "sys_platform == 'darwin'", + "version": "==0.1.4" + }, + "asttokens": { + "hashes": [ + "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", + "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" + ], + "version": "==2.4.1" + }, + "backcall": { + "hashes": [ + "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e", + "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255" + ], + "version": "==0.2.0" + }, + "black": { + "hashes": [ + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==24.3.0" + }, + "click": { + "hashes": [ + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" + ], + "markers": "python_version >= '3.7'", + "version": "==8.1.7" + }, + "decorator": { + "hashes": [ + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" + ], + "markers": "python_version >= '3.5'", + "version": "==5.1.1" + }, + "exceptiongroup": { + "hashes": [ + "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14", + "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68" + ], + "markers": "python_version < '3.11'", + "version": "==1.2.0" + }, + "executing": { + "hashes": [ + "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", + "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" + ], + "markers": "python_version >= '3.5'", + "version": "==2.0.1" + }, + "flake8": { + "hashes": [ + "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132", + "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3" + ], + "index": "pypi", + "markers": "python_full_version >= '3.8.1'", + "version": "==7.0.0" + }, + "iniconfig": { + "hashes": [ + "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", + "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" + ], + "markers": "python_version >= '3.7'", + "version": "==2.0.0" + }, + "ipython": { + "hashes": [ + "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363", + "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.12.3" + }, + "isort": { + "hashes": [ + "sha256:0ec8b74806e80fec33e6e7ba89d35e17b3eb1c4c74316ea44cf877cc26e8b118", + "sha256:cde11e804641edbe1b6b95d56582eb541f27eebc77864c6015545944bb0e9c76" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.0'", + "version": "==6.0.0b2" + }, + "jedi": { + "hashes": [ + "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", + "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" + ], + "markers": "python_version >= '3.6'", + "version": "==0.19.1" + }, + "matplotlib-inline": { + "hashes": [ + "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311", + "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304" + ], + "markers": "python_version >= '3.5'", + "version": "==0.1.6" + }, + "mccabe": { + "hashes": [ + "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", + "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" + ], + "markers": "python_version >= '3.6'", + "version": "==0.7.0" + }, + "mypy-extensions": { + "hashes": [ + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "numpy": { + "hashes": [ + "sha256:0ec87a7084caa559c36e0a2309e4ecb1baa03b687201d0a847c8b0ed476a7187", + "sha256:1a7d6acc2e7524c9955e5c903160aa4ea083736fde7e91276b0e5d98e6332812", + "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7", + "sha256:210461d87fb02a84ef243cac5e814aad2b7f4be953b32cb53327bb49fd77fbb4", + "sha256:2d926b52ba1367f9acb76b0df6ed21f0b16a1ad87c6720a1121674e5cf63e2b6", + "sha256:352ee00c7f8387b44d19f4cada524586f07379c0d49270f87233983bc5087ca0", + "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4", + "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570", + "sha256:4719d5aefb5189f50887773699eaf94e7d1e02bf36c1a9d353d9f46703758ca4", + "sha256:4749e053a29364d3452c034827102ee100986903263e89884922ef01a0a6fd2f", + "sha256:5342cf6aad47943286afa6f1609cad9b4266a05e7f2ec408e2cf7aea7ff69d80", + "sha256:56e48aec79ae238f6e4395886b5eaed058abb7231fb3361ddd7bfdf4eed54289", + "sha256:76e3f4e85fc5d4fd311f6e9b794d0c00e7002ec122be271f2019d63376f1d385", + "sha256:7776ea65423ca6a15255ba1872d82d207bd1e09f6d0894ee4a64678dd2204078", + "sha256:784c6da1a07818491b0ffd63c6bbe5a33deaa0e25a20e1b3ea20cf0e43f8046c", + "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463", + "sha256:9a7721ec204d3a237225db3e194c25268faf92e19338a35f3a224469cb6039a3", + "sha256:a1d3c026f57ceaad42f8231305d4653d5f05dc6332a730ae5c0bea3513de0950", + "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155", + "sha256:ab5f23af8c16022663a652d3b25dcdc272ac3f83c3af4c02eb8b824e6b3ab9d7", + "sha256:ae8d0be48d1b6ed82588934aaaa179875e7dc4f3d84da18d7eae6eb3f06c242c", + "sha256:c91c4afd8abc3908e00a44b2672718905b8611503f7ff87390cc0ac3423fb096", + "sha256:d5036197ecae68d7f491fcdb4df90082b0d4960ca6599ba2659957aafced7c17", + "sha256:d6cc757de514c00b24ae8cf5c876af2a7c3df189028d68c0cb4eaa9cd5afc2bf", + "sha256:d933fabd8f6a319e8530d0de4fcc2e6a61917e0b0c271fded460032db42a0fe4", + "sha256:ea8282b9bcfe2b5e7d491d0bf7f3e2da29700cec05b49e64d6246923329f2b02", + "sha256:ecde0f8adef7dfdec993fd54b0f78183051b6580f606111a6d789cd14c61ea0c", + "sha256:f21c442fdd2805e91799fbe044a7b999b8571bb0ab0f7850d0cb9641a687092b" + ], + "markers": "python_version >= '3.8'", + "version": "==1.24.3" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" + ], + "markers": "python_version >= '3.7'", + "version": "==24.0" + }, + "parso": { + "hashes": [ + "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", + "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.3" + }, + "pathspec": { + "hashes": [ + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "pexpect": { + "hashes": [ + "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", + "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" + ], + "markers": "sys_platform != 'win32'", + "version": "==4.9.0" + }, + "pickleshare": { + "hashes": [ + "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca", + "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56" + ], + "version": "==0.7.5" + }, + "platformdirs": { + "hashes": [ + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" + ], + "markers": "python_version >= '3.8'", + "version": "==4.2.0" + }, + "pluggy": { + "hashes": [ + "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981", + "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be" + ], + "markers": "python_version >= '3.8'", + "version": "==1.4.0" + }, + "prompt-toolkit": { + "hashes": [ + "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d", + "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6" + ], + "markers": "python_full_version >= '3.7.0'", + "version": "==3.0.43" + }, + "ptyprocess": { + "hashes": [ + "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", + "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" + ], + "version": "==0.7.0" + }, + "pure-eval": { + "hashes": [ + "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", + "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" + ], + "version": "==0.2.2" + }, + "pycodestyle": { + "hashes": [ + "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f", + "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67" + ], + "markers": "python_version >= '3.8'", + "version": "==2.11.1" + }, + "pyflakes": { + "hashes": [ + "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f", + "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a" + ], + "markers": "python_version >= '3.8'", + "version": "==3.2.0" + }, + "pygments": { + "hashes": [ + "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c", + "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367" + ], + "markers": "python_version >= '3.7'", + "version": "==2.17.2" + }, + "pytest": { + "hashes": [ + "sha256:2a8386cfc11fa9d2c50ee7b2a57e7d898ef90470a7a34c4b949ff59662bb78b7", + "sha256:ac978141a75948948817d360297b7aae0fcb9d6ff6bc9ec6d514b85d5a65c044" + ], + "index": "pypi", + "markers": "python_version >= '3.8'", + "version": "==8.1.1" + }, + "six": { + "hashes": [ + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "version": "==1.16.0" + }, + "stack-data": { + "hashes": [ + "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", + "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" + ], + "version": "==0.6.3" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "traitlets": { + "hashes": [ + "sha256:8cdd83c040dab7d1dee822678e5f5d100b514f7b72b01615b26fc5718916fdf9", + "sha256:fcdf85684a772ddeba87db2f398ce00b40ff550d1528c03c14dbf6a02003cd80" + ], + "markers": "python_version >= '3.8'", + "version": "==5.14.2" + }, + "typing-extensions": { + "hashes": [ + "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb", + "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4" + ], + "markers": "python_version >= '3.7'", + "version": "==4.5.0" + }, + "wcwidth": { + "hashes": [ + "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", + "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" + ], + "version": "==0.2.13" + } + } +} diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 00000000..54e4824e --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,18 @@ +pybind11_add_module( + _pyuTensor + cpp/_pyuTensor.cpp + cpp/impl/fast_copyop.cpp + cpp/impl/matmul.cpp + cpp/impl/conv.cpp + cpp/impl/allocator.cpp + cpp/impl/arithmetic_kernels.cpp + cpp/impl/broadcast.cpp + cpp/impl/activation.cpp +) +target_include_directories(_pyuTensor PUBLIC cpp/include) +target_link_libraries(_pyuTensor PRIVATE utensor) +set_target_properties( + _pyuTensor + PROPERTIES + LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/pyuTensor +) \ No newline at end of file diff --git a/python/Makefile b/python/Makefile new file mode 100644 index 00000000..bc605664 --- /dev/null +++ b/python/Makefile @@ -0,0 +1,2 @@ +run-debg: + lldb -s .lldb-cmds $$(which python3) -- -m pdb debug.py diff --git a/python/Pipfile b/python/Pipfile index 3f796007..807f846d 100644 --- a/python/Pipfile +++ b/python/Pipfile @@ -4,15 +4,22 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] +tensorflow = "*" +torch = "*" +torchvision = "*" black = "*" flake8 = "*" isort = "*" +ipython = "*" +pytest = "*" +numpy = "*" [packages] -tensorflow = "==2.1.0" -torch = "*" -torchvision = "*" jinja2 = "*" +pyutensor = {file = ".", editable = true} [requires] -python_version = "3.7" +python_version = "3.8" + +[pipenv] +allow_prereleases = true diff --git a/python/cpp/_pyuTensor.cpp b/python/cpp/_pyuTensor.cpp new file mode 100644 index 00000000..d910b0fd --- /dev/null +++ b/python/cpp/_pyuTensor.cpp @@ -0,0 +1,52 @@ +#include + +#include "activation.hpp" +#include "allocator.hpp" +#include "arithmetic_kernels.hpp" +#include "broadcast.hpp" +#include "conv.hpp" +#include "matmul.hpp" + +PYBIND11_MODULE(_pyuTensor, m) { + m.doc() = "pybind11 uTensor plugin"; // optional module docstring + m.def("set_ram_total", &uTensor::python::set_ram_total, py::arg("capacity")); + m.def("set_meta_total", &uTensor::python::set_meta_total, + py::arg("capacity")); + m.def("matmul", &matmul, "matmul", py::arg("a"), py::arg("b")); + m.def("conv2d_f", &conv2d_f, "conv2d_f", py::arg("input"), py::arg("filter"), + py::arg("bias"), + py::arg("strides") = std::array({1, 1, 1, 1}), + py::arg("padding") = "VALID"); + m.def("max_pool_f", &(max_pool), "max_pool_f", py::arg("input"), + py::arg("k_size"), py::arg("strides"), py::arg("padding") = "VALID"); + m.def("max_pool_i8", &(max_pool), "max_pool_i8", py::arg("input"), + py::arg("k_size"), py::arg("strides"), py::arg("padding") = "VALID"); + m.def("max_pool_u8", &(max_pool), "max_pool_u8", py::arg("input"), + py::arg("k_size"), py::arg("strides"), py::arg("padding") = "VALID"); + m.def("add_kernel_f", &add_kernel, "add_kernel_f", py::arg("a"), + py::arg("b")); + m.def("add_kernel_i8", &add_kernel, "add_kernel_i8", py::arg("a"), + py::arg("b")); + m.def("add_kernel_u8", &add_kernel, "add_kernel_u8", py::arg("a"), + py::arg("b")); + m.def("add_kernel_i16", &add_kernel, "add_kernel_i16", py::arg("a"), + py::arg("b")); + m.def("add_kernel_u16", &add_kernel, "add_kernel_u16", py::arg("a"), + py::arg("b")); + m.def("add_kernel_i32", &add_kernel, "add_kernel_i32", py::arg("a"), + py::arg("b")); + m.def("add_kernel_u32", &add_kernel, "add_kernel_u32", py::arg("a"), + py::arg("b")); + m.def("mul_kernel", &mul_kernel, "mul_kernel", py::arg("a"), py::arg("b")); + py::class_(m, "Broadcaster") + .def(py::init()) + .def("get_output_shape", &PyBroadcaster::get_output_shape) + .def("get_linear_idx", &PyBroadcaster::get_linear_idx); + m.def("relu_f", &relu_f, "relu_f", py::arg("input")); + m.def("relu_i8", &relu_q, "relu_i8", py::arg("input"), + py::arg("scale"), py::arg("zero_point")); + m.def("relu_i16", &relu_q, "relu_i16", py::arg("input"), + py::arg("scale"), py::arg("zero_point")); + m.def("relu_i32", &relu_q, "relu_i32", py::arg("input"), + py::arg("scale"), py::arg("zero_point")); +} diff --git a/python/cpp/impl/activation.cpp b/python/cpp/impl/activation.cpp new file mode 100644 index 00000000..379247f9 --- /dev/null +++ b/python/cpp/impl/activation.cpp @@ -0,0 +1,70 @@ +#include "activation.hpp" + +#include "allocator.hpp" +#include "fast_copyop.hpp" +#include "uTensor/core/types.hpp" +#include "uTensor/ops/ActivationFncs.hpp" + +namespace py = pybind11; +using uTensor::Context; +using uTensor::RamTensor; +using uTensor::Tensor; +using uTensor::python::get_meta_allocator; +using uTensor::python::get_ram_allocator; + +template +py::array_t _relu(const py::array_t &input, float scale, + int32_t zero_point) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_input = input.request(); + CopyOperator copy_op; + uTensor::ReferenceOperators::ReLUOperator relu_op; + TensorShape in_shape(0); + + for (int idx = 0; idx < info_input.ndim; idx++) { + in_shape[idx] = info_input.shape[idx]; + } + in_shape.update_dims(); + auto elem_type = ttype_from::type; + Tensor tensor_input = new RamTensor(in_shape, elem_type); + Tensor tensor_output = new RamTensor(in_shape, elem_type); + copy_op.toTensor(info_input.ptr, tensor_input); + if (is_quantized) { + tensor_input->set_quantization_params( + uTensor::QuantizationParams(&zero_point, &scale, 1)); + tensor_output->set_quantization_params( + uTensor::QuantizationParams(&zero_point, &scale, 1)); + } + relu_op + .set_inputs( + {{uTensor::ReferenceOperators::ReLUOperator::in, tensor_input}}) + .set_outputs( + {{uTensor::ReferenceOperators::ReLUOperator::out, tensor_output}}) + .eval(); + py::buffer_info out_info = copy_op.getInfo(tensor_output); + tensor_input.free(); + tensor_output.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + + py::object base = py::cast(out_info.ptr); + return py::array_t(out_info, base); +} + +template +py::array_t relu_q(const py::array_t &input, float scale, + int32_t zero_point) { + return _relu(input, scale, zero_point); +} + +py::array_t relu_f(const py::array_t &input) { + return _relu(input, 0.0, 0); +} + +template py::array_t relu_q(const py::array_t &input, + float scale, int32_t zero_point); +template py::array_t relu_q(const py::array_t &input, + float scale, int32_t zero_point); +template py::array_t relu_q(const py::array_t &input, + float scale, int32_t zero_point); diff --git a/python/cpp/impl/allocator.cpp b/python/cpp/impl/allocator.cpp new file mode 100644 index 00000000..0e56e723 --- /dev/null +++ b/python/cpp/impl/allocator.cpp @@ -0,0 +1,76 @@ +#include "allocator.hpp" + +#include +#include + +using std::free; +using std::malloc; + +static uTensor::MallocAllocator ram_allocator(0); +static uTensor::MallocAllocator meta_allocator(0); + +namespace uTensor { + +DEFINE_ERROR(InvalidBoundError); + +MallocAllocator::MallocAllocator(size_t capability) + : total_(capability), accum_(0) {} +size_t MallocAllocator::available() { + size_t rem = static_cast(total_ - accum_); + return rem; +} +bool MallocAllocator::rebalance() { return true; } +void MallocAllocator::set_total(size_t v) { total_ = v; } + +void MallocAllocator::_bind(void *ptr, Handle *hndl) { + if (ptrs_map_.find(hndl) != ptrs_map_.end()) { + Context::get_default_context()->throwError(new InvalidBoundError()); + } + ptrs_map_[hndl] = ptr; +} +void MallocAllocator::_unbind(void *ptr, Handle *hndl) { + if (ptrs_map_.find(hndl) == ptrs_map_.end()) { + return; + } + ptrs_map_.erase(hndl); +} +bool MallocAllocator::_is_bound(void *ptr, Handle *hndl) { + if (ptrs_map_.find(hndl) == ptrs_map_.end()) { + return false; + } + return ptrs_map_[hndl] == ptr; +} +bool MallocAllocator::_has_handle(Handle *hndl) { + return ptrs_map_.find(hndl) != ptrs_map_.end(); +} +void *MallocAllocator::_allocate(size_t sz) { + if (total_ < accum_ + sz) { + std::cerr << "need to enlarge the total memory usage" << std::endl; + throw std::bad_alloc(); + } + void *addr = malloc(sz); + accum_ += sz; + size_map_[addr] = sz; + return addr; +} +void MallocAllocator::_deallocate(void *ptr) { + if (size_map_.find(ptr) == size_map_.end()) { + // throw error? + return; + } + size_t sz = size_map_[ptr]; + size_map_.erase(ptr); + accum_ -= sz; + free(ptr); +} + +MallocAllocator *python::get_ram_allocator() { return &ram_allocator; } +MallocAllocator *python::get_meta_allocator() { return &meta_allocator; } +void python::set_ram_total(size_t capacity) { + ram_allocator.set_total(capacity); +} +void python::set_meta_total(size_t capacity) { + meta_allocator.set_total(capacity); +} + +} // namespace uTensor diff --git a/python/cpp/impl/arithmetic_kernels.cpp b/python/cpp/impl/arithmetic_kernels.cpp new file mode 100644 index 00000000..e01f1fcf --- /dev/null +++ b/python/cpp/impl/arithmetic_kernels.cpp @@ -0,0 +1,102 @@ +#include "arithmetic_kernels.hpp" + +#include + +#include "allocator.hpp" +#include "fast_copyop.hpp" +#include "uTensor/core/types.hpp" +#include "uTensor/ops/Arithmetic_kernels.hpp" +#include "uTensor/ops/Broadcast.hpp" + +namespace py = pybind11; +using uTensor::Context; +using uTensor::RamTensor; +using uTensor::Tensor; +using uTensor::python::get_meta_allocator; +using uTensor::python::get_ram_allocator; + +template +py::array_t add_kernel(const py::array_t &a, const py::array_t &b) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_a = a.request(); + py::buffer_info info_b = b.request(); + + CopyOperator copy_op; + // setup TensorShape, start with a 0-dim placeholder + TensorShape shape_a(0), shape_b(0), output_shape(0); + for (int i = 0; i < info_a.ndim; i++) + shape_a[i] = info_a.shape[i]; + for (int i = 0; i < info_b.ndim; i++) + shape_b[i] = info_b.shape[i]; + shape_a.update_dims(); + shape_b.update_dims(); + if (!is_broadcastable(shape_a, shape_b, output_shape)) + throw py::value_error("a and b are not broadcastable"); + auto elem_type = ttype_from::type; + Tensor tensor_a = new RamTensor(shape_a, elem_type); + Tensor tensor_b = new RamTensor(shape_b, elem_type); + Tensor tensor_c = new RamTensor(output_shape, elem_type); + copy_op.toTensor(info_a.ptr, tensor_a); + copy_op.toTensor(info_b.ptr, tensor_b); + uTensor::add_kernel(tensor_c, tensor_a, tensor_b); + py::buffer_info out_info = copy_op.getInfo(tensor_c); + tensor_a.free(); + tensor_b.free(); + tensor_c.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + + py::object base = py::cast(out_info.ptr); + return py::array_t(out_info, base); +} + +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); +template py::array_t add_kernel(const py::array_t &a, + const py::array_t &b); + +py::array_t mul_kernel(const py::array_t &a, + const py::array_t &b) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_a = a.request(); + py::buffer_info info_b = b.request(); + + CopyOperator copy_op; + // setup TensorShape, start with a 0-dim placeholder + TensorShape shape_a(0), shape_b(0), output_shape(0); + for (int i = 0; i < info_a.ndim; i++) + shape_a[i] = info_a.shape[i]; + for (int i = 0; i < info_b.ndim; i++) + shape_b[i] = info_b.shape[i]; + shape_a.update_dims(); + shape_b.update_dims(); + if (!is_broadcastable(shape_a, shape_b, output_shape)) + throw py::value_error("a and b are not broadcastable"); + Tensor tensor_a = new RamTensor(shape_a, flt); + Tensor tensor_b = new RamTensor(shape_b, flt); + Tensor tensor_c = new RamTensor(output_shape, flt); + copy_op.toTensor(info_a.ptr, tensor_a); + copy_op.toTensor(info_b.ptr, tensor_b); + uTensor::mul_kernel(tensor_c, tensor_a, tensor_b); + py::buffer_info out_info = copy_op.getInfo(tensor_c); + tensor_a.free(); + tensor_b.free(); + tensor_c.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + + py::object base = py::cast(out_info.ptr); + return py::array_t(out_info, base); +} diff --git a/python/cpp/impl/broadcast.cpp b/python/cpp/impl/broadcast.cpp new file mode 100644 index 00000000..d2fcb22d --- /dev/null +++ b/python/cpp/impl/broadcast.cpp @@ -0,0 +1,36 @@ +#include "broadcast.hpp" + +#include "uTensor/core/types.hpp" + +PyBroadcaster::PyBroadcaster(const py::tuple &shape_a, + const py::tuple &shape_b) { + TensorShape ts_a(0), ts_b(0); + for (int i = 0; i < shape_a.size(); i++) + ts_a[i] = static_cast(shape_a[i].cast()); + for (int i = 0; i < shape_b.size(); i++) + ts_b[i] = static_cast(shape_b[i].cast()); + ts_a.update_dims(); + ts_b.update_dims(); + try { + _bc.set_shape(ts_a, ts_b); + } catch (const std::runtime_error &e) { + throw py::value_error(e.what()); + } +} + +py::tuple PyBroadcaster::get_linear_idx(int idx_c) const { + std::pair indices; + try { + indices = _bc.get_linear_idx(idx_c); + } catch (const std::runtime_error &e) { + throw py::value_error(e.what()); + } + return py::make_tuple(indices.first, indices.second); +} + +py::tuple PyBroadcaster::get_output_shape() const { + TensorShape ts = _bc.get_output_shape(); + py::tuple shape(ts.num_dims()); + for (int i = 0; i < ts.num_dims(); i++) shape[i] = ts[i]; + return shape; +} \ No newline at end of file diff --git a/python/cpp/impl/conv.cpp b/python/cpp/impl/conv.cpp new file mode 100644 index 00000000..7bacd00d --- /dev/null +++ b/python/cpp/impl/conv.cpp @@ -0,0 +1,189 @@ +#include "conv.hpp" + +#include + +#include "allocator.hpp" +#include "fast_copyop.hpp" +#include "uTensor/ops/Convolution.hpp" + +using uTensor::Context; +using uTensor::RamTensor; +using uTensor::Tensor; +using uTensor::python::get_meta_allocator; +using uTensor::python::get_ram_allocator; +using uTensor::ReferenceOperators::Conv2dOperator; +using namespace uTensor::ReferenceOperators::Conv2dConstants; + +static void _compute_output_shape(py::buffer_info &info_input, + uTensor::Padding padding, + uint16_t kernel_height, uint16_t kernel_width, + uint16_t stride_height, uint16_t stride_width, + uint16_t &out_height, uint16_t &out_width) { + switch (padding) { + case uTensor::VALID: + out_height = static_cast(std::ceil( + static_cast((info_input.shape[1] - kernel_height + 1)) / + static_cast(stride_height))); + out_width = static_cast( + std::ceil(static_cast(info_input.shape[2] - kernel_width + 1) / + static_cast(stride_width))); + break; + case uTensor::SAME: + out_height = static_cast( + std::ceil(static_cast(info_input.shape[1]) / + static_cast(stride_height))); + out_width = static_cast( + std::ceil(static_cast(info_input.shape[2]) / + static_cast(stride_width))); + break; + case uTensor::UNKNOWN: + throw py::value_error("invalid padding value, support only SAME and VALID"); + } +} + +py::array_t +conv2d_f(const py::array_t &input, + const py::array_t &filter, + const py::array_t &bias, + std::array strides, std::string padding) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_input = input.request(), info_filter = filter.request(), + info_bias = bias.request(); + if (info_input.ndim != 4 || info_filter.ndim != 4) { + throw py::value_error("input and filter should be both 4-dims array"); + } + if (info_input.shape[3] != info_filter.shape[filter_in_channels_dim]) { + throw py::value_error( + "in-channels must be the same for the input and filter"); + } + if (info_filter.shape[filter_out_channels_dim] != info_bias.shape[0]) { + throw py::value_error( + "the number of bias is not the same as filter out-channels"); + } + uTensor::Padding padding_; + if (padding == "VALID") { + padding_ = uTensor::VALID; + } else if (padding == "SAME") { + padding_ = uTensor::SAME; + } else { + padding_ = uTensor::UNKNOWN; + } + // https://www.tensorflow.org/api_docs/python/tf/nn#notes_on_padding_2 + uint16_t out_height, out_width; + _compute_output_shape(info_input, padding_, + info_filter.shape[filter_height_dim], + info_filter.shape[filter_width_dim], strides[1], + strides[2], out_height, out_width); + + CopyOperator copy_op; + Conv2dOperator conv_op(strides, padding_); + Tensor tensor_input = new RamTensor( + { + static_cast(info_input.shape[0]), + static_cast(info_input.shape[1]), + static_cast(info_input.shape[2]), + static_cast(info_input.shape[3]), + + }, + flt); + Tensor tensor_filter = new RamTensor( + { + static_cast(info_filter.shape[0]), + static_cast(info_filter.shape[1]), + static_cast(info_filter.shape[2]), + static_cast(info_filter.shape[3]), + }, + flt); + Tensor tensor_bias = + new RamTensor({static_cast(info_bias.shape[0])}, flt); + copy_op.toTensor(info_input.ptr, tensor_input); + copy_op.toTensor(info_filter.ptr, tensor_filter); + copy_op.toTensor(info_bias.ptr, tensor_bias); + Tensor tensor_out = new RamTensor( + {static_cast(info_input.shape[0]), out_height, out_width, + static_cast(info_filter.shape[filter_out_channels_dim])}, + flt); + conv_op + .set_inputs({{Conv2dOperator::in, tensor_input}, + {Conv2dOperator::filter, tensor_filter}, + {Conv2dOperator::bias, tensor_bias}}) + .set_outputs({{Conv2dOperator::out, tensor_out}}) + .eval(); + py::buffer_info info = copy_op.getInfo(tensor_out); + tensor_input.free(); + tensor_filter.free(); + tensor_bias.free(); + tensor_out.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + return py::array_t(info); +} + +template +py::array_t max_pool(py::array_t input, std::array k_size, + std::array strides, std::string padding) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_input = input.request(); + uTensor::Padding padding_; + if (padding == "VALID") { + padding_ = uTensor::VALID; + } else if (padding == "SAME") { + padding_ = uTensor::SAME; + } else { + padding_ = uTensor::UNKNOWN; + } + CopyOperator copy_op; + uTensor::ReferenceOperators::MaxPoolOperator max_pool_op(k_size, strides, + padding_); + auto elem_type = ttype_from::type; + uint16_t out_height, out_width; + _compute_output_shape(info_input, padding_, k_size[0], k_size[1], strides[1], + strides[2], out_height, out_width); + Tensor tensor_out = new RamTensor( + { + static_cast(info_input.shape[0]), + out_height, + out_width, + static_cast(info_input.shape[3]), + }, + elem_type); + Tensor tensor_input = new RamTensor( + { + static_cast(info_input.shape[0]), + static_cast(info_input.shape[1]), + static_cast(info_input.shape[2]), + static_cast(info_input.shape[3]), + + }, + elem_type); + copy_op.toTensor(info_input.ptr, tensor_input); + max_pool_op + .set_inputs( + {{uTensor::ReferenceOperators::MaxPoolOperator::in, tensor_input}}) + .set_outputs( + {{uTensor::ReferenceOperators::MaxPoolOperator::out, tensor_out}}) + .eval(); + py::buffer_info info = copy_op.getInfo(tensor_out); + tensor_input.free(); + tensor_out.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + return py::array_t(info); +} + +template py::array_t max_pool(py::array_t input, + std::array k_size, + std::array strides, + std::string padding); + +template py::array_t max_pool(py::array_t input, + std::array k_size, + std::array strides, + std::string padding); + +template py::array_t max_pool(py::array_t input, + std::array k_size, + std::array strides, + std::string padding); diff --git a/python/cpp/impl/fast_copyop.cpp b/python/cpp/impl/fast_copyop.cpp new file mode 100644 index 00000000..829d3d2d --- /dev/null +++ b/python/cpp/impl/fast_copyop.cpp @@ -0,0 +1,79 @@ +#include "fast_copyop.hpp" + +#include +#include +#include + +using uTensor::Tensor; + +void CopyOperator::toTensor(const void *src, Tensor &dest) { + void *dest_buffer; + auto num_elems = dest->num_elems(); + size_t count = static_cast(type_size(dest->get_type())) * + static_cast(num_elems); + get_writeable_block(dest, dest_buffer, num_elems, 0); + std::memcpy(dest_buffer, src, count); +} + +void CopyOperator::fromTensor(void *dest, const Tensor &src) { + const void *src_buffer; + auto num_elems = src->num_elems(); + size_t count = static_cast(type_size(src->get_type())) * + static_cast(num_elems); + get_readable_block(src, src_buffer, num_elems, 0); + std::memcpy(dest, src_buffer, count); +} + +py::buffer_info CopyOperator::getInfo(const Tensor &tensor) { + py::buffer_info info; + uint32_t num_elems = tensor->num_elems(); + py::ssize_t item_size = + static_cast(type_size(tensor->get_type())); + void *src_buffer = std::malloc(static_cast(item_size) * + static_cast(num_elems)); + fromTensor(src_buffer, tensor); + + std::string fmt; + switch (tensor->get_type()) { + case flt: + fmt = py::format_descriptor::format(); + break; + case i8: + fmt = py::format_descriptor::format(); + break; + case u8: + fmt = py::format_descriptor::format(); + break; + case i16: + fmt = py::format_descriptor::format(); + break; + case u16: + fmt = py::format_descriptor::format(); + break; + case i32: + fmt = py::format_descriptor::format(); + break; + case u32: + fmt = py::format_descriptor::format(); + break; + default: + throw py::type_error("unknown tensor data type"); + break; + } + TensorShape shape = tensor->get_shape(); + py::ssize_t ndims = static_cast(shape.num_dims()); + + std::vector v_shape(ndims); + std::vector v_strides(ndims); + py::ssize_t s = 1; + for (size_t idx = 0; idx < ndims; ++idx) { + v_shape.at(idx) = shape[idx]; + v_strides.at(ndims - idx - 1) = s * item_size; + s *= shape[ndims - idx - 1]; + } + return py::buffer_info( + src_buffer, item_size, fmt, ndims, + py::detail::any_container(v_shape.begin(), v_shape.end()), + py::detail::any_container(v_strides.begin(), + v_strides.end())); +} \ No newline at end of file diff --git a/python/cpp/impl/matmul.cpp b/python/cpp/impl/matmul.cpp new file mode 100644 index 00000000..b7d3aa28 --- /dev/null +++ b/python/cpp/impl/matmul.cpp @@ -0,0 +1,55 @@ +#include "matmul.hpp" + +#include "allocator.hpp" +#include "fast_copyop.hpp" +#include "uTensor/ops/Matrix.hpp" + +namespace py = pybind11; +using uTensor::Context; +using uTensor::RamTensor; +using uTensor::Tensor; +using uTensor::python::get_meta_allocator; +using uTensor::python::get_ram_allocator; +using uTensor::ReferenceOperators::MatrixMultOperatorV2; + +py::array_t matmul(const py::array_t &a, + const py::array_t &b) { + Context::get_default_context()->set_ram_data_allocator(get_ram_allocator()); + Context::get_default_context()->set_metadata_allocator(get_meta_allocator()); + py::buffer_info info_a = a.request(); + py::buffer_info info_b = b.request(); + if (info_a.ndim != 2 || info_b.ndim != 2) { + throw py::value_error("a and b should be both 2-dims array"); + } + CopyOperator copy_op; + MatrixMultOperatorV2 matmul_op; + Tensor tensor_a = new RamTensor({static_cast(info_a.shape[0]), + static_cast(info_a.shape[1])}, + flt); + Tensor tensor_b = new RamTensor({static_cast(info_b.shape[0]), + static_cast(info_b.shape[1])}, + flt); + Tensor tensor_c = new RamTensor({static_cast(info_a.shape[0]), + static_cast(info_b.shape[1])}, + flt); + copy_op.toTensor(info_a.ptr, tensor_a); + copy_op.toTensor(info_b.ptr, tensor_b); + matmul_op + .set_inputs({ + {MatrixMultOperatorV2::input, tensor_a}, + {MatrixMultOperatorV2::filter, tensor_b}, + }) + .set_outputs({ + {MatrixMultOperatorV2::output, tensor_c}, + }) + .eval(); + py::buffer_info out_info = copy_op.getInfo(tensor_c); + tensor_a.free(); + tensor_b.free(); + tensor_c.free(); + Context::get_default_context()->set_ram_data_allocator(nullptr); + Context::get_default_context()->set_metadata_allocator(nullptr); + + py::object base = py::cast(out_info.ptr); + return py::array_t(out_info, base); +} diff --git a/python/cpp/include/activation.hpp b/python/cpp/include/activation.hpp new file mode 100644 index 00000000..b66e3e93 --- /dev/null +++ b/python/cpp/include/activation.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "pybind11/numpy.h" + +namespace py = pybind11; + +template +py::array_t relu_q(const py::array_t &input, float scale, + int32_t zero_point); +py::array_t relu_f(const py::array_t &input); \ No newline at end of file diff --git a/python/cpp/include/allocator.hpp b/python/cpp/include/allocator.hpp new file mode 100644 index 00000000..e1bcdc32 --- /dev/null +++ b/python/cpp/include/allocator.hpp @@ -0,0 +1,45 @@ +#ifndef UTENSOR_ALLOCATOR_H +#define UTENSOR_ALLOCATOR_H + +#include + +#include "uTensor.h" +#include "uTensor/core/errorHandler.hpp" + +namespace uTensor { + +DECLARE_ERROR(InvalidBoundError); + +class MallocAllocator : public AllocatorInterface { + public: + MallocAllocator(size_t capability); + size_t available() override; + bool rebalance() override; + void set_total(size_t v); + + protected: + void _bind(void *ptr, Handle *hndl) override; + void _unbind(void *ptr, Handle *hndl) override; + bool _is_bound(void *ptr, Handle *hndl) override; + bool _has_handle(Handle *hndl) override; + void *_allocate(size_t sz) override; + void _deallocate(void *ptr) override; + + private: + std::unordered_map ptrs_map_; + std::unordered_map size_map_; + unsigned long long total_; + unsigned long long accum_; +}; + +namespace python { +MallocAllocator *get_ram_allocator(); +MallocAllocator *get_meta_allocator(); + +void set_ram_total(size_t capacity); +void set_meta_total(size_t capacity); +} // namespace python + +} // namespace uTensor + +#endif \ No newline at end of file diff --git a/python/cpp/include/arithmetic_kernels.hpp b/python/cpp/include/arithmetic_kernels.hpp new file mode 100644 index 00000000..c431062b --- /dev/null +++ b/python/cpp/include/arithmetic_kernels.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include "pybind11/numpy.h" + +namespace py = pybind11; + +template +py::array_t add_kernel(const py::array_t &a, const py::array_t &b); + +py::array_t mul_kernel(const py::array_t &a, + const py::array_t &b); \ No newline at end of file diff --git a/python/cpp/include/broadcast.hpp b/python/cpp/include/broadcast.hpp new file mode 100644 index 00000000..be46281a --- /dev/null +++ b/python/cpp/include/broadcast.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "pybind11/pybind11.h" +#include "uTensor/ops/Broadcast.hpp" + +namespace py = pybind11; + +class PyBroadcaster { + public: + PyBroadcaster(const py::tuple &shape_a, const py::tuple &shape_b); + py::tuple get_linear_idx(int idx_c) const; + py::tuple get_output_shape() const; + + private: + Broadcaster _bc; +}; diff --git a/python/cpp/include/conv.hpp b/python/cpp/include/conv.hpp new file mode 100644 index 00000000..d0456c77 --- /dev/null +++ b/python/cpp/include/conv.hpp @@ -0,0 +1,22 @@ +#pragma once + +#include + +#include "pybind11/numpy.h" +#include "pybind11/stl.h" +#include "string" +#include "uTensor.h" + +namespace py = pybind11; + +py::array_t +conv2d_f(const py::array_t &input, + const py::array_t &filter, + const py::array_t &bias, + std::array strides = {1, 1, 1, 1}, + std::string padding = "VALID"); + +template +py::array_t max_pool(py::array_t input, std::array k_size, + std::array strides, + std::string padding = "VALID"); diff --git a/python/cpp/include/fast_copyop.hpp b/python/cpp/include/fast_copyop.hpp new file mode 100644 index 00000000..8c9a4561 --- /dev/null +++ b/python/cpp/include/fast_copyop.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "pybind11/numpy.h" +#include "uTensor.h" +#include "uTensor/core/operatorBase.hpp" + +using uTensor::FastOperator; +using uTensor::Tensor; +namespace py = pybind11; + +class CopyOperator : public FastOperator { + public: + void toTensor(const void *src, Tensor &dest); + void fromTensor(void *dest, const Tensor &src); + py::buffer_info getInfo(const Tensor &tensor); +}; diff --git a/python/cpp/include/matmul.hpp b/python/cpp/include/matmul.hpp new file mode 100644 index 00000000..e3839351 --- /dev/null +++ b/python/cpp/include/matmul.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include "pybind11/numpy.h" + +namespace py = pybind11; + +py::array_t matmul(const py::array_t &a, + const py::array_t &b); \ No newline at end of file diff --git a/python/debug.py b/python/debug.py new file mode 100644 index 00000000..58590ab1 --- /dev/null +++ b/python/debug.py @@ -0,0 +1,15 @@ + +import numpy as np +import tensorflow as tf +import pyuTensor + +pyuTensor.set_ram_total(2000000) +pyuTensor.set_meta_total(1000) + +a_setting = (1, 5, 5, 3) +a = np.arange(np.prod(a_setting)).reshape(a_setting).astype(np.float32) +b_setting = (5, 5, 3, 5) +b = np.arange(np.prod(b_setting)).reshape(b_setting).astype(np.float32) + +print(pyuTensor.conv2d_f(a, b.transpose(3, 0, 1, 2), [0 for _ in range(b_setting[3])], [1, 2, 2, 1], "VALID")) +print(tf.nn.conv2d(a, b, strides=[1, 2, 2, 1], padding="VALID").numpy()) \ No newline at end of file diff --git a/python/setup.cfg b/python/setup.cfg new file mode 100644 index 00000000..71f4b891 --- /dev/null +++ b/python/setup.cfg @@ -0,0 +1,16 @@ +[metadata] +name = pyuTensor +author = uTensor Dev +author_email = dev@utensor.ai +description = A Python package for uTensor +long_description = file: README.md +version= attr: pyuTensor._version.__version__ + +[options] +packages = find: +zip_safe = False +install_requires = + numpy + +[options.packages.find] +where=src \ No newline at end of file diff --git a/python/setup.py b/python/setup.py new file mode 100644 index 00000000..57c026bf --- /dev/null +++ b/python/setup.py @@ -0,0 +1,4 @@ +from setuptools import setup + +if __name__ == "__main__": + setup() \ No newline at end of file diff --git a/python/src/pyuTensor/__init__.py b/python/src/pyuTensor/__init__.py new file mode 100644 index 00000000..2154270f --- /dev/null +++ b/python/src/pyuTensor/__init__.py @@ -0,0 +1,11 @@ +from . import _pyuTensor as _C +from ._version import __version__ +from .arithmetic import * +from .conv import * +from .relu import * + +set_meta_total = _C.set_meta_total +set_ram_total = _C.set_ram_total +Broadcaster = _C.Broadcaster + + \ No newline at end of file diff --git a/python/src/pyuTensor/_version.py b/python/src/pyuTensor/_version.py new file mode 100644 index 00000000..a0235ce5 --- /dev/null +++ b/python/src/pyuTensor/_version.py @@ -0,0 +1 @@ +__version__ = "0.0.2" \ No newline at end of file diff --git a/python/src/pyuTensor/arithmetic.py b/python/src/pyuTensor/arithmetic.py new file mode 100644 index 00000000..f71c01aa --- /dev/null +++ b/python/src/pyuTensor/arithmetic.py @@ -0,0 +1,34 @@ +import numpy as np + +from . import _pyuTensor as _C +from .util import export as _export + + +@_export +def matmul(a: np.ndarray, b: np.ndarray) -> np.ndarray: + if a.dtype != np.float32: + a = a.astype(np.float32) + if b.dtype != np.float32: + b = b.astype(np.float32) + return _C.mul_kernel(a, b) + +@_export +def add(a: np.ndarray, b: np.ndarray) -> np.ndarray: + if a.dtype != b.dtype: + raise ValueError(f"Data types must match: {a.dtype} v.s {b.dtype}") + if a.dtype == np.float32: + return _C.add_kernel_f(a, b) + elif a.dtype == np.int8: + return _C.add_kernel_i8(a, b) + elif a.dtype == np.uint8: + return _C.add_kernel_u8(a, b) + elif a.dtype == np.int16: + return _C.add_kernel_i16(a, b) + elif a.dtype == np.uint16: + return _C.add_kernel_u16(a, b) + elif a.dtype == np.int32: + return _C.add_kernel_i32(a, b) + elif a.dtype == np.uint32: + return _C.add_kernel_u32(a, b) + else: + raise ValueError(f"Unsupported data type: {a.dtype}") \ No newline at end of file diff --git a/python/src/pyuTensor/conv.py b/python/src/pyuTensor/conv.py new file mode 100644 index 00000000..5848d104 --- /dev/null +++ b/python/src/pyuTensor/conv.py @@ -0,0 +1,22 @@ +import numpy as np + +from . import _pyuTensor as _C +from .util import export as _export + + +@_export +def conv2d(input: np.ndarray, kernel: np.ndarray, strides: list, bias = None, padding: str = "VALID") -> np.ndarray: + if bias is None: + bias = np.zeros(kernel.shape[0]) + return _C.conv2d_f(input, kernel, bias, strides[:4], padding) + +@_export +def max_pool2d(input: np.ndarray, kernel_size: list, strides: list, padding: str = "VALID") -> np.ndarray: + if input.dtype == np.float32: + return _C.max_pool_f(input, kernel_size, strides, padding) + elif input.dtype == np.int8: + return _C.max_pool_i8(input, kernel_size, strides, padding) + elif input.dtype == np.uint8: + return _C.max_pool_u8(input, kernel_size, strides, padding) + else: + raise ValueError(f"Unsupported data type: {input.dtype}") \ No newline at end of file diff --git a/python/src/pyuTensor/relu.py b/python/src/pyuTensor/relu.py new file mode 100644 index 00000000..74349e16 --- /dev/null +++ b/python/src/pyuTensor/relu.py @@ -0,0 +1,24 @@ +import numpy as np + +from . import _pyuTensor as _C +from .util import export as _export + + +@_export +def relu(arr: np.ndarray) -> np.ndarray: + assert arr.dtype in [np.float32, np.float64], "Expecting array of type float32 or float64" + return _C.relu_f(arr.astype(np.float32)) + +@_export +def relu_q(arr: np.ndarray, scale: float, zero_point: int) -> np.ndarray: + """ + Quantized ReLU + """ + if arr.dtype == np.int8: + return _C.relu_i8(arr, scale, zero_point) + elif arr.dtype == np.int16: + return _C.relu_i16(arr, scale, zero_point) + elif arr.dtype == np.int32: + return _C.relu_i32(arr, scale, zero_point) + else: + raise ValueError(f"Unsupported dtype: {arr.dtype}") \ No newline at end of file diff --git a/python/src/pyuTensor/util.py b/python/src/pyuTensor/util.py new file mode 100644 index 00000000..5b6729a2 --- /dev/null +++ b/python/src/pyuTensor/util.py @@ -0,0 +1,28 @@ +import inspect +from types import ModuleType + +__all__ = ["export"] + + +def export(obj): + """export object + + populate the given object into `__all__` + """ + caller_frame = inspect.currentframe().f_back + all_list = caller_frame.f_globals.get("__all__", []) + caller_frame.f_globals["__all__"] = all_list + try: + all_list.append( + obj.__name__.split(".")[-1] if isinstance(obj, ModuleType) else obj.__name__ + ) # exporting a class/function + except AttributeError as err: + for name, value in caller_frame.f_globals.items(): + if value is obj: + all_list.append(name) + break + else: + raise ValueError( + f"{obj} not found in the scope, fail to export symbol" + ) from err + return obj \ No newline at end of file diff --git a/python/test_scripts/gen_rsqrt.py b/python/test_scripts/gen_rsqrt.py new file mode 100644 index 00000000..349f52f1 --- /dev/null +++ b/python/test_scripts/gen_rsqrt.py @@ -0,0 +1,50 @@ +from random import randint + +import tensorflow as tf +from jinja_env import Operator, SingleOpTest, Tensor, env2 + +test_group = "ReferenceRsqrt" +num_tests = 5 +output_file = "test_rsqrt.cpp" +const_file = "constants_rsqrt.hpp" + + +def gen_test(test_number: int): + test_name = f"random_gen_rsqrt__{test_number:d}" + num_dims = randint(2, 4) + in_tensor = tf.constant( + tf.random.uniform([randint(3, 10) for _ in range(num_dims)]), + ).numpy() + out = tf.math.rsqrt(in_tensor).numpy() + in_t = Tensor("input", in_tensor, f"s_ref_in_{test_number:0d}") + out_ref = Tensor("out_ref", out, f"s_ref_out_{test_number:0d}") + out_t = Tensor("out", out) + op = Operator( + "RsqrtOperator", "rsqrt_op", dtypes=[lambda: "float"] + ) + op.set_namespace("uTensor::ReferenceOperators::") + op.set_inputs({"input": in_t}).set_outputs({"output": out_t}) + test = SingleOpTest(test_group, test_name, op) + test.add_tensor_comparison(out_t, out_ref, 0.001) + return test.render() + + +if __name__ == "__main__": + tests = [] + const_snippets = [] + for i in range(num_tests): + tr, cs = gen_test(i) + tests.append(tr) + const_snippets.extend(cs) + with open(const_file, "w") as fp: + c_r = env2.get_template("const_container.hpp").render( + constants=const_snippets, constants_header=const_file + ) + fp.write(c_r) + with open(output_file, "w") as fp: + gt_r = env2.get_template("gtest_container.cpp").render( + constants_header=const_file, + using_directives=["using namespace uTensor::ReferenceOperators"], + tests=tests, + ) + fp.write(gt_r) diff --git a/python/test_scripts/gen_sum.py b/python/test_scripts/gen_sum.py new file mode 100644 index 00000000..09dfa0c4 --- /dev/null +++ b/python/test_scripts/gen_sum.py @@ -0,0 +1,55 @@ +from random import randint + +import numpy as np +import tensorflow as tf +from jinja_env import Operator, SingleOpTest, Tensor, env2 + +test_group = "ReferenceSum" +num_tests = 5 +output_file = "test_sum.cpp" +const_file = "constants_sum.hpp" + + +def gen_test(test_number): + test_name = f"random_gen_reduce_sum__{test_number:d}" + num_dims = randint(2, 4) + in_tensor = tf.constant( + tf.random.uniform([randint(3, 10) for _ in range(num_dims)]), + ).numpy() + axis = np.array([randint(0, num_dims - 1)], dtype=np.int32) + out = tf.reduce_sum(in_tensor, axis=axis).numpy() + + in_t = Tensor("input", in_tensor, f"s_ref_in_{test_number:0d}") + axis_t = Tensor("axis", axis, f"s_ref_axis_{test_number:0d}") + out_ref = Tensor("out_ref", out, f"s_ref_out_{test_number:0d}") + out_t = Tensor("out", out) + + op = Operator("SumOperator", "sum_op", dtypes=[lambda: "float"]) + op.set_namespace("uTensor::ReferenceOperators::") + op.set_inputs({"input": in_t, "axis": axis_t}).set_outputs({"output": out_t}) + + test = SingleOpTest(test_group, test_name, op) + test.add_tensor_comparison(out_t, out_ref, 0.001) + test_rendered, const_snippets = test.render() + return test_rendered, const_snippets + + +if __name__ == "__main__": + tests = [] + const_snippets = [] + for i in range(num_tests): + tr, cs = gen_test(i) + tests.append(tr) + const_snippets.extend(cs) + with open(const_file, "w") as fp: + c_r = env2.get_template("const_container.hpp").render( + constants=const_snippets, constants_header=const_file + ) + fp.write(c_r) + with open(output_file, "w") as fp: + gt_r = env2.get_template("gtest_container.cpp").render( + constants_header=const_file, + using_directives=["using namespace uTensor::ReferenceOperators"], + tests=tests, + ) + fp.write(gt_r) diff --git a/src/uTensor.h b/src/uTensor.h index 2ca4e6f6..608c4567 100644 --- a/src/uTensor.h +++ b/src/uTensor.h @@ -23,6 +23,8 @@ #include "uTensor/ops/Functional.hpp" #include "uTensor/ops/Matrix.hpp" #include "uTensor/ops/Reshape.hpp" +#include "uTensor/ops/Rsqrt.hpp" +#include "uTensor/ops/Sum.hpp" #include "uTensor/ops/symmetric_quantization/QuantizeOps.hpp" #include "uTensor/ops/symmetric_quantization/convolution2d.hpp" #include "uTensor/ops/symmetric_quantization/depthwise_separable_convolution.hpp" diff --git a/src/uTensor/CMakeLists.txt b/src/uTensor/CMakeLists.txt index 8113cae5..de2c19b3 100644 --- a/src/uTensor/CMakeLists.txt +++ b/src/uTensor/CMakeLists.txt @@ -15,6 +15,7 @@ set(src_utensor_tensors set(src_utensor_ops ops/ActivationFncs.cpp ops/ActivationFncs_kernels.cpp + ops/Broadcast.cpp ops/Matrix.cpp ops/Convolution.cpp ops/Matrix_kernels.cpp diff --git a/src/uTensor/core/CMakeLists.txt b/src/uTensor/core/CMakeLists.txt index 25d309c0..245dc618 100644 --- a/src/uTensor/core/CMakeLists.txt +++ b/src/uTensor/core/CMakeLists.txt @@ -10,7 +10,7 @@ set(src_utensor_core errorHandler.cpp modelBase.cpp quantizationPrimitives.cpp - ) +) set(hdr_utensor_core types.hpp @@ -25,8 +25,8 @@ set(hdr_utensor_core errorHandler.hpp modelBase.hpp quantizationPrimitives.hpp - ) - -add_library(utensor_core ${src_utensor_core} ) +) + +add_library(utensor_core ${src_utensor_core}) target_include_directories(utensor_core PUBLIC .) target_compile_features(utensor_core PUBLIC cxx_std_11) diff --git a/src/uTensor/core/tensor.cpp b/src/uTensor/core/tensor.cpp index dd17b66e..f41e9e67 100644 --- a/src/uTensor/core/tensor.cpp +++ b/src/uTensor/core/tensor.cpp @@ -7,46 +7,46 @@ namespace uTensor { // Tensor::Tensor(const Tensor& that) {} // Cannot copy Tensors, must pass by // reference -TensorInterface* Tensor::operator->() { - return reinterpret_cast(_ptr); +TensorInterface *Tensor::operator->() { + return reinterpret_cast(_ptr); } -const TensorInterface* Tensor::operator->() const { - return reinterpret_cast(_ptr); +const TensorInterface *Tensor::operator->() const { + return reinterpret_cast(_ptr); } -TensorInterface* Tensor::operator*() { - return reinterpret_cast(_ptr); +TensorInterface *Tensor::operator*() { + return reinterpret_cast(_ptr); } Tensor::~Tensor() { free(); } void Tensor::free() { - void* ptr_t = _ptr; // unbind invalidates this handle so store a copy + void *ptr_t = _ptr; // unbind invalidates this handle so store a copy if (_ptr) { - AllocatorInterface* alloc = + AllocatorInterface *alloc = Context::get_default_context()->get_metadata_allocator(); if (alloc->is_bound(_ptr, this)) { alloc->unbind(_ptr, this); } - delete reinterpret_cast(ptr_t); + delete reinterpret_cast(ptr_t); alloc->deallocate(ptr_t); } _ptr = nullptr; } Tensor::Tensor() : Handle() {} -Tensor::Tensor(TensorInterface* ptr) : Handle((void*)ptr) { +Tensor::Tensor(TensorInterface *ptr) : Handle((void *)ptr) { // Context::get_default_context()->get_metadata_allocator()->bind(_ptr, this); if (ptr != nullptr) { bind(*this, *Context::get_default_context()->get_metadata_allocator()); } } -Tensor& Tensor::operator=(TensorInterface* ptr) { - _ptr = (void*)ptr; +Tensor &Tensor::operator=(TensorInterface *ptr) { + _ptr = (void *)ptr; bind(*this, *Context::get_default_context()->get_metadata_allocator()); // Context::get_metadata_allocator()->bind(_ptr, this); return *this; } -Tensor::Tensor(Tensor&& that) { +Tensor::Tensor(Tensor &&that) { _ptr = that._ptr; - AllocatorInterface* alloc = + AllocatorInterface *alloc = Context::get_default_context()->get_metadata_allocator(); if (alloc->is_bound(_ptr, &that)) { alloc->unbind(_ptr, &that); @@ -54,10 +54,10 @@ Tensor::Tensor(Tensor&& that) { } that._ptr = nullptr; } -Tensor& Tensor::operator=(Tensor&& that) { +Tensor &Tensor::operator=(Tensor &&that) { if (this != &that) { _ptr = that._ptr; - AllocatorInterface* alloc = + AllocatorInterface *alloc = Context::get_default_context()->get_metadata_allocator(); if (alloc->is_bound(_ptr, &that)) { alloc->unbind(_ptr, &that); @@ -70,60 +70,60 @@ Tensor& Tensor::operator=(Tensor&& that) { // Add some bits to make the interface nicer to the user // Force everything to be on the utensor allocator -void* Tensor::operator new(size_t sz) { // Have to delegate this size from - // tensors somehow + sizeof(Tensor) - void* p = +void *Tensor::operator new(size_t sz) { // Have to delegate this size from + // tensors somehow + sizeof(Tensor) + void *p = Context::get_default_context()->get_metadata_allocator()->allocate(sz); return p; } -void Tensor::operator delete(void* p) { +void Tensor::operator delete(void *p) { Context::get_default_context()->get_metadata_allocator()->deallocate(p); } // Interface const IntegralValue Tensor::operator()(uint16_t i, uint16_t j, uint16_t k, uint16_t l) const { - return reinterpret_cast(_ptr)->operator()(i, j, k, l); + return reinterpret_cast(_ptr)->operator()(i, j, k, l); } IntegralValue Tensor::operator()(uint16_t i, uint16_t j, uint16_t k, uint16_t l) { - return reinterpret_cast(_ptr)->operator()(i, j, k, l); + return reinterpret_cast(_ptr)->operator()(i, j, k, l); } const IntegralValue Tensor::operator()(uint32_t linear_index) const { - return reinterpret_cast(_ptr)->operator()(linear_index); + return reinterpret_cast(_ptr)->operator()(linear_index); } IntegralValue Tensor::operator()(uint32_t linear_index) { - return reinterpret_cast(_ptr)->operator()(linear_index); + return reinterpret_cast(_ptr)->operator()(linear_index); } -TensorShape& Tensor::get_shape() { - return reinterpret_cast(_ptr)->get_shape(); +TensorShape &Tensor::get_shape() { + return reinterpret_cast(_ptr)->get_shape(); } -const TensorShape& Tensor::get_shape() const { - return reinterpret_cast(_ptr)->get_shape(); +const TensorShape &Tensor::get_shape() const { + return reinterpret_cast(_ptr)->get_shape(); } -TensorInterface* TensorReference::operator*() { - return reinterpret_cast(_ref->operator*()); +TensorInterface *TensorReference::operator*() { + return reinterpret_cast(_ref->operator*()); } // Add a couple of bits for GDB debugging since GDB doesnt support operator() IntegralValue Tensor::gdb_read(uint16_t i) { - return reinterpret_cast(_ptr)->operator()(i); + return reinterpret_cast(_ptr)->operator()(i); } IntegralValue Tensor::gdb_read(uint16_t i, uint16_t j) { - return reinterpret_cast(_ptr)->operator()(i, j); + return reinterpret_cast(_ptr)->operator()(i, j); } IntegralValue Tensor::gdb_read(uint16_t i, uint16_t j, uint16_t k) { - return reinterpret_cast(_ptr)->operator()(i, j, k); + return reinterpret_cast(_ptr)->operator()(i, j, k); } IntegralValue Tensor::gdb_read(uint16_t i, uint16_t j, uint16_t k, uint16_t l) { - return reinterpret_cast(_ptr)->operator()(i, j, k, l); + return reinterpret_cast(_ptr)->operator()(i, j, k, l); } -void print(const Tensor& t) { - const TensorShape& t_shape = t->get_shape(); +void print(const Tensor &t) { + const TensorShape &t_shape = t->get_shape(); if (t_shape.num_dims() > 2) { uTensor_printf("printing > 2D tensors not supported\n"); return; @@ -133,30 +133,30 @@ void print(const Tensor& t) { uTensor_printf("[ "); for (int i = 0; i < t_shape[0]; i++) { switch (t->get_type()) { - case u8: - uTensor_printf("%hhu", static_cast(t(j, i))); - break; - case i8: - uTensor_printf("%hhd", static_cast(t(j, i))); - break; - case u16: - uTensor_printf("%hu", static_cast(t(j, i))); - break; - case i16: - uTensor_printf("%hd", static_cast(t(j, i))); - break; - case u32: - uTensor_printf("%u", static_cast(t(j, i))); - break; - case i32: - uTensor_printf("%d", static_cast(t(j, i))); - break; - case flt: - uTensor_printf("%f", static_cast(t(j, i))); - break; - default: - uTensor_printf("Unknown data type"); - return; + case u8: + uTensor_printf("%hhu", static_cast(t(j, i))); + break; + case i8: + uTensor_printf("%hhd", static_cast(t(j, i))); + break; + case u16: + uTensor_printf("%hu", static_cast(t(j, i))); + break; + case i16: + uTensor_printf("%hd", static_cast(t(j, i))); + break; + case u32: + uTensor_printf("%u", static_cast(t(j, i))); + break; + case i32: + uTensor_printf("%d", static_cast(t(j, i))); + break; + case flt: + uTensor_printf("%f", static_cast(t(j, i))); + break; + default: + uTensor_printf("Unknown data type"); + return; } if (i != (t_shape[0] - 1)) { uTensor_printf(", "); @@ -169,10 +169,80 @@ void print(const Tensor& t) { uTensor_printf("]\n"); } -SimpleNamedTensor::SimpleNamedTensor(const uTensor::string& name, - Tensor& tensor) +SimpleNamedTensor::SimpleNamedTensor(const uTensor::string &name, + Tensor &tensor) : name(&name), _tensor(&tensor) {} SimpleNamedTensor::SimpleNamedTensor() : name(nullptr), _tensor(nullptr) {} -Tensor& SimpleNamedTensor::tensor() { return *_tensor; } +Tensor &SimpleNamedTensor::tensor() { return *_tensor; } -} // namespace uTensor +DEFINE_ERROR(ViewDoesNotSupportResizeError); + +Slice::Slice(int32_t start, int32_t end, int32_t step) + : start_(start), end_(end), step_(step) {} + +TensorView::TensorView(Tensor &other) + : base_(other), TensorInterface(other->get_shape(), other->get_type()) {} + +void TensorView::init_(int idx, const Slice &slice) { + _starts[idx] = slice.start(); + _ends[idx] = slice.end(); + _steps[idx] = slice.step(); + _shape[idx] = (slice.end() - slice.start()) / slice.step() + 1; +} + +TensorView::TensorView(Tensor &other, const Slice &slice1) : TensorView(other) { + init_(0, slice1); +} + +TensorView::TensorView(Tensor &other, const Slice &slice1, const Slice &slice2) + : TensorView(other, slice1) { + init_(1, slice2); +} + +TensorView::TensorView(Tensor &other, const Slice &slice1, const Slice &slice2, + const Slice &slice3) + : TensorView(other, slice1, slice2) { + init_(2, slice3); +} +TensorView::TensorView(Tensor &other, const Slice &slice1, const Slice &slice2, + const Slice &slice3, const Slice &slice4) + : TensorView(other, slice1, slice2, slice3) { + init_(3, slice4); +} + +uint32_t TensorView::compute_linear_index(uint16_t i, uint16_t j, uint16_t k, + uint16_t l) const { + return base_->get_shape().linear_index( + i * _steps[0] + _starts[0], j * _steps[1] + _starts[1], + k * _steps[2] + _starts[2], l * _steps[3] + _starts[3]); +} + +void *TensorView::read(uint32_t linear_index) const { + return base_->read(linear_index); +} + +void *TensorView::write(uint32_t linear_index) { + return base_->write(linear_index); +} + +void TensorView::resize(const TensorShape &new_shape) { + Context::get_default_context()->throwError(new ViewDoesNotSupportResizeError); +} + +Tensor Tensor::view() { return Tensor(new TensorView(*this)); } +Tensor Tensor::view(const Slice &slice1) { + return Tensor(new TensorView(*this, slice1)); +} +Tensor Tensor::view(const Slice &slice1, const Slice &slice2) { + return Tensor(new TensorView(*this, slice1, slice2)); +} +Tensor Tensor::view(const Slice &slice1, const Slice &slice2, + const Slice &slice3) { + return Tensor(new TensorView(*this, slice1, slice2, slice3)); +} +Tensor Tensor::view(const Slice &slice1, const Slice &slice2, + const Slice &slice3, const Slice &slice4) { + return Tensor(new TensorView(*this, slice1, slice2, slice3, slice4)); +} + +} // namespace uTensor diff --git a/src/uTensor/core/tensor.hpp b/src/uTensor/core/tensor.hpp index a3715489..44908099 100644 --- a/src/uTensor/core/tensor.hpp +++ b/src/uTensor/core/tensor.hpp @@ -10,22 +10,29 @@ namespace uTensor { // move tensors around and delete them without affecting user code // template // -class alignas(alignof(uint8_t*)) Tensor : public Handle { - public: - TensorInterface* operator->(); - const TensorInterface* operator->() const; +class Slice; +class alignas(alignof(uint8_t *)) Tensor : public Handle { +public: + TensorInterface *operator->(); + const TensorInterface *operator->() const; // As long as operating on instantiations of this class and not pointers this // function will work - TensorInterface* operator*(); + TensorInterface *operator*(); Tensor(); - Tensor(TensorInterface* ptr); - Tensor& operator=(TensorInterface* ptr); - Tensor(Tensor&& that); - Tensor& operator=(Tensor&& that); + Tensor(TensorInterface *ptr); + Tensor &operator=(TensorInterface *ptr); + Tensor(Tensor &&that); + Tensor &operator=(Tensor &&that); ~Tensor(); void free(); + Tensor view(); + Tensor view(const Slice &slice1); + Tensor view(const Slice &slice1, const Slice &slice2); + Tensor view(const Slice &slice1, const Slice &slice2, const Slice &slice3); + Tensor view(const Slice &slice1, const Slice &slice2, const Slice &slice3, + const Slice &slice4); // Add some bits to make the interface nicer to the user const IntegralValue operator()(uint16_t i, uint16_t j, uint16_t k = 0, @@ -35,12 +42,12 @@ class alignas(alignof(uint8_t*)) Tensor : public Handle { const IntegralValue operator()(uint32_t linear_index) const; IntegralValue operator()(uint32_t linear_index); - TensorShape& get_shape(); - const TensorShape& get_shape() const; + TensorShape &get_shape(); + const TensorShape &get_shape() const; // Force everything to be on the utensor allocator - void* operator new(size_t sz); - void operator delete(void* p); + void *operator new(size_t sz); + void operator delete(void *p); // KEY BIT friend class AllocatorInterface; @@ -53,23 +60,66 @@ class alignas(alignof(uint8_t*)) Tensor : public Handle { }; // Convenience -void print(const Tensor& t); +void print(const Tensor &t); class TensorReference : public HandleReference { - public: - TensorInterface* operator*(); +public: + TensorInterface *operator*(); }; // Same as Named Tensor but not registered in the context class struct SimpleNamedTensor { - public: +public: SimpleNamedTensor(); - SimpleNamedTensor(const uTensor::string& name, Tensor& tensor); - Tensor& tensor(); - public: - const uTensor::string* name; // Fixed - private: - Tensor* _tensor; // Modifiable + SimpleNamedTensor(const uTensor::string &name, Tensor &tensor); + Tensor &tensor(); + +public: + const uTensor::string *name; // Fixed +private: + Tensor *_tensor; // Modifiable +}; + +DECLARE_ERROR(ViewDoesNotSupportResizeError); + +class Slice { +public: + Slice(int32_t start, int32_t end, int32_t step = 1); + + inline int32_t start() const { return start_; } + inline int32_t end() const { return end_; } + inline int32_t step() const { return step_; } + +private: + int32_t start_, end_, step_; +}; + +class TensorView : public TensorInterface { +public: + // NOTE: currently only support positive slicing + // TODO: support negative indices and slicing + // TODO: reshape + TensorView(Tensor &other); + TensorView(Tensor &other, const Slice &slice1); + TensorView(Tensor &other, const Slice &slice1, const Slice &slice2); + TensorView(Tensor &other, const Slice &slice1, const Slice &slice2, + const Slice &slice3); + TensorView(Tensor &other, const Slice &slice1, const Slice &slice2, + const Slice &slice3, const Slice &slice4); + +protected: + virtual void *read(uint32_t linear_index) const override; + virtual void *write(uint32_t linear_index) override; + virtual void resize(const TensorShape &new_shape) override; + virtual uint32_t compute_linear_index(uint16_t i, uint16_t j, uint16_t k = 0, + uint16_t l = 0) const override; + +private: + Tensor &base_; + int32_t _starts[4]; + int32_t _ends[4]; + int32_t _steps[4]; + void init_(int idx, const Slice &slice); }; -} // namespace uTensor +} // namespace uTensor #endif diff --git a/src/uTensor/core/tensorBase.cpp b/src/uTensor/core/tensorBase.cpp index 638be0b9..152d53df 100644 --- a/src/uTensor/core/tensorBase.cpp +++ b/src/uTensor/core/tensorBase.cpp @@ -1,7 +1,7 @@ #include "tensorBase.hpp" -#include "uTensor/core/context.hpp" #include "memoryManagementInterface.hpp" +#include "uTensor/core/context.hpp" #include "uTensor/core/uTensor_util.hpp" namespace uTensor { @@ -16,48 +16,52 @@ TensorBase::~TensorBase() { } // Allocate the tensor metadata on a different heap from the data scratch pads -void* TensorBase::operator new(size_t sz) { - void* p = +void *TensorBase::operator new(size_t sz) { + void *p = Context::get_default_context()->get_metadata_allocator()->allocate(sz); return p; } -void TensorBase::operator delete(void* p) { - if(p == nullptr){ +void TensorBase::operator delete(void *p) { + if (p == nullptr) { Context::get_default_context()->throwError(new NullTensorDeleteError); } Context::get_default_context()->get_metadata_allocator()->deallocate(p); } ttype TensorInterface::get_type() const { return _type; } -TensorShape& TensorInterface::get_shape() { return _shape; } -const TensorShape& TensorInterface::get_shape() const { return _shape; } +TensorShape &TensorInterface::get_shape() { return _shape; } +const TensorShape &TensorInterface::get_shape() const { return _shape; } uint32_t TensorInterface::num_elems() const { return _shape.num_elems(); } TensorInterface::TensorInterface() - : TensorBase(), _shape(0), _type(undefined), _type_size(0), _qnt_params(nullptr) {} + : TensorBase(), _shape(0), _type(undefined), _type_size(0), + _qnt_params(nullptr) {} TensorInterface::TensorInterface(ttype _type) : TensorBase(), _shape(0), _type(_type), _qnt_params(nullptr) { _type_size = type_size(_type); } -TensorInterface::TensorInterface(const TensorShape& _shape, ttype _type) +TensorInterface::TensorInterface(const TensorShape &_shape, ttype _type) : TensorBase(), _shape(_shape), _type(_type), _qnt_params(nullptr) { _type_size = type_size(_type); } -TensorInterface::~TensorInterface(){ -}; +TensorInterface::~TensorInterface(){}; // Can access Tensors like // mTensor(1) = 5, mTensor(2,2) = 5, etc. +uint32_t TensorInterface::compute_linear_index(uint16_t i, uint16_t j, + uint16_t k, uint16_t l) const { + return _shape.linear_index(i, j, k, l); +} const IntegralValue TensorInterface::operator()(uint16_t i, uint16_t j, uint16_t k, uint16_t l) const { // Add shape checks here - return read(_shape.linear_index(i, j, k, l)); + return read(compute_linear_index(i, j, k, l)); } IntegralValue TensorInterface::operator()(uint16_t i, uint16_t j, uint16_t k, uint16_t l) { // Add shape checks here - return write(_shape.linear_index(i, j, k, l)); + return write(compute_linear_index(i, j, k, l)); } const IntegralValue TensorInterface::operator()(uint32_t linear_index) const { // Add shape checks here @@ -68,11 +72,11 @@ IntegralValue TensorInterface::operator()(uint32_t linear_index) { return write(linear_index); } -const QuantizationParams& TensorInterface::get_quantization_params() const { +const QuantizationParams &TensorInterface::get_quantization_params() const { return *(_qnt_params.operator*()); } -size_t TensorInterface::_get_readable_block(const void*& buffer, +size_t TensorInterface::_get_readable_block(const void *&buffer, uint16_t req_read_size, uint32_t linear_index) const { uTensor_printf( @@ -81,7 +85,7 @@ size_t TensorInterface::_get_readable_block(const void*& buffer, new InvalidOptimizableTensorError()); return -1; } -size_t TensorInterface::_get_writeable_block(void*& buffer, +size_t TensorInterface::_get_writeable_block(void *&buffer, uint16_t req_write_size, uint32_t linear_index) { uTensor_printf( @@ -90,14 +94,15 @@ size_t TensorInterface::_get_writeable_block(void*& buffer, new InvalidOptimizableTensorError()); return -1; } -size_t TensorInterface::get_readable_block(const void*& buffer, uint16_t req_read_size, +size_t TensorInterface::get_readable_block(const void *&buffer, + uint16_t req_read_size, uint32_t linear_index) const { if (req_read_size > _type_size * _shape.get_linear_size()) { return -1; } return _get_readable_block(buffer, req_read_size, linear_index); } -size_t TensorInterface::get_writeable_block(void*& buffer, +size_t TensorInterface::get_writeable_block(void *&buffer, uint16_t req_write_size, uint32_t linear_index) { if (req_write_size > _type_size * _shape.get_linear_size()) { @@ -106,4 +111,4 @@ size_t TensorInterface::get_writeable_block(void*& buffer, return _get_writeable_block(buffer, req_write_size, linear_index); } -} // namespace uTensor +} // namespace uTensor diff --git a/src/uTensor/core/tensorBase.hpp b/src/uTensor/core/tensorBase.hpp index 98234cdf..d96a4745 100644 --- a/src/uTensor/core/tensorBase.hpp +++ b/src/uTensor/core/tensorBase.hpp @@ -1,7 +1,7 @@ #ifndef UTENSOR_TENSOR_BASE_H #define UTENSOR_TENSOR_BASE_H -#include "quantizationPrimitives.hpp" #include "errorHandler.hpp" +#include "quantizationPrimitives.hpp" #include "uTensor/core/types.hpp" namespace uTensor { @@ -12,33 +12,38 @@ DECLARE_ERROR(NullTensorDeleteError); * into a known memory location in the Context class */ class TensorBase { - public: +public: TensorBase(); ~TensorBase(); // Allocate the tensor metadata on a different heap from the data scratch pads // Note: as long as derived classes dont override new and delete, these will // get called correctly - void* operator new(size_t sz); - void operator delete(void* p); + void *operator new(size_t sz); + void operator delete(void *p); }; +class TensorView; // The public interface for all TensorMem types. This is the public contract for // users of tensors, handling basic data read/write, sizing, construction, // shaping, etc. class TensorInterface : public TensorBase { // DO not make these read/write calls public or Michael will smite you - protected: - virtual void* read(uint32_t linear_index) const = 0; // Handle to the data - virtual void* write(uint32_t linear_index) = 0; + friend class TensorView; + +protected: + virtual void *read(uint32_t linear_index) const = 0; // Handle to the data + virtual void *write(uint32_t linear_index) = 0; + virtual uint32_t compute_linear_index(uint16_t i, uint16_t j, uint16_t k = 0, + uint16_t l = 0) const; - public: +public: ttype get_type() const; uint32_t num_elems() const; - TensorShape& get_shape(); - const TensorShape& get_shape() const; + TensorShape &get_shape(); + const TensorShape &get_shape() const; TensorInterface(); - TensorInterface(const TensorShape& _shape, ttype _type); + TensorInterface(const TensorShape &_shape, ttype _type); TensorInterface(ttype _type); virtual ~TensorInterface(); @@ -51,12 +56,12 @@ class TensorInterface : public TensorBase { const IntegralValue operator()(uint32_t linear_index) const; IntegralValue operator()(uint32_t linear_index); - virtual void resize(const TensorShape& new_shape) = 0; - template - TensorInterface& set_quantization_params(const QType& params); - const QuantizationParams& get_quantization_params() const; + virtual void resize(const TensorShape &new_shape) = 0; + template + TensorInterface &set_quantization_params(const QType ¶ms); + const QuantizationParams &get_quantization_params() const; - private: +private: /** Optimized op interface * @param buffer pointer to data block to read from/write to in tensor managed * memory @@ -65,37 +70,36 @@ class TensorInterface : public TensorBase { * @return the size of requested block, note may not be equal to the * req_read_size/write_size */ - size_t get_readable_block(const void*& buffer, uint16_t req_read_size, + size_t get_readable_block(const void *&buffer, uint16_t req_read_size, uint32_t linear_index) const; - size_t get_writeable_block(void*& buffer, uint16_t req_write_size, + size_t get_writeable_block(void *&buffer, uint16_t req_write_size, uint32_t linear_index); friend class FastOperator; - protected: - virtual size_t _get_readable_block(const void*& buffer, uint16_t req_read_size, +protected: + virtual size_t _get_readable_block(const void *&buffer, + uint16_t req_read_size, uint32_t linear_index) const; - virtual size_t _get_writeable_block(void*& buffer, uint16_t req_write_size, + virtual size_t _get_writeable_block(void *&buffer, uint16_t req_write_size, uint32_t linear_index); - protected: +protected: TensorShape _shape; - ttype _type; // Maybe make this const + ttype _type; // Maybe make this const uint8_t _type_size; QuantizationParamsHandle _qnt_params; }; - -template -TensorInterface& TensorInterface::set_quantization_params(const QType& params){ - if(!_qnt_params){ + +template +TensorInterface &TensorInterface::set_quantization_params(const QType ¶ms) { + if (!_qnt_params) { _qnt_params = new QType(params); - } - else { - // _qnt_params = params; - // ERROR + } else { + // _qnt_params = params; + // ERROR } return *this; - } -} // namespace uTensor +} // namespace uTensor #endif diff --git a/src/uTensor/core/types.cpp b/src/uTensor/core/types.cpp index e988b463..7860edb6 100644 --- a/src/uTensor/core/types.cpp +++ b/src/uTensor/core/types.cpp @@ -147,15 +147,16 @@ uint32_t TensorShape::num_elems() const { TensorStrides::TensorStrides(TensorShape& shape) { _num_dims = shape.num_dims(); - size_t last_idx = _num_dims - 1; - for (size_t i = last_idx + 1; i < 3; ++i) { - _strides[i] = 0; - } - _strides[last_idx] = 1; + memset(_strides, 0, 4 * sizeof(uint32_t)); + _strides[_num_dims - 1] = 1; uint32_t s = 1; - for (int32_t i = last_idx - 1; i >= 0; --i) { - s *= shape[i + 1]; - _strides[i] = s; + for (int32_t i = _num_dims - 2; i >= 0; --i) { + if (shape[i + 1] == 0) { + _strides[i] = 0; + } else { + s *= shape[i + 1]; + _strides[i] = s; + } } } uint8_t TensorStrides::num_dims() { return _num_dims; } diff --git a/src/uTensor/core/types.hpp b/src/uTensor/core/types.hpp index 9745f126..2e77c89f 100644 --- a/src/uTensor/core/types.hpp +++ b/src/uTensor/core/types.hpp @@ -4,10 +4,11 @@ // https://www.arduinolibraries.info/libraries/avr_stl #include // check if the follow modificiation affect other builds -//#include -#include +// #include #include +#include + using std::array; class TensorShape { @@ -18,7 +19,7 @@ class TensorShape { TensorShape(uint16_t shape1, uint16_t shape2, uint16_t shape3, uint16_t shape4); - //FIXME: array isn't avaliable on all embedded platforms + // FIXME: array isn't avaliable on all embedded platforms TensorShape(array shape); TensorShape(array shape); TensorShape(array shape); @@ -41,6 +42,7 @@ class TensorShape { class TensorStrides { public: + TensorStrides() = default; TensorStrides(TensorShape& shape); uint8_t num_dims(); uint32_t operator[](size_t i) const; diff --git a/src/uTensor/ops/Arithmetic_kernels.hpp b/src/uTensor/ops/Arithmetic_kernels.hpp index 6af7ef3d..8238ffe7 100644 --- a/src/uTensor/ops/Arithmetic_kernels.hpp +++ b/src/uTensor/ops/Arithmetic_kernels.hpp @@ -1,5 +1,6 @@ #ifndef UTENSOR_ARITH_KERNELS_H #define UTENSOR_ARITH_KERNELS_H +#include "Broadcast.hpp" #include "uTensor/core/operatorBase.hpp" namespace uTensor { @@ -8,12 +9,22 @@ void add_kernel(Tensor& c, const Tensor& a, const Tensor& b) { // Decide on c shape TensorShape c_shape = c->get_shape(); uint32_t c_size = c_shape.get_linear_size(); - // TensorInterface& C = reinterpret_cast(*c); - // const TensorInterface& A = reinterpret_cast(*a); - // const TensorInterface& B = reinterpret_cast(*b); - for (uint32_t i = 0; i < c_size; i++) - c(i) = static_cast(static_cast(a(i)) + static_cast(b(i))); + // see if broadcast is needed + if (c_shape.num_elems() != a->get_shape().num_elems() || + c_shape.num_elems() != b->get_shape().num_elems()) { + // broadcast + Broadcaster bc; + bc.set_shape(a->get_shape(), b->get_shape(), c_shape); + for (uint32_t i = 0; i < c_size; i++) { + std::pair indices = bc.get_linear_idx(i); + c(i) = static_cast(static_cast(a(indices.first)) + + static_cast(b(indices.second))); + } + } else { + for (uint32_t i = 0; i < c_size; i++) + c(i) = static_cast(static_cast(a(i)) + static_cast(b(i))); + } } template @@ -25,8 +36,21 @@ void mul_kernel(Tensor& c, const Tensor& a, const Tensor& b) { // const TensorInterface& A = reinterpret_cast(*a); // const TensorInterface& B = reinterpret_cast(*b); - for (uint32_t i = 0; i < c_size; i++) - c(i) = static_cast(static_cast(a(i)) * static_cast(b(i))); + // see if broadcast is needed + if (c_shape.num_elems() != a->get_shape().num_elems() || + c_shape.num_elems() != b->get_shape().num_elems()) { + // broadcast + Broadcaster bc; + bc.set_shape(a->get_shape(), b->get_shape(), c_shape); + for (uint32_t i = 0; i < c_size; i++) { + std::pair indices = bc.get_linear_idx(i); + c(i) = static_cast(static_cast(a(indices.first)) * + static_cast(b(indices.second))); + } + } else { + for (uint32_t i = 0; i < c_size; i++) + c(i) = static_cast(static_cast(a(i)) * static_cast(b(i))); + } } } // namespace uTensor diff --git a/src/uTensor/ops/Broadcast.cpp b/src/uTensor/ops/Broadcast.cpp new file mode 100644 index 00000000..6ced1170 --- /dev/null +++ b/src/uTensor/ops/Broadcast.cpp @@ -0,0 +1,90 @@ +#include "Broadcast.hpp" + +#include + +Broadcaster::Broadcaster() : _output_shape(0) {} + +void Broadcaster::set_shape(const TensorShape& shape_a, + const TensorShape& shape_b) { + if (!is_broadcastable(shape_a, shape_b, _output_shape)) { + throw std::runtime_error("Shapes are not broadcastable"); + } + set_shape(shape_a, shape_b, _output_shape); +} + +/* +! Use with caution +This function is assuming that the shapes are broadcastable and the output +shape is already set correctly ! In case that the output shape is not known, use +`set_shape(const TensorShape& shape_a, const TensorShape& shape_b)` instead +*/ +void Broadcaster::set_shape(const TensorShape& shape_a, + const TensorShape& shape_b, + const TensorShape& output_shape) { + uint8_t num_dims_a = shape_a.num_dims(), num_dims_b = shape_b.num_dims(), + num_dims_c = output_shape.num_dims(); + for (uint8_t i = 0; i < num_dims_c; i++) { + _output_shape[i] = output_shape[i]; + } + _output_shape.update_dims(); + ouput_strides = TensorStrides(_output_shape); + uint32_t s_a = 1, s_b = 1; + for (uint8_t offset = 0; offset < num_dims_c; offset++) { + int c_idx = num_dims_c - offset - 1, a_idx = num_dims_a - offset - 1, + b_idx = num_dims_b - offset - 1; + if (a_idx < 0) { + _strides_a[c_idx] = 0; + } else if (shape_a[a_idx] == 1) { + _strides_a[c_idx] = 0; + } else { + _strides_a[c_idx] = s_a; + s_a *= shape_a[a_idx]; + } + if (b_idx < 0) { + _strides_b[c_idx] = 0; + } else if (shape_b[b_idx] == 1) { + _strides_b[c_idx] = 0; + } else { + _strides_b[c_idx] = s_b; + s_b *= shape_b[b_idx]; + } + } +} + +std::pair Broadcaster::get_linear_idx( + uint32_t idx_c) const { + if (idx_c >= _output_shape.get_linear_size()) { + throw std::runtime_error("Index out of bounds"); + } + uint32_t idx_a = 0, idx_b = 0; + for (uint8_t i = 0; i < _output_shape.num_dims(); i++) { + idx_a += (idx_c / ouput_strides[i]) * _strides_a[i]; + idx_b += (idx_c / ouput_strides[i]) * _strides_b[i]; + idx_c %= ouput_strides[i]; + } + return std::make_pair(idx_a, idx_b); +} + +bool is_broadcastable(const TensorShape& shape_a, const TensorShape& shape_b, + TensorShape& output_shape) { + uint8_t num_dims_a = shape_a.num_dims(), num_dims_b = shape_b.num_dims(); + uint8_t num_dims_c = std::max(num_dims_a, num_dims_b); + + // Check if the shapes are compatible + // Each tensor has at least one dimension. + // When iterating over the dimension sizes, starting at the trailing + // dimension, the dimension sizes must either be equal, one of them is 1, or + // one of them does not exist. + for (uint8_t offset = 0; offset < num_dims_c; offset++) { + int c_idx = num_dims_c - offset - 1, a_idx = num_dims_a - offset - 1, + b_idx = num_dims_b - offset - 1; + uint16_t size_a = (a_idx < 0) ? 1 : shape_a[a_idx]; + uint16_t size_b = (b_idx < 0) ? 1 : shape_b[b_idx]; + if (size_a != size_b && size_a != 1 && size_b != 1) { + return false; + } + output_shape[c_idx] = std::max(size_a, size_b); + } + output_shape.update_dims(); + return true; +} \ No newline at end of file diff --git a/src/uTensor/ops/Broadcast.hpp b/src/uTensor/ops/Broadcast.hpp new file mode 100644 index 00000000..296a135a --- /dev/null +++ b/src/uTensor/ops/Broadcast.hpp @@ -0,0 +1,31 @@ +#pragma once + +#include + +#include "uTensor/core/types.hpp" + +class Broadcaster { + public: + Broadcaster(); + void set_shape(const TensorShape& shape_a, const TensorShape& shape_b); + /* + ! Use with caution + This function is assuming that the shapes are broadcastable and the output + shape is already set correctly ! In case that the output shape is not known, + use `set_shape(const TensorShape& shape_a, const TensorShape& shape_b)` + instead + */ + void set_shape(const TensorShape& shape_a, const TensorShape& shape_b, + const TensorShape& output_shape); + std::pair get_linear_idx(uint32_t idx_c) const; + TensorShape get_output_shape() const { return _output_shape; } + + private: + TensorShape _output_shape; + TensorStrides _strides_a; + TensorStrides _strides_b; + TensorStrides ouput_strides; +}; + +bool is_broadcastable(const TensorShape& shape_a, const TensorShape& shape_b, + TensorShape& output_shape); diff --git a/src/uTensor/ops/Convolution.hpp b/src/uTensor/ops/Convolution.hpp index 4c408f4d..d77b889f 100644 --- a/src/uTensor/ops/Convolution.hpp +++ b/src/uTensor/ops/Convolution.hpp @@ -10,77 +10,94 @@ namespace uTensor { namespace ReferenceOperators { namespace Conv2dConstants { - // https://github.com/tensorflow/tensorflow/blob/28d1ad34bb59e3e1631b5807eebc46563ef3382c/tensorflow/lite/kernels/internal/reference/conv.h#L56-L57 - constexpr int input_batch_dim = 0; - constexpr int input_height_dim = 0; - constexpr int input_witdh_dim = 0; - constexpr int input_channel_dim = 0; - - constexpr int filter_height_dim = 1; - constexpr int filter_width_dim = 2; - constexpr int filter_in_channels_dim = 3; - constexpr int filter_out_channels_dim = 0; - - constexpr int output_height_dim = 1; - constexpr int output_width_dim = 2; -} +// https://github.com/tensorflow/tensorflow/blob/28d1ad34bb59e3e1631b5807eebc46563ef3382c/tensorflow/lite/kernels/internal/reference/conv.h#L56-L57 +constexpr int input_batch_dim = 0; +constexpr int input_height_dim = 0; +constexpr int input_witdh_dim = 0; +constexpr int input_channel_dim = 0; + +constexpr int filter_height_dim = 1; +constexpr int filter_width_dim = 2; +constexpr int filter_in_channels_dim = 3; +constexpr int filter_out_channels_dim = 0; + +constexpr int output_height_dim = 1; +constexpr int output_width_dim = 2; +} // namespace Conv2dConstants // Can use these intermediate types to make the convolution operator more // generic. Maxpool, conv, average pool, median etc. are all basically the same // operation with target functions. -template -class ConvFilter { +template class ConvFilter { T tmp; - const Tensor& filter; + const Tensor &filter; - public: - ConvFilter(const Tensor& filter) : tmp(0), filter(filter) {} +public: + ConvFilter(const Tensor &filter) : tmp(0), filter(filter) {} inline void reset() { tmp = 0; } - inline void PartialCompute(const T& input_value, int i, int j, int k, int l) { + inline void PartialCompute(const T &input_value, int i, int j, int k, int l) { const T filter_value = filter(i, j, k, l); tmp += (input_value * filter_value); } inline T finalize() const { return tmp; } // https://github.com/tensorflow/tensorflow/blob/28d1ad34bb59e3e1631b5807eebc46563ef3382c/tensorflow/lite/kernels/internal/reference/conv.h#L56-L57 - inline int16_t height() const { return filter->get_shape()[Conv2dConstants::filter_height_dim]; } - inline int16_t width() const { return filter->get_shape()[Conv2dConstants::filter_width_dim]; } - inline int16_t in_channels() const { return filter->get_shape()[Conv2dConstants::filter_in_channels_dim]; } - inline int16_t out_channels() const { return filter->get_shape()[Conv2dConstants::filter_out_channels_dim]; } + inline int16_t height() const { + return filter->get_shape()[Conv2dConstants::filter_height_dim]; + } + inline int16_t width() const { + return filter->get_shape()[Conv2dConstants::filter_width_dim]; + } + inline int16_t in_channels() const { + return filter->get_shape()[Conv2dConstants::filter_in_channels_dim]; + } + inline int16_t out_channels() const { + return filter->get_shape()[Conv2dConstants::filter_out_channels_dim]; + } }; // Specialization for quantization -template <> -class ConvFilter { +template <> class ConvFilter { float tmp; - const Tensor& filter; + const Tensor &filter; - public: - ConvFilter(const Tensor& filter) : tmp(0), filter(filter) {} +public: + ConvFilter(const Tensor &filter) : tmp(0), filter(filter) {} inline void reset() { tmp = 0; } - inline void PartialCompute(const float& input_value, int i, int j, int k, int l) { - const int32_t fv32 = static_cast(static_cast(filter(i, j, k, l))); - const int32_t zp = filter->get_quantization_params().get_zeroP_for_channel(i); - const float scale = filter->get_quantization_params().get_scale_for_channel(i); - const float filter_value = (fv32 - zp)*scale; + inline void PartialCompute(const float &input_value, int i, int j, int k, + int l) { + const int32_t fv32 = + static_cast(static_cast(filter(i, j, k, l))); + const int32_t zp = + filter->get_quantization_params().get_zeroP_for_channel(i); + const float scale = + filter->get_quantization_params().get_scale_for_channel(i); + const float filter_value = (fv32 - zp) * scale; tmp += (input_value * filter_value); } inline float finalize() const { return tmp; } - inline int16_t height() const { return filter->get_shape()[Conv2dConstants::filter_height_dim]; } - inline int16_t width() const { return filter->get_shape()[Conv2dConstants::filter_width_dim]; } - inline int16_t in_channels() const { return filter->get_shape()[Conv2dConstants::filter_in_channels_dim]; } - inline int16_t out_channels() const { return filter->get_shape()[Conv2dConstants::filter_out_channels_dim]; } + inline int16_t height() const { + return filter->get_shape()[Conv2dConstants::filter_height_dim]; + } + inline int16_t width() const { + return filter->get_shape()[Conv2dConstants::filter_width_dim]; + } + inline int16_t in_channels() const { + return filter->get_shape()[Conv2dConstants::filter_in_channels_dim]; + } + inline int16_t out_channels() const { + return filter->get_shape()[Conv2dConstants::filter_out_channels_dim]; + } }; -template -class MaxFilter { +template class MaxFilter { T tmp; int16_t h; int16_t w; int16_t c; - public: +public: MaxFilter(int16_t h, int16_t w, int16_t c) : h(h), w(w), c(c) {} inline void reset() { tmp = std::numeric_limits::lowest(); } - inline void PartialCompute(const T& input_value, int i, int j, int k, int l) { + inline void PartialCompute(const T &input_value, int i, int j, int k, int l) { tmp = std::max(tmp, input_value); } inline T finalize() const { return tmp; } @@ -90,17 +107,16 @@ class MaxFilter { inline int16_t out_channels() const { return c; } }; -template -class MinFilter { +template class MinFilter { T tmp; int16_t h; int16_t w; int16_t c; - public: +public: MinFilter(int16_t h, int16_t w, int16_t c) : h(h), w(w), c(c) {} inline void reset() { tmp = std::numeric_limits::max(); } - inline void PartialCompute(const T& input_value, int i, int j, int k, int l) { + inline void PartialCompute(const T &input_value, int i, int j, int k, int l) { tmp = std::min(tmp, input_value); } inline T finalize() const { return tmp; } @@ -110,108 +126,122 @@ class MinFilter { inline int16_t out_channels() const { return c; } }; -template -class AvgFilter { +template class AvgFilter { T tmp; int16_t w; int16_t h; int16_t c; - public: +public: AvgFilter(int16_t h, int16_t w, int16_t c) : h(h), w(w), c(c) {} inline void reset() { tmp = 0; } - inline void PartialCompute(const T& input_value, int i, int j, int k, int l) { + inline void PartialCompute(const T &input_value, int i, int j, int k, int l) { tmp += input_value; } - inline T finalize() const { - return tmp / (w * h); - } //(static_cast(w*h)); } + inline T finalize() const { return tmp / (w * h); } //(static_cast(w*h)); } inline int16_t height() const { return h; } inline int16_t width() const { return w; } inline int16_t in_channels() const { return 1; } inline int16_t out_channels() const { return c; } }; -template -class NoBias { - public: - T operator()(int32_t i) { return 0; } +template class NoBias { +public: + T operator()(int32_t i) { return 0; } }; -template -class wBias { - public: - wBias(const Tensor& t) : t(t) {} - T operator()(int32_t i) { return static_cast(t(i)); } +template class wBias { +public: + wBias(const Tensor &t) : t(t) {} + T operator()(int32_t i) { return static_cast(t(i)); } - private: - const Tensor& t; +private: + const Tensor &t; }; -template<> -class wBias { - public: - wBias(const Tensor& t) : t(t) {} - float operator()(int32_t i) { - const int32_t b32 = static_cast(t(i)); - const float scale = t->get_quantization_params().get_scale_for_channel(i); - const int32_t zp = t->get_quantization_params().get_zeroP_for_channel(i); - return (b32 - zp)*scale; - } +template <> class wBias { +public: + wBias(const Tensor &t) : t(t) {} + float operator()(int32_t i) { + const int32_t b32 = static_cast(t(i)); + const float scale = t->get_quantization_params().get_scale_for_channel(i); + const int32_t zp = t->get_quantization_params().get_zeroP_for_channel(i); + return (b32 - zp) * scale; + } - private: - const Tensor& t; +private: + const Tensor &t; }; -template -class Conv2dOperator : public OperatorInterface<3, 1> { - public: +template class Conv2dOperator : public OperatorInterface<3, 1> { +public: enum names_in : uint8_t { in, filter, bias }; enum names_out : uint8_t { out }; Conv2dOperator(std::initializer_list strides, Padding padding) : _padding(padding) { - for(int j = 0; j < 4; j++){ + for (int j = 0; j < 4; j++) { _stride[j] = 1; } int i = 0; - if(strides.size() == 2){ + if (strides.size() == 2) { i = 1; // Offset the stride loc } for (auto s : strides) { _stride[i++] = s; } } +#ifdef PYTHON_BINDING + Conv2dOperator(std::array strides, Padding padding) + : _padding(padding) { + for (int j = 0; j < 4; j++) { + _stride[j] = 1; + } + int i = 0; + for (auto s : strides) { + _stride[i++] = s; + } + } + Conv2dOperator(std::array strides, Padding padding) + : _padding(padding) { + for (int j = 0; j < 4; j++) { + _stride[j] = 1; + } + int i = 1; + for (auto s : strides) { + _stride[i++] = s; + } + } +#endif - protected: +protected: virtual void compute(); - private: +private: uint16_t _stride[4]; Padding _padding; }; -template -void Conv2dOperator::compute() { +template void Conv2dOperator::compute() { bool have_bias = inputs.has(bias); ConvFilter conv(inputs[filter].tensor()); - if(have_bias) { + if (have_bias) { wBias w_bias(inputs[bias].tensor()); - generic_convolution_kernel>( - outputs[out].tensor(), inputs[in].tensor(), conv, w_bias, _padding, _stride); + generic_convolution_kernel>(outputs[out].tensor(), + inputs[in].tensor(), conv, + w_bias, _padding, _stride); } else { NoBias no_bias; - generic_convolution_kernel>( - outputs[out].tensor(), inputs[in].tensor(), conv, no_bias, _padding, _stride); - + generic_convolution_kernel>(outputs[out].tensor(), + inputs[in].tensor(), conv, + no_bias, _padding, _stride); } } // Specialization for symmetric quantization -template <> -void Conv2dOperator::compute(); +template <> void Conv2dOperator::compute(); template class DepthwiseSeparableConvOperator : public OperatorInterface<3, 1> { - public: +public: enum names_in : uint8_t { in, depthwise_filter, pointwise_filter }; enum names_out : uint8_t { out }; @@ -225,12 +255,12 @@ class DepthwiseSeparableConvOperator : public OperatorInterface<3, 1> { } } - protected: +protected: virtual void compute() { - TensorShape& in_shape = inputs[in].tensor()->get_shape(); - TensorShape& df_shape = inputs[depthwise_filter].tensor()->get_shape(); - TensorShape& pf_shape = inputs[pointwise_filter].tensor()->get_shape(); - TensorShape& out_shape = outputs[out].tensor()->get_shape(); + TensorShape &in_shape = inputs[in].tensor()->get_shape(); + TensorShape &df_shape = inputs[depthwise_filter].tensor()->get_shape(); + TensorShape &pf_shape = inputs[pointwise_filter].tensor()->get_shape(); + TensorShape &out_shape = outputs[out].tensor()->get_shape(); if (in_shape[3] != df_shape[2]) { Context::get_default_context()->throwError( @@ -246,14 +276,14 @@ class DepthwiseSeparableConvOperator : public OperatorInterface<3, 1> { _padding, _stride); } - private: +private: uint16_t _stride[4]; Padding _padding; }; template class GenericPoolOperator : public OperatorInterface<1, 1> { - public: +public: enum names_in : uint8_t { in }; enum names_out : uint8_t { out }; @@ -271,15 +301,31 @@ class GenericPoolOperator : public OperatorInterface<1, 1> { } } - protected: +// constructor for python binding (pybind11) +#ifdef PYTHON_BINDING + GenericPoolOperator(std::array k_size, + std::array strides, Padding padding) + : _padding(padding) { + int i = 0; + for (auto s : strides) { + _stride[i++] = s; + } + i = 0; + for (auto k : k_size) { + _k_size[i++] = k; + } + } +#endif + +protected: virtual void compute() { - TensorShape& in_shape = inputs[in].tensor()->get_shape(); + TensorShape &in_shape = inputs[in].tensor()->get_shape(); Filter filter(_k_size[0], _k_size[1], in_shape[3]); generic_pool_convolution_kernel( outputs[out].tensor(), inputs[in].tensor(), filter, _padding, _stride); } - private: +private: uint16_t _k_size[2]; uint16_t _stride[4]; Padding _padding; @@ -291,9 +337,9 @@ using MaxPoolOperator = GenericPoolOperator>; template using AvgPoolOperator = GenericPoolOperator>; -template +template using MinPoolOperator = GenericPoolOperator>; -} -} // namespace uTensor +} // namespace ReferenceOperators +} // namespace uTensor #endif diff --git a/src/uTensor/ops/Convolution_kernels.hpp b/src/uTensor/ops/Convolution_kernels.hpp index 60ab7133..ee6ffcb1 100644 --- a/src/uTensor/ops/Convolution_kernels.hpp +++ b/src/uTensor/ops/Convolution_kernels.hpp @@ -1,7 +1,6 @@ #ifndef UTENSOR_CONVOLUTION_KERNELS_H #define UTENSOR_CONVOLUTION_KERNELS_H #include -#include #include "uTensor/core/operatorBase.hpp" @@ -9,10 +8,19 @@ namespace uTensor { enum Padding : uint8_t { UNKNOWN = 0, VALID = 1, SAME = 2 }; +// Matches TF's behavior, ref: +// https://github.com/tensorflow/tensorflow/blob/6ea11589562f64a404ab74b1df9eba33f1fad83f/tensorflow/core/framework/kernel_shape_util.cc#L23 +inline int get_filter_offset(const Padding padding, const int out_size, + const int filter_size, const int in_size, + const int stride) { + if (padding == VALID) return 0; + int pad_size = std::max((out_size - 1) * stride + filter_size - in_size, 0); + return pad_size / 2; +} + template void generic_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, - Bias bias, - const Padding padding, + Bias bias, const Padding padding, const uint16_t (&strides)[4]) { const TensorShape& in_shape = in->get_shape(); @@ -31,28 +39,11 @@ void generic_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, // Compute for now, but should assume codegen does this int16_t out_rows = out->get_shape()[1]; int16_t out_cols = out->get_shape()[2]; - if (padding == VALID) { - // out_rows = (input_rows - filter_rows) / stride_rows + 1; - // out_cols = (input_cols - filter_cols) / stride_cols + 1; - } else { - // SAME - // out_rows = input_rows; - // out_cols = input_cols; - } - // When we're converting the 32 bit accumulator to a lower bit depth, we - int filter_left_offset; - int filter_top_offset; - if (padding == VALID) { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols + 1) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows + 1) / 2; - } else { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows) / 2; - } + + int filter_left_offset = get_filter_offset(padding, out_cols, filter_cols, + input_cols, stride_cols); + int filter_top_offset = get_filter_offset(padding, out_rows, filter_rows, + input_rows, stride_rows); // If we've got multiple images in our input, work through each of them. for (int batch = 0; batch < input_batches; ++batch) { @@ -90,8 +81,8 @@ void generic_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, // filter_x * input_depth * filter_count + // in_channel * filter_count + out_channel; // const T filter_value = filter(filter_index); - filter.PartialCompute(input_value, out_channel, filter_y, filter_x, - in_channel); + filter.PartialCompute(input_value, out_channel, filter_y, + filter_x, in_channel); } } } @@ -101,7 +92,8 @@ void generic_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, (out_y * out_cols * filter_count) + (out_x * filter_count) + out_channel) = output_val; */ - out(batch, out_y, out_x, out_channel) = filter.finalize() + bias(out_channel); + out(batch, out_y, out_x, out_channel) = + filter.finalize() + bias(out_channel); } } } @@ -109,11 +101,9 @@ void generic_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, } template -void generic_sq_convolution_kernel( - Tensor& out, const Tensor& in, Filter filter, - Bias bias, - const Padding padding, - const uint16_t (&strides)[4]) { +void generic_sq_convolution_kernel(Tensor& out, const Tensor& in, Filter filter, + Bias bias, const Padding padding, + const uint16_t (&strides)[4]) { const TensorShape& in_shape = in->get_shape(); const int16_t input_depth = in_shape[3]; @@ -131,28 +121,11 @@ void generic_sq_convolution_kernel( // Compute for now, but should assume codegen does this int16_t out_rows = out->get_shape()[1]; int16_t out_cols = out->get_shape()[2]; - if (padding == VALID) { - // out_rows = (input_rows - filter_rows) / stride_rows + 1; - // out_cols = (input_cols - filter_cols) / stride_cols + 1; - } else { - // SAME - // out_rows = input_rows; - // out_cols = input_cols; - } - // When we're converting the 32 bit accumulator to a lower bit depth, we - int filter_left_offset; - int filter_top_offset; - if (padding == VALID) { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols + 1) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows + 1) / 2; - } else { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows) / 2; - } + + int filter_left_offset = get_filter_offset(padding, out_cols, filter_cols, + input_cols, stride_cols); + int filter_top_offset = get_filter_offset(padding, out_rows, filter_rows, + input_rows, stride_rows); // If we've got multiple images in our input, work through each of them. for (int batch = 0; batch < input_batches; ++batch) { @@ -181,10 +154,15 @@ void generic_sq_convolution_kernel( input_depth + in_channel; input_value = in((uint32_t)input_index); */ - const int32_t iv8 = static_cast(in(batch, in_y, in_x, in_channel)); - const float scale = in->get_quantization_params().get_scale_for_channel(in_channel); - const int32_t zp = in->get_quantization_params().get_zeroP_for_channel(in_channel); - input_value = (iv8 - zp)*scale; + const int32_t iv8 = + static_cast(in(batch, in_y, in_x, in_channel)); + const float scale = + in->get_quantization_params().get_scale_for_channel( + in_channel); + const int32_t zp = + in->get_quantization_params().get_zeroP_for_channel( + in_channel); + input_value = (iv8 - zp) * scale; } else { input_value = 0; } @@ -193,8 +171,8 @@ void generic_sq_convolution_kernel( // filter_x * input_depth * filter_count + // in_channel * filter_count + out_channel; // const T filter_value = filter(filter_index); - filter.PartialCompute(input_value, out_channel, filter_y, filter_x, - in_channel); + filter.PartialCompute(input_value, out_channel, filter_y, + filter_x, in_channel); } } } @@ -205,10 +183,14 @@ void generic_sq_convolution_kernel( (out_x * filter_count) + out_channel) = output_val; */ const float out_val = filter.finalize() + bias(out_channel); - const float oscale = out->get_quantization_params().get_scale_for_channel(out_channel); - const int32_t ozp = out->get_quantization_params().get_zeroP_for_channel(out_channel); - const int32_t otmp = static_cast(out_val/oscale) + ozp; - const int8_t out8 = (otmp < -127 ) ? -128 : (otmp > 127) ? 127 : static_cast(otmp); + const float oscale = + out->get_quantization_params().get_scale_for_channel(out_channel); + const int32_t ozp = + out->get_quantization_params().get_zeroP_for_channel(out_channel); + const int32_t otmp = static_cast(out_val / oscale) + ozp; + const int8_t out8 = (otmp < -127) ? -128 + : (otmp > 127) ? 127 + : static_cast(otmp); out(batch, out_y, out_x, out_channel) = out8; } } @@ -237,36 +219,11 @@ void generic_pool_convolution_kernel(Tensor& out, const Tensor& in, // Compute for now, but should assume codegen does this int16_t out_rows = out->get_shape()[1]; int16_t out_cols = out->get_shape()[2]; - if (padding == VALID) { - // out_rows = (input_rows - filter_rows) / stride_rows + 1; - // out_cols = (input_cols - filter_cols) / stride_cols + 1; - } else { - // SAME - // out_rows = input_rows; - // out_cols = input_cols; - } - // When we're converting the 32 bit accumulator to a lower bit depth, we - int filter_left_offset; - int filter_top_offset; - if (padding == VALID) { - // filter_left_offset = - // ((out_cols - 1) * stride_cols + filter_cols - input_cols + 1) / 2; - // filter_top_offset = - // ((out_rows - 1) * stride_rows + filter_rows - input_rows + 1) / 2; - filter_left_offset = - (((input_cols - filter_cols) / stride_cols) * stride_cols + - filter_cols - input_cols + 1) / - 2; - filter_top_offset = - (((input_rows - filter_rows) / stride_rows) * stride_rows + - filter_rows - input_rows + 1) / - 2; - } else { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows) / 2; - } + + int filter_left_offset = get_filter_offset(padding, out_cols, filter_cols, + input_cols, stride_cols); + int filter_top_offset = get_filter_offset(padding, out_rows, filter_rows, + input_rows, stride_rows); // If we've got multiple images in our input, work through each of them. for (int batch = 0; batch < input_batches; ++batch) { @@ -345,28 +302,11 @@ void convolution_kernel(Tensor& out, const Tensor& in, const Tensor& filter, // Compute for now, but should assume codegen does this int16_t out_rows = out->get_shape()[1]; int16_t out_cols = out->get_shape()[2]; - if (padding == VALID) { - // out_rows = (input_rows - filter_rows) / stride_rows + 1; - // out_cols = (input_cols - filter_cols) / stride_cols + 1; - } else { - // SAME - // out_rows = input_rows; - // out_cols = input_cols; - } - // When we're converting the 32 bit accumulator to a lower bit depth, we - int filter_left_offset; - int filter_top_offset; - if (padding == VALID) { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols + 1) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows + 1) / 2; - } else { - filter_left_offset = - ((out_cols - 1) * stride_cols + filter_cols - input_cols) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + filter_rows - input_rows) / 2; - } + + int filter_left_offset = get_filter_offset(padding, out_cols, filter_cols, + input_cols, stride_cols); + int filter_top_offset = get_filter_offset(padding, out_rows, filter_rows, + input_rows, stride_rows); // If we've got multiple images in our input, work through each of them. for (int batch = 0; batch < input_batches; ++batch) { @@ -449,28 +389,11 @@ void depthwise_separable_convolution_kernel(Tensor& out, const Tensor& in, // Compute for now, but should assume codegen does this int16_t out_rows = out->get_shape()[1]; int16_t out_cols = out->get_shape()[2]; - if (padding == VALID) { - // out_rows = (input_rows - filter_rows) / stride_rows + 1; - // out_cols = (input_cols - filter_cols) / stride_cols + 1; - } else { - // SAME - // out_rows = input_rows; - // out_cols = input_cols; - } - // When we're converting the 32 bit accumulator to a lower bit depth, we - int filter_left_offset; - int filter_top_offset; - if (padding == VALID) { - filter_left_offset = - ((out_cols - 1) * stride_cols + dw_filter_cols - input_cols + 1) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + dw_filter_rows - input_rows + 1) / 2; - } else { - filter_left_offset = - ((out_cols - 1) * stride_cols + dw_filter_cols - input_cols) / 2; - filter_top_offset = - ((out_rows - 1) * stride_rows + dw_filter_rows - input_rows) / 2; - } + + int filter_left_offset = get_filter_offset(padding, out_cols, dw_filter_cols, + input_cols, stride_cols); + int filter_top_offset = get_filter_offset(padding, out_rows, dw_filter_rows, + input_rows, stride_rows); // If we've got multiple images in our input, work through each of them. for (int batch = 0; batch < input_batches; ++batch) { diff --git a/src/uTensor/ops/Rsqrt.hpp b/src/uTensor/ops/Rsqrt.hpp new file mode 100644 index 00000000..a4123624 --- /dev/null +++ b/src/uTensor/ops/Rsqrt.hpp @@ -0,0 +1,32 @@ +#ifndef UTENSOR_RSQRT_H +#define UTENSOR_RSQRT_H +#include + +#include "uTensor/core/operatorBase.hpp" +#include "uTensor/core/tensor.hpp" +#include "uTensor/core/types.hpp" + +namespace uTensor { +namespace ReferenceOperators { + +template +class RsqrtOperator : public OperatorInterface<1, 1> { + public: + enum names_in : uint8_t { input }; + enum names_out : uint8_t { output }; + + protected: + void compute() { + Tensor &inputT = inputs[input].tensor(); + Tensor &outputT = outputs[output].tensor(); + for (uint32_t i = 0; i < outputT->num_elems(); ++i) { + Tin v = static_cast(inputT(i)); + Tin one = 1; + Tin sqrt = std::sqrt(v); + outputT(i) = static_cast(one / sqrt); + } + } +}; +} // namespace ReferenceOperators +} // namespace uTensor +#endif // UTENSOR_RSQRT_H \ No newline at end of file diff --git a/src/uTensor/ops/Sum.hpp b/src/uTensor/ops/Sum.hpp new file mode 100644 index 00000000..08353502 --- /dev/null +++ b/src/uTensor/ops/Sum.hpp @@ -0,0 +1,55 @@ +#ifndef UTENSOR_SUM_H +#define UTENSOR_SUM_H + +#include "uTensor/core/operatorBase.hpp" +#include "uTensor/core/tensor.hpp" +#include "uTensor/core/types.hpp" + +namespace uTensor { +namespace ReferenceOperators { +template +class SumOperator : public OperatorInterface<2, 1> { + public: + enum names_in : uint8_t { input, axis }; + enum names_out : uint8_t { output }; + + virtual void compute() { + const Tensor &input_tensor = inputs[input].tensor(); + const Tensor &axis_tensor = inputs[axis].tensor(); + Tensor &output_tensor = outputs[output].tensor(); + if (axis_tensor->get_type() != i32) { + uTensor_printf("only support i32 typed axis tensor\n"); + Context::get_default_context()->throwError(new InvalidTensorError); + return; + } + TensorShape input_shape = input_tensor->get_shape(); + int num_dims = input_shape.num_dims(); + int32_t axis_dim = axis_tensor(0); + if (axis_dim < 0) axis_dim += num_dims; + uint16_t axis_size = input_shape[axis_dim]; + uint32_t outer_size = 1; + for (int i = 0; i < axis_dim; ++i) { + outer_size *= input_shape[i]; + } + uint32_t inner_size = 1; + for (int i = axis_dim + 1; i < num_dims; ++i) { + inner_size *= input_shape[i]; + } + for (uint32_t outer = 0; outer < outer_size; ++outer) { + for (uint32_t inner = 0; inner < inner_size; ++inner) { + Tin acc = 0; + for (uint32_t i = 0; i < axis_size; ++i) { + Tin elem = static_cast( + input_tensor((outer * axis_size + i) * inner_size + inner)); + acc += elem; + } + output_tensor(outer * inner_size + inner) = acc; + } + } + } +}; + +} // namespace ReferenceOperators +} // namespace uTensor + +#endif // UTENSOR_SUM_H \ No newline at end of file