# rbonnetguerrini/ml4transients architecture

> Architecture diagram of the GitHub repository rbonnetguerrini/ml4transients, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-05-12). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/rbonnetguerrini/ml4transients
- Repository: https://github.com/rbonnetguerrini/ml4transients

## Overview

1. **What this repo is**
   ML4transients is an end-to-end Python package for transient-vs-bogus classification, centered on LSST data products. It is not a single model repo; it spans data generation, cutout/lightcurve preparation, model training, inference, and post-hoc evaluation/interpretability.

2. **Core pipeline boundary**
   The architecture is organized as a pipeline over astronomy data artifacts:
   raw LSST difference-image/visit data → injected catalogs and cutouts → indexed lightcurve datasets and cross-match annotations → PyTorch training datasets → trained CNN/ensemble models → batch inference and evaluation outputs.  
   Most steps are driven by YAML configs and shell submit scripts.

3. **Package layout in `src/ML4transients`**
   The library is split by subsystem:
   - `data_preparation`: crossmatch, cutouts, lightcurves
   - `data_access`: dataset loading and lazy access
   - `training`: models, losses, trainers, PyTorch dataset wrappers
   - `evaluation`: inference, metrics, visualizations, interpretability, lightcurve labeling
   - `injection`: synthetic transient catalog generation
   - `utils.py`: shared helpers  
   This mirrors the operational workflow and makes the main architecture easy to diagram as separate stages.

4. **Data preparation subsystem**
   This is the heaviest external-boundary layer and depends on LSST-distributed tooling. It includes:
   - `run_cutout.py` and batch submit scripts to produce image cutouts/features from selected visits
   - `run_lightcurves.py` to extract and index time-series data into patch-based HDF5 files
   - `run_crossmatch.py` to annotate/filter against external catalogs such as Gaia/MilliQuas
   - noise perturbation and batch orchestration utilities for splitting large collections across jobs  
   The output is structured for downstream ML consumption, not for direct human use.

5. **Injection subsystem**
   `scripts/injection` and `src/ML4transients/injection` generate synthetic source catalogs for training. The repo supports both host-associated and hostless transients, with band-specific catalogue generation and batch submission. This stage feeds the LSST pipeline and is a distinct source of supervised labels in an otherwise weakly/unsupervised data regime.

6. **Dataset access boundary**
   `DatasetLoader` in `data_access` is the main abstraction for consuming prepared data. It lazily loads cutouts, lightcurves, features, and inference outputs from disk, and builds object/source ID indexing for lookup. This is the boundary between storage formats (HDF5, indices, per-visit artifacts) and model-facing code.

7. **Training subsystem**
   Training is PyTorch-based (`torch` 2.0 per README) and includes multiple strategies:
   - standard CNN training
   - deep ensemble training
   - co-teaching and asymmetric co-teaching
   - stochastic co-teaching variants
   - multichannel variants that use difference images plus coadded images  
   The `models.py`, `losses.py`, `trainers.py`, and `pytorch_dataset.py` modules separate network definition, objective functions, training loop logic, and data feeding. Hyperparameter search is supported through Bayesian optimization configs.

8. **Inference and evaluation subsystem**
   `evaluation/inference.py` and `scripts/evaluation/run_inference.py` run model prediction over prepared data, often in batch mode. Evaluation extends beyond classification metrics into:
   - UMAP/embedding-based interpretability
   - uncertainty analysis
   - visualizations for cutouts and lightcurves
   - object-subset evaluation via ID lists  
   Results are written to disk and can be re-ingested for further analysis.

9. **Lightcurve-specific workflow and SuperNNova integration**
   A separate lightcurve inference path exists around SuperNNova (SNN). The repo converts HDF5 patch-based lightcurves to CSV, runs SNN in a different environment, then writes ensemble predictions back into the original HDF5 files. This is a clear cross-system boundary: ML4transients manages the data staging and result reintegration, while SNN performs the actual sequence-model inference.

10. **Operational model: scripts, configs, and batch jobs**
   The repo is designed for HPC/cluster execution rather than a single interactive app. `scripts/` contains job submission wrappers for SLURM-style batch execution, and `configs/` defines stage-specific YAMLs for data preparation, injection, training, and evaluation. The README explicitly distinguishes LSST-distrib environments for pipeline-related steps from a normal conda/PyTorch environment for training and evaluation.

11. **Artifacts and persistence**
   The main persistent outputs are HDF5 datasets, CSV exports for SNN, config-derived intermediate files, model checkpoints/weights, TensorBoard logs, and HTML/lightcurve visualizations. This means the architecture is file- and job-oriented, with disk-based handoffs between subsystems rather than a central service or database.

12. **How to diagram it**
   A good architecture diagram would show four main lanes:  
   data generation/preparation, ML training, inference/evaluation, and external catalog/SNN integration.  
   The key interfaces are the on-disk dataset formats, the `DatasetLoader` abstraction, and the config-driven batch scripts that connect each stage.

Main entry points: [`src/ML4transients`](https://github.com/rbonnetguerrini/ml4transients/tree/main/src/ML4transients) (ML4transients), [`src/ML4transients/evaluation/inference.py`](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/inference.py) (Inference), [`scripts`](https://github.com/rbonnetguerrini/ml4transients/tree/main/scripts) (Batch scripts), [`src/ML4transients/data_access/dataset_loader.py`](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_access/dataset_loader.py) (Dataset loader)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_group_data_prep["Data prep"]
  node_dp_crossmatch["Crossmatch<br/>catalog annotation<br/>[crossmatch.py]"]
  node_dp_cutouts["Cutouts<br/>image prep<br/>[cutouts.py]"]
  node_dp_lightcurves["Lightcurves<br/>time-series prep<br/>[lightcurves.py]"]
  node_dp_run_cutout["Run cutout<br/>pipeline script<br/>[run_cutout.py]"]
  node_dp_run_lc["Run lc<br/>pipeline script<br/>[run_lightcurves.py]"]
  node_dp_run_crossmatch["Run crossmatch<br/>pipeline script<br/>[run_crossmatch.py]"]
  node_dp_noise["Noise perturb<br/>batch utility"]
end

subgraph group_group_training["Training"]
  node_train_models["Models<br/>network definitions<br/>[models.py]"]
  node_train_losses["Losses<br/>objectives<br/>[losses.py]"]
  node_train_dataset["PyTorch dataset<br/>batching layer<br/>[pytorch_dataset.py]"]
  node_train_trainers["Trainers<br/>training loops<br/>[trainers.py]"]
  node_train_script["Train model<br/>training entrypoint<br/>[train_model.py]"]
end

subgraph group_group_eval["Evaluation"]
  node_infer_eval["Inference<br/>prediction engine<br/>[inference.py]"]
  node_eval_metrics["Metrics<br/>evaluation<br/>[metrics.py]"]
  node_eval_interp["Interpretability<br/>analysis"]
  node_eval_viz["Visualizations<br/>reporting<br/>[visualizations.py]"]
  node_eval_lc["LC labels<br/>labeling<br/>[lc_labels.py]"]
  node_eval_script["Run eval<br/>evaluation entrypoint<br/>[run_evaluation.py]"]
  node_snn_convert["SNN convert<br/>interop bridge"]
  node_snn_infer["SNN infer<br/>external inference<br/>[infer_snn.py]"]
  node_snn_save["SNN save<br/>result reintegration"]
end

subgraph group_group_injection["Injection"]
  node_inj_catalog["Injection catalog<br/>synthetic data<br/>[injection.py]"]
  node_inj_script["Gen injection<br/>pipeline script"]
end

node_src_pkg["ML4transients<br/>python package"]
node_utils["Utils<br/>shared helpers<br/>[utils.py]"]
node_loader[("Dataset loader<br/>data boundary<br/>[dataset_loader.py]")]
node_configs["Configs"]
node_scripts_root["Batch scripts<br/>hpc wrappers"]

node_src_pkg -->|"shared helpers"| node_utils
node_src_pkg -->|"data prep"| node_dp_crossmatch
node_src_pkg -->|"data prep"| node_dp_cutouts
node_src_pkg -->|"data prep"| node_dp_lightcurves
node_src_pkg -->|"data access"| node_loader
node_src_pkg -->|"training"| node_train_models
node_src_pkg -->|"training"| node_train_losses
node_src_pkg -->|"training"| node_train_dataset
node_src_pkg -->|"training"| node_train_trainers
node_src_pkg -->|"evaluation"| node_infer_eval
node_src_pkg -->|"evaluation"| node_eval_metrics
node_src_pkg -->|"injection"| node_inj_catalog
node_dp_run_cutout -->|"calls"| node_dp_cutouts
node_dp_run_lc -->|"calls"| node_dp_lightcurves
node_dp_run_crossmatch -->|"calls"| node_dp_crossmatch
node_dp_noise -->|"augments"| node_dp_cutouts
node_loader -->|"feeds"| node_train_dataset
node_loader -->|"feeds"| node_infer_eval
node_train_dataset -->|"batches for"| node_train_models
node_train_models -->|"optimized by"| node_train_losses
node_train_trainers -->|"trains"| node_train_models
node_train_script -->|"launches"| node_train_trainers
node_eval_script -->|"launches"| node_infer_eval
node_infer_eval -->|"scores"| node_eval_metrics
node_infer_eval -->|"analyzes"| node_eval_interp
node_infer_eval -->|"renders"| node_eval_viz
node_infer_eval -->|"labels"| node_eval_lc
node_inj_script -->|"generates"| node_inj_catalog
node_snn_convert -->|"reads"| node_loader
node_snn_convert -->|"stages for"| node_snn_infer
node_snn_infer -->|"returns to"| node_snn_save
node_configs -->|"configures"| node_dp_run_cutout
node_configs -->|"configures"| node_train_script
node_configs -->|"configures"| node_eval_script
node_scripts_root -->|"orchestrates"| node_dp_run_cutout
node_scripts_root -->|"orchestrates"| node_train_script
node_scripts_root -->|"orchestrates"| node_eval_script
node_scripts_root -->|"orchestrates"| node_inj_script

click node_src_pkg "https://github.com/rbonnetguerrini/ml4transients/tree/main/src/ML4transients"
click node_utils "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/utils.py"
click node_dp_crossmatch "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/crossmatch.py"
click node_dp_cutouts "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/cutouts.py"
click node_dp_lightcurves "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/lightcurves.py"
click node_dp_run_cutout "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_cutout.py"
click node_dp_run_lc "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_lightcurves.py"
click node_dp_run_crossmatch "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_crossmatch.py"
click node_dp_noise "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/compute_noise_perturbation.py"
click node_loader "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_access/dataset_loader.py"
click node_train_models "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/models.py"
click node_train_losses "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/losses.py"
click node_train_dataset "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/pytorch_dataset.py"
click node_train_trainers "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/trainers.py"
click node_train_script "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/training/train_model.py"
click node_infer_eval "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/inference.py"
click node_eval_metrics "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/metrics.py"
click node_eval_interp "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/interpretability.py"
click node_eval_viz "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/visualizations.py"
click node_eval_lc "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/lc_labels.py"
click node_eval_script "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/evaluation/run_evaluation.py"
click node_inj_catalog "https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/injection/injection.py"
click node_inj_script "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/injection/gen_injection_catalogue.py"
click node_snn_convert "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/convert_lc_for_snn.py"
click node_snn_infer "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/infer_snn.py"
click node_snn_save "https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/save_inference_snn.py"
click node_configs "https://github.com/rbonnetguerrini/ml4transients/tree/main/configs"
click node_scripts_root "https://github.com/rbonnetguerrini/ml4transients/tree/main/scripts"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_dp_crossmatch,node_dp_cutouts,node_dp_lightcurves,node_dp_run_cutout,node_dp_run_lc,node_dp_run_crossmatch,node_dp_noise toneBlue
class node_train_models,node_train_losses,node_train_dataset,node_train_trainers,node_train_script toneAmber
class node_infer_eval,node_eval_metrics,node_eval_interp,node_eval_viz,node_eval_lc,node_eval_script,node_snn_convert,node_snn_infer,node_snn_save toneMint
class node_inj_catalog,node_inj_script toneRose
class node_src_pkg,node_utils,node_loader,node_configs,node_scripts_root toneNeutral
```

## Components

### Data prep

Raw LSST data is turned into cutouts, lightcurves, and crossmatch annotations.

- [Crossmatch](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/crossmatch.py): catalog annotation · Matches and filters sources against external catalogs. · `src/ML4transients/data_preparation/crossmatch.py`
- [Cutouts](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/cutouts.py): image prep · Builds cutouts and features from selected visits. · `src/ML4transients/data_preparation/cutouts.py`
- [Lightcurves](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_preparation/lightcurves.py): time-series prep · Extracts and indexes patch-based lightcurve datasets. · `src/ML4transients/data_preparation/lightcurves.py`
- [Run cutout](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_cutout.py): pipeline script · Batch entrypoint for cutout generation. · `scripts/data_preparation/run_cutout.py`
- [Run lc](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_lightcurves.py): pipeline script · Batch entrypoint for lightcurve extraction. · `scripts/data_preparation/run_lightcurves.py`
- [Run crossmatch](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/run_crossmatch.py): pipeline script · Batch entrypoint for catalog crossmatching. · `scripts/data_preparation/run_crossmatch.py`
- [Noise perturb](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/compute_noise_perturbation.py): batch utility · Creates noisy variants and splits work across jobs. · `scripts/data_preparation/compute_noise_perturbation.py`

### Training

PyTorch models, losses, datasets, and training loops.

- [Models](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/models.py): network definitions · CNN and ensemble model definitions, including multichannel variants. · `src/ML4transients/training/models.py`
- [Losses](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/losses.py): objectives · Standard, co-teaching, and ensemble training losses. · `src/ML4transients/training/losses.py`
- [PyTorch dataset](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/pytorch_dataset.py): batching layer · Feeds prepared artifacts into the training loop. · `src/ML4transients/training/pytorch_dataset.py`
- [Trainers](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/training/trainers.py): training loops · Implements standard, ensemble, and co-teaching training strategies. · `src/ML4transients/training/trainers.py`
- [Train model](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/training/train_model.py): training entrypoint · Command-line training runner for configured experiments. · `scripts/training/train_model.py`

### Evaluation

Inference, metrics, interpretability, and visualization outputs.

- [Inference](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/inference.py): prediction engine · Runs batch prediction over prepared data and writes outputs. · `src/ML4transients/evaluation/inference.py`
- [Metrics](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/metrics.py): evaluation · Computes classification and subset evaluation metrics. · `src/ML4transients/evaluation/metrics.py`
- [Interpretability](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/interpretability.py): analysis · Embeddings, UMAP-style views, and uncertainty analysis. · `src/ML4transients/evaluation/interpretability.py`
- [Visualizations](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/visualizations.py): reporting · Cutout and result visualizations for inspection. · `src/ML4transients/evaluation/visualizations.py`
- [LC labels](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/evaluation/lc_labels.py): labeling · Generates lightcurve-specific labels and outputs. · `src/ML4transients/evaluation/lc_labels.py`
- [Run eval](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/evaluation/run_evaluation.py): evaluation entrypoint · Batch evaluation driver for metrics and outputs. · `scripts/evaluation/run_evaluation.py`
- [SNN convert](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/convert_lc_for_snn.py): interop bridge · Converts HDF5 lightcurves to CSV for SuperNNova. · `scripts/data_preparation/SNN/convert_lc_for_snn.py`
- [SNN infer](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/infer_snn.py): external inference · Runs SuperNNova inference in a separate environment. · `scripts/data_preparation/SNN/infer_snn.py`
- [SNN save](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/data_preparation/SNN/save_inference_snn.py): result reintegration · Writes SNN predictions back into original HDF5 artifacts. · `scripts/data_preparation/SNN/save_inference_snn.py`

### Injection

Synthetic transient catalog generation and batch submission.

- [Injection catalog](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/injection/injection.py): synthetic data · Generates synthetic transient catalogs for training labels. · `src/ML4transients/injection/injection.py`
- [Gen injection](https://github.com/rbonnetguerrini/ml4transients/blob/main/scripts/injection/gen_injection_catalogue.py): pipeline script · Creates band-specific injection catalogues for batch jobs. · `scripts/injection/gen_injection_catalogue.py`

### Other components

- [ML4transients](https://github.com/rbonnetguerrini/ml4transients/tree/main/src/ML4transients): python package · Top-level library namespace for the pipeline. · `src/ML4transients`
- [Utils](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/utils.py): shared helpers · Common helper functions used across subsystems. · `src/ML4transients/utils.py`
- [Dataset loader](https://github.com/rbonnetguerrini/ml4transients/blob/main/src/ML4transients/data_access/dataset_loader.py): data boundary · Lazily loads prepared artifacts and builds ID-based lookup. · `src/ML4transients/data_access/dataset_loader.py`
- [Configs](https://github.com/rbonnetguerrini/ml4transients/tree/main/configs): yaml configs · Stage-specific YAML configuration files for batch execution. · `configs`
- [Batch scripts](https://github.com/rbonnetguerrini/ml4transients/tree/main/scripts): hpc wrappers · SLURM-style wrappers and orchestration scripts across pipeline stages. · `scripts`

## Connections

- ML4transients → Utils: shared helpers · Common utilities support all subsystems.
- ML4transients → Crossmatch: data prep · Namespace contains data preparation modules.
- ML4transients → Cutouts: data prep · Namespace contains data preparation modules.
- ML4transients → Lightcurves: data prep · Namespace contains data preparation modules.
- ML4transients → Dataset loader: data access · Namespace contains dataset loading boundary.
- ML4transients → Models: training · Namespace contains model code.
- ML4transients → Losses: training · Namespace contains loss functions.
- ML4transients → PyTorch dataset: training · Namespace contains dataset wrappers.
- ML4transients → Trainers: training · Namespace contains training loops.
- ML4transients → Inference: evaluation · Namespace contains inference and scoring.
- ML4transients → Metrics: evaluation · Namespace contains metrics and analysis.
- ML4transients → Injection catalog: injection · Namespace contains synthetic catalog generation.
- Run cutout → Cutouts: calls · Script drives cutout generation.
- Run lc → Lightcurves: calls · Script drives lightcurve extraction.
- Run crossmatch → Crossmatch: calls · Script drives catalog annotation.
- Noise perturb → Cutouts: augments · Noise utilities operate on prepared image artifacts.
- Dataset loader → PyTorch dataset: feeds · Prepared artifacts are consumed by training datasets.
- Dataset loader → Inference: feeds · Prepared artifacts are consumed by batch inference.
- PyTorch dataset → Models: batches for · Dataset wrapper supplies model inputs.
- Models → Losses: optimized by · Model training uses configured losses.
- Trainers → Models: trains · Training loops fit the models.
- Train model → Trainers: launches · CLI entrypoint launches configured training.
- Run eval → Inference: launches · Batch driver runs inference and evaluation.
- Inference → Metrics: scores · Inference outputs are summarized by metrics.
- Inference → Interpretability: analyzes · Inference outputs feed interpretability analysis.
- Inference → Visualizations: renders · Inference outputs feed visual reports.
- Inference → LC labels: labels · Produces lightcurve-specific labels.
- Gen injection → Injection catalog: generates · Script creates synthetic injection catalogs.
- SNN convert → Dataset loader: reads · Reads prepared lightcurve artifacts for export.
- SNN convert → SNN infer: stages for · CSV export prepares external SNN inference.
- SNN infer → SNN save: returns to · External predictions are reintegrated into repository artifacts.
- Configs → Run cutout: configures · YAML configs drive batch prep stages.
- Configs → Train model: configures · YAML configs drive training runs.
- Configs → Run eval: configures · YAML configs drive evaluation runs.
- Batch scripts → Run cutout: orchestrates · Repository scripts orchestrate HPC execution.
- Batch scripts → Train model: orchestrates · Repository scripts orchestrate HPC execution.
- Batch scripts → Run eval: orchestrates · Repository scripts orchestrate HPC execution.
- Batch scripts → Gen injection: orchestrates · Repository scripts orchestrate HPC execution.
