Summary
The current Investment model covers the core build-once timing problem well (binary build/active, lifetime retirement, big-M linearization, NPV weighting). Several extensions from the energy systems MILP literature could be added incrementally.
Potential Extensions
Integer / Lumpy Investment
- Add
n_units[flow, period] ∈ ℤ⁺ for discrete unit counts (e.g., number of turbines)
cap_new[t] = n_units[t] · unit_size instead of continuous sizing
Cumulative / Repeated Investment
- Allow multiple build events for the same technology across periods
- Requires shifting from single
invest_size to cumulative capacity accumulation:
cap[t] = cap[t-1] + cap_new[t] - cap_retired[t]
Endogenous Early Retirement
- Add a binary
retire_early[flow, period] decision variable
- Allows decommissioning before lifetime expires (stranded asset modeling)
Precedence / Dependency Constraints
- Express inter-technology dependencies: "H₂ electrolyzer requires renewable capacity first"
build[h2, t] ≤ Σ_{τ≤t} build[wind, τ]
Construction Lead Time
- CAPEX charged at construction start, capacity available only after lead time
active[t] = build[t - lead_time] instead of build[t]
Stochastic / Scenario-Based Investment
- Two-stage: invest now (here-and-now), operate under scenarios (wait-and-see)
- Scenario tree over investment periods
Context
Based on a literature review of MILP capacity expansion planning (GenX, PyPSA, TIMES/MARKAL, OSeMOSYS). Each extension is independently useful and can be added incrementally without breaking the current API.
References
- Palmintier & Webster (2011) — UC constraints in generation expansion
- Heuberger et al. (2017) — Endogenous learning in multi-period MILP
- Neumann & Brown (2021) — Near-optimal feasible space of renewable systems
- GenX documentation — explicit MILP formulation for CEP
Summary
The current
Investmentmodel covers the core build-once timing problem well (binary build/active, lifetime retirement, big-M linearization, NPV weighting). Several extensions from the energy systems MILP literature could be added incrementally.Potential Extensions
Integer / Lumpy Investment
n_units[flow, period] ∈ ℤ⁺for discrete unit counts (e.g., number of turbines)cap_new[t] = n_units[t] · unit_sizeinstead of continuous sizingCumulative / Repeated Investment
invest_sizeto cumulative capacity accumulation:cap[t] = cap[t-1] + cap_new[t] - cap_retired[t]Endogenous Early Retirement
retire_early[flow, period]decision variablePrecedence / Dependency Constraints
build[h2, t] ≤ Σ_{τ≤t} build[wind, τ]Construction Lead Time
active[t] = build[t - lead_time]instead ofbuild[t]Stochastic / Scenario-Based Investment
Context
Based on a literature review of MILP capacity expansion planning (GenX, PyPSA, TIMES/MARKAL, OSeMOSYS). Each extension is independently useful and can be added incrementally without breaking the current API.
References