SPB Git

spb/wp46_uqo

Public

WP46: collect-and-evaluate chain

Simon-Pierre Boucher committed (Nov 9, 2026) parent 7c25080 Browse files

1 changed file +23 −0

Unified Split
added scripts/collect_and_evaluate.sh +23 −0
@@ -0,0 +1,23 @@
1+#!/bin/bash
2+# Collect the main run from the nodes, compute losses, run the analyses and build the exhibits (resumable; logs in results/logs).
3+set -u
4+cd "$(dirname "$0")/.." || exit 1
5+PY=.venv/bin/python
6+NODES=${NODES:-M3U96a:24,M3U96b:26,M2U64:22,M5M36:16,M4M64a:14,M4M64c:14}
7+$PY scripts/dispatch_nodes.py collect --name main --nodes "$NODES" 2>&1 | tee results/logs/collect_main.log
8+$PY - <<'PYEOF'
9+import json, collections, glob, os
10+root="results/forecasts/main"
11+files=[f for f in glob.glob(f"{root}/*/*.parquet") if not f.endswith(".fits.parquet")]
12+jobs=json.load(open("results/manifests/jobs_main.json"))
13+want={(j["symbol"], f"{j['model_id']}__{j['dist']}__w{j['window']}_r{j['refit_every']}") for j in jobs}
14+have={(os.path.basename(os.path.dirname(f)), os.path.basename(f)[:-8]) for f in files}
15+missing=sorted(want-have)
16+print("forecast files", len(have), "of", len(want), "missing", len(missing))
17+json.dump([{"symbol":s,"spec_id":p} for s,p in missing], open("results/manifests/jobs_main_missing.json","w"), indent=0)
18+print(collections.Counter(p.split("__")[0] for s,p in missing).most_common(10))
19+PYEOF
20+$PY scripts/compute_losses.py --run main --workers 6 2>&1 | tee results/logs/compute_losses_main.log | tail -3
21+$PY scripts/analyze.py --run main --period test 2>&1 | tee results/logs/analyze_main_test.log | tail -5
22+$PY scripts/analyze.py --run main --period validation --reps 500 2>&1 | tee results/logs/analyze_main_validation.log | tail -3
23+$PY scripts/build_paper.py --run main --period test 2>&1 | tee results/logs/build_paper.log | tail -3
24
Menu

Theme