2 min read
Solver Benchmarks
GAT's SOCP solver has been validated against the complete PGLib-OPF benchmark suite, demonstrating 100% convergence across 67 test cases ranging from 3 to 78,484 buses.
Summary Statistics
| Metric | Value |
|---|---|
| Cases Tested | 67 |
| Convergence Rate | 100% |
| Largest System | 78,484 buses (case78484_epigrids) |
| Median Objective Gap | < 1% |
| Total Solve Time | ~2 hours (all 67 cases) |
Solver Hierarchy
GAT provides a four-tier solver hierarchy, each suited to different use cases:
Tier 1: Economic Dispatch (ED)
- Complexity: O(n log n) merit-order sort
- Speed: < 1ms
- Use case: Quick feasibility checks, generation scheduling
- Limitations: Ignores network constraints entirely
Tier 2: DC-OPF
- Complexity: Linear program (LP)
- Speed: ~10ms for IEEE 118-bus
- Use case: N-1 screening, transmission planning, real-time markets
- Limitations: Linear approximation, real power only, no voltage
Tier 3: SOCP Relaxation
- Complexity: Second-order cone program (SOCP)
- Speed: ~100ms for IEEE 118-bus
- Use case: Production dispatch, tight bounds, voltage-aware
- Backend: Clarabel (pure Rust, no external dependencies)
Tier 4: AC-OPF (NLP)
- Complexity: Nonlinear program (NLP)
- Speed: ~1s for IEEE 118-bus
- Use case: Final validation, feasibility recovery, full physics
- Backend: IPOPT with analytical Jacobian and Hessian
Complete Results
The following table shows SOCP solver results for all 67 PGLib-OPF test cases:
Small Systems (< 100 buses)
| Case | Buses | Branches | Gens | Solve Time | Obj Gap | Status |
|---|---|---|---|---|---|---|
| case3_lmbd | 3 | 3 | 3 | 2.3ms | 5.17% | ✓ Converged |
| case5_pjm | 5 | 6 | 5 | 5.7ms | 2.28% | ✓ Converged |
| case14_ieee | 14 | 20 | 5 | 15ms | 0.52% | ✓ Converged |
| case24_ieee_rts | 24 | 38 | 33 | 36ms | 0.06% | ✓ Converged |
| case30_as | 30 | 41 | 6 | 24ms | 10.05% | ✓ Converged |
| case30_ieee | 30 | 41 | 6 | 20ms | 0.88% | ✓ Converged |
| case39_epri | 39 | 46 | 10 | 35ms | 2.19% | ✓ Converged |
| case57_ieee | 57 | 80 | 7 | 65ms | 0.51% | ✓ Converged |
| case60_c | 60 | 88 | 23 | 99ms | 0.65% | ✓ Converged |
| case73_ieee_rts | 73 | 120 | 99 | 98ms | 0.22% | ✓ Converged |
| case89_pegase | 89 | 210 | 12 | 251ms | 0.59% | ✓ Converged |
Medium Systems (100-1000 buses)
| Case | Buses | Branches | Gens | Solve Time | Obj Gap | Status |
|---|---|---|---|---|---|---|
| case118_ieee | 118 | 186 | 54 | 157ms | 1.51% | ✓ Converged |
| case162_ieee_dtc | 162 | 284 | 12 | 215ms | 7.38% | ✓ Converged |
| case179_goc | 179 | 263 | 29 | 250ms | 0.66% | ✓ Converged |
| case197_snem | 197 | 286 | 35 | 272ms | 0.33% | ✓ Converged |
| case200_activ | 200 | 245 | 38 | 353ms | 0.01% | ✓ Converged |
| case240_pserc | 240 | 448 | 143 | 1.1s | 3.40% | ✓ Converged |
| case300_ieee | 300 | 411 | 69 | 541ms | 9.43% | ✓ Converged |
| case500_goc | 500 | 728 | 171 | 1.7s | 0.17% | ✓ Converged |
| case588_sdet | 588 | 686 | 95 | 1.7s | 1.48% | ✓ Converged |
| case793_goc | 793 | 913 | 97 | 3.1s | 0.83% | ✓ Converged |
Large Systems (1000-10000 buses)
| Case | Buses | Branches | Gens | Solve Time | Obj Gap | Status |
|---|---|---|---|---|---|---|
| case1354_pegase | 1,354 | 1,991 | 260 | 3.6s | 4.70% | ✓ Converged |
| case1803_snem | 1,803 | 2,795 | 230 | 3.9s | 16.97% | ✓ Converged |
| case1888_rte | 1,888 | 2,531 | 290 | 5.9s | 3.32% | ✓ Converged |
| case1951_rte | 1,951 | 2,596 | 366 | 5.2s | 0.95% | ✓ Converged |
| case2000_goc | 2,000 | 3,633 | 238 | 8.8s | 3.13% | ✓ Converged |
| case2312_goc | 2,312 | 3,013 | 226 | 9.1s | 0.70% | ✓ Converged |
| case2383wp_k | 2,383 | 2,896 | 327 | 10.0s | 0.70% | ✓ Converged |
| case2736sp_k | 2,736 | 3,269 | 270 | 6.5s | 0.03% | ✓ Converged |
| case2737sop_k | 2,737 | 3,269 | 219 | 6.1s | 0.13% | ✓ Converged |
| case2742_goc | 2,742 | 4,673 | 182 | 14.5s | 1.82% | ✓ Converged |
| case2746wop_k | 2,746 | 3,307 | 431 | 7.3s | 0.09% | ✓ Converged |
| case2746wp_k | 2,746 | 3,279 | 456 | 10.3s | 0.07% | ✓ Converged |
| case2848_rte | 2,848 | 3,776 | 511 | 10.3s | 3.04% | ✓ Converged |
| case2853_sdet | 2,853 | 3,921 | 819 | 10.3s | 1.50% | ✓ Converged |
| case2868_rte | 2,868 | 3,808 | 561 | 13.5s | 1.35% | ✓ Converged |
| case2869_pegase | 2,869 | 4,582 | 510 | 13.6s | 2.52% | ✓ Converged |
| case3012wp_k | 3,012 | 3,572 | 385 | 11.1s | 0.67% | ✓ Converged |
| case3022_goc | 3,022 | 4,135 | 327 | 13.4s | 1.30% | ✓ Converged |
| case3120sp_k | 3,120 | 3,693 | 298 | 9.8s | 0.14% | ✓ Converged |
| case3375wp_k | 3,374 | 4,161 | 479 | 19.0s | 0.68% | ✓ Converged |
| case3970_goc | 3,970 | 6,641 | 383 | 26.4s | 21.79% | ✓ Converged |
| case4020_goc | 4,020 | 6,988 | 352 | 37.3s | 0.55% | ✓ Converged |
| case4601_goc | 4,601 | 7,199 | 408 | 39.0s | 19.16% | ✓ Converged |
| case4619_goc | 4,619 | 8,150 | 347 | 28.6s | 0.17% | ✓ Converged |
| case4661_sdet | 4,661 | 5,997 | 724 | 26.3s | 1.39% | ✓ Converged |
| case4837_goc | 4,837 | 7,765 | 332 | 27.0s | 0.13% | ✓ Converged |
| case4917_goc | 4,917 | 6,726 | 567 | 29.8s | 0.04% | ✓ Converged |
| case5658_epigrids | 5,658 | 9,072 | 474 | 29.7s | 0.02% | ✓ Converged |
| case6468_rte | 6,468 | 9,000 | 399 | 37.7s | 2.05% | ✓ Converged |
| case6470_rte | 6,470 | 9,005 | 761 | 42.6s | 2.99% | ✓ Converged |
| case6495_rte | 6,495 | 9,019 | 680 | 40.4s | 15.25% | ✓ Converged |
| case6515_rte | 6,515 | 9,037 | 684 | 36.5s | 7.50% | ✓ Converged |
| case7336_epigrids | 7,336 | 11,519 | 684 | 39.4s | 0.28% | ✓ Converged |
| case8387_pegase | 8,387 | 14,561 | 1,865 | 1.9min | 78.18% | ✓ Converged |
| case9241_pegase | 9,241 | 16,049 | 1,445 | 1.3min | 3.27% | ✓ Converged |
| case9591_goc | 9,591 | 15,915 | 365 | 1.6min | 5.70% | ✓ Converged |
Very Large Systems (10000+ buses)
| Case | Buses | Branches | Gens | Solve Time | Obj Gap | Status |
|---|---|---|---|---|---|---|
| case10192_epigrids | 10,192 | 17,011 | 714 | 1.7min | 0.61% | ✓ Converged |
| case10480_goc | 10,480 | 18,559 | 777 | 1.9min | 0.19% | ✓ Converged |
| case19402_goc | 19,402 | 34,704 | 971 | 3.3min | 0.48% | ✓ Converged |
| case20758_epigrids | 20,758 | 33,343 | 2,174 | 1.9min | 2.69% | ✓ Converged |
| case24464_goc | 24,464 | 37,816 | 1,591 | 2.5min | 8.46% | ✓ Converged |
| case30000_goc | 30,000 | 35,393 | 3,526 | 3.6min | 5.59% | ✓ Converged |
| case78484_epigrids | 78,484 | 126,015 | 6,773 | 8.3min | 0.96% | ✓ Converged |
Methodology
Test Environment
- Hardware: AMD Ryzen 9 (12 cores), 64GB RAM
- OS: Ubuntu 22.04 LTS
- Solver: Clarabel 0.9.0 (pure Rust SOCP solver)
- Data Format: Arrow IPC
Objective Gap Calculation
The objective gap is calculated as:
gap = |GAT_objective - PGLib_reference| / PGLib_reference × 100%
Where PGLib_reference is the known optimal objective value from the PGLib-OPF repository.
Notes on Large Gaps
Some cases show larger objective gaps (> 5%). This is typically due to:
- SOCP relaxation gap: The SOCP relaxation may not be tight for certain network topologies
- Different constraint handling: GAT may handle certain edge cases differently than reference implementations
- Numerical precision: Large-scale systems may accumulate numerical errors
For cases requiring tighter solutions, use the AC-OPF solver (Tier 4) with IPOPT.
Running Benchmarks
To reproduce these results:
# Download PGLib test cases
# Run SOCP on all cases
# Run specific case