Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Scenario Generation

SDDP requires scenarios – discrete realizations of uncertain quantities (inflows and, when stochastic load is configured, bus demand) – at multiple points in the algorithm. This page provides an overview of how scenarios are generated and used. For the underlying stochastic model, see PAR Inflow Model (spec). For the forward/backward pass mechanics that consume these scenarios, see SDDP Algorithm (spec).

The opening tree

Before the SDDP iteration loop begins, Cobre generates a fixed opening tree: a set of pre-sampled noise vectors for each stage. Each noise vector contains correlated random draws for all hydro plants, reflecting the spatial correlation structure estimated from historical data (see Spatial Correlation). When stochastic load is configured, the noise vector also includes independent draws for each bus (load entity), covering both sources of uncertainty in the same structure.

The opening tree is generated once and remains fixed throughout training. This ensures that every iteration’s backward pass evaluates the same set of realizations, which is important for cut validity – cuts are valid lower bounds on the expected cost-to-go computed over a specific discrete distribution.

The number of openings per stage is a key configuration parameter. More openings give a finer approximation of the continuous distribution but increase the computational cost of each backward pass proportionally.

Forward pass sampling

During the forward pass, each trajectory needs one scenario realization per stage. The default scheme (InSample) draws uniformly at random from the opening tree – the same set used by the backward pass. This means the forward pass explores states that are consistent with the distribution the cuts were built for.

Alternative sampling schemes are available:

  • External: Draws from user-provided scenario data, allowing the forward pass to explore states driven by historical or synthetically generated inflow sequences.
  • Historical: Uses actual historical inflow records as forward pass scenarios, useful for validating the policy against observed conditions.

Regardless of the sampling scheme, the backward pass always uses the complete opening tree.

Backward pass branching

The backward pass evaluates all openings in the tree at each visited trial point. This complete enumeration is what makes the resulting Benders cut a valid expected-value inequality: the cut coefficients are computed as probability-weighted averages over the full discrete distribution.

For each trial point at stage :

  1. Solve the stage LP once per opening , using as the incoming state and as the realization of all uncertain quantities (inflows and, if applicable, load demand).
  2. Extract dual multipliers and objective values from each solve.
  3. Aggregate into a single cut (probability-weighted average of per-scenario coefficients).

The uniform probability applies when all openings are equally likely, which is the default.

From noise to inflows

The opening tree stores noise vectors (standardized innovations), not inflows directly. At each stage, the PAR(p) model transforms these noise vectors into physical inflow values using the autoregressive equation:

where is the noise draw from the opening tree. The deterministic base and lag contribution depend on the incoming state (autoregressive lags), so the same noise vector produces different inflows depending on the system’s history. This is how the Markov property is maintained – the state carries enough information to reconstruct the inflow dynamics.

From noise to load demand

When stochastic load is configured, the opening tree also contains noise draws for each bus. These are transformed into demand scaling factors using the load seasonal statistics (per-bus, per-season mean and standard deviation):

where is the load noise draw from the opening tree for bus at stage . The resulting value scales the nominal bus demand in the LP for that scenario.

Load noise is independent of inflow noise – the two sets of draws are sampled separately and stored in the same noise vector per opening. Both are applied during the same LP patching step: inflow values are written to the hydro water balance constraints while load scaling factors are written to the bus demand terms. For the load seasonal statistics model that produces and , see Stochastic Modeling.

Scenario count and computational cost

The number of openings directly affects the backward pass cost: each backward stage solve requires LP solves per trial point. Typical configurations use 20 to 200 openings per stage, balancing approximation quality against runtime.

The forward pass cost is independent of the opening count – each trajectory samples exactly one realization per stage.