Discount Rate Formulation
Purpose
Section titled “Purpose”This chapter defines how discount rates are incorporated into the Novomodelo SDDP solver: the discounted Bellman equation, stage-dependent discount factors, effect on the future cost variable , cumulative discounting, and the effect on lower/upper bound computation.
For the reserved cyclic-mode formulation (where discounting would be required for convergence), see Horizon Modes.
For notation conventions (index sets, parameters, decision variables, dual variables), see Notation Conventions.
1 Motivation
Section titled “1 Motivation”The discount factor captures the time value of money, where future costs are valued less than present costs. This is essential for:
- Infinite horizon problems: Ensuring convergence of the value function in cyclic (infinite-horizon) policy graphs, a reserved design (see Horizon Modes)
- Economic consistency: Reflecting opportunity cost of capital
2 Discounted Bellman Equation
Section titled “2 Discounted Bellman Equation”The standard risk-neutral Bellman recursion with discount factor is:
where:
- is the immediate cost at stage
- is the future cost function (cost-to-go)
- is the discount factor for the transition from stage to
3 Stage Discount Factor
Section titled “3 Stage Discount Factor”Each stage has an annual rate : the study’s global rate , unless the stage declares its own rate. is the duration of stage in years, its whole number of days divided by 365.25.
The rate and the duration are those of the source stage , whose future cost the factor discounts. A zero rate gives .
The rates are set for the study and, optionally, per stage; the Configure tab under Implementation in Novomodelo lists the fields.
4 Discount Factor in the Stage Subproblem
Section titled “4 Discount Factor in the Stage Subproblem”The discount factor is applied to the future cost variable in the stage objective, not to the cut coefficients:
subject to all standard constraints (load balance, hydro balance, etc.) and Benders cuts:
The cut coefficients are the undiscounted values from the backward pass. When the study has in-transit water or anticipated thermals, the cut also carries terms on the in-transit buckets and the commitment-ring slots, undiscounted in the same way. Cuts are stored and managed in undiscounted form — the discount factor appears only in the objective coefficient of . See Cut Management for cut generation and aggregation details.
5 Cumulative Discounting
Section titled “5 Cumulative Discounting”The cumulative discount factor of stage carries a cost incurred at stage to its present value at stage 1:
The present value at stage 1 of a cost incurred at stage is .
Arrow Form and Delivery Discount
Section titled “Arrow Form and Delivery Discount”For stages , the discount from stage back to stage is
In this arrow form, is the one-step factor of §3 and the cumulative factor. A cost incurred at stage and charged in the stage- objective is multiplied by . An anticipated thermal’s commitment cost is charged at its decision stage and discounted from its delivery stage in this way (State Augmentation §5).
Post-Study Extension
Section titled “Post-Study Extension”Past the last study stage , the cumulative factor continues over the declared post-study stages, at the global rate on each post-study stage’s duration. The horizon is bridged by the last study stage’s one-step factor, , so the continuation equals the factor a horizon covering the post-study stages would give. Post-Study Boundary & Chained Studies prices deliveries past the horizon with this extended factor.
Consistency with the Bellman Recursion
Section titled “Consistency with the Bellman Recursion”Each stage objective multiplies by its one-step factor (§4), so a cost entered in the stage- objective reaches stage 1 multiplied by exactly once. A cost charged at stage for stage reaches stage 1 multiplied by , the cumulative factor of the stage at which it is incurred. Charging it with in the stage- objective would discount it twice: it would reach stage 1 multiplied by .
6 Lower Bound with Discounting
Section titled “6 Lower Bound with Discounting”The lower bound at iteration is the first stage’s risk-adjusted value over its openings at the initial state (Upper Bound Evaluation — Lower bound). In each opening’s first-stage problem the future cost variable enters the objective with the one-step factor , and each later stage’s factor carries its cost to stage 1 once (§4), so the lower bound is stated in stage 1 present value.
7 Upper Bound (Simulation) with Discounting
Section titled “7 Upper Bound (Simulation) with Discounting”When simulating the policy to estimate the upper bound:
Each stage’s immediate cost is explicitly discounted to stage 1 present value using the cumulative discount factor.
For stopping rules that use these bounds, see Stopping Rules.
8 Reporting
Section titled “8 Reporting”Both the lower bound and upper bound represent total expected cost expressed in present value at stage 1:
- A cost incurred at stage enters both bounds as
- Comparisons between bounds and between iterations are valid because they use consistent discounting
- The simulation output records each stage’s immediate cost in that stage’s own monetary units (not discounted to stage 1) together with its cumulative factor (Simulation Output)
Implementation in Novomodelo
Section titled “Implementation in Novomodelo”The methodology above defines the stage discount factor and the cumulative discount; the tab below covers how Novomodelo’s software surface configures the rates.
Novomodelo reads the discount rates from stages.json: the global rate on the
policy_graph object and, optionally, a rate per stage. The factors the rates
produce are defined in
§3 Stage Discount Factor and
§5 Cumulative Discounting
above. The full file reference is
stages.json.
Discount Rate Fields
Section titled “Discount Rate Fields”| Field | Type | Required | Description |
|---|---|---|---|
policy_graph.annual_discount_rate | number | Yes | The global annual rate, >= 0.0; a negative value is rejected at load. It is the rate of every stage without its own rate and of every post-study stage. |
stages[].annual_discount_rate_override | number or null | No | The stage’s own annual rate; an absent or null value uses the global rate. |
policy_graph.transitions[].annual_discount_rate_override | number or null | No | Stage-chain dialect only (no policy_graph.nodes[]): the rate folds onto the edge’s source stage, and the stage field wins when both are set. Under policy_graph.nodes[] it is rejected with an InvalidValue error that points to the stage field. |
The global rate is a required key of the policy_graph object (excerpt of
stages.json):
{ "policy_graph": { "type": "finite_horizon", "annual_discount_rate": 0.06, "transitions": [ { "source_id": 0, "target_id": 1, "probability": 1.0 }, { "source_id": 1, "target_id": 2, "probability": 1.0 } ] }}The canonical spelling of a per-stage rate is the stage’s own key. In this
stages excerpt, stage 1 takes the annual rate 0.1 in place of the global
rate:
{ "stages": [ { "id": 1, "start_date": "2024-02-01", "end_date": "2024-03-01", "blocks": [{ "id": 0, "name": "SINGLE", "hours": 696 }], "num_openings": 10, "annual_discount_rate_override": 0.1 } ]}As an alternative to the stage key, a policy_graph.transitions entry in
the stage-chain dialect may carry the same rate for the stage it leaves;
this entry gives stage 1 the rate 0.1:
{ "source_id": 1, "target_id": 2, "probability": 1.0, "annual_discount_rate_override": 0.1}A rate of 0.0 means no discounting for the stages it governs; the post-study
stages of
post_study_stages.json
declare no rate and use the global rate.
Cross-References
Section titled “Cross-References”- SDDP Algorithm — Core Bellman equation and forward/backward pass structure that discount rates modify
- Cut Management — Cut coefficients remain undiscounted; discount applied to in objective
- Stopping Rules — Convergence criteria using discounted lower/upper bounds
- Upper Bound Evaluation — Inner approximation uses discounted vertex values
- Horizon Modes — Finite (supported) vs. reserved cyclic policy graphs; the reserved cyclic-mode formal structure (season function, cycle convergence inequality, season-indexed cut pool, fixed-point Bellman operator)
- Notation Conventions — Index sets, parameters, decision variables, and dual variables used throughout