How to write subproblems to file

The first step to debug a model is to write out the subproblems to a file in order to check that you are actually building what you think you are building.

This can be achieved with the help of two functions: SDDP.parameterize and SDDP.write_subproblem_to_file. The first lets you parameterize a node given a noise, and the second writes out the subproblem to a file.

Here is an example model:

using SDDP, HiGHSmodel = SDDP.LinearPolicyGraph(            stages = 2,            lower_bound = 0.0,            optimizer = HiGHS.Optimizer,        ) do subproblem, t    @variable(subproblem, x, SDDP.State, initial_value = 1)    @variable(subproblem, y)    @constraint(subproblem, balance, x.in == x.out + y)    SDDP.parameterize(subproblem, [1.1, 2.2]) do ω        @stageobjective(subproblem, ω * x.out)        fix(y, ω)    endend# outputA policy graph with 2 nodes. Node indices: 1, 2

Initially, model hasn't been parameterized with a concrete realizations of ω. Let's do so now by parameterizing the first subproblem with ω=1.1.

julia> SDDP.parameterize(model[1], 1.1)

Easy! To parameterize the second stage problem, we would have used model[2].

Now to write out the problem to a file. We'll get a few warnings because some variables and constraints don't have names. They don't matter, so ignore them.

julia> SDDP.write_subproblem_to_file(model[1], "subproblem.lp")julia> read("subproblem.lp") |> String |> printminimizeobj: 1.1 x_out + 1 x4subject tobalance: 1 x_in - 1 x_out - 1 y = 0Boundsx_in freex_out freey = 1.1x4 >= 0End

It is easy to see that ω has been set in the objective, and as the fixed value for y.

It is also possible to parameterize the subproblems using values for ω that are not in the original problem formulation.

julia> SDDP.parameterize(model[1], 3.3)julia> SDDP.write_subproblem_to_file(model[1], "subproblem.lp")julia> read("subproblem.lp") |> String |> printminimizeobj: 3.3 x_out + 1 x4subject tobalance: 1 x_in - 1 x_out - 1 y = 0Boundsx_in freex_out freey = 3.3x4 >= 0Endjulia> rm("subproblem.lp")  # Clean up.