Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions energy_grid_planning/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -120,10 +120,10 @@ Texas is now the fastest-growing market for AI data center development. Hypersca

```text
STAGE 5: OPTIMIZE -- Joint Interconnection + Upgrade
Status: OPTIMAL | Objective: 1,579,200,000
Status: OPTIMAL
Objective: 1,562,600,000.00

KNEE POINT: $300M -- 5 DCs, 1,500 MW, $264M net value
xAI Colossus ($105M/yr) unlocks at $300M -- highest-revenue single request
KNEE POINT: $300M -- $300M budget, $252,450,000 net value, 6 DCs, 1,530 MW

PIPELINE COMPLETE: 5 stages executed on shared Energy Grid ontology
```
Expand Down Expand Up @@ -225,7 +225,7 @@ Three declarative rules consume upstream outputs, then a composite flag combines

An `InvestmentLevel` Scenario Concept holds 5 budget levels ($200M-$600M), each parameterizing one MIP solve into a Pareto frontier. Binary variables `x_approve` (per DC request) and `x_upgrade` (per substation upgrade) are indexed by investment level; substation-capacity constraints use `predicted_load` from Stage 1 so the optimizer sees the same forecasted headroom as the rules engine, and budget constraints are scoped `.per(InvestmentLevel)`. Revenue reflects annual interconnection capacity revenue ($145K-$210K per MW/yr), not energy revenue.

One solve produces the entire frontier. The knee point at $300M (5 DCs, 1,500 MW, $264M net value) shows the highest marginal return, unlocking xAI Colossus ($105M/yr). At $200M, 4 DCs are approved (Microsoft, CoreWeave, Crusoe, Oracle); each additional $100M adds one more DC with diminishing returns ($995K/$M at the knee vs $400K/$M at $600M). Google Metroplex DC (400 MW) and Lambda Labs DFW (200 MW) are never approved at any budget — DFW capacity is fully consumed. Per-level results (approvals, upgrades, MW) are all queried from the ontology via `model.select()` rather than parsed from solver output.
One solve produces the entire frontier. The knee point at $300M (6 DCs, 1,530 MW, $252M net value) shows the highest marginal return: both DFW upgrades fit the budget, and Google Metroplex DC and Lambda Labs DFW join. At $200M, 4 DCs are approved (Microsoft, Amazon SA, Crusoe, Oracle); beyond the knee each additional $100M adds one more DC with diminishing returns ($1,013K/$M into the knee vs $439K/$M from $400M to $500M). xAI Colossus (500 MW) is never approved at any budget — DFW headroom goes to Google and Lambda. Per-level results (approvals, upgrades, MW) are all queried from the ontology via `model.select()` rather than parsed from solver output.

See `energy_grid_planning.py` for the implementation of all five stages and `runbook.md` for the skill-driven reproduction.

Expand Down Expand Up @@ -288,11 +288,11 @@ Focus on the first changes most users will make.
</details>

<details>
<summary>Google and Lambda Labs are never approved at any budget level</summary>
<summary>xAI Colossus is never approved at any budget level</summary>

- Both target the Dallas-Fort Worth substation, which is already the only substation predicted to breach capacity (54.6% growth).
- Even with upgrades, DFW capacity is fully consumed by higher-revenue requests (xAI Colossus at 500 MW, $105M/yr).
- The optimizer correctly prioritizes revenue-maximizing allocations at the constrained substation.
- It targets the Dallas-Fort Worth substation, the only substation predicted to breach capacity (54.6% growth). Even with both DFW upgrades, DFW has 699.8 MW of headroom.
- That fits Google Metroplex DC and Lambda Labs DFW together (600 MW, $108M/yr) or xAI alone (500 MW, $105M/yr); xAI with Lambda would need 700 MW.
- The optimizer correctly prioritizes the revenue-maximizing allocation at the constrained substation.

</details>

Expand Down
17 changes: 9 additions & 8 deletions energy_grid_planning/energy_grid_planning.py
Original file line number Diff line number Diff line change
Expand Up @@ -1010,17 +1010,18 @@ def _query_flag(relationship, flag_name):
x_u_c = Float.ref("xu_c")
effective_load = Substation.predicted_load | Substation.current_load_mw

# Each upgrade's capacity and each request's MW is weighted by its own variable.
problem.satisfy(model.where(
DataCenterRequest.x_approve(InvestmentLevel, x_a_c),
SubstationUpgrade.x_upgrade(InvestmentLevel, x_u_c),
InvestmentLevel,
DataCenterRequest.substation(Substation),
SubstationUpgrade.substation(Substation),
).require(
Substation.max_capacity_mw - effective_load
+ sum(x_u_c * UpgRef.capacity_increase_mw).where(
UpgRef.substation == Substation).per(Substation, InvestmentLevel)
>= sum(x_a_c * DCRef.requested_mw).where(
DCRef.substation == Substation).per(Substation, InvestmentLevel)
+ sum(UpgRef, x_u_c * UpgRef.capacity_increase_mw).where(
UpgRef.substation == Substation, UpgRef.x_upgrade(InvestmentLevel, x_u_c),
).per(Substation, InvestmentLevel)
>= sum(DCRef, x_a_c * DCRef.requested_mw).where(
DCRef.substation == Substation, DCRef.x_approve(InvestmentLevel, x_a_c),
).per(Substation, InvestmentLevel)
))

# C2: Budget per investment level
Expand All @@ -1032,7 +1033,7 @@ def _query_flag(relationship, flag_name):

# Objective: maximize total DC revenue across all levels
problem.maximize(
sum(x_a * DataCenterRequest.annual_revenue_per_mw * DataCenterRequest.requested_mw).where(
sum(InvestmentLevel, x_a * DataCenterRequest.annual_revenue_per_mw * DataCenterRequest.requested_mw).where(
DataCenterRequest.x_approve(InvestmentLevel, x_a)
)
)
Expand Down
10 changes: 5 additions & 5 deletions energy_grid_planning/runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ ERCOT processes 10 hyperscaler interconnection requests (2,930 MW) against a 12-
ERCOT has 10 hyperscaler interconnection requests totalling 2,930 MW
on a 12-substation grid where DFW is the binding capacity bottleneck.
The chain produces a Pareto frontier across 5 budget levels — the knee at
$300M unlocks 5 DCs (1,500 MW, $264M net value) including xAI Colossus.
$300M unlocks 6 DCs (1,530 MW, $252M net value) including Google and Lambda at DFW.

─────────────────────────────────────────────────────────────────
STAGE 1 Predictive ──► Substation.predicted_load (12)
Expand Down Expand Up @@ -37,8 +37,8 @@ $300M unlocks 5 DCs (1,500 MW, $264M net value) including xAI Colossus.
STAGE 5 Prescriptive ──► DataCenterRequest.x_approve (per InvestmentLevel)
SubstationUpgrade.x_upgrade (per InvestmentLevel)
OPTIMAL across 5 budget levels in one solve.
Knee $300M · 5 DCs · 1,500 MW · $264M net.
Google + Lambda never approved — DFW full.
Knee $300M · 6 DCs · 1,530 MW · $252M net.
xAI never approved — DFW headroom fits Google + Lambda.
─────────────────────────────────────────────────────────────────
```

Expand Down Expand Up @@ -152,7 +152,7 @@ OPTIMAL MIP across 5 `InvestmentLevel` values in one solve; `x_approve` and `x_u

**Response**

Pareto frontier with knee at $300M (5 DCs, 1,500 MW, $264M net); marginal $995K/$M at knee, declining to $400K/$M by $600M; Google + Lambda never approved (DFW full).
Pareto frontier with knee at $300M (6 DCs, 1,530 MW, $252M net); marginal $1,013K/$M into the knee, declining to $439K/$M by $500M; xAI Colossus never approved (DFW headroom goes to Google + Lambda).

### 10. Persist solution concepts into the ontology

Expand All @@ -164,7 +164,7 @@ Pareto frontier with knee at $300M (5 DCs, 1,500 MW, $264M net); marginal $995K/

**Response**

Ontology gains an `InvestmentPortfolio(InvestmentLevel)` Concept (5 rows, one per budget) with `dc_count`, `total_mw`, `annual_revenue`, `upgrade_cost`, `net_value`, `marginal_per_m_to_next_level`, `is_knee_point`. All five frontier rows — $200M ($165M net) → $300M ($264M net, knee) → $600M ($395M net) — are queryable as ontology rather than stdout.
Ontology gains an `InvestmentPortfolio(InvestmentLevel)` Concept (5 rows, one per budget) with `dc_count`, `total_mw`, `annual_revenue`, `upgrade_cost`, `net_value`, `marginal_per_m_to_next_level`, `is_knee_point`. All five frontier rows — $200M ($151M net) → $300M ($252M net, knee) → $600M ($398M net) — are queryable as ontology rather than stdout.

## Data

Expand Down
Loading