Discount factor on graph edges and padding stages in SDDP.jl (NEWAVE-style)

Hi all,

Following up on my previous question about Conditioning stochastic inflows on lagged state variables in SDDP.jl (PAR(p) model), I now have a question about applying the discount factor in the cost-to-go function and the role of padding stages.


Context

The one-stage hydrothermal dispatch problem (NEWAVE/Eletrobrás formulation) has the objective:

z_t = \min \sum_{k \in NS} \sum_{j \in NUT_k} CT_j \, GT_{t,j} + \frac{1}{1+\beta} \alpha_{t+1}

where \beta is the monthly discount rate and \alpha_{t+1} is the future cost-to-go function.

In SDDP.jl, the factor \frac{1}{1+\beta} that multiplies \alpha_{t+1} maps naturally to the edge weight in the policy graph. I implement it as:

annual_rate = 0.12
β_monthly   = 1 / (1 + annual_rate)^(1/12)

graph = SDDP.Graph(0)
for t in 1:steps
    SDDP.add_node(graph, t)
end

T_real = 60  # real planning horizon (e.g., 5 years x 12 months)

SDDP.add_edge(graph, 0 => 1, 1.0)
for t in 1:(steps - 1)
    if t < T_real
        SDDP.add_edge(graph, t => t + 1, β_monthly)
    else
        SDDP.add_edge(graph, t => t + 1, 1.0)  # padding stages
    end
end

Why padding is needed

Without padding, the model knows the world ends at stage T_real and sets \alpha_{T_{real}+1} = 0. This causes the model to over-dispatch thermal generation in the final periods (the end-of-horizon effect). Padding stages extend the horizon so that the cuts at T_real are informed by non-trivial future costs, approximating a reasonable terminal value function.


My questions

  1. Is placing \frac{1}{1+\beta} on the edges the correct way to implement discounting in SDDP.jl? Or should the discount factor appear explicitly inside the subproblem objective instead?

  2. For the padding stages, should the edge weight be 1.0 (no discounting) or continue using β_monthly? My intuition is that padding stages are artificial and exist only to provide a non-trivial boundary condition — applying further discounting would shrink the cost-to-go signal from the padding toward zero, defeating its purpose. But one could also argue the padding should keep discounting and simply be long enough that the discounted tail becomes negligible.

Thanks!