mlonmcu 0.3.0.dev0__3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mlonmcu/__init__.py +26 -0
- mlonmcu/artifact.py +172 -0
- mlonmcu/cli/__init__.py +19 -0
- mlonmcu/cli/build.py +119 -0
- mlonmcu/cli/cleanup.py +75 -0
- mlonmcu/cli/common.py +227 -0
- mlonmcu/cli/compile.py +87 -0
- mlonmcu/cli/env.py +68 -0
- mlonmcu/cli/export.py +93 -0
- mlonmcu/cli/flow.py +67 -0
- mlonmcu/cli/helper/__init__.py +18 -0
- mlonmcu/cli/helper/filter.py +25 -0
- mlonmcu/cli/helper/parse.py +159 -0
- mlonmcu/cli/init.py +130 -0
- mlonmcu/cli/load.py +87 -0
- mlonmcu/cli/main.py +116 -0
- mlonmcu/cli/models.py +48 -0
- mlonmcu/cli/run.py +56 -0
- mlonmcu/cli/setup.py +136 -0
- mlonmcu/cli/tune.py +48 -0
- mlonmcu/config.py +219 -0
- mlonmcu/context/__init__.py +22 -0
- mlonmcu/context/context.py +545 -0
- mlonmcu/context/read_write_filelock.py +327 -0
- mlonmcu/environment/__init__.py +18 -0
- mlonmcu/environment/config.py +214 -0
- mlonmcu/environment/environment.py +501 -0
- mlonmcu/environment/init.py +191 -0
- mlonmcu/environment/list.py +81 -0
- mlonmcu/environment/loader.py +250 -0
- mlonmcu/environment/templates.py +69 -0
- mlonmcu/environment/writer.py +117 -0
- mlonmcu/feature/__init__.py +18 -0
- mlonmcu/feature/feature.py +230 -0
- mlonmcu/feature/features.py +1537 -0
- mlonmcu/feature/type.py +33 -0
- mlonmcu/flow/__init__.py +61 -0
- mlonmcu/flow/backend.py +234 -0
- mlonmcu/flow/framework.py +69 -0
- mlonmcu/flow/tflm/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/__init__.py +23 -0
- mlonmcu/flow/tflm/backend/backend.py +47 -0
- mlonmcu/flow/tflm/backend/tflmc.py +129 -0
- mlonmcu/flow/tflm/backend/tflmi.py +385 -0
- mlonmcu/flow/tflm/framework.py +81 -0
- mlonmcu/flow/tvm/__init__.py +23 -0
- mlonmcu/flow/tvm/backend/__init__.py +26 -0
- mlonmcu/flow/tvm/backend/backend.py +282 -0
- mlonmcu/flow/tvm/backend/model_info.py +307 -0
- mlonmcu/flow/tvm/backend/python_utils.py +36 -0
- mlonmcu/flow/tvm/backend/tuner.py +41 -0
- mlonmcu/flow/tvm/backend/tvmaot.py +162 -0
- mlonmcu/flow/tvm/backend/tvmaotplus.py +51 -0
- mlonmcu/flow/tvm/backend/tvmc_utils.py +172 -0
- mlonmcu/flow/tvm/backend/tvmcg.py +102 -0
- mlonmcu/flow/tvm/backend/tvmllvm.py +106 -0
- mlonmcu/flow/tvm/backend/tvmrt.py +151 -0
- mlonmcu/flow/tvm/backend/wrapper.py +645 -0
- mlonmcu/flow/tvm/framework.py +96 -0
- mlonmcu/logging.py +79 -0
- mlonmcu/mlonmcu.py +19 -0
- mlonmcu/models/__init__.py +31 -0
- mlonmcu/models/convert_data.py +107 -0
- mlonmcu/models/frontend.py +571 -0
- mlonmcu/models/group.py +29 -0
- mlonmcu/models/lookup.py +345 -0
- mlonmcu/models/metadata.py +133 -0
- mlonmcu/models/model.py +104 -0
- mlonmcu/models/options.py +64 -0
- mlonmcu/models/utils.py +136 -0
- mlonmcu/platform/__init__.py +27 -0
- mlonmcu/platform/_platform.py +46 -0
- mlonmcu/platform/espidf/__init__.py +25 -0
- mlonmcu/platform/espidf/espidf.py +489 -0
- mlonmcu/platform/espidf/espidf_target.py +257 -0
- mlonmcu/platform/lookup.py +126 -0
- mlonmcu/platform/microtvm/__init__.py +25 -0
- mlonmcu/platform/microtvm/microtvm.py +580 -0
- mlonmcu/platform/microtvm/microtvm_arduino_target.py +68 -0
- mlonmcu/platform/microtvm/microtvm_backend.py +64 -0
- mlonmcu/platform/microtvm/microtvm_espidf_target.py +94 -0
- mlonmcu/platform/microtvm/microtvm_etissvp_target.py +98 -0
- mlonmcu/platform/microtvm/microtvm_host_target.py +46 -0
- mlonmcu/platform/microtvm/microtvm_spike_target.py +230 -0
- mlonmcu/platform/microtvm/microtvm_target.py +189 -0
- mlonmcu/platform/microtvm/microtvm_template_target.py +55 -0
- mlonmcu/platform/microtvm/microtvm_zephyr_target.py +91 -0
- mlonmcu/platform/mlif/__init__.py +25 -0
- mlonmcu/platform/mlif/mlif.py +300 -0
- mlonmcu/platform/mlif/mlif_target.py +86 -0
- mlonmcu/platform/platform.py +244 -0
- mlonmcu/platform/tvm/__init__.py +25 -0
- mlonmcu/platform/tvm/tvm.py +429 -0
- mlonmcu/platform/tvm/tvm_backend.py +57 -0
- mlonmcu/platform/tvm/tvm_target.py +165 -0
- mlonmcu/platform/zephyr/__init__.py +25 -0
- mlonmcu/platform/zephyr/zephyr.py +450 -0
- mlonmcu/platform/zephyr/zephyr_target.py +110 -0
- mlonmcu/plugins.py +26 -0
- mlonmcu/report.py +99 -0
- mlonmcu/session/__init__.py +18 -0
- mlonmcu/session/postprocess/__init__.py +43 -0
- mlonmcu/session/postprocess/postprocess.py +62 -0
- mlonmcu/session/postprocess/postprocesses.py +487 -0
- mlonmcu/session/run.py +1008 -0
- mlonmcu/session/session.py +373 -0
- mlonmcu/setup/__init__.py +18 -0
- mlonmcu/setup/cache.py +147 -0
- mlonmcu/setup/gen_requirements.py +619 -0
- mlonmcu/setup/setup.py +285 -0
- mlonmcu/setup/task.py +380 -0
- mlonmcu/setup/tasks/__init__.py +40 -0
- mlonmcu/setup/tasks/arm_gcc.py +58 -0
- mlonmcu/setup/tasks/cmsisnn.py +151 -0
- mlonmcu/setup/tasks/common.py +36 -0
- mlonmcu/setup/tasks/corstone300.py +64 -0
- mlonmcu/setup/tasks/espidf.py +87 -0
- mlonmcu/setup/tasks/etiss.py +147 -0
- mlonmcu/setup/tasks/llvm.py +67 -0
- mlonmcu/setup/tasks/mlif.py +49 -0
- mlonmcu/setup/tasks/muriscvnn.py +166 -0
- mlonmcu/setup/tasks/pulp.py +192 -0
- mlonmcu/setup/tasks/riscv_gcc.py +146 -0
- mlonmcu/setup/tasks/spike.py +190 -0
- mlonmcu/setup/tasks/tf.py +92 -0
- mlonmcu/setup/tasks/tflite.py +59 -0
- mlonmcu/setup/tasks/tflmc.py +141 -0
- mlonmcu/setup/tasks/tvm.py +172 -0
- mlonmcu/setup/tasks/utvmcg.py +96 -0
- mlonmcu/setup/tasks/zephyr.py +119 -0
- mlonmcu/setup/utils.py +374 -0
- mlonmcu/target/__init__.py +37 -0
- mlonmcu/target/_target.py +41 -0
- mlonmcu/target/arm/__init__.py +3 -0
- mlonmcu/target/arm/corstone300.py +235 -0
- mlonmcu/target/arm/util.py +109 -0
- mlonmcu/target/common.py +194 -0
- mlonmcu/target/elf.py +256 -0
- mlonmcu/target/host_x86.py +84 -0
- mlonmcu/target/metrics.py +75 -0
- mlonmcu/target/riscv/__init__.py +7 -0
- mlonmcu/target/riscv/etiss_pulpino.py +462 -0
- mlonmcu/target/riscv/gvsoc_pulp.py +215 -0
- mlonmcu/target/riscv/ovpsim.py +301 -0
- mlonmcu/target/riscv/riscv.py +185 -0
- mlonmcu/target/riscv/riscv_qemu.py +166 -0
- mlonmcu/target/riscv/spike.py +243 -0
- mlonmcu/target/riscv/util.py +134 -0
- mlonmcu/target/target.py +200 -0
- mlonmcu/utils.py +49 -0
- mlonmcu/version.py +21 -0
- mlonmcu-0.3.0.dev0.dist-info/LICENSE +202 -0
- mlonmcu-0.3.0.dev0.dist-info/METADATA +343 -0
- mlonmcu-0.3.0.dev0.dist-info/NOTICE +8 -0
- mlonmcu-0.3.0.dev0.dist-info/RECORD +376 -0
- mlonmcu-0.3.0.dev0.dist-info/WHEEL +5 -0
- mlonmcu-0.3.0.dev0.dist-info/entry_points.txt +3 -0
- mlonmcu-0.3.0.dev0.dist-info/top_level.txt +1 -0
- resources/frameworks/tvm/crt_config/README.md +7 -0
- resources/frameworks/tvm/crt_config/crt_config.h +53 -0
- resources/frameworks/tvm/tuning_records/riscv_cpu_v0.01.log.best +46 -0
- resources/patches/fix_esp32c3_march.patch +20 -0
- resources/patches/pulp_freertos_support.patch +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/CMakeLists.txt +29 -0
- resources/platforms/espidf/micro_speech_esp32devboard/README.md +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/CMakeLists.txt +78 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/Kconfig +76 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_data.c +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/exit.h +26 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/ml_interface.h +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/include/printing.h +31 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface.c +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tflm.cc +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/mlif2/ml_interface_tvm.c +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/CMakeLists.txt +140 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/micro_speech_esp32devboard/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/micro_speech_esp32devboard/example_test.py +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/info.txt +9 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/CMakeLists.txt +58 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.cc +193 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/audio_provider.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.cc +53 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/command_responder.h +35 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc +132 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.cc.orig +145 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/feature_provider.h +55 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/COPYING +11 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/_kiss_fft_guts.h +168 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.c +408 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/kiss_fft.h +124 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.c +159 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/kissfft/tools/kiss_fftr.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main.cc +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.cc +204 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/main_functions.h +37 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.cc +121 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_features_generator.h +38 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.cc +23 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/micro_model_settings.h +43 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/bits.h +102 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.cc +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.cc +69 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/fft_util.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.c +134 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank.h +63 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.c +220 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/filterbank_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.c +72 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend.h +64 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.c +85 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/frontend_util.h +52 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_common.h +48 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.cc +8 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/kiss_fft_int16.h +34 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.c +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_lut.h +40 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.c +83 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale.h +39 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.c +27 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/log_scale_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.c +51 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction.h +46 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.c +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/noise_reduction_util.h +50 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.c +56 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control.h +47 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.c +92 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/pcan_gain_control_util.h +57 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.c +70 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window.h +49 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.c +73 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/microfrontend/lib/window_util.h +45 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.c +14 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/pins.h +30 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.cc +150 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/recognize_commands.h +173 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.c +333 -0
- resources/platforms/espidf/micro_speech_esp32devboard/main/ringbuf.h +74 -0
- resources/platforms/espidf/micro_speech_esp32devboard/sdkconfig.defaults +36 -0
- resources/platforms/espidf/project/CMakeLists.txt +29 -0
- resources/platforms/espidf/project/README.md +70 -0
- resources/platforms/espidf/project/components/mlif/CMakeLists.txt +77 -0
- resources/platforms/espidf/project/components/mlif/Kconfig +76 -0
- resources/platforms/espidf/project/components/mlif/default_data.c +26 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_input.c +35 -0
- resources/platforms/espidf/project/components/mlif/default_model_support/process_output.c +45 -0
- resources/platforms/espidf/project/components/mlif/include/exit.h +26 -0
- resources/platforms/espidf/project/components/mlif/include/ml_interface.h +60 -0
- resources/platforms/espidf/project/components/mlif/include/printing.h +31 -0
- resources/platforms/espidf/project/components/mlif/ml_interface.c +54 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tflm.cc +40 -0
- resources/platforms/espidf/project/components/mlif/ml_interface_tvm.c +40 -0
- resources/platforms/espidf/project/components/tflite-lib/CMakeLists.txt +142 -0
- resources/platforms/espidf/project/components/tflite-lib/Kconfig +8 -0
- resources/platforms/espidf/project/components/tvm-lib/CMakeLists.txt +66 -0
- resources/platforms/espidf/project/components/tvm-lib/Kconfig +7 -0
- resources/platforms/espidf/project/example_test.py +38 -0
- resources/platforms/espidf/project/main/CMakeLists.txt +25 -0
- resources/platforms/espidf/project/main/main.c +57 -0
- resources/platforms/espidf/project/sdkconfig.defaults +26 -0
- resources/platforms/zephyr/project/CMakeLists.txt +22 -0
- resources/platforms/zephyr/project/Kconfig +101 -0
- resources/platforms/zephyr/project/README.rst +33 -0
- resources/platforms/zephyr/project/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/CMakeLists.txt +31 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_data.c +8 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project/lib/ml_interface/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.c +36 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface.h +47 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project/lib/ml_interface/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project/prj.conf +11 -0
- resources/platforms/zephyr/project/sample.yaml +19 -0
- resources/platforms/zephyr/project/src/main.c +71 -0
- resources/platforms/zephyr/project2/CMakeLists.txt +72 -0
- resources/platforms/zephyr/project2/Kconfig +101 -0
- resources/platforms/zephyr/project2/README.rst +33 -0
- resources/platforms/zephyr/project2/cmake/AddAllSubdirs.cmake +21 -0
- resources/platforms/zephyr/project2/cmake/ChooseTarget.cmake +22 -0
- resources/platforms/zephyr/project2/cmake/LinkTFLite.cmake +223 -0
- resources/platforms/zephyr/project2/cmake/LinkTVM.cmake +68 -0
- resources/platforms/zephyr/project2/cmake/LookupClang.cmake +41 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmc.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tflmi.cmake +5 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaot.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmaotplus.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmcg.cmake +10 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmllvm.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/backends/tvmrt.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/extras.cmake +9 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_gcc.cmake +65 -0
- resources/platforms/zephyr/project2/cmake/features/auto_vectorize_llvm.cmake +20 -0
- resources/platforms/zephyr/project2/cmake/features/cmsisnn.cmake +86 -0
- resources/platforms/zephyr/project2/cmake/features/muriscvnn.cmake +87 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tflm_mlif.cmake +8 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm.cmake +1 -0
- resources/platforms/zephyr/project2/cmake/frameworks/tvm_mlif.cmake +37 -0
- resources/platforms/zephyr/project2/default_data.c +8 -0
- resources/platforms/zephyr/project2/default_model_support/CMakeLists.txt +3 -0
- resources/platforms/zephyr/project2/default_model_support/process_input.c +17 -0
- resources/platforms/zephyr/project2/default_model_support/process_output.c +27 -0
- resources/platforms/zephyr/project2/lib/CMakeLists.txt +13 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.c +10 -0
- resources/platforms/zephyr/project2/lib/drivers/fake_input.h +8 -0
- resources/platforms/zephyr/project2/lib/support/CMakeLists.txt +2 -0
- resources/platforms/zephyr/project2/lib/support/dummy.c +0 -0
- resources/platforms/zephyr/project2/lib/support/exit.h +8 -0
- resources/platforms/zephyr/project2/lib/support/printing.h +11 -0
- resources/platforms/zephyr/project2/lib/support/quantize.h +23 -0
- resources/platforms/zephyr/project2/lib/targets/corstone300.c +62 -0
- resources/platforms/zephyr/project2/lib/targets/default.c +2 -0
- resources/platforms/zephyr/project2/lib/targets/etiss_pulpino.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/generic_riscv.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/riscv_qemu.c +112 -0
- resources/platforms/zephyr/project2/lib/targets/target.h +2 -0
- resources/platforms/zephyr/project2/ml_interface.c +36 -0
- resources/platforms/zephyr/project2/ml_interface.h +47 -0
- resources/platforms/zephyr/project2/ml_interface_tflm.cc +22 -0
- resources/platforms/zephyr/project2/ml_interface_tvm.c +22 -0
- resources/platforms/zephyr/project2/prj.conf +13 -0
- resources/platforms/zephyr/project2/sample.yaml +19 -0
- resources/platforms/zephyr/project2/settings.json +6 -0
- resources/platforms/zephyr/project2/src/main.c +35 -0
- resources/pycharm/.run/README.md +73 -0
- resources/pycharm/.run/step1_ init env.run.xml +24 -0
- resources/pycharm/.run/step2_ setup.run.xml +25 -0
- resources/pycharm/.run/step3_ run resnet on pulpxpulpissimo.run.xml +25 -0
- resources/templates/default.yml.j2 +258 -0
- resources/templates/dev.yml.j2 +212 -0
- resources/templates/minimal.yml.j2 +234 -0
- resources/templates/phi.yml.j2 +282 -0
- resources/templates/pulp.yml.j2 +267 -0
- resources/templates/research.yml.j2 +237 -0
- resources/templates/tumeda.yml.j2 +239 -0
mlonmcu/setup/setup.py
ADDED
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
import os
|
|
20
|
+
import shutil
|
|
21
|
+
import multiprocessing
|
|
22
|
+
from tqdm import tqdm
|
|
23
|
+
|
|
24
|
+
from mlonmcu.logging import get_logger
|
|
25
|
+
from mlonmcu.feature.type import FeatureType
|
|
26
|
+
from mlonmcu.feature.features import get_matching_features
|
|
27
|
+
from mlonmcu.config import filter_config, str2bool
|
|
28
|
+
from .tasks import get_task_factory
|
|
29
|
+
from .task import TaskGraph
|
|
30
|
+
from mlonmcu.utils import ask_user
|
|
31
|
+
|
|
32
|
+
logger = get_logger()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class Setup:
|
|
36
|
+
"""MLonMCU dependency management interface."""
|
|
37
|
+
|
|
38
|
+
FEATURES = []
|
|
39
|
+
|
|
40
|
+
DEFAULTS = {
|
|
41
|
+
"print_outputs": False,
|
|
42
|
+
"num_threads": None,
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
REQUIRED = []
|
|
46
|
+
OPTIONAL = []
|
|
47
|
+
|
|
48
|
+
def __init__(self, features=None, config=None, context=None, tasks_factory=None):
|
|
49
|
+
if not tasks_factory:
|
|
50
|
+
tasks_factory = get_task_factory()
|
|
51
|
+
self.config = config if config else {}
|
|
52
|
+
self.features = self.process_features(features)
|
|
53
|
+
self.config = filter_config(self.config, "setup", self.DEFAULTS, self.OPTIONAL, self.REQUIRED)
|
|
54
|
+
self.context = context
|
|
55
|
+
self.tasks_factory = tasks_factory
|
|
56
|
+
self.num_threads = int(
|
|
57
|
+
self.config["num_threads"] if self.config["num_threads"] else multiprocessing.cpu_count()
|
|
58
|
+
)
|
|
59
|
+
|
|
60
|
+
@property
|
|
61
|
+
def verbose(self):
|
|
62
|
+
value = self.config["print_outputs"]
|
|
63
|
+
return str2bool(value) if not isinstance(value, (bool, int)) else value
|
|
64
|
+
|
|
65
|
+
def clean_cache(self, interactive=True):
|
|
66
|
+
assert self.context is not None
|
|
67
|
+
deps_dir = self.context.environment.lookup_path("deps").path
|
|
68
|
+
cache_file = deps_dir / "cache.ini"
|
|
69
|
+
if cache_file.is_file():
|
|
70
|
+
print(f"The dependency cache file ({cache_file}) will be removed.")
|
|
71
|
+
if ask_user("Are your sure?", default=not interactive, interactive=interactive):
|
|
72
|
+
print(f"Removing {cache_file} ...")
|
|
73
|
+
os.remove(cache_file)
|
|
74
|
+
|
|
75
|
+
def clean_dependencies(self, interactive=True):
|
|
76
|
+
assert self.context is not None
|
|
77
|
+
self.clean_cache(interactive=interactive)
|
|
78
|
+
deps_dir = self.context.environment.lookup_path("deps").path
|
|
79
|
+
subdirs = ["src", "build", "install"]
|
|
80
|
+
print(f"All dependencies will be removed from {deps_dir}.")
|
|
81
|
+
if ask_user("Are your sure?", default=not interactive, interactive=interactive):
|
|
82
|
+
for subdir in subdirs:
|
|
83
|
+
full_path = deps_dir / subdir
|
|
84
|
+
print(f"Removing contents of {full_path} ...")
|
|
85
|
+
shutil.rmtree(full_path, ignore_errors=True)
|
|
86
|
+
full_path.mkdir(exist_ok=True)
|
|
87
|
+
|
|
88
|
+
def process_features(self, features):
|
|
89
|
+
if features is None:
|
|
90
|
+
return []
|
|
91
|
+
features = get_matching_features(features, FeatureType.SETUP)
|
|
92
|
+
for feature in features:
|
|
93
|
+
# Not need to list features explicitly
|
|
94
|
+
# assert (
|
|
95
|
+
# feature.name in self.FEATURES
|
|
96
|
+
# ), f"Incompatible feature: {feature.name}"
|
|
97
|
+
feature.add_setup_config(self.config)
|
|
98
|
+
return features
|
|
99
|
+
|
|
100
|
+
def _get_task_graph(self):
|
|
101
|
+
self.tasks_factory.reset_changes()
|
|
102
|
+
task_graph = TaskGraph(
|
|
103
|
+
self.tasks_factory.registry.keys(),
|
|
104
|
+
self.tasks_factory.dependencies,
|
|
105
|
+
self.tasks_factory.providers,
|
|
106
|
+
)
|
|
107
|
+
return task_graph
|
|
108
|
+
|
|
109
|
+
def get_dependency_order(self):
|
|
110
|
+
task_graph = self._get_task_graph()
|
|
111
|
+
V, E = task_graph.get_graph()
|
|
112
|
+
order = task_graph.get_order()
|
|
113
|
+
order_str = " -> ".join(order)
|
|
114
|
+
logger.debug("Determined dependency order: %s" % order_str)
|
|
115
|
+
return order
|
|
116
|
+
|
|
117
|
+
def setup_progress_bar(self, enabled):
|
|
118
|
+
if enabled:
|
|
119
|
+
pbar = tqdm(
|
|
120
|
+
total=len(self.tasks_factory.registry),
|
|
121
|
+
desc="Installing dependencies",
|
|
122
|
+
ncols=100,
|
|
123
|
+
bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}s]",
|
|
124
|
+
)
|
|
125
|
+
return pbar
|
|
126
|
+
else:
|
|
127
|
+
logger.info("Installing dependencies...")
|
|
128
|
+
return None
|
|
129
|
+
|
|
130
|
+
def write_cache_file(self):
|
|
131
|
+
logger.debug("Updating dependency cache")
|
|
132
|
+
cache_file = self.context.environment.paths["deps"].path / "cache.ini"
|
|
133
|
+
self.context.cache.write_to_file(cache_file)
|
|
134
|
+
|
|
135
|
+
def visualize(self, path, ordered=False):
|
|
136
|
+
task_graph = self._get_task_graph()
|
|
137
|
+
task_graph.export_dot(path)
|
|
138
|
+
logger.debug("Written task graph to file: %s" % path)
|
|
139
|
+
|
|
140
|
+
def invoke_single_task(self, name, progress=False, write_cache=True, rebuild=False):
|
|
141
|
+
assert name in self.tasks_factory.registry, f"Invalid task name: {name}"
|
|
142
|
+
func = self.tasks_factory.registry[name]
|
|
143
|
+
func(self.context, progress=progress, rebuild=rebuild, verbose=self.verbose, threads=self.num_threads)
|
|
144
|
+
if write_cache:
|
|
145
|
+
self.write_cache_file()
|
|
146
|
+
|
|
147
|
+
def install_dependencies(
|
|
148
|
+
self,
|
|
149
|
+
progress=False,
|
|
150
|
+
write_cache=True,
|
|
151
|
+
rebuild=False,
|
|
152
|
+
):
|
|
153
|
+
assert self.context is not None
|
|
154
|
+
order = self.get_dependency_order()
|
|
155
|
+
pbar = self.setup_progress_bar(progress)
|
|
156
|
+
for task in order:
|
|
157
|
+
func = self.tasks_factory.registry[task]
|
|
158
|
+
func(self.context, progress=progress, rebuild=rebuild, verbose=self.verbose, threads=self.num_threads)
|
|
159
|
+
if pbar:
|
|
160
|
+
pbar.update(1)
|
|
161
|
+
if pbar:
|
|
162
|
+
pbar.close()
|
|
163
|
+
if write_cache:
|
|
164
|
+
self.write_cache_file()
|
|
165
|
+
logger.info("Finished installing dependencies")
|
|
166
|
+
return True
|
|
167
|
+
|
|
168
|
+
def generate_requirements(
|
|
169
|
+
self,
|
|
170
|
+
):
|
|
171
|
+
from .gen_requirements import join_requirements
|
|
172
|
+
import os
|
|
173
|
+
|
|
174
|
+
requirements = join_requirements()
|
|
175
|
+
output_dir = os.path.join(self.context.environment.home, "requirements_addition.txt")
|
|
176
|
+
|
|
177
|
+
def feature_enabled_and_supported(obj, feature):
|
|
178
|
+
if getattr(obj, "enabled", True):
|
|
179
|
+
if getattr(obj, "name", None) == feature and getattr(obj, "supported", False):
|
|
180
|
+
return True
|
|
181
|
+
else:
|
|
182
|
+
enable_and_supported = False
|
|
183
|
+
for k, v in obj.__dict__.items():
|
|
184
|
+
if isinstance(v, list):
|
|
185
|
+
for i in v:
|
|
186
|
+
enable_and_supported = enable_and_supported or feature_enabled_and_supported(i, feature)
|
|
187
|
+
return enable_and_supported
|
|
188
|
+
else:
|
|
189
|
+
return False
|
|
190
|
+
|
|
191
|
+
with open(output_dir, "w") as f:
|
|
192
|
+
f.write(f"# AUTOGENERATED by 'mlonmcu setup -g' {os.linesep}")
|
|
193
|
+
config_pools = (
|
|
194
|
+
self.context.environment.frameworks
|
|
195
|
+
+ self.context.environment.frontends
|
|
196
|
+
+ self.context.environment.platforms
|
|
197
|
+
+ self.context.environment.targets
|
|
198
|
+
)
|
|
199
|
+
for config in config_pools:
|
|
200
|
+
if "espidf" in config.name and config.enabled:
|
|
201
|
+
for d in requirements["espidf"][1]:
|
|
202
|
+
f.write(f"{d}{os.linesep}")
|
|
203
|
+
logger.info("add dependencies for espidf")
|
|
204
|
+
break
|
|
205
|
+
for config in config_pools:
|
|
206
|
+
if "zephyr" in config.name and config.enabled:
|
|
207
|
+
for d in requirements["zephyr"][1]:
|
|
208
|
+
f.write(f"{d}{os.linesep}")
|
|
209
|
+
logger.info("add dependencies for zephyr")
|
|
210
|
+
break
|
|
211
|
+
for config in config_pools:
|
|
212
|
+
if "tflm" in config.name and config.enabled:
|
|
213
|
+
for d in requirements["tflm"][1]:
|
|
214
|
+
f.write(f"{d}{os.linesep}")
|
|
215
|
+
logger.info("add dependencies for tflm")
|
|
216
|
+
break
|
|
217
|
+
for config in config_pools:
|
|
218
|
+
if "tflite" in config.name and config.enabled:
|
|
219
|
+
for d in requirements["tflite"][1]:
|
|
220
|
+
f.write(f"{d}{os.linesep}")
|
|
221
|
+
logger.info("add dependencies for tflite")
|
|
222
|
+
break
|
|
223
|
+
for config in config_pools:
|
|
224
|
+
if "onnx" in config.name and config.enabled:
|
|
225
|
+
for d in requirements["onnx"][1]:
|
|
226
|
+
f.write(f"{d}{os.linesep}")
|
|
227
|
+
logger.info("add dependencies for onnx")
|
|
228
|
+
break
|
|
229
|
+
for config in config_pools:
|
|
230
|
+
if "etiss" in config.name and config.enabled:
|
|
231
|
+
for d in requirements["etiss"][1]:
|
|
232
|
+
f.write(f"{d}{os.linesep}")
|
|
233
|
+
logger.info("add dependencies for etiss")
|
|
234
|
+
break
|
|
235
|
+
for config in config_pools:
|
|
236
|
+
if "gvsoc_pulp" in config.name and config.enabled:
|
|
237
|
+
for d in requirements["gvsoc_pulp"][1]:
|
|
238
|
+
f.write(f"{d}{os.linesep}")
|
|
239
|
+
logger.info("add dependencies for gvsoc_pulp")
|
|
240
|
+
break
|
|
241
|
+
for config in config_pools:
|
|
242
|
+
if "visualize" in config.name and config.enabled:
|
|
243
|
+
for d in requirements["visualize"][1]:
|
|
244
|
+
f.write(f"{d}{os.linesep}")
|
|
245
|
+
logger.info("add dependencies for visualize")
|
|
246
|
+
break
|
|
247
|
+
for config in config_pools:
|
|
248
|
+
if "microtvm" in config.name and config.enabled:
|
|
249
|
+
for d in requirements["microtvm"][1]:
|
|
250
|
+
f.write(f"{d}{os.linesep}")
|
|
251
|
+
logger.info("add dependencies for microtvm")
|
|
252
|
+
break
|
|
253
|
+
for config in config_pools:
|
|
254
|
+
if feature_enabled_and_supported(config, "moiopt"):
|
|
255
|
+
for d in requirements["moiopt"][1]:
|
|
256
|
+
f.write(f"{d}{os.linesep}")
|
|
257
|
+
logger.info("add dependencies for moiopt")
|
|
258
|
+
break
|
|
259
|
+
# for config in config_pools:
|
|
260
|
+
# if feature_enabled_and_supported(config, "relayviz"):
|
|
261
|
+
# # equirements for relay visualization
|
|
262
|
+
# for d in requirements['relayviz'][1]:
|
|
263
|
+
# f.write(f"{d}{os.linesep}")
|
|
264
|
+
# break
|
|
265
|
+
for config in config_pools:
|
|
266
|
+
if "tvm" in config.name and config.enabled:
|
|
267
|
+
for d in requirements["tvm"][1]:
|
|
268
|
+
f.write(f"{d}{os.linesep}")
|
|
269
|
+
logger.info("add dependencies for tvm")
|
|
270
|
+
break
|
|
271
|
+
for config in config_pools:
|
|
272
|
+
if "tvm" in config.name and feature_enabled_and_supported(config, "autotuned"):
|
|
273
|
+
for d in requirements["tvm-autotuning"][1]:
|
|
274
|
+
f.write(f"{d}{os.linesep}")
|
|
275
|
+
logger.info("add dependencies for tvm-autotuning")
|
|
276
|
+
break
|
|
277
|
+
for config in config_pools:
|
|
278
|
+
if "tf" in config.name and feature_enabled_and_supported(config, "visualize"):
|
|
279
|
+
# requirements for tvm tflite visualization
|
|
280
|
+
for d in requirements["visualize_tflite"][1]:
|
|
281
|
+
f.write(f"{d}{os.linesep}")
|
|
282
|
+
logger.info("add dependencies for tflite visualization")
|
|
283
|
+
break
|
|
284
|
+
logger.info("Finished generating requirements_addition.txt")
|
|
285
|
+
return True
|
mlonmcu/setup/task.py
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Copyright (c) 2022 TUM Department of Electrical and Computer Engineering.
|
|
3
|
+
#
|
|
4
|
+
# This file is part of MLonMCU.
|
|
5
|
+
# See https://github.com/tum-ei-eda/mlonmcu.git for further info.
|
|
6
|
+
#
|
|
7
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
8
|
+
# you may not use this file except in compliance with the License.
|
|
9
|
+
# You may obtain a copy of the License at
|
|
10
|
+
#
|
|
11
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
12
|
+
#
|
|
13
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
14
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
15
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
16
|
+
# See the License for the specific language governing permissions and
|
|
17
|
+
# limitations under the License.
|
|
18
|
+
#
|
|
19
|
+
"""Definitions of a task registry used to automatically install dependencies."""
|
|
20
|
+
|
|
21
|
+
from functools import wraps
|
|
22
|
+
import itertools
|
|
23
|
+
from enum import Enum
|
|
24
|
+
import time
|
|
25
|
+
from typing import List, Tuple
|
|
26
|
+
import networkx as nx
|
|
27
|
+
from networkx.drawing.nx_agraph import write_dot
|
|
28
|
+
from tqdm import tqdm
|
|
29
|
+
|
|
30
|
+
from mlonmcu.logging import get_logger
|
|
31
|
+
|
|
32
|
+
logger = get_logger()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def get_combs(data) -> List[dict]:
|
|
36
|
+
"""Utility which returns combinations of the input data.
|
|
37
|
+
|
|
38
|
+
Parameters
|
|
39
|
+
----------
|
|
40
|
+
data : dict
|
|
41
|
+
Input dictionary
|
|
42
|
+
|
|
43
|
+
Returns
|
|
44
|
+
-------
|
|
45
|
+
combs : list
|
|
46
|
+
All combinations of the input data.
|
|
47
|
+
|
|
48
|
+
Examples
|
|
49
|
+
--------
|
|
50
|
+
>>> get_combs({"foo": [False, True], "bar": [5, 10]})
|
|
51
|
+
[{"foo": False, "bar": 5}, {"foo": False, "bar": 10}, {"foo": True, "bar": 5}, {"foo": True, "bar": 10}]
|
|
52
|
+
"""
|
|
53
|
+
keys = list(data.keys())
|
|
54
|
+
values = list(data.values())
|
|
55
|
+
prod = list(itertools.product(*values))
|
|
56
|
+
if len(prod) == 1:
|
|
57
|
+
if len(prod[0]) == 0:
|
|
58
|
+
prod = []
|
|
59
|
+
combs = [dict(zip(keys, p)) for p in prod]
|
|
60
|
+
return combs
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
class TaskType(Enum):
|
|
64
|
+
"""Enumeration for the task type."""
|
|
65
|
+
|
|
66
|
+
MISC = 0
|
|
67
|
+
FRAMEWORK = 1
|
|
68
|
+
BACKEND = 2
|
|
69
|
+
TOOLCHAIN = 3
|
|
70
|
+
TARGET = 4
|
|
71
|
+
FRONTEND = 5
|
|
72
|
+
OPT = 6
|
|
73
|
+
FEATURE = 7
|
|
74
|
+
PLATFORM = 8
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
class TaskGraph:
|
|
78
|
+
"""Task graph object.
|
|
79
|
+
|
|
80
|
+
Attributes
|
|
81
|
+
----------
|
|
82
|
+
names : list
|
|
83
|
+
list of task names in the graph
|
|
84
|
+
dependencies : dict
|
|
85
|
+
Dependencies between task artifacts
|
|
86
|
+
providers : dict
|
|
87
|
+
Providers for all the artifacts
|
|
88
|
+
|
|
89
|
+
Examples
|
|
90
|
+
-------
|
|
91
|
+
TODO
|
|
92
|
+
"""
|
|
93
|
+
|
|
94
|
+
def __init__(self, names: List[str], dependencies: dict, providers: dict):
|
|
95
|
+
self.names = names
|
|
96
|
+
self.dependencies = dependencies
|
|
97
|
+
self.providers = providers
|
|
98
|
+
|
|
99
|
+
def get_graph(self) -> Tuple[list, list]:
|
|
100
|
+
"""Get nodes and edges of the task graph.
|
|
101
|
+
|
|
102
|
+
Returns
|
|
103
|
+
-------
|
|
104
|
+
nodes : list
|
|
105
|
+
List of edges
|
|
106
|
+
edges : list
|
|
107
|
+
List of edge tuples.
|
|
108
|
+
"""
|
|
109
|
+
nodes = list(self.names)
|
|
110
|
+
edges = []
|
|
111
|
+
for dest, deps in self.dependencies.items():
|
|
112
|
+
for dep in deps:
|
|
113
|
+
if dep not in self.providers.keys():
|
|
114
|
+
raise RuntimeError(f"Unable to resolve dependency '{dep}'")
|
|
115
|
+
src = self.providers[dep]
|
|
116
|
+
edge = (src, dest)
|
|
117
|
+
edges.append(edge)
|
|
118
|
+
# Remove duplicates
|
|
119
|
+
edges = list(dict.fromkeys(edges))
|
|
120
|
+
return nodes, edges
|
|
121
|
+
|
|
122
|
+
def get_order(self) -> list:
|
|
123
|
+
"""Get execution order of tasks via topological sorting."""
|
|
124
|
+
nodes, edges = self.get_graph()
|
|
125
|
+
graph = nx.DiGraph(edges)
|
|
126
|
+
graph.add_nodes_from(nodes)
|
|
127
|
+
order = list(nx.topological_sort(graph))
|
|
128
|
+
return order
|
|
129
|
+
|
|
130
|
+
def export_dot(self, path):
|
|
131
|
+
"""Visualize the task dependency graph."""
|
|
132
|
+
nodes, edges = self.get_graph()
|
|
133
|
+
graph = nx.DiGraph(edges)
|
|
134
|
+
graph.add_nodes_from(nodes)
|
|
135
|
+
# order = list(nx.topological_sort(graph))
|
|
136
|
+
# TODO: annotate with order
|
|
137
|
+
# TODO: also export order as extra graph
|
|
138
|
+
write_dot(graph, path)
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class TaskFactory:
|
|
142
|
+
"""Class which is used to register all available tasks and their annotations.
|
|
143
|
+
|
|
144
|
+
Attributes
|
|
145
|
+
----------
|
|
146
|
+
registry : dict
|
|
147
|
+
Mapping of task names and their actual function
|
|
148
|
+
dependencies : dict
|
|
149
|
+
Mapping of task dependencies
|
|
150
|
+
providers : dict
|
|
151
|
+
Mapping of which task provides which artifacts
|
|
152
|
+
types : dict
|
|
153
|
+
Mapping of task types
|
|
154
|
+
validates : dict
|
|
155
|
+
Mapping of validation functions for the tasks
|
|
156
|
+
changed : list
|
|
157
|
+
List of tasks?artifacts which have changed recently
|
|
158
|
+
"""
|
|
159
|
+
|
|
160
|
+
def __init__(self):
|
|
161
|
+
self.registry = {}
|
|
162
|
+
self.dependencies = {}
|
|
163
|
+
self.providers = {}
|
|
164
|
+
self.types = {}
|
|
165
|
+
self.params = {}
|
|
166
|
+
self.validates = {}
|
|
167
|
+
self.changed = [] # Main problem: per
|
|
168
|
+
|
|
169
|
+
def reset_changes(self):
|
|
170
|
+
"""Reset all pending changes."""
|
|
171
|
+
self.changed = []
|
|
172
|
+
|
|
173
|
+
def needs(self, keys, force=True):
|
|
174
|
+
"""Decorator which registers the artifacts a task needs to be processed."""
|
|
175
|
+
|
|
176
|
+
def real_decorator(function):
|
|
177
|
+
name = function.__name__
|
|
178
|
+
if name in self.dependencies:
|
|
179
|
+
self.dependencies[name].extend(keys)
|
|
180
|
+
else:
|
|
181
|
+
self.dependencies[name] = keys
|
|
182
|
+
|
|
183
|
+
@wraps(function)
|
|
184
|
+
def wrapper(*args, **kwargs):
|
|
185
|
+
# logger.debug("Checking inputs...")
|
|
186
|
+
if force:
|
|
187
|
+
context = args[0]
|
|
188
|
+
variables = context.cache._vars
|
|
189
|
+
for key in keys:
|
|
190
|
+
if key not in variables.keys() or variables[key] is None:
|
|
191
|
+
raise RuntimeError(f"Task '{name}' needs the value of '{key}' which is not set")
|
|
192
|
+
retval = function(*args, **kwargs)
|
|
193
|
+
return retval
|
|
194
|
+
|
|
195
|
+
return wrapper
|
|
196
|
+
|
|
197
|
+
return real_decorator
|
|
198
|
+
|
|
199
|
+
def optional(self, keys):
|
|
200
|
+
"""Decorator for optional task requirements."""
|
|
201
|
+
return self.needs(keys, force=False)
|
|
202
|
+
|
|
203
|
+
# def optional(self, keys):
|
|
204
|
+
# def real_decorator(function):
|
|
205
|
+
# name = function.__name__
|
|
206
|
+
# if name in self.dependencies:
|
|
207
|
+
# self.dependencies[name].extend(keys)
|
|
208
|
+
# else:
|
|
209
|
+
# self.dependencies[name] = keys
|
|
210
|
+
# @wraps(function)
|
|
211
|
+
# def wrapper(*args, **kwargs):
|
|
212
|
+
# retval = function(*args, **kwargs)
|
|
213
|
+
# return retval
|
|
214
|
+
# return wrapper
|
|
215
|
+
# return real_decorator
|
|
216
|
+
|
|
217
|
+
def provides(self, keys):
|
|
218
|
+
"""Decorator which registers what a task provides."""
|
|
219
|
+
|
|
220
|
+
def real_decorator(function):
|
|
221
|
+
name = function.__name__
|
|
222
|
+
for key in keys:
|
|
223
|
+
self.providers[key] = name
|
|
224
|
+
|
|
225
|
+
@wraps(function)
|
|
226
|
+
def wrapper(*args, **kwargs):
|
|
227
|
+
context = args[0]
|
|
228
|
+
for key in keys:
|
|
229
|
+
if key in context.cache._vars:
|
|
230
|
+
del context.cache._vars[key] # Unset the value before calling function
|
|
231
|
+
retval = function(*args, **kwargs)
|
|
232
|
+
if retval is not False:
|
|
233
|
+
# logger.debug("Checking outputs...")
|
|
234
|
+
variables = context.cache._vars
|
|
235
|
+
for key in keys:
|
|
236
|
+
if key not in variables.keys() or variables[key] is None:
|
|
237
|
+
raise RuntimeError(f"Task '{name}' did not set the value of '{key}'")
|
|
238
|
+
return retval
|
|
239
|
+
|
|
240
|
+
self.registry[name] = wrapper
|
|
241
|
+
return wrapper
|
|
242
|
+
|
|
243
|
+
return real_decorator
|
|
244
|
+
|
|
245
|
+
def param(self, flag, options):
|
|
246
|
+
"""Decorator which registers available task parameters."""
|
|
247
|
+
if not isinstance(options, list):
|
|
248
|
+
options = [options]
|
|
249
|
+
|
|
250
|
+
def real_decorator(function):
|
|
251
|
+
name = function.__name__
|
|
252
|
+
if name in self.params:
|
|
253
|
+
self.params[name][flag] = options
|
|
254
|
+
else:
|
|
255
|
+
self.params[name] = {flag: options}
|
|
256
|
+
|
|
257
|
+
@wraps(function)
|
|
258
|
+
def wrapper(*args, **kwargs):
|
|
259
|
+
retval = function(*args, **kwargs)
|
|
260
|
+
return retval
|
|
261
|
+
|
|
262
|
+
return wrapper
|
|
263
|
+
|
|
264
|
+
return real_decorator
|
|
265
|
+
|
|
266
|
+
def validate(self, func):
|
|
267
|
+
"""Decorator which registers validattion functions for a task."""
|
|
268
|
+
|
|
269
|
+
def real_decorator(function):
|
|
270
|
+
name = function.__name__
|
|
271
|
+
self.validates[name] = func
|
|
272
|
+
return function
|
|
273
|
+
|
|
274
|
+
return real_decorator
|
|
275
|
+
|
|
276
|
+
def register(self, category=TaskType.MISC):
|
|
277
|
+
"""Decorator which actually registers a task in the registry."""
|
|
278
|
+
|
|
279
|
+
def real_decorator(function):
|
|
280
|
+
name = function.__name__
|
|
281
|
+
|
|
282
|
+
@wraps(function)
|
|
283
|
+
def wrapper(*args, rebuild=False, progress=False, **kwargs):
|
|
284
|
+
combs = get_combs(self.params[name])
|
|
285
|
+
|
|
286
|
+
def get_valid_combs(combs):
|
|
287
|
+
ret = []
|
|
288
|
+
for comb in combs:
|
|
289
|
+
if name in self.validates:
|
|
290
|
+
check = self.validates[name](args[0], params=comb)
|
|
291
|
+
if not check:
|
|
292
|
+
continue
|
|
293
|
+
ret.append(comb)
|
|
294
|
+
return ret
|
|
295
|
+
|
|
296
|
+
combs = get_valid_combs(combs)
|
|
297
|
+
|
|
298
|
+
def process(name_, params=None, rebuild=False):
|
|
299
|
+
if not params:
|
|
300
|
+
params = []
|
|
301
|
+
rebuild = rebuild
|
|
302
|
+
if name in self.dependencies:
|
|
303
|
+
for dep in self.dependencies[name]:
|
|
304
|
+
if dep in self.changed:
|
|
305
|
+
rebuild = True
|
|
306
|
+
break
|
|
307
|
+
retval = function(*args, params=params, rebuild=rebuild, **kwargs)
|
|
308
|
+
if retval:
|
|
309
|
+
keys = [key for key, provider in self.providers.items() if provider == name]
|
|
310
|
+
for key in keys:
|
|
311
|
+
if key not in self.changed:
|
|
312
|
+
self.changed.append(key)
|
|
313
|
+
# logger.debug("Processed task:", function.__name__)
|
|
314
|
+
return retval
|
|
315
|
+
|
|
316
|
+
if progress:
|
|
317
|
+
pbar = tqdm(
|
|
318
|
+
total=max(len(combs), 1),
|
|
319
|
+
desc="Processing",
|
|
320
|
+
ncols=100,
|
|
321
|
+
bar_format="{l_bar}{bar}| {n_fmt}/{total_fmt} [{elapsed}s]",
|
|
322
|
+
leave=None,
|
|
323
|
+
)
|
|
324
|
+
else:
|
|
325
|
+
pbar = None
|
|
326
|
+
if len(combs) == 0:
|
|
327
|
+
if pbar:
|
|
328
|
+
pbar.set_description(f"Processing: {name}")
|
|
329
|
+
else:
|
|
330
|
+
logger.info("Processing task: %s", name)
|
|
331
|
+
time.sleep(0.1)
|
|
332
|
+
check = True
|
|
333
|
+
if name in self.validates:
|
|
334
|
+
check = self.validates[name](args[0], params={})
|
|
335
|
+
if check:
|
|
336
|
+
start = time.time()
|
|
337
|
+
retval = process(name, rebuild=rebuild)
|
|
338
|
+
end = time.time()
|
|
339
|
+
diff = end - start
|
|
340
|
+
minutes = int(diff // 60)
|
|
341
|
+
seconds = int(diff % 60)
|
|
342
|
+
duration_str = f"{seconds}s" if minutes == 0 else f"{minutes}m{seconds}s"
|
|
343
|
+
if not pbar:
|
|
344
|
+
logger.debug("-> Done (%s)", duration_str)
|
|
345
|
+
# TODO: move this to helper func
|
|
346
|
+
else:
|
|
347
|
+
logger.debug("-> Skipped")
|
|
348
|
+
retval = False
|
|
349
|
+
if pbar:
|
|
350
|
+
pbar.update(1)
|
|
351
|
+
else:
|
|
352
|
+
for comb in combs: # TODO process in parallel?
|
|
353
|
+
extended_name = name + str(comb)
|
|
354
|
+
if pbar:
|
|
355
|
+
pbar.set_description(f"Processing - {extended_name}")
|
|
356
|
+
else:
|
|
357
|
+
logger.info("Processing task: %s", extended_name)
|
|
358
|
+
time.sleep(0.1)
|
|
359
|
+
start = time.time()
|
|
360
|
+
retval = process(extended_name, params=comb, rebuild=rebuild)
|
|
361
|
+
end = time.time()
|
|
362
|
+
diff = end - start
|
|
363
|
+
minutes = int(diff // 60)
|
|
364
|
+
seconds = int(diff % 60)
|
|
365
|
+
duration_str = f"{seconds}s" if minutes == 0 else f"{minutes}m{seconds}s"
|
|
366
|
+
if not pbar:
|
|
367
|
+
logger.debug("-> Done (%s)", duration_str)
|
|
368
|
+
# TODO: move this to helper func
|
|
369
|
+
else:
|
|
370
|
+
pbar.update(1)
|
|
371
|
+
if pbar:
|
|
372
|
+
pbar.close()
|
|
373
|
+
return retval
|
|
374
|
+
|
|
375
|
+
self.registry[name] = wrapper
|
|
376
|
+
self.types[name] = category
|
|
377
|
+
self.params[name] = {}
|
|
378
|
+
return wrapper
|
|
379
|
+
|
|
380
|
+
return real_decorator
|