The market spec for the ARPA-E / NERC GO Competition Challenge 3. Two-stage SCUC → AC SCED with full GO C3 penalty tensor (thermal, voltage, bus balance, ramp, reserves — including reactive), security screening, and the GO C3 solution export format.
Canonical implementation lives in Rust under src/surge-market/ +
src/surge-dispatch/; the Python layer here is thin.
from pathlib import Path
from markets.go_c3 import GoC3Policy, GoC3Problem, solve
report = solve(
GoC3Problem.load("scenario.json"),
workdir=Path("out/run-1"),
policy=GoC3Policy(
formulation="dc",
ac_reconcile_mode="ac_dispatch",
lp_solver="highs",
nlp_solver="ipopt",
),
)
print(report["status"], report["artifacts"]["solution"])The solve writes four files to workdir:
| File | Content |
|---|---|
solution.json |
GO C3 exported solution (what the validator scores). |
workflow-result.json |
Per-stage Rust workflow trace. |
run-report.json |
Status, timing, policy, step timings. |
solve.log |
Timestamped Python + (optional) Rust/solver log. |
| Aspect | Value |
|---|---|
| Problem schema | GO C3 JSON (see problem.py). |
| Adapter | Rust surge_io::go_c3 — bus/device/branch mapping. |
| Reserves | 10-product GO C3 set (reg-up/down, spin, non-spin, ramp ↑/↓ on/off, reactive ↑/↓). |
| Clearing | DC SCUC MIP → AC SCED NLP (two-stage, commitment handoff). |
| Pricing | LP repricing for LMPs (optional; off by default). |
| Security | N-1 contingency screening via iterative flowgate cuts. |
| Export | solution.json in the GO C3 competition submission format. |
See config.py for the MarketConfig preset and
policy.py for the full knob list.
| Policy field | Purpose |
|---|---|
formulation |
"dc" or "ac" (SCUC formulation). |
ac_reconcile_mode |
"ac_dispatch" (two-stage), "acpf", or "none" (SCUC only). |
allow_branch_switching |
SW1 mode — branch on/off becomes MIP decision. |
scuc_only |
Stop after SCUC; useful for MIP-tightening benchmarks. |
commitment_mip_rel_gap / commitment_time_limit_secs |
MIP optimality target and wall-time cap. |
commitment_mip_gap_schedule |
Time-varying gap schedule (step function). |
reactive_support_pin_factor |
Retry factor applied on NLP degeneracy fallback. |
capture_solver_log |
Tee Rust tracing + solver console into solve.log (~3000 lines). |