Upper Bound Evaluation
Purpose
Section titled “Purpose”This chapter defines Novomodelo’s upper-bound mechanisms: an overview of the bounds of a training iteration (section 1), the exact deterministic upper bound of an enumerated forward pass and its nested form under a uniform CVaR (section 2), the gap computation that compares the iteration’s upper bound against the lower bound from cuts (section 3), and the estimators of the sampled forward schemes and of the post-training sampled and census simulation, with what each estimates (section 4). The appendix describes the reserved vertex-based inner approximation (SIDP) design. It complements the outer approximation (cuts) described in SDDP Algorithm by providing the convergence-certificate half of the bound pair.
For notation conventions (index sets, parameters, decision variables, dual variables), see Notation Conventions.
1 Overview
Section titled “1 Overview”Standard SDDP produces only a lower bound on the optimal cost, through the outer (cut) approximation. A convergence certificate additionally requires an upper bound that closes the optimality gap between the two bounds.
Novomodelo computes this per-iteration upper bound via one of two forward-pass mechanisms, selected by the forward pass’s sampling mode:
- Statistical Monte-Carlo upper bound. Under a sampled forward pass, the sample mean of the scenario costs gathered that iteration, together with a 95% confidence-interval half-width, estimates the expected cost under the policy. This is a statistical estimate: it carries genuine sampling error that narrows only as more scenarios are drawn. Section 4 states what it estimates under each forward scheme.
- Exact deterministic upper bound. Under an enumerated forward pass, the probability-weighted expectation over every enumerated leaf path is the exact expected cost under the policy, with no sampling error at all. See section 2.
Section 3 computes the gap between that upper bound and the lower bound from the cuts at every iteration.
After training, the post-training simulation reruns the trained policy on scenarios drawn under each class’s simulation scheme, in a sampled and a census variant (section 4.5). That estimator is a diagnostic on the finished policy — it is not part of the per-iteration training loop the mechanisms above feed, and it is not consumed by any stopping rule.
The appendix describes a reserved design that Novomodelo does not compute, a vertex-based inner approximation of the cost-to-go function (SIDP).
2 Exact Deterministic Upper Bound
Section titled “2 Exact Deterministic Upper Bound”Under an enumerated forward pass — one that visits every node of the policy graph deterministically rather than sampling it — the forward pass evaluates every leaf path of the scenario tree exactly once. Let be that leaf path’s probability and
its realized total discounted cost (see Discount Rate Formulation). The exact upper bound is the probability-weighted expectation over the full enumeration:
Because the enumeration is exhaustive rather than sampled, is the exact expectation of total cost under the current policy — not an estimate of it. Its standard deviation and 95% confidence-interval half-width are consequently identically zero: a deduplicated enumeration carries no sampling distribution to estimate a spread over.
With an imported terminal boundary (Post-Study Boundary & Chained Studies), the last stage’s cost keeps the discounted boundary value of that stage’s outgoing state, so the upper bound contains the same terminal function as the lower bound.
The bound above is the exact upper bound under an expectation objective. Under a CVaR measure held uniform across every stage, the same exhaustive enumeration yields an exact bound of a different shape — a nested risk recursion — developed in section 2.1; see Risk Measures for the risk-measure background.
Under a stage-varying measure — one whose risk-aversion weight or tail fraction differs across stages, a stage with zero risk-aversion weight counting as the expectation — Novomodelo computes no bound on the risk-averse objective: the enumerated pass reports the probability-weighted path sum above, the policy’s expected cost, and a gap rule is not supported (it is rejected at setup).
Contrast with the statistical mechanism (section 1): a sampled forward pass computes the same weighted-sum form — sample weight per scenario — but that sum is a Monte Carlo estimator of the expectation, carrying genuine sampling error. Only the enumerated forward pass’s weights (the true leaf-path probabilities) make the sum exact rather than an estimate.
This is the training-phase, per-iteration mechanism: it is evaluated once per training iteration and feeds the gap computation (section 3). It is distinct from the post-training simulation’s census variant (section 4.5.4), which computes the same probability-weighted-sum form under the final policy, evaluated once after training completes.
2.1 Nested Risk-Adjusted Exact Bound (uniform CVaR)
Section titled “2.1 Nested Risk-Adjusted Exact Bound (uniform CVaR)”When every stage applies the same CVaR measure , the probability-weighted path sum of section 2 is no longer the quantity the policy optimizes. SDDP minimizes a nested, time-consistent risk functional,
in which the measure is applied stage by stage, not once to whole-path totals. The exact upper bound must be evaluated in that same nested form. Over the enumerated scenario tree, let node carry immediate cost at stage , with children reached under conditional probabilities . Define, from the leaves up,
where applies the stage measure to the children’s values weighted by — the same risk aggregation the cut construction applies in the backward pass. The exact upper bound is the value at the root:
It is exact for the same reason the expectation form is — the recursion visits every node of the deduplicated enumeration exactly once, so it carries no sampling distribution, and its standard deviation and confidence-interval half-width are identically zero.
Why the nested form, not the path-total form. Applying once to the distribution of whole-path totals gives the end-of-horizon value of the path totals, a different functional from the nested objective : it is not an upper bound on the nested objective, and it can fall below the lower bound of the risk-averse objective. Fed to the gap rule, it would then produce a negative gap that the rule would read as a lower/upper crossover, halting training before the policy has converged. The nested instead satisfies at every iteration, so the gap stays non-negative and closes only at true convergence.
Under expectation — or a CVaR with , which is expectation-equivalent — the measure is linear, the nesting telescopes, and collapses exactly to the probability-weighted path sum of section 2; the two forms coincide.
At each training iteration , the gap compares the lower bound from the cuts with the upper bound of the active forward-pass mechanism; both refer to the study started from its initial state , with the stages numbered by the 1-based math convention.
Lower bound
Section titled “Lower bound”The lower bound at iteration applies the first stage’s risk measure to the optimal values of the first stage over its openings:
where is the optimal value of the first-stage problem at the initial state under opening , its immediate cost plus the discounted future cost that the iteration- cuts bound from below, with the opening’s full realization applied: inflow, load and non-controllable availability. is the first stage’s opening set, its generated openings or a single supplied realization, and its openings are weighted uniformly. is the first stage’s risk measure, the expectation when risk-neutral; it aggregates the first stage’s own openings as well as those of the next stage (Risk Measures §6). The bound is stated in original cost units, with the cost scaling of the stage problems undone. It does not decrease in , because the problem it is evaluated on keeps every cut once added (Cut Management §5), and it is a valid lower bound under the hypotheses of Tier 1.
Upper bound
Section titled “Upper bound”The upper bound is that of whichever forward-pass mechanism is active (section 1): under a sampled forward pass, is the statistical estimator’s sample mean; under an enumerated forward pass, (section 2).
The optimality gap is the distance between these two bounds, also stated in percent of the lower bound.
Under the exact mechanism the compared bound is . The inequality holds for the exact upper bound on the same tree under the same measure when Tier 1 holds (Tier 3), while an in-sample, out-of-sample, historical or external estimate can fall below .
For stopping rules that use the gap, see Stopping Rules, section 5.
Convergence
Section titled “Convergence”As , for convex problems with finitely many scenarios, provided the upper bound is exact. Under a sampled forward pass, carries sampling error, so a small reported gap reflects that noise as well as genuine convergence.
4 Estimators by Scheme
Section titled “4 Estimators by Scheme”A sampled forward pass draws each stochastic class (inflow, load and non-controllable sources) under that class’s forward scheme, and the post-training simulation of section 4.5 draws under a scheme of its own for each class; Scenario Generation §3.2 defines how each scheme samples. The sample mean of the discounted path costs estimates the policy’s expected cost under the law the scheme samples from, stated below per scheme. Under a risk-averse measure it estimates the expected cost, not the risk-adjusted value (section 1).
4.1 In-Sample
Section titled “4.1 In-Sample”The in-sample scheme draws, at each stage, one opening of the fixed opening tree that the backward pass also uses. Its sample mean estimates the policy’s expected cost under the opening-tree law, the law of the model the cuts are built on. It is a statistical estimate that certifies nothing (Tier 3): its sampling error lets it fall below . An enumerated pass over the same tree is the exact bound of section 2, not an estimate.
4.2 Out-of-Sample
Section titled “4.2 Out-of-Sample”The out-of-sample scheme draws fresh noise from the class’s applied stochastic model, from a seed independent of the opening tree’s. Its sample mean estimates the policy’s expected cost under the noise model’s law, with draws independent of the tree, rather than under the tree that discretizes that law for the backward pass. It is a statistical estimate that certifies nothing (Tier 3): it evaluates a law other than the opening tree’s, and it can fall below .
4.3 External
Section titled “4.3 External”The external scheme replays one scenario of a supplied scenario set over all the stages of a trajectory. Its sample mean estimates the policy’s expected cost under the supplied scenarios’ law, the empirical law of that set. It is a statistical estimate that certifies nothing (Tier 3): it evaluates a law other than the opening tree’s, and it can fall below .
4.4 Historical
Section titled “4.4 Historical”The historical scheme replays one window of the historical window pool over all the stages of a trajectory. Its sample mean estimates the policy’s expected cost under the replayed history, the empirical law of the windows in the pool. It is a statistical estimate that certifies nothing (Tier 3): it evaluates a law other than the opening tree’s, and it can fall below .
4.5 Simulation After Training
Section titled “4.5 Simulation After Training”Novomodelo can also estimate an upper bound on expected total cost by running the trained policy on scenarios drawn independently of the training forward passes — a separate, post-training procedure distinct from the per-iteration training-phase mechanisms in sections 1–2. It supports two variants: a sampled estimator (Monte Carlo; sections 4.5.2–4.5.3) over an independently drawn scenario sample, and a census estimator (section 4.5.4) over an exhaustively enumerated population of scenarios.
4.5.1 Independence from Training
Section titled “4.5.1 Independence from Training”The core methodological guarantee is that the noise used for the simulation forward pass is drawn independently of the noise used during training. Training forward passes sample under each class’s forward scheme (see Scenario Generation) to generate the trial states at which cuts are built; any cost computed by re-running the policy on those same training scenarios would produce a biased estimator — the cuts were shaped to be tight at those states. The simulation avoids this by drawing its scenarios under each class’s simulation scheme (§4.1–§4.4; the training scheme unless the simulation declares its own) with a seed derivation that no training iteration uses. Because cuts have no dependence on these independent draws, the resulting cost sample is an unbiased estimator of the policy’s expected cost under its scheme’s law.
4.5.2 Sampled Estimator (Monte Carlo)
Section titled “4.5.2 Sampled Estimator (Monte Carlo)”The sampled variant executes a complete forward pass for each of the independently drawn scenarios, recording the total discounted cost for scenario :
where is the immediate cost at stage of scenario , and is the cumulative discount factor from stage 1 to stage (see Discount Rate Formulation).
The sample mean is the Monte Carlo estimator of expected total cost:
This estimator is unbiased under independent draws: . The sample standard deviation is:
the Bessel-corrected estimator appropriate to a drawn sample. For the census variant’s population-level counterpart, see section 4.5.4.
4.5.3 Confidence Interval
Section titled “4.5.3 Confidence Interval”Under the normal approximation, the 95% confidence interval for has half-width:
The approximation is reliable once is large enough for the central-limit-theorem regime to apply. The reported interval is .
Trade-off: every doubling of narrows the confidence interval by a factor of , but costs proportionally more LP solves — the per-check cost scales with times the horizon length. Because the half-width shrinks as , a sufficiently large scenario count resolves the interval finely enough to distinguish a converged policy from one still improving.
This confidence interval applies to the sampled variant only. The census variant (section 4.5.4) reports the exact mean and population variance of an exhaustively enumerated population — there is no sampling error left to bound, so it carries no confidence interval.
4.5.4 Census Estimator
Section titled “4.5.4 Census Estimator”When the simulation scenarios come from an exhaustive enumeration of the policy graph’s leaf paths rather than a sample — a declared census — the per-scenario weight is that scenario’s leaf-path probability rather than a uniform sample weight, and the weights sum to one: .
The census weighted mean replaces the sample mean:
and the census weighted standard deviation is the true weighted population variance — no Bessel correction:
The population form omits the sampled variant’s correction because a census is exhaustive, not sampled: ranges over the entire population of scenarios rather than a draw from it, so there is no downward bias in the naive variance to correct for.
Because the population is fully enumerated rather than estimated from a draw, the census estimator carries no confidence interval — and are exact statistics of the enumerated population, not estimates of an unknown expectation.
4.5.5 Number of Simulation Scenarios
Section titled “4.5.5 Number of Simulation Scenarios”The sole knob governing the simulation procedure — sampled or census — is the number of simulation scenarios . It controls the statistical resolution of the sampled estimator and the compute cost of the procedure simultaneously.
Raising narrows the sampled confidence interval as , while the compute cost — proportional to times the horizon length in LP solves — grows linearly in , so the scenario count trades statistical resolution directly against compute. Under the census variant, is instead fixed by the size of the declared enumeration rather than chosen for statistical resolution, since there is no confidence interval to narrow.
4.5.6 Relation to Training-Phase Bounds
Section titled “4.5.6 Relation to Training-Phase Bounds”This simulation estimator is independent of the training loop: it is not consumed by any stopping rule and does not gate training termination. Training termination is governed by the gap-based stopping rule (see Stopping Rules, section 5), which compares the training-phase upper bound — the statistical or exact forward-pass estimator, sections 1–2 — against the lower bound at every iteration, using the training forward pass rather than the post-training simulation.
This section’s estimator instead reports the trained policy’s simulated cost distribution once training has finished: the sampled mean/standard-deviation/confidence-interval (sections 4.5.2–4.5.3), or the census weighted mean/population variance (section 4.5.4). See Convergence & Diagnostics for how this output is consumed operationally.
Appendix: Inner Approximation (Reserved)
Section titled “Appendix: Inner Approximation (Reserved)”This appendix describes a reserved design that Novomodelo does not compute: a vertex-based inner approximation of the cost-to-go function (SIDP), which would evaluate the upper bound independently of the forward pass’s sampling mode.
Vertex-Based Inner Approximation
Section titled “Vertex-Based Inner Approximation”The inner approximation would be constructed from vertices (visited state-value pairs):
where each vertex would store:
- : State vector entering stage , visited during forward passes
- : Upper bound on expected cost-to-go from that state (computed recursively)
Lipschitz Interpolation
Section titled “Lipschitz Interpolation”At a state , the upper bound would be the cheapest convex combination of the vertex values, plus a Lipschitz penalty on the deviation of from the same convex combination of the vertex states:
where is the convex-combination weight of vertex , and are the componentwise positive and negative deviations of from the combined vertex state , and is the vector of per-state-component Lipschitz constants (see below), so that the deviation of each state component is weighted by its own .
Interpretation: is convex and piecewise linear in , and at every vertex. It is an upper bound on the convex cost-to-go when every vertex value bounds the cost-to-go at its state from above, , and changes by at most per unit change of each state component : the inner (upper) counterpart to the outer (lower) cut approximation, both convex.
Lipschitz Constant Computation
Section titled “Lipschitz Constant Computation”The Lipschitz constants would bound the rate of change of the value function with respect to each state component. The state components carry different units, hm³ for a storage component and the units of its own lag for an inflow-lag component, so is the vector of per-state-component constants , each in $ per unit of its component . For SDDP with penalty-based feasibility (relatively complete recourse):
- Storage component. A hm³ of stored water is priced in the stage by the energy it displaces (the penalty bound in $/MWh times the energy that hm³ yields through the productivities of the plants it reaches, in MWh/hm³), by the penalties charged per hm³ of storage (the storage-floor and filling-target shortfall costs of Penalty System), and by the cost of spilling water that cannot be stored (converted from $/(m³/s·h) to $/hm³). Its constant , in $/hm³, bounds that price from above.
- Inflow-lag component. Its constant carries the units of its own lag: it bounds, in $ per unit of that lag, the change in cost through the inflows that the lag enters.
Backward accumulation, per storage component : at the terminal stage, is the stage’s own bound, whose energy term is built from the largest penalty coefficient of that stage; at each earlier stage , adds the stage’s own bound, whose energy term is built from the largest stage- penalty coefficient (in $/MWh), to the discounted next-stage constant , where is the discount factor for transition (see Discount Rate Formulation).
Vertex Value Computation
Section titled “Vertex Value Computation”During the upper bound evaluation pass (a backward pass variant), vertex values would be computed as follows.
At terminal stage :
At stage :
For each vertex :
- For each scenario , the stage subproblem would be solved with incoming state and realization
- The optimal outgoing state would be obtained
- The next stage’s inner approximation would be evaluated at that outgoing state:
- The vertex value would be set as the expected discounted cost-to-go:
Upper Bound Evaluation LP
Section titled “Upper Bound Evaluation LP”For policy evaluation with the inner approximation, the stage LP would replace the outer approximation (cut constraints on ) with the inner approximation (convex-combination constraints on ).
Standard LP (outer approximation, lower bound):
Inner approximation LP (upper bound):
The future-cost variable of stage stands for the next stage’s inner approximation, so the weights range over the vertices of , the deviations are priced by , and the two constraints on the outgoing state are those of the definition of : at the optimum, , with at the last stage.
Additional variables (one weight per vertex, one deviation pair per state component):
| Variable | Domain | Description |
|---|---|---|
| Convex-combination weight of vertex | ||
| Componentwise positive deviation of from the combined vertex state | ||
| Componentwise negative deviation of from the combined vertex state | ||
| free | Upper bound on future cost, bounded below by the convex-combination value |
Computational Considerations
Section titled “Computational Considerations”| Aspect | Impact |
|---|---|
| Vertices per stage | Typically |
| LP size increase | additional variables |
| Evaluation frequency | Trade-off between gap accuracy and runtime |
| Memory | Vertices stored separately from cuts |
Cyclic Mode
Section titled “Cyclic Mode”For the reserved cyclic policy graphs design (see Horizon Modes), the inner approximation would operate on the same seasonal cut-pool structure: vertices organized by season , not by absolute stage ID. The Lipschitz constant would need to account for the cumulative discount around the cycle, which bounds the geometric series of future contributions.
The convergence guarantee would still hold: with , both the outer (cut) and inner (vertex) approximations would converge to the true value function at the fixed point.
References
Section titled “References”Cross-References
Section titled “Cross-References”- SDDP Algorithm — Core algorithm providing the outer approximation (lower bound) that this chapter complements
- Notation Conventions — Standard symbols for state variables, value functions, and cost-to-go
- Discount Rate Formulation — Discount factor used in the exact bound’s discounted cost (section 2) and in the reserved vertex value computation and Lipschitz accumulation (appendix)
- Policy Graphs — The enumerated-versus-sampled forward-pass distinction that selects between the statistical and exact upper-bound mechanisms (sections 1–2)
- Horizon Modes — The reserved cyclic policy-graph target design and the season-indexed pool structure the appendix’s reserved inner approximation would mirror
- Cut Management — Outer approximation cuts that provide the lower bound counterpart
- Stopping Rules — The gap-based stopping rule, which compares this chapter’s training-phase upper bound (sections 1–2) against the lower bound (section 3)
- Risk Measures — The nested risk-adjusted lower bound and why only the exact nested bound certifies a risk-averse policy
- Scenario Generation — The opening tree and the forward sampling schemes whose estimates section 4 interprets, in training and in the post-training simulation (section 4.5)
- Running Novomodelo: Convergence & Diagnostics — the software guide for reading and assessing this estimator’s output.