#!/usr/bin/env bash set -euo pipefail CONFIG=${1:-configs/train_1gpu_debug.yaml} PYTHON_BIN=${PYTHON:-python3} "$PYTHON_BIN" - <<'PY' "$CONFIG" import sys, yaml, pathlib cfg = yaml.safe_load(pathlib.Path(sys.argv[1]).read_text()) num_gpus = int(cfg.get("num_gpus", 1)) out = pathlib.Path(cfg.get("output_dir", "outputs/train")) out.mkdir(parents=True, exist_ok=True) print(f"config={sys.argv[1]}") print(f"num_gpus={num_gpus}") print(f"output_dir={out}") print("This public wrapper records the intended WiSER alternating schedule.") print("Run the phase scripts directly for production training after filling checkpoint paths.") PY cat <<'EOF' WiSER training schedule used by the paper: P0 radiomap warmup P1 CIR restore with frozen scene encoder / radiomap head P2 radiomap refinement P3-P8 alternating CIR and radiomap refinement P9 final radiomap refinement Public phase scripts: scripts/train_phase_radiomap.py scripts/train_phase_cir.py scripts/evaluate_dual.py This wrapper is intentionally conservative: it does not launch a long training job until users fill the data manifests and warm-start checkpoint paths in a local run script. EOF