Skip to content

Notation Conventions

This spec defines the complete mathematical notation used across all Cobre specification documents: index sets, parameters, decision variables, and dual variables. It serves as the canonical reference for symbol meanings, ensuring consistency across all math and data model specs.

This document follows SDDP.jl notation conventions for consistency with the broader SDDP literature:

ConventionMeaning
t{1,,T}t \in \{1, \ldots, T\}Stage index
ωΩt\omega \in \Omega_tScenario realization at stage tt
xtx_tState variables at end of stage tt
x^t1\hat{x}_{t-1}Incoming state (from previous stage)
Vt(x)V_t(x)Value function (cost-to-go) at stage tt
θt\theta_tEpigraph variable approximating VtV_{t}
π\piDual variables (row Lagrange multipliers)
(α,π)(\alpha, \pi)Cut intercept and coefficients
kkIteration counter
SymbolDescription
t{1,,T}t \in \{1, \ldots, T\}Stages
kKk \in \mathcal{K}Blocks within stage
B\mathcal{B}Buses
H\mathcal{H}Hydro plants
HopH\mathcal{H}^{op} \subseteq \mathcal{H}Operating hydros (can generate)
HfillH\mathcal{H}^{fill} \subseteq \mathcal{H}Filling hydros (no generation)
HfphaH\mathcal{H}^{fpha} \subseteq \mathcal{H}Hydros using FPHA production model
HconstH\mathcal{H}^{const} \subseteq \mathcal{H}Hydros using constant productivity (complement of Hfpha\mathcal{H}^{fpha} within Hop\mathcal{H}^{op})
T\mathcal{T}Thermal plants
R\mathcal{R}Non-controllable generation sources
L\mathcal{L}Transmission lines
C\mathcal{C}All contracts (CimpCexp\mathcal{C}^{imp} \cup \mathcal{C}^{exp})
Cimp\mathcal{C}^{imp}, Cexp\mathcal{C}^{exp}Import/export contracts
P\mathcal{P}Pumping stations
G\mathcal{G}Generic constraints
Sb\mathcal{S}_bDeficit segments for bus bb
Mh\mathcal{M}_hFPHA planes for hydro hh
Uh\mathcal{U}_hUpstream hydros of hh
Ωt\Omega_tScenario realizations at stage tt
SymbolUnitsDescription
τk\tau_khoursDuration of block kk
wk=τk/jτjw_k = \tau_k / \sum_j \tau_j-Block weight (fraction of stage)
ζ\zetahm³/(m³/s)Time conversion: m³/s over stage → hm³

The factor ζ\zeta converts a flow rate in m³/s to a volume in hm³ accumulated over the stage duration.

Fundamental Relationship:

Volume=Flow Rate×Time\text{Volume} = \text{Flow Rate} \times \text{Time}

Unit Conversion Chain:

  1. Flow rate: QQ [m³/s]
  2. Time period: τ\tau [hours]
  3. Target volume: VV [hm³] = 10610^6
V [hm³]=Q [m³/s]×τ [hours]×3600 s1 hour×1 hm³106 m³V \text{ [hm³]} = Q \text{ [m³/s]} \times \tau \text{ [hours]} \times \frac{3600 \text{ s}}{1 \text{ hour}} \times \frac{1 \text{ hm³}}{10^6 \text{ m³}} V=Q×τ×3600106=Q×τ×0.0036V = Q \times \tau \times \frac{3600}{10^6} = Q \times \tau \times 0.0036

For a stage with multiple blocks: If the stage has blocks kKk \in \mathcal{K} with durations τk\tau_k hours, and the flow is assumed constant across the stage (parallel blocks), the total time is kτk\sum_k \tau_k hours:

ζ=0.0036×kKτk[hm³/(m³/s)]\zeta = 0.0036 \times \sum_{k \in \mathcal{K}} \tau_k \quad \text{[hm³/(m³/s)]}

Dimensional Analysis:

[ζ]=sh×hm³×h=hm³m³/s[\zeta] = \frac{\text{s}}{\text{h}} \times \frac{\text{m³}}{\text{hm³}} \times \text{h} = \frac{\text{hm³}}{\text{m³/s}}

Worked Example (Monthly Stage):

BlockNameDuration τk\tau_k (h)
1LEVE200
2MÉDIA300
3PESADA228
Total728
ζ=0.0036×728=2.6208 hm³/(m³/s)\zeta = 0.0036 \times 728 = 2.6208 \text{ hm³/(m³/s)}

Verification: A constant inflow of Q=100Q = 100 m³/s over the month yields:

V=Q×ζ=100×2.6208=262.08 hm³V = Q \times \zeta = 100 \times 2.6208 = 262.08 \text{ hm³}

Direct calculation: 100 m³/s×728 h×3600 s/h/106=262.08 hm³100 \text{ m³/s} \times 728 \text{ h} \times 3600 \text{ s/h} / 10^6 = 262.08 \text{ hm³}

SymbolUnitsDescription
Db,kD_{b,k}MWLoad at bus bb, block kk
cb,sdefc^{def}_{b,s}$/MWhDeficit cost at bus bb, segment ss
dˉb,s\bar{d}_{b,s}MWDeficit segment depth
cbexcc^{exc}_b$/MWhExcess generation cost
cj,sthc^{th}_{j,s}$/MWhThermal cost at plant jj, segment ss
chspillc^{spill}_h$/(m³/s·h)Spillage cost
chdivc^{div}_h$/(m³/s·h)Diversion cost
clexchc^{exch}_l$/MWhExchange (transmission) cost
ccctrc^{ctr}_c$/MWhContract price (signed: + import cost, − export revenue)
SymbolUnitsDescription
v^h\hat{v}_hhm³Incoming storage (state from previous stage)
Vˉh\bar{V}_h, Vh\underline{V}_hhm³Storage bounds
Qˉh\bar{Q}_h, Qh\underline{Q}_hm³/sTurbined flow bounds
Gˉh\bar{G}_h, Gh\underline{G}_hMWGeneration bounds
Oˉh\bar{O}_h, Oh\underline{O}_hm³/sOutflow bounds
ρh\rho_hMW/(m³/s)Productivity (constant model)
γ0m,γvm,γqm,γsm\gamma^m_0, \gamma^m_v, \gamma^m_q, \gamma^m_s-FPHA plane coefficients (already αFPHA\alpha_{FPHA}-scaled)
αFPHA\alpha_{FPHA}-FPHA least-squares fit-correction factor; scales the fitted plane set, distinct from the Benders cut intercept α\alpha. See Hydro Production Models.
SymbolUnitsDescription
Fˉl+\bar{F}^+_l, Fˉl\bar{F}^-_lMWLine capacity (direct/reverse)
ηl=1losses/100\eta_l = 1 - \text{losses}/100-Line efficiency
Cˉc\bar{C}_c, Cc\underline{C}_cMWContract capacity bounds
SymbolUnitsDescription
μm\mu_mm³/sSeasonal mean inflow for season mm
ψm,\psi_{m,\ell}-AR coefficient for season mm, lag \ell
σm\sigma_mm³/sResidual standard deviation for season mm
a^h,\hat{a}_{h,\ell}m³/sIncoming AR lag \ell (state)

Per-block variables are indexed by kKk \in \mathcal{K}:

VariableDomainUnitsDescription
δb,k,s\delta_{b,k,s}[0,dˉb,s][0, \bar{d}_{b,s}]MWDeficit at bus bb, segment ss
ϵb,k\epsilon_{b,k}0\geq 0MWExcess generation at bus bb
fl,k+f^+_{l,k}[0,Fˉl+][0, \bar{F}^+_l]MWDirect flow on line ll
fl,kf^-_{l,k}[0,Fˉl][0, \bar{F}^-_l]MWReverse flow on line ll
gj,k,sg_{j,k,s}[0,gˉj,s][0, \bar{g}_{j,s}]MWThermal generation at plant jj, segment ss
qh,kq_{h,k}[Qh,Qˉh][\underline{Q}_h, \bar{Q}_h]m³/sTurbined flow at hydro hh
sh,ks_{h,k}0\geq 0m³/sSpillage at hydro hh
gh,kg_{h,k}[Gh,Gˉh][\underline{G}_h, \bar{G}_h]MWHydro generation at plant hh
uh,ku_{h,k}[0,Uˉh][0, \bar{U}_h]m³/sDiversion/bypass flow (to separate channel)
oh,ko_{h,k}-m³/sTotal downstream outflow: oh,k=qh,k+sh,ko_{h,k} = q_{h,k} + s_{h,k}
eh,ke_{h,k}freem³/sEvaporation (can be negative for condensation)
rh,kr_{h,k}signedm³/sWater withdrawal; pinned to a signed target (negative = inter-basin return/addition); the realized value cannot cross zero past the target
pj,kp_{j,k}[Pj,Pˉj][\underline{P}_j, \bar{P}_j]m³/sPumped flow at station jj
χc,k\chi_{c,k}[Cc,Cˉc][\underline{C}_c, \bar{C}_c]MWContract dispatch (import if cCimpc \in \mathcal{C}^{imp}, export if cCexpc \in \mathcal{C}^{exp}); Cc>0\underline{C}_c > 0 is a take-or-pay floor
VariableDomainUnitsDescription
vhv_h[Vh,Vˉh][\underline{V}_h, \bar{V}_h]hm³End-of-stage storage
vhavgv^{avg}_h-hm³Average storage during stage: (v^h+vh)/2(\hat{v}_h + v_h)/2
ah,a_{h,\ell}fixedm³/sAR lag \ell (fixed by state transition)
xs,i,tax^{\mathrm{a}}_{s,i,t}fixedMWSlot ss of plant ii‘s anticipated-thermal ring buffer at stage tt (fixed by state transition); slot 0 matures here.
dtid^i_t[Gi,Gˉi][\underline{G}_i, \bar{G}_i]MWAnticipated-thermal commitment placed at stage tt for delivery at stage t+Kit + K_i
θ\theta0\geq 0$Future cost (cost-to-go approximation)

Slack variables for soft constraints:

VariableDomainUnitsConstraint
σhv\sigma^{v-}_h0\geq 0hm³Storage below minimum
σhfill\sigma^{fill}_h0\geq 0hm³Per-stage filling-floor shortfall
σh,kq\sigma^{q-}_{h,k}0\geq 0m³/sTurbined flow below minimum
σh,ko\sigma^{o-}_{h,k}0\geq 0m³/sOutflow below minimum
σh,ko+\sigma^{o+}_{h,k}0\geq 0m³/sOutflow above maximum
σh,kg\sigma^{g-}_{h,k}0\geq 0MWGeneration below minimum
σh,ke+\sigma^{e+}_{h,k}, σh,ke\sigma^{e-}_{h,k}0\geq 0m³/sEvaporation violation
σh,kr\sigma^{r}_{h,k}0\geq 0m³/sWater withdrawal violation
σhinf\sigma^{inf}_h0\geq 0m³/sInflow non-negativity (if enabled)

Cut coefficients in SDDP are state sensitivities. This section describes how the incoming state is carried in the LP for efficient solver updates, and how the resulting sensitivities — row duals for true constraints, reduced costs for the pinned state columns — map to cut coefficients.

5.1 LP Formulation Strategy for Efficient Hot-Path Updates

Section titled “5.1 LP Formulation Strategy for Efficient Hot-Path Updates”

In the SDDP algorithm, each subproblem solve requires setting the incoming state values (storage volumes and AR lags from the previous stage). For computational efficiency with solvers like HiGHS, Cobre gives each incoming-state coordinate its own LP column and pins it by setting equal lower and upper column bounds:

This design allows the hot path to update incoming state values by patching column bounds (and, for the realized-inflow noise, a single row RHS) without rebuilding the constraint matrix — only scalar values change between solves, not LP structure. The cut coefficient for each state coordinate is then the reduced cost of its pinned column (§5.4).

The water balance is mathematically:

vh=v^h+ζ[ah+kKwknet_flowsh,k]v_h = \hat{v}_h + \zeta \Big[ a_h + \sum_{k \in \mathcal{K}} w_k \cdot \text{net\_flows}_{h,k} \Big]

For LP implementation, the incoming storage is carried as a dedicated LP variable vhinv^{in}_h (the storage_in column) rather than a constant, and all LP variables are collected on the LHS with a zero RHS:

vhvhinζahζkwk[iUh(qi,k+si,k+ui,k)+i:div=hui,k+j:dest=hpj,kqh,ksh,kuh,keh,krh,kj:src=hpj,k]=0\begin{aligned} & v_h - v^{in}_h - \zeta \cdot a_h - \zeta \sum_{k} w_k \Big[ \sum_{i \in \mathcal{U}_h} (q_{i,k} + s_{i,k} + u_{i,k}) + \sum_{i:\text{div}=h} u_{i,k} \\ & \qquad + \sum_{j:\text{dest}=h} p_{j,k} - q_{h,k} - s_{h,k} - u_{h,k} - e_{h,k} - r_{h,k} - \sum_{j:\text{src}=h} p_{j,k} \Big] = 0 \end{aligned}

LP Structure:

  • LHS: Linear combination of LP variables (storage vhv_h, incoming storage vhinv^{in}_h, flows qq, ss, uu, etc.)
  • RHS: 00 — the incoming state is not a constraint RHS; it is pinned separately on the vhinv^{in}_h column (§5.1)
  • Constraint type: Equality (==)

For autoregressive inflow state variables, the lag column is pinned to the incoming value by equal column bounds:

ah,=aˉh,=a^h,hH,  {1,,Ph}\underline{a}_{h,\ell} = \bar{a}_{h,\ell} = \hat{a}_{h,\ell} \quad \forall h \in \mathcal{H}, \; \ell \in \{1, \ldots, P_h\}

LP Structure:

  • Column: ah,a_{h,\ell} (the inflow_lags column), bounds set equal to the incoming lag value
  • Pin value: Incoming lag a^h,\hat{a}_{h,\ell} (set via column bounds in the hot path)
  • No constraint row: pinning is a bound, not an equality row

The SDDP cut at stage t1t-1 has the form:

θt1α+hπhvvh+h,πh,lagah,\theta_{t-1} \geq \alpha + \sum_{h} \pi^v_h \cdot v_h + \sum_{h,\ell} \pi^{lag}_{h,\ell} \cdot a_{h,\ell}

where α\alpha is the intercept and π\pi are the coefficients with respect to state variables.

Key principle: For an incoming-state column pinned at x=xˉ=x^\underline{x} = \bar{x} = \hat{x}, the column’s reduced cost cˉ\bar{c} represents:

cˉ=Qx^\bar{c} = \frac{\partial Q^*}{\partial \hat{x}}

where QQ^* is the optimal objective value — the marginal cost of increasing the pinned bound. By KKT parity this equals the multiplier the equivalent equality row xin=x^x^{in} = \hat{x} would have carried.

Storage Reduced Cost (cˉhin\bar{c}^{in}_h)

Section titled “Storage Reduced Cost (cˉhin\bar{c}^{in}_hcˉhin​)”

The incoming storage column vhinv^{in}_h is pinned at vhin=vˉhin=v^h\underline{v}^{in}_h = \bar{v}^{in}_h = \hat{v}_h (see LP Formulation §4a). Its reduced cost cˉhin\bar{c}^{in}_h measures: “How does optimal cost change if incoming storage v^h\hat{v}_h increases by 1 hm³?”

Economic interpretation:

  • More incoming storage means more water available for generation
  • Water has value (can displace thermal generation or avoid deficit)
  • Therefore, increasing v^h\hat{v}_h decreases cost: Qv^h<0\frac{\partial Q^*}{\partial \hat{v}_h} < 0
  • By LP convention (minimization), this gives cˉhin<0\bar{c}^{in}_h < 0, hence πhv<0\pi^v_h < 0

Cut coefficient:

πhv=cˉhin/dhcol\pi^v_h = \bar{c}^{in}_h / d^{col}_h

The reduced cost is divided by the column’s prescaler factor dhcold^{col}_h to recover the original-unit sensitivity (§12 of LP Formulation); no sign change is needed. By the LP envelope theorem, the reduced cost automatically captures all downstream effects — water balance, FPHA hyperplanes, and generic constraints — without manual combination of duals from multiple constraint types. See Cut Management §2.

AR Lag Reduced Cost (cˉh,lag\bar{c}^{lag}_{h,\ell})

Section titled “AR Lag Reduced Cost (cˉh,ℓlag\bar{c}^{lag}_{h,\ell}cˉh,ℓlag​)”

The lag column ah,a_{h,\ell} is pinned at ah,=aˉh,=a^h,\underline{a}_{h,\ell} = \bar{a}_{h,\ell} = \hat{a}_{h,\ell}. Its reduced cost measures: _“How does optimal cost change if incoming lag a^h,\hat{a}_{h,\ell} increases by 1 m³/s?”_

Economic interpretation:

  • Higher historical inflow (in the PAR model) correlates with higher expected current inflow
  • Higher inflows reduce cost (more hydro generation possible)
  • Therefore, cˉh,lag<0\bar{c}^{lag}_{h,\ell} < 0 (increasing the lag decreases cost)

Cut coefficient:

The cut coefficient for lag \ell is the reduced cost of the pinned lag column, divided by its prescaler factor: πh,lag=cˉh,lag/dh,col\pi^{lag}_{h,\ell} = \bar{c}^{lag}_{h,\ell} / d^{col}_{h,\ell}. No sign change is needed.

SymbolSourcePinned value / RHSCut Coefficient
cˉhin\bar{c}^{in}_hReduced cost of pinned vhinv^{in}_h columnv^h\hat{v}_hπhv=cˉhin/dcol\pi^v_h = \bar{c}^{in}_h / d^{col} (captures all downstream effects)
cˉh,lag\bar{c}^{lag}_{h,\ell}Reduced cost of pinned ah,a_{h,\ell} columna^h,\hat{a}_{h,\ell}πh,lag=cˉh,lag/dcol\pi^{lag}_{h,\ell} = \bar{c}^{lag}_{h,\ell} / d^{col}
πb,klb\pi^{lb}_{b,k}Load balance (row dual)Db,kD_{b,k}Marginal cost of energy
πhwb\pi^{wb}_hWater balance (row dual)-Not used directly for cut coefficients
πmfpha\pi_m^{fpha}FPHA hyperplane mm (row dual)-Captured via cˉhin\bar{c}^{in}_h automatically
πcgen\pi^{gen}_cGeneric constraint cc (row dual)-Captured via cˉhin\bar{c}^{in}_h automatically
λi\lambda_iBenders cut ii (row dual)αi\alpha_iCut activity indicator

The key property: since incoming state coordinates are pinned at equal column bounds, each column’s reduced cost is the bound sensitivity directly, so no sign change is needed when mapping to cut coefficients — only the per-column prescaler unscaling (πhv=cˉhin/dhcol\pi^v_h = \bar{c}^{in}_h / d^{col}_h; likewise for AR lags). Cut coefficient extraction reads the reduced costs of the contiguous incoming-state column regions (storage_in, inflow_lags, and, when present, anticipated_state).

Verification check: In a typical hydrothermal system:

  • cˉhin<0\bar{c}^{in}_h < 0 (water has value, more storage reduces cost)
  • πhv<0\pi^v_h < 0 (cut value increases as storage decreases — future is more expensive with less water)
  • The cut θα+πvv\theta \geq \alpha + \pi^v \cdot v correctly penalizes low storage
  • LP Formulation — Complete LP subproblem using this notation
  • SDDP Algorithm — Algorithm overview and cut generation process
  • Cut Management — Cut coefficient computation and aggregation details
  • PAR Inflow Model — Detailed PAR(p) model using inflow parameters defined here
  • Hydro Production Models — FPHA plane coefficients (γ\gamma) and productivity (ρ\rho)
  • Equipment Formulations — Thermal, contract, pumping variable notation
  • What Cobre Solves — methodology principles (reproducibility, determinism, declaration order invariance, code as ground truth, agent-readability) that frame this book