Skip to content

Reproducibility

Public smoke run

pip install -e ".[dev,benchmark,app]"
adaptforecast validate-data data/sample/synthetic_demand.csv
adaptforecast benchmark --config configs/benchmark.smoke.yaml

The smoke profile uses one category, one seed, two GA generations, and five Pattern Search iterations. Its purpose is interface verification, not model comparison.

On a host without MATLAB, run the independent Python IT2 contract instead:

adaptforecast benchmark --config configs/benchmark.python-it2.smoke.yaml

The two smoke runs are separate backend checks and should not be merged into one performance claim.

Full audit

Run the full configuration with MATLAB R2024b+ and the required toolboxes:

adaptforecast benchmark --config configs/benchmark.yaml

The resulting artifact directory is authoritative. Preserve its manifest.json, data SHA-256, configuration, per-category and macro summaries, weather-ablation tables, predictions, rules, activations, and model files together. The manifest status is partial whenever a configured model is unavailable; only runs with every configured model present are marked complete.

Private data

Do not copy unlicensed source data into this repository. Set ADAPTFORECAST_DATA_DIR, run adaptforecast prepare when the legacy converter is needed, and reference the resulting file by name in a local configuration. The manifest records its hash without publishing its records. configs/benchmark.private.example.yaml resolves the input through that environment variable and writes full-run artifacts to the repository's parent directory. Use configs/benchmark.private.python-it2.example.yaml for the independent Python IT2 full run. Its artifact has the same year split and metric protocol, but its EFS backend identity remains python-it2 throughout the evidence tables.

Continuous integration

Python CI verifies conversion, leakage barriers, date alignment, metrics, artifact contracts, linting, documentation, and deterministic Python IT2 inference/training. MATLAB CI separately uses a deliberately small synthetic training job. Full three-seed optimization remains an explicit local research run because it is computationally expensive.

The public runner uses a staged file contract because temporary MATLAB Actions licensing is available to the official runner action rather than arbitrary child processes. Python first writes hash-identified jobs, the official action executes them, and the normal benchmark accepts the results only when the job configuration and input CSV hashes match exactly. Local execution continues to use matlab -batch directly.

On hosts where MATLAB is not on PATH, set ADAPTFORECAST_MATLAB_EXECUTABLE to the full path of the MATLAB executable. CI obtains this path from the official setup-matlab action output.