Pular para o conteúdo

Block Formulation Variants

Este conteúdo não está disponível em sua língua ainda.

This spec defines the two block formulations supported by Cobre — parallel and chronological — which determine how intra-stage time periods (e.g., peak, off-peak, or hourly resolution) are handled in the LP. The choice of block formulation affects water balance constraints, LP size, and the ability to model intra-stage storage dynamics.

For the variable and set definitions used here, see notation conventions. For how blocks integrate into the full LP, see LP formulation. For the system elements that participate in block constraints, see system elements.

In parallel blocks mode, all blocks within a stage are independent — there is no intra-stage storage dynamics.

A single water balance constraint spans all blocks:

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

where:

  • wk=τk/jτjw_k = \tau_k / \sum_j \tau_j is the block weight
  • net_flowsh,k\text{net\_flows}_{h,k} = inflows from upstream − outflows − evaporation − withdrawal

This formulation assumes the reservoir can freely redistribute water across blocks within the stage.

AspectDescription
LP sizeSmaller (one water balance per hydro)
Storage dynamicsEnd-of-stage only
Use caseLong-term strategic planning
Configurationblock_mode: "parallel" configured per stage via the block_mode parameter

In chronological blocks mode, blocks are sequential within each stage, enabling modeling of intra-stage storage dynamics (e.g., daily cycling patterns within a monthly stage).

VariableDomainUnitsDescription
vh,kv_{h,k}[Vh,Vˉh][\underline{V}_h, \bar{V}_h]hm³Storage at end of block kk

The end-of-stage storage (state variable) is: vh=vh,Kv_h = v_{h,|\mathcal{K}|}

vh,1=v^h+ζ1[ahw1+net_flowsh,1]v_{h,1} = \hat{v}_h + \zeta_1 \left[ a_h \cdot w_1 + \text{net\_flows}_{h,1} \right]

where ζ1=0.0036×τ1\zeta_1 = 0.0036 \times \tau_1 is the time conversion for block 1.

For k=2,,Kk = 2, \ldots, |\mathcal{K}|:

vh,k=vh,k1+ζk[ahwk+net_flowsh,k]v_{h,k} = v_{h,k-1} + \zeta_k \left[ a_h \cdot w_k + \text{net\_flows}_{h,k} \right]

Each block chains its storage from the previous block’s end storage vh,k1v_{h,k-1}, so the per-block boundaries vh,0=v^h,vh,1,,vh,Kv_{h,0} = \hat{v}_h, v_{h,1}, \ldots, v_{h,|\mathcal{K}|} form a within-stage storage trajectory.

Each block’s hydro production (FPHA) and evaporation are evaluated on that block’s own average storage (vh,k1+vh,k)/2(v_{h,k-1} + v_{h,k})/2, rather than the single stage-average storage that parallel mode shares across all blocks. A storage-dependent production or evaporation coefficient γv\gamma_v therefore enters the block-kk constraint as γv/2-\gamma_v/2 on both bounding storage columns vh,k1v_{h,k-1} and vh,kv_{h,k}, so the block sees the mean of its entry and exit storage. This lets a chronological stage capture the head and evaporative-area variation that tracks the within-stage storage trajectory.

Only end-of-stage storage is a state variable:

vh=vh,Kv_h = v_{h,|\mathcal{K}|}

Inter-block storages vh,kv_{h,k} for k<Kk < |\mathcal{K}| are internal LP variables — not state variables. This ensures:

  1. Cuts are computed with respect to end-of-stage storage only
  2. State dimension does not increase with number of blocks

In chronological mode, the incoming storage LP variable vhinv^{in}_h is pinned to its trial value v^h\hat{v}_h by equal column bounds (see LP formulation §4a). The reduced cost of that pinned column gives the storage cut coefficient directly:

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

By the LP envelope theorem, this reduced cost automatically captures all downstream effects through the chain of inter-block water balances (vhinvh,1vh,Kv^{in}_h \to v_{h,1} \to \ldots \to v_{h,|\mathcal{K}|}), FPHA constraints, and generic constraints. No special handling or dual combination is required. See Cut management.

AspectDescription
LP sizeLarger (Nhydro×(K1)N_{hydro} \times (\lvert\mathcal{K}\rvert - 1) additional vars/cons)
Storage dynamicsIntra-stage cycling modeled
Use caseShort-term planning with storage cycling
Configurationblock_mode: "chronological" configured per stage via the block_mode parameter
AspectParallel BlocksChronological Blocks
Water balance1 per hydro per stageK\lvert\mathcal{K}\rvert per hydro per stage
Inter-block storageNot modeledExplicit continuity
State variablesEnd-of-stage onlyEnd-of-stage only
LP variablesFewerMore
LP constraintsFewerMore
Intra-stage dynamicsNoneFull

A policy (the set of Benders cuts) trained under one block formulation can be loaded and simulated under the other — parallel-trained cuts drive a chronological simulation, and vice versa — and a policy trained with one block count can be simulated with a different one. This is a guarantee, not a coincidence: it follows directly from the state-variable definition in §2.5.

4.1 Why cuts are block-count- and block-mode-independent

Section titled “4.1 Why cuts are block-count- and block-mode-independent”

Only end-of-stage storage is carried as state (§2.5); the interior block storages are internal LP columns. A cut approximates the future-cost function over the incoming state vector, whose dimension — end-of-stage storage plus any inflow lags and augmented slots — does not depend on how many blocks a stage carries or whether they are parallel or chronological. The storage cut coefficient is the reduced cost of the pinned incoming-state storage column (§2.6), whose identity is likewise block-structure-independent. The resulting cut coefficients are therefore identical across block modes and block counts, and loading them into a differently-blocked LP is exact, not approximate.

This is what unlocks a coarse-train / fine-simulate workflow: train the policy with a cheap block partition (a few parallel blocks) and simulate it with a finer chronological partition that resolves intra-stage cycling — the trained cost-to-go is reused unchanged.

Policy load is validated unconditionally against the current study (the check cannot be disabled), but on state identity, not block structure:

  • The state-vector dimension must match.
  • A per-slot entity manifest embedded in each policy file must match — every state coordinate must attach to the same entity (same type, id, and sub-index) it was trained on, which rejects a policy that matches by dimension count but binds its coordinates to different plants.

There is no block_mode, block-count, or block-duration check anywhere in policy validation. See output format for the embedded manifest.

For traceability, policy/metadata.json records the mode the policy was trained under in training_block_mode (and training_block_mode_per_stage when it varies across stages). This is provenance only — it does not gate loading.

5. Note on Fine-Grained Temporal Resolution

Section titled “5. Note on Fine-Grained Temporal Resolution”

The current block formulations use a single level of temporal decomposition within each stage: the user defines blocks with durations τ_k, and the LP operates at that resolution in both training and simulation.

A more sophisticated approach — used in commercial tools like PSR’s SDDP (v17.3+) — decomposes each stage into representative typical days, each containing chronological hourly (or sub-hourly) blocks. This enables:

  • Accurate modeling of daily cycling patterns (peak/off-peak storage arbitrage)
  • Proper representation of intermittent renewable generation profiles
  • Separate temporal resolutions for training (aggregated blocks) and simulation (full typical-day profiles)

This extension is out of scope for the current formulation because it requires:

  • New input data schemas (day-type definitions, weights, hourly profiles)
  • Separation of the objective time-weighting (day weight × block duration) from the water balance conversion (block duration only)
  • Research into how day types chain within a stage (sequential vs. independent with weighted-average storage)
  • Validation against reference implementations
  • Notation conventions — variable and set definitions (vhv_h, v^h\hat{v}_h, K\mathcal{K}, τk\tau_k, wkw_k)
  • System elements — hydro plant element description and decision variables
  • LP formulation — how block formulations integrate into the assembled LP
  • Cut management — cut coefficient extraction from pinned-column reduced costs
  • Hydro production models — production function constraints that operate within each block