triggerflow 0.3.3__tar.gz → 0.3.6__tar.gz
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.
- {triggerflow-0.3.3 → triggerflow-0.3.6}/PKG-INFO +46 -32
- {triggerflow-0.3.3 → triggerflow-0.3.6}/pyproject.toml +42 -33
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_loader/loader.py +25 -13
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_loader/processor.py +1 -1
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/core.py +34 -51
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/interfaces/uGT.py +80 -32
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples.json +0 -4
- triggerflow-0.3.6/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/meta_dataset.py +49 -0
- triggerflow-0.3.6/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/nodes.py +70 -0
- triggerflow-0.3.6/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/pipeline.py +20 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/nodes.py +1 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/nodes.py +1 -0
- triggerflow-0.3.6/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/nodes.py +48 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/pipeline.py +1 -1
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/nodes.py +3 -1
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/model-gt.cpp +3 -3
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/model_template.cpp +18 -11
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/scales.h +2 -2
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/PKG-INFO +46 -32
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/SOURCES.txt +0 -1
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/requires.txt +33 -15
- {triggerflow-0.3.3 → triggerflow-0.3.6}/tests/test.py +1 -1
- triggerflow-0.3.3/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/samples_dummy.json +0 -26
- triggerflow-0.3.3/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/meta_dataset.py +0 -88
- triggerflow-0.3.3/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/nodes.py +0 -50
- triggerflow-0.3.3/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/pipeline.py +0 -10
- triggerflow-0.3.3/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/nodes.py +0 -31
- {triggerflow-0.3.3 → triggerflow-0.3.6}/MANIFEST.in +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/README.md +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/setup.cfg +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_dataset/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_dataset/core.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_loader/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/trigger_loader/cluster_manager.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/cli.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/interfaces/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/mlflow_wrapper.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/.gitignore +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/README.md +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/cookiecutter.json +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/prompts.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.dvcignore +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitignore +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/.gitlab-ci.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/README.md +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/README.md +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/catalog.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_compile.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_data_processing.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_load_data.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_training.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/base/parameters_model_validation.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/catalog.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_compile.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_data_processing.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_load_data.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_training.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/local/parameters_model_validation.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/conf/logging.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/condor_config.json +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/cuda_config.json +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/settings.json +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/01_raw/test.root +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/02_loaded/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/03_preprocessed/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/04_models/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/05_validation/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/06_compile/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/data/07_reporting/.gitkeep +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/dvc.yaml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/environment.yml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/pyproject.toml +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/__main__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/any_object.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_dataset.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/base_loader.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_dataset.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/datasets/{{ cookiecutter.python_package }}_loader.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/base_model.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/models/{{ cookiecutter.python_package }}_model.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipeline_registry.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/compile/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/data_processing/pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/load_data/pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_training/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/pipelines/model_validation/pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/settings.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/metric.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/src/{{ cookiecutter.python_package }}/utils/plotting.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/compile/test_pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/data_processing/test_pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/load_data/test_pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_training/test_pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/__init__.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/pipelines/model_validation/test_pipeline.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/starter/{{ cookiecutter.repo_name }}/tests/test_run.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/build_ugt.tcl +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/data_types.h +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/makefile +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow/templates/makefile_version +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/dependency_links.txt +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/entry_points.txt +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/src/triggerflow.egg-info/top_level.txt +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/tests/test_loader.py +0 -0
- {triggerflow-0.3.3 → triggerflow-0.3.6}/tests/test_starter.py +0 -0
|
@@ -1,48 +1,62 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: triggerflow
|
|
3
|
-
Version: 0.3.
|
|
3
|
+
Version: 0.3.6
|
|
4
4
|
Summary: Utilities for ML models targeting hardware triggers
|
|
5
|
-
|
|
6
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
7
|
-
Classifier: Operating System :: OS Independent
|
|
8
|
-
Requires-Python: >=3.11
|
|
5
|
+
Requires-Python: >=3.10
|
|
9
6
|
Description-Content-Type: text/markdown
|
|
10
7
|
Requires-Dist: cookiecutter>=2.3
|
|
11
8
|
Requires-Dist: PyYAML>=6
|
|
12
9
|
Requires-Dist: Jinja2>=3
|
|
13
|
-
Requires-Dist: mlflow==2.21.0
|
|
14
10
|
Requires-Dist: kedro==1.0.0
|
|
11
|
+
Requires-Dist: kedro-datasets
|
|
12
|
+
Requires-Dist: kedro-mlflow==2.0.1
|
|
13
|
+
Requires-Dist: awkward<3,>=2.8
|
|
14
|
+
Requires-Dist: dask==2025.3.0
|
|
15
|
+
Requires-Dist: coffea>=2025.12
|
|
16
|
+
Requires-Dist: distributed==2025.3.0
|
|
15
17
|
Provides-Extra: dev
|
|
16
18
|
Requires-Dist: pytest-cov~=3.0; extra == "dev"
|
|
17
19
|
Requires-Dist: pytest-mock<2.0,>=1.7.1; extra == "dev"
|
|
18
20
|
Requires-Dist: pytest~=7.2; extra == "dev"
|
|
19
21
|
Requires-Dist: ruff~=0.1.8; extra == "dev"
|
|
20
|
-
Provides-Extra:
|
|
21
|
-
Requires-Dist:
|
|
22
|
-
Requires-Dist:
|
|
23
|
-
Requires-Dist:
|
|
24
|
-
Requires-Dist:
|
|
25
|
-
Requires-Dist:
|
|
26
|
-
Requires-Dist:
|
|
27
|
-
Requires-Dist:
|
|
28
|
-
Requires-Dist:
|
|
29
|
-
Requires-Dist:
|
|
30
|
-
Requires-Dist:
|
|
31
|
-
Requires-Dist:
|
|
32
|
-
Requires-Dist:
|
|
33
|
-
Requires-Dist:
|
|
34
|
-
Requires-Dist:
|
|
35
|
-
Requires-Dist:
|
|
36
|
-
Requires-Dist:
|
|
37
|
-
Requires-Dist:
|
|
38
|
-
Requires-Dist:
|
|
39
|
-
Requires-Dist:
|
|
40
|
-
Requires-Dist:
|
|
41
|
-
Requires-Dist:
|
|
42
|
-
|
|
43
|
-
Requires-Dist:
|
|
44
|
-
Requires-Dist:
|
|
45
|
-
Requires-Dist:
|
|
22
|
+
Provides-Extra: qkeras
|
|
23
|
+
Requires-Dist: tensorflow==2.13.0; extra == "qkeras"
|
|
24
|
+
Requires-Dist: QKeras==0.9.0; extra == "qkeras"
|
|
25
|
+
Requires-Dist: keras==2.13.1; extra == "qkeras"
|
|
26
|
+
Requires-Dist: qonnx==0.4.0; extra == "qkeras"
|
|
27
|
+
Requires-Dist: tf_keras; extra == "qkeras"
|
|
28
|
+
Requires-Dist: tf2onnx; extra == "qkeras"
|
|
29
|
+
Requires-Dist: hls4ml; extra == "qkeras"
|
|
30
|
+
Requires-Dist: conifer; extra == "qkeras"
|
|
31
|
+
Requires-Dist: coffea; extra == "qkeras"
|
|
32
|
+
Requires-Dist: dask; extra == "qkeras"
|
|
33
|
+
Requires-Dist: pyarrow==17.0.0; extra == "qkeras"
|
|
34
|
+
Requires-Dist: pandas==2.0.3; extra == "qkeras"
|
|
35
|
+
Requires-Dist: uproot==4.0.0; extra == "qkeras"
|
|
36
|
+
Requires-Dist: hist==2.7.3; extra == "qkeras"
|
|
37
|
+
Requires-Dist: awkward-pandas; extra == "qkeras"
|
|
38
|
+
Requires-Dist: matplotlib; extra == "qkeras"
|
|
39
|
+
Requires-Dist: mplhep; extra == "qkeras"
|
|
40
|
+
Requires-Dist: h5py; extra == "qkeras"
|
|
41
|
+
Requires-Dist: xxhash; extra == "qkeras"
|
|
42
|
+
Requires-Dist: shap; extra == "qkeras"
|
|
43
|
+
Requires-Dist: numpy==1.24.3; extra == "qkeras"
|
|
44
|
+
Provides-Extra: keras3
|
|
45
|
+
Requires-Dist: keras==3.11.0; extra == "keras3"
|
|
46
|
+
Requires-Dist: tensorflow==2.16.1; extra == "keras3"
|
|
47
|
+
Requires-Dist: hgq2; extra == "keras3"
|
|
48
|
+
Requires-Dist: hls4ml; extra == "keras3"
|
|
49
|
+
Requires-Dist: conifer; extra == "keras3"
|
|
50
|
+
Requires-Dist: pyarrow==17.0.0; extra == "keras3"
|
|
51
|
+
Requires-Dist: pandas==2.0.3; extra == "keras3"
|
|
52
|
+
Requires-Dist: uproot==4.0.0; extra == "keras3"
|
|
53
|
+
Requires-Dist: hist==2.7.3; extra == "keras3"
|
|
54
|
+
Requires-Dist: awkward-pandas; extra == "keras3"
|
|
55
|
+
Requires-Dist: matplotlib; extra == "keras3"
|
|
56
|
+
Requires-Dist: mplhep; extra == "keras3"
|
|
57
|
+
Requires-Dist: h5py; extra == "keras3"
|
|
58
|
+
Requires-Dist: xxhash; extra == "keras3"
|
|
59
|
+
Requires-Dist: shap; extra == "keras3"
|
|
46
60
|
|
|
47
61
|
# Machine Learning for Hardware Triggers
|
|
48
62
|
|
|
@@ -4,63 +4,73 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "triggerflow"
|
|
7
|
-
version = "0.3.
|
|
7
|
+
version = "0.3.6"
|
|
8
8
|
description = "Utilities for ML models targeting hardware triggers"
|
|
9
9
|
readme = "README.md"
|
|
10
|
-
requires-python = ">=3.
|
|
10
|
+
requires-python = ">=3.10"
|
|
11
11
|
dependencies = [
|
|
12
12
|
"cookiecutter>=2.3",
|
|
13
13
|
"PyYAML>=6",
|
|
14
14
|
"Jinja2>=3",
|
|
15
|
-
"
|
|
16
|
-
"kedro
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
15
|
+
"kedro==1.0.0",
|
|
16
|
+
"kedro-datasets",
|
|
17
|
+
"kedro-mlflow==2.0.1",
|
|
18
|
+
"awkward>=2.8,<3",
|
|
19
|
+
"dask==2025.3.0",
|
|
20
|
+
"coffea>=2025.12",
|
|
21
|
+
"distributed==2025.3.0"
|
|
22
22
|
]
|
|
23
23
|
|
|
24
24
|
[project.optional-dependencies]
|
|
25
25
|
dev = [
|
|
26
26
|
"pytest-cov~=3.0",
|
|
27
27
|
"pytest-mock>=1.7.1, <2.0",
|
|
28
|
-
"pytest~=7.2",
|
|
28
|
+
"pytest~=7.2",
|
|
29
|
+
"ruff~=0.1.8",
|
|
29
30
|
]
|
|
30
31
|
|
|
31
|
-
|
|
32
|
-
|
|
32
|
+
qkeras = [
|
|
33
|
+
"tensorflow==2.13.0",
|
|
34
|
+
"QKeras==0.9.0",
|
|
35
|
+
"keras==2.13.1",
|
|
36
|
+
"qonnx==0.4.0",
|
|
37
|
+
"tf_keras",
|
|
38
|
+
"tf2onnx",
|
|
39
|
+
"hls4ml",
|
|
40
|
+
"conifer",
|
|
41
|
+
# Physics/Data tools included in this flow
|
|
33
42
|
"coffea",
|
|
34
43
|
"dask",
|
|
35
|
-
"pyarrow",
|
|
36
|
-
|
|
37
|
-
# Explicitly Versioned Packages
|
|
38
|
-
"pandas==2.0.3",
|
|
39
|
-
"uproot4==4.0.0",
|
|
40
44
|
"pyarrow==17.0.0",
|
|
45
|
+
"pandas==2.0.3",
|
|
46
|
+
"uproot==4.0.0",
|
|
41
47
|
"hist==2.7.3",
|
|
42
|
-
"
|
|
43
|
-
"tensorflow==2.13.0",
|
|
44
|
-
"QKeras==0.9.0",
|
|
45
|
-
"keras==2.13.1",
|
|
46
|
-
|
|
47
|
-
# Packages with required versions/source links
|
|
48
|
-
"numpy",
|
|
49
|
-
"pyparsing",
|
|
50
|
-
"PyYAML",
|
|
48
|
+
"awkward-pandas",
|
|
51
49
|
"matplotlib",
|
|
52
50
|
"mplhep",
|
|
53
51
|
"h5py",
|
|
54
52
|
"xxhash",
|
|
55
53
|
"shap",
|
|
56
|
-
"
|
|
57
|
-
"qonnx==0.4.0",
|
|
58
|
-
"tf_keras",
|
|
59
|
-
"tf2onnx",
|
|
60
|
-
"hls4ml",
|
|
61
|
-
"conifer"
|
|
54
|
+
"numpy==1.24.3"
|
|
62
55
|
]
|
|
63
56
|
|
|
57
|
+
keras3 = [
|
|
58
|
+
"keras==3.11.0",
|
|
59
|
+
"tensorflow==2.16.1",
|
|
60
|
+
"hgq2",
|
|
61
|
+
"hls4ml",
|
|
62
|
+
"conifer",
|
|
63
|
+
"pyarrow==17.0.0",
|
|
64
|
+
"pandas==2.0.3",
|
|
65
|
+
"uproot==4.0.0",
|
|
66
|
+
"hist==2.7.3",
|
|
67
|
+
"awkward-pandas",
|
|
68
|
+
"matplotlib",
|
|
69
|
+
"mplhep",
|
|
70
|
+
"h5py",
|
|
71
|
+
"xxhash",
|
|
72
|
+
"shap",
|
|
73
|
+
]
|
|
64
74
|
|
|
65
75
|
[tool.setuptools]
|
|
66
76
|
include-package-data = true
|
|
@@ -78,6 +88,5 @@ select = [ "F", "W", "E", "I", "UP", "PL", "T201",]
|
|
|
78
88
|
ignore = [ "E501",]
|
|
79
89
|
extend-exclude = ["src/triggerflow/starter"]
|
|
80
90
|
|
|
81
|
-
# expose CLI entrypoint
|
|
82
91
|
[project.scripts]
|
|
83
92
|
triggerflow = "triggerflow.cli:main"
|
|
@@ -46,16 +46,16 @@ class TriggerLoader:
|
|
|
46
46
|
def _load_sample_json(self, sample_json: str) -> dict:
|
|
47
47
|
"""
|
|
48
48
|
Loads the JSON and resolves file paths using the priority:
|
|
49
|
-
1.
|
|
50
|
-
2. 'DAS' query (
|
|
49
|
+
1. 'files' list or path (local)
|
|
50
|
+
2. 'DAS' query (remote fallback)
|
|
51
51
|
|
|
52
|
-
Returns
|
|
52
|
+
Returns canonical coffea fileset: {dataset_name: [file_path_list]}.
|
|
53
53
|
"""
|
|
54
54
|
import glob
|
|
55
55
|
import os
|
|
56
|
-
|
|
57
|
-
#
|
|
58
|
-
# def _fetch_files_from_das(das_query: str) -> list[str]: ...
|
|
56
|
+
|
|
57
|
+
# Placeholder for DAS fetching if needed
|
|
58
|
+
# def _fetch_files_from_das(das_query: str) -> list[str]: ...
|
|
59
59
|
|
|
60
60
|
with open(sample_json) as f:
|
|
61
61
|
full_data = json.load(f)
|
|
@@ -64,23 +64,31 @@ class TriggerLoader:
|
|
|
64
64
|
fileset, meta_data = {}, {}
|
|
65
65
|
for ds_name, ds_info in dataset_metadata.items():
|
|
66
66
|
files = []
|
|
67
|
+
|
|
67
68
|
if "files" in ds_info:
|
|
68
69
|
file_info = ds_info["files"]
|
|
70
|
+
|
|
69
71
|
if isinstance(file_info, list):
|
|
70
|
-
files =
|
|
72
|
+
files = []
|
|
73
|
+
for f in file_info:
|
|
74
|
+
if os.path.isdir(f):
|
|
75
|
+
files.extend(glob.glob(os.path.join(f, "*.root")))
|
|
76
|
+
elif os.path.isfile(f):
|
|
77
|
+
files.append(f)
|
|
78
|
+
|
|
71
79
|
elif isinstance(file_info, str):
|
|
72
80
|
if os.path.isdir(file_info):
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
self.logger.info(f"Resolved {len(files)} files from directory {file_info}.")
|
|
76
|
-
else:
|
|
81
|
+
files = glob.glob(os.path.join(file_info, "*.root"))
|
|
82
|
+
elif os.path.isfile(file_info):
|
|
77
83
|
files = [file_info]
|
|
84
|
+
|
|
78
85
|
if files:
|
|
79
86
|
self.logger.info(f"Using {len(files)} local/explicit files for {ds_name}.")
|
|
80
87
|
|
|
88
|
+
# Fallback to DAS if no local files found
|
|
81
89
|
if not files and "DAS" in ds_info:
|
|
82
90
|
try:
|
|
83
|
-
files = _fetch_files_from_das(ds_info["DAS"])
|
|
91
|
+
files = _fetch_files_from_das(ds_info["DAS"])
|
|
84
92
|
self.logger.info(f"Resolved {len(files)} files via DAS for {ds_name}.")
|
|
85
93
|
except NameError:
|
|
86
94
|
self.logger.info("DAS fetching skipped: _fetch_files_from_das is not defined.")
|
|
@@ -90,10 +98,14 @@ class TriggerLoader:
|
|
|
90
98
|
continue
|
|
91
99
|
|
|
92
100
|
fileset[ds_name] = files
|
|
93
|
-
meta_data[ds_name] = {
|
|
101
|
+
meta_data[ds_name] = {
|
|
102
|
+
"files": files,
|
|
103
|
+
"is_signal": ds_info.get("is_signal", False)
|
|
104
|
+
}
|
|
94
105
|
|
|
95
106
|
return fileset, meta_data
|
|
96
107
|
|
|
108
|
+
|
|
97
109
|
def _write_run_metadata_file(self, path: str, duration_s: float | None = None):
|
|
98
110
|
meta_path = f"{path}/run_metadata.json"
|
|
99
111
|
data = {
|
|
@@ -164,7 +164,7 @@ class TriggerProcessor(processor.ProcessorABC):
|
|
|
164
164
|
"entrystop": event_meta["stop"],
|
|
165
165
|
"n_events_written": len(table),
|
|
166
166
|
"columns": table.column_names,
|
|
167
|
-
"created_utc": dt.datetime.now(dt.
|
|
167
|
+
"created_utc": dt.datetime.now(dt.timezone.utc).isoformat(timespec="seconds") + "Z",
|
|
168
168
|
"compression": self.compression,
|
|
169
169
|
"processing_time_s": round(elapsed_s, 6),
|
|
170
170
|
}
|
|
@@ -9,7 +9,8 @@ from typing import Optional, Dict, Any, Union
|
|
|
9
9
|
import shutil, warnings
|
|
10
10
|
import importlib.resources as pkg_resources
|
|
11
11
|
import triggerflow.templates
|
|
12
|
-
from
|
|
12
|
+
from importlib import import_module
|
|
13
|
+
from datetime import datetime
|
|
13
14
|
|
|
14
15
|
|
|
15
16
|
class ModelConverter(ABC):
|
|
@@ -265,21 +266,19 @@ class WorkspaceManager:
|
|
|
265
266
|
def __init__(self):
|
|
266
267
|
self.workspace = self.BASE_WORKSPACE
|
|
267
268
|
self.artifacts = {"firmware": None}
|
|
268
|
-
self.metadata = {
|
|
269
|
-
"name": None,
|
|
270
|
-
"ml_backend": None,
|
|
271
|
-
"compiler": None,
|
|
272
|
-
"versions": []
|
|
273
|
-
}
|
|
269
|
+
self.metadata = {}
|
|
274
270
|
|
|
275
|
-
def setup_workspace(self,
|
|
276
|
-
"""Initialize workspace and metadata"""
|
|
271
|
+
def setup_workspace(self, config: Dict):
|
|
272
|
+
"""Initialize workspace and save metadata"""
|
|
277
273
|
self.workspace.mkdir(parents=True, exist_ok=True)
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
"
|
|
282
|
-
|
|
274
|
+
|
|
275
|
+
# Store config + timestamp as metadata
|
|
276
|
+
self.metadata = {
|
|
277
|
+
"config": config,
|
|
278
|
+
"created_at": datetime.now().isoformat()
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
self.save_metadata()
|
|
283
282
|
|
|
284
283
|
def save_native_model(self, model, ml_backend: str):
|
|
285
284
|
"""Save the native model to workspace"""
|
|
@@ -292,18 +291,10 @@ class WorkspaceManager:
|
|
|
292
291
|
"""Add artifact to tracking"""
|
|
293
292
|
self.artifacts[key] = value
|
|
294
293
|
|
|
295
|
-
def add_version(self, version_info: Dict):
|
|
296
|
-
"""Add version information"""
|
|
297
|
-
self.metadata["versions"].append(version_info)
|
|
298
|
-
|
|
299
294
|
def save_metadata(self):
|
|
300
295
|
"""Save metadata to file"""
|
|
301
296
|
with open(self.workspace / "metadata.json", "w") as f:
|
|
302
|
-
json.dump(
|
|
303
|
-
"name": self.metadata["name"],
|
|
304
|
-
"ml_backend": self.metadata["ml_backend"],
|
|
305
|
-
"compiler": self.metadata["compiler"],
|
|
306
|
-
}, f, indent=2)
|
|
297
|
+
json.dump(self.metadata, f, indent=2)
|
|
307
298
|
|
|
308
299
|
|
|
309
300
|
class ModelSerializer:
|
|
@@ -394,6 +385,7 @@ class TriggerModel:
|
|
|
394
385
|
|
|
395
386
|
self.native_model = native_model
|
|
396
387
|
self.scales = scales
|
|
388
|
+
self.config = config # Store the full config
|
|
397
389
|
|
|
398
390
|
self.compiler_cfg = config.get("compiler", {})
|
|
399
391
|
self.subsystem_cfg = config.get("subsystem", {})
|
|
@@ -404,6 +396,8 @@ class TriggerModel:
|
|
|
404
396
|
|
|
405
397
|
self.n_outputs = self.compiler_cfg.get("n_outputs")
|
|
406
398
|
self.unscaled_type = self.subsystem_cfg.get("unscaled_type", "ap_fixed<16,6>")
|
|
399
|
+
self.namespace = self.compiler_cfg.get("namespace", "triggerflow")
|
|
400
|
+
self.project_name = self.compiler_cfg.get("project_name", "triggerflow")
|
|
407
401
|
|
|
408
402
|
if self.ml_backend not in ("keras", "xgboost"):
|
|
409
403
|
raise ValueError("Unsupported backend")
|
|
@@ -416,13 +410,8 @@ class TriggerModel:
|
|
|
416
410
|
self.model_qonnx = None
|
|
417
411
|
self.input_name = None
|
|
418
412
|
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
self.name,
|
|
422
|
-
self.ml_backend,
|
|
423
|
-
self.compiler
|
|
424
|
-
)
|
|
425
|
-
|
|
413
|
+
self.workspace_manager.setup_workspace(self.config)
|
|
414
|
+
|
|
426
415
|
@property
|
|
427
416
|
def workspace(self) -> Path:
|
|
428
417
|
"""Get workspace path"""
|
|
@@ -455,7 +444,6 @@ class TriggerModel:
|
|
|
455
444
|
qonnx_path, self.model_qonnx = conversion_result
|
|
456
445
|
self.input_name = self.model_qonnx.graph.input[0].name
|
|
457
446
|
self.workspace_manager.add_artifact("qonnx", qonnx_path)
|
|
458
|
-
self.workspace_manager.add_version({"qonnx": str(qonnx_path)})
|
|
459
447
|
|
|
460
448
|
|
|
461
449
|
# Compile model
|
|
@@ -475,27 +463,20 @@ class TriggerModel:
|
|
|
475
463
|
self.unscaled_type
|
|
476
464
|
)
|
|
477
465
|
|
|
466
|
+
subsystem_name = self.subsystem_cfg.get("name", "uGT")
|
|
467
|
+
interface_module = import_module(f"triggerflow.interfaces.{subsystem_name}")
|
|
468
|
+
build_firmware = getattr(interface_module, f"build_{subsystem_name.lower()}_model")
|
|
469
|
+
|
|
470
|
+
build_firmware(
|
|
471
|
+
subsystem_cfg=self.subsystem_cfg,
|
|
472
|
+
compiler_cfg=self.compiler_cfg,
|
|
473
|
+
workspace_manager=self.workspace_manager,
|
|
474
|
+
compiler=self.compiler,
|
|
475
|
+
scales=self.scales,
|
|
476
|
+
name=self.name,
|
|
477
|
+
n_outputs=self.n_outputs
|
|
478
|
+
)
|
|
478
479
|
|
|
479
|
-
build_ugt_model(
|
|
480
|
-
templates_dir=self.subsystem_cfg.get("templates_dir", Path("templates")),
|
|
481
|
-
firmware_dir=self.workspace_manager.workspace / "firmware",
|
|
482
|
-
compiler = self.compiler,
|
|
483
|
-
model_name=self.name,
|
|
484
|
-
n_inputs=self.subsystem_cfg["n_inputs"],
|
|
485
|
-
n_outputs=self.subsystem_cfg.get("n_outputs", self.n_outputs),
|
|
486
|
-
nn_offsets=self.scales["offsets"],
|
|
487
|
-
nn_shifts=self.scales["shifts"],
|
|
488
|
-
muon_size=self.subsystem_cfg.get("muon_size", 0),
|
|
489
|
-
jet_size=self.subsystem_cfg.get("jet_size", 0),
|
|
490
|
-
egamma_size=self.subsystem_cfg.get("egamma_size", 0),
|
|
491
|
-
tau_size=self.subsystem_cfg.get("tau_size", 0),
|
|
492
|
-
output_type=self.subsystem_cfg.get("output_type", "result_t"),
|
|
493
|
-
offset_type=self.subsystem_cfg.get("offset_type", "ap_fixed<10,10>"),
|
|
494
|
-
shift_type=self.subsystem_cfg.get("shift_type", "ap_fixed<10,10>"),
|
|
495
|
-
object_features=self.subsystem_cfg.get("object_features"),
|
|
496
|
-
global_features=self.subsystem_cfg.get("global_features")
|
|
497
|
-
)
|
|
498
|
-
|
|
499
480
|
|
|
500
481
|
|
|
501
482
|
self.workspace_manager.add_artifact("firmware", self.workspace_manager.workspace / "firmware")
|
|
@@ -563,6 +544,8 @@ class TriggerModel:
|
|
|
563
544
|
"AD_SHIFT": ", ".join(map(str, ad_shift)),
|
|
564
545
|
"AD_OFFSETS": ", ".join(map(str, ad_offsets)),
|
|
565
546
|
"UNSCALED_TYPE": unscaled_type,
|
|
547
|
+
"NAMESPACE": self.namespace,
|
|
548
|
+
"PROJECT_NAME": self.project_name,
|
|
566
549
|
}
|
|
567
550
|
self._render_template(scales_template_path, scales_out_path, context)
|
|
568
551
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from pathlib import Path
|
|
2
|
-
import shutil, warnings
|
|
2
|
+
import shutil, warnings, subprocess
|
|
3
3
|
import pkg_resources
|
|
4
4
|
from jinja2 import Template
|
|
5
5
|
import re
|
|
@@ -7,7 +7,7 @@ import re
|
|
|
7
7
|
|
|
8
8
|
def _render_template(template_name: str, output_file: Path, context: dict):
|
|
9
9
|
template_bytes = pkg_resources.resource_string(
|
|
10
|
-
"triggerflow"
|
|
10
|
+
"triggerflow", template_name
|
|
11
11
|
)
|
|
12
12
|
template_text = template_bytes.decode('utf-8')
|
|
13
13
|
|
|
@@ -17,11 +17,62 @@ def _render_template(template_name: str, output_file: Path, context: dict):
|
|
|
17
17
|
with open(output_file, "w") as f:
|
|
18
18
|
f.write(rendered)
|
|
19
19
|
|
|
20
|
+
|
|
20
21
|
def build_ugt_model(
|
|
22
|
+
subsystem_cfg: dict,
|
|
23
|
+
compiler_cfg: dict,
|
|
24
|
+
workspace_manager,
|
|
25
|
+
compiler,
|
|
26
|
+
scales: dict,
|
|
27
|
+
name: str,
|
|
28
|
+
n_outputs: int
|
|
29
|
+
):
|
|
30
|
+
|
|
31
|
+
firmware_dir = workspace_manager.workspace / "firmware"
|
|
32
|
+
templates_dir = subsystem_cfg.get("templates_dir", Path("templates"))
|
|
33
|
+
|
|
34
|
+
objects = subsystem_cfg.get("objects", {})
|
|
35
|
+
|
|
36
|
+
object_features = {}
|
|
37
|
+
|
|
38
|
+
for object_name, object_config in objects.items():
|
|
39
|
+
object_features[object_name] = object_config.get("features", [])
|
|
40
|
+
|
|
41
|
+
muon_size = subsystem_cfg.get("muon_size", 0)
|
|
42
|
+
jet_size = subsystem_cfg.get("jet_size", 0)
|
|
43
|
+
egamma_size = subsystem_cfg.get("egamma_size", 0)
|
|
44
|
+
tau_size = subsystem_cfg.get("tau_size", 0)
|
|
45
|
+
|
|
46
|
+
uGT(
|
|
47
|
+
templates_dir=templates_dir,
|
|
48
|
+
firmware_dir=firmware_dir,
|
|
49
|
+
compiler=compiler,
|
|
50
|
+
model_name=name,
|
|
51
|
+
namespace=compiler_cfg.get("namespace", "triggerflow"),
|
|
52
|
+
project_name=compiler_cfg.get("project_name", "triggerflow"),
|
|
53
|
+
n_inputs=subsystem_cfg["n_inputs"],
|
|
54
|
+
n_outputs=subsystem_cfg.get("n_outputs", n_outputs),
|
|
55
|
+
nn_offsets=scales["offsets"],
|
|
56
|
+
nn_shifts=scales["shifts"],
|
|
57
|
+
muon_size=muon_size,
|
|
58
|
+
jet_size=jet_size,
|
|
59
|
+
egamma_size=egamma_size,
|
|
60
|
+
tau_size=tau_size,
|
|
61
|
+
output_type=subsystem_cfg.get("output_type", "result_t"),
|
|
62
|
+
offset_type=subsystem_cfg.get("offset_type", "ap_fixed<10,10>"),
|
|
63
|
+
shift_type=subsystem_cfg.get("shift_type", "ap_fixed<10,10>"),
|
|
64
|
+
object_features=object_features,
|
|
65
|
+
global_features=subsystem_cfg.get("global_features")
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def uGT(
|
|
21
70
|
templates_dir: Path,
|
|
22
71
|
firmware_dir: Path,
|
|
23
72
|
compiler: str,
|
|
24
73
|
model_name: str,
|
|
74
|
+
namespace: str,
|
|
75
|
+
project_name: str,
|
|
25
76
|
n_inputs: int,
|
|
26
77
|
n_outputs: int,
|
|
27
78
|
nn_offsets: list,
|
|
@@ -40,7 +91,6 @@ def build_ugt_model(
|
|
|
40
91
|
Render uGT top func.
|
|
41
92
|
"""
|
|
42
93
|
|
|
43
|
-
|
|
44
94
|
if object_features is None:
|
|
45
95
|
object_features = {
|
|
46
96
|
"muons": ["pt", "eta_extrapolated", "phi_extrapolated"],
|
|
@@ -84,29 +134,31 @@ def build_ugt_model(
|
|
|
84
134
|
|
|
85
135
|
|
|
86
136
|
context = {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
137
|
+
"MODEL_NAME": model_name,
|
|
138
|
+
"NAMESPACE": namespace,
|
|
139
|
+
"PROJECT_NAME": project_name,
|
|
140
|
+
"N_INPUTS": n_inputs,
|
|
141
|
+
"N_OUTPUTS": n_outputs,
|
|
142
|
+
"NN_OFFSETS": ", ".join(map(str, nn_offsets)),
|
|
143
|
+
"NN_SHIFTS": ", ".join(map(str, nn_shifts)),
|
|
144
|
+
"MUON_SIZE": muon_size,
|
|
145
|
+
"JET_SIZE": jet_size,
|
|
146
|
+
"EGAMMA_SIZE": egamma_size,
|
|
147
|
+
"TAU_SIZE": tau_size,
|
|
148
|
+
"OUTPUT_TYPE": output_type,
|
|
149
|
+
"OUTPUT_LAYER": output_layer,
|
|
150
|
+
"OUT": out,
|
|
151
|
+
"OFFSET_TYPE": offset_type,
|
|
152
|
+
"SHIFT_TYPE": shift_type,
|
|
153
|
+
"MUON_FEATURES": object_features["muons"],
|
|
154
|
+
"JET_FEATURES": object_features["jets"],
|
|
155
|
+
"EGAMMA_FEATURES": object_features["egammas"],
|
|
156
|
+
"TAU_FEATURES": object_features["taus"],
|
|
157
|
+
"GLOBAL_FEATURES": global_features
|
|
106
158
|
}
|
|
107
159
|
|
|
108
160
|
context_tcl = {
|
|
109
|
-
|
|
161
|
+
"MODEL_NAME": model_name,
|
|
110
162
|
}
|
|
111
163
|
|
|
112
164
|
out_path = firmware_dir / "firmware/model-gt.cpp"
|
|
@@ -128,12 +180,8 @@ def build_ugt_model(
|
|
|
128
180
|
check=True
|
|
129
181
|
)
|
|
130
182
|
else:
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
183
|
+
warnings.warn(
|
|
184
|
+
"Vivado executable not found on the system PATH. "
|
|
185
|
+
"Skipping FW build. ",
|
|
186
|
+
UserWarning
|
|
187
|
+
)
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"samples" : {
|
|
3
3
|
"signal" : {
|
|
4
|
-
"all_file_path":"data/01_raw/test.root",
|
|
5
4
|
"files":"data/01_raw/test.root",
|
|
6
|
-
"path":"data/01_raw/test.root",
|
|
7
5
|
"file_pattern":["test.root"],
|
|
8
6
|
"DAS" : "Blabla",
|
|
9
7
|
"type" : "123",
|
|
@@ -13,9 +11,7 @@
|
|
|
13
11
|
"is_signal": true
|
|
14
12
|
},
|
|
15
13
|
"background" : {
|
|
16
|
-
"all_file_path":"data/01_raw/test.root",
|
|
17
14
|
"files":"data/01_raw/test.root",
|
|
18
|
-
"path":"data/01_raw/test.root",
|
|
19
15
|
"file_pattern":["test.root"],
|
|
20
16
|
"DAS" : "Blabla",
|
|
21
17
|
"type" : "123",
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import logging, json
|
|
2
|
+
from glob import glob
|
|
3
|
+
from kedro.io import AbstractDataset
|
|
4
|
+
|
|
5
|
+
METADATA_CONFIG = {"x": 0}
|
|
6
|
+
|
|
7
|
+
class MetaDataset(AbstractDataset):
|
|
8
|
+
def __init__(self, filepath: str, sample_key: str):
|
|
9
|
+
self._filepath = filepath
|
|
10
|
+
self._sample_key = sample_key
|
|
11
|
+
self.logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
def get_dasgoclient_metadata(self, das_name: str, config: dict) -> dict:
|
|
14
|
+
self.logger.info(f"Fetching DAS metadata for dataset: {das_name}")
|
|
15
|
+
return {"gridpack": "0.0.0"}
|
|
16
|
+
|
|
17
|
+
def _load(self) -> dict:
|
|
18
|
+
self.logger.info(f"Processing file: {self._filepath}")
|
|
19
|
+
with open(self._filepath, "r") as f:
|
|
20
|
+
data = json.load(f)
|
|
21
|
+
return data
|
|
22
|
+
|
|
23
|
+
def _save(self, samples: dict) -> None:
|
|
24
|
+
metadata = {}
|
|
25
|
+
|
|
26
|
+
dataset_content = samples.get(self._sample_key, {})
|
|
27
|
+
|
|
28
|
+
for sample_name, sample_info in dataset_content.items():
|
|
29
|
+
self.logger.info(f"Processing sample: {sample_name}")
|
|
30
|
+
|
|
31
|
+
sample_files = sample_info.get("files", "")
|
|
32
|
+
|
|
33
|
+
resolved_files = glob(sample_files) if isinstance(sample_files, str) else sample_files
|
|
34
|
+
sample_info["files"] = resolved_files
|
|
35
|
+
|
|
36
|
+
self.logger.info(f"Found {len(resolved_files)} files for {sample_name}.")
|
|
37
|
+
|
|
38
|
+
metadata[sample_name] = self.get_dasgoclient_metadata(
|
|
39
|
+
sample_info.get("DAS", "Unknown"),
|
|
40
|
+
METADATA_CONFIG
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
with open(self._filepath, "w") as f:
|
|
44
|
+
json.dump(metadata, f, indent=4)
|
|
45
|
+
|
|
46
|
+
def _describe(self) -> dict:
|
|
47
|
+
return {"filepath": self._filepath, "sample_key": self._sample_key}
|
|
48
|
+
|
|
49
|
+
|