| 224 | |
| 225 | |
| 226 | def load_scenarios(ids): |
| 227 | scenarios = [] |
| 228 | for path in sorted(SCENARIO_DIR.glob("*.json")): |
| 229 | scenario = json.loads(path.read_text()) |
| 230 | if ids and scenario["id"] not in ids: |
| 231 | continue |
| 232 | if scenario.get("real_model") is None: |
| 233 | if ids: |
| 234 | print(f"[skip] {scenario['id']}: machinery-only scenario (no real_model block)") |
| 235 | continue |
| 236 | scenarios.append(scenario) |
| 237 | if ids: |
| 238 | missing = set(ids) - {s["id"] for s in scenarios} |
| 239 | runnable_missing = [ |
| 240 | m for m in missing if not (SCENARIO_DIR / f"{m}.json").exists() |
| 241 | ] |
| 242 | if runnable_missing: |
| 243 | sys.exit(f"unknown scenario id(s): {', '.join(sorted(runnable_missing))}") |
| 244 | return scenarios |
| 245 | |
| 246 | |
| 247 | def run(cmd, cwd=None, env=None, timeout=None, check=True): |