lkapelevich / SDDiP.jl

The functionality from this package has been moved to https://github.com/odow/SDDP.jl
Other
8 stars 3 forks source link

Subgradient gets a NaN somewhere #5

Closed odow closed 6 years ago

odow commented 6 years ago

https://gist.github.com/odow/61c0585bfb91d59577c8a6ce8c2f9a83

D:\SDDiP>D:/julia/julia-0.6/bin/julia booking_management.jl
-------------------------------------------------------------------------------
                      SDDP Solver. © Oscar Dowson, 2017.
-------------------------------------------------------------------------------
    Solver:
        Serial solver
    Model:
        Stages:         5
        States:         6
        Subproblems:    5
        Value Function: Default
-------------------------------------------------------------------------------
              Objective              |  Cut  Passes    Simulations   Total
     Simulation       Bound   % Gap  |   #     Time     #    Time    Time
-------------------------------------------------------------------------------
        7.000         47.500         |     1    1.7      0    0.0    1.7

 ... lines omitted ...

       19.000         40.736         |    30    8.5      0    0.0    8.6
       17.000         39.653         |    31    8.8      0    0.0    8.9
ERROR: LoadError: Invalid coefficient NaN on variable vacancy_before_decision[1,
1]
Stacktrace:
 [1] assert_isfinite(::JuMP.GenericAffExpr{Float64,JuMP.Variable}) at C:\Users\o
dow003\.julia\v0.6\JuMP\src\affexpr.jl:95
 [2] prepAffObjective(::JuMP.Model) at C:\Users\odow003\.julia\v0.6\JuMP\src\sol
vers.jl:500
 [3] #build#119(::Bool, ::Bool, ::JuMP.ProblemTraits, ::Function, ::JuMP.Model)
at C:\Users\odow003\.julia\v0.6\JuMP\src\solvers.jl:327
 [4] (::JuMP.#kw##build)(::Array{Any,1}, ::JuMP.#build, ::JuMP.Model) at .\<miss
ing>:0
 [5] #solve#116(::Bool, ::Bool, ::Bool, ::Array{Any,1}, ::Function, ::JuMP.Model
) at C:\Users\odow003\.julia\v0.6\JuMP\src\solvers.jl:168
 [6] (::JuMP.#kw##solve)(::Array{Any,1}, ::JuMP.#solve, ::JuMP.Model) at .\<miss
ing>:0
 [7] solve_primal(::JuMP.Model, ::SDDiP.Lagrangian.LinearProgramData{SDDiP.Lagra
ngian.SubgradientMethod{SDDiP.Lagrangian.Unit},SDDiP.Lagrangian.LinearProgram},
::Array{Float64,1}) at C:\Users\odow003\.julia\v0.6\SDDiP\src\Lagrangian\utils.j
l:87
 [8] lagrangian_method!(::SDDiP.Lagrangian.LinearProgramData{SDDiP.Lagrangian.Su
bgradientMethod{SDDiP.Lagrangian.Unit},SDDiP.Lagrangian.LinearProgram}, ::JuMP.M
odel, ::Array{Float64,1}) at C:\Users\odow003\.julia\v0.6\SDDiP\src\Lagrangian\s
ubgradient.jl:90
 [9] lagrangiansolve!(::SDDiP.Lagrangian.LinearProgramData{SDDiP.Lagrangian.Subg
radientMethod{SDDiP.Lagrangian.Unit},SDDiP.Lagrangian.LinearProgram}, ::JuMP.Mod
el, ::Array{Float64,1}) at C:\Users\odow003\.julia\v0.6\SDDiP\src\Lagrangian\Lag
rangian.jl:115
 [10] #SDDiPsolve!#2(::Bool, ::Int64, ::Array{Any,1}, ::Function, ::JuMP.Model)
at C:\Users\odow003\.julia\v0.6\SDDiP\src\solver.jl:87
 [11] (::SDDiP.#kw##SDDiPsolve!)(::Array{Any,1}, ::SDDiP.#SDDiPsolve!, ::JuMP.Mo
del) at .\<missing>:0
 [12] #solve#116(::Bool, ::Bool, ::Bool, ::Array{Any,1}, ::Function, ::JuMP.Mode
l) at C:\Users\odow003\.julia\v0.6\JuMP\src\solvers.jl:151
 [13] (::JuMP.#kw##solve)(::Array{Any,1}, ::JuMP.#solve, ::JuMP.Model) at .\<mis
sing>:0
 [14] JuMPsolve(::Type{SDDP.BackwardPass}, ::SDDP.SDDPModel{SDDP.DefaultValueFun
ction{SDDP.DefaultCutOracle}}, ::JuMP.Model) at C:\Users\odow003\.julia\v0.6\SDD
iP\src\solver.jl:8
 [15] solvesubproblem!(::Type{SDDP.BackwardPass}, ::SDDP.SDDPModel{SDDP.DefaultV
alueFunction{SDDP.DefaultCutOracle}}, ::JuMP.Model, ::Float64) at C:\Users\odow0
03\.julia\v0.6\SDDP\src\valuefunctions.jl:115
 [16] backwardpass!(::SDDP.SDDPModel{SDDP.DefaultValueFunction{SDDP.DefaultCutOr
acle}}, ::SDDP.Settings, ::Bool) at C:\Users\odow003\.julia\v0.6\SDDP\src\SDDP.j
l:259
 [17] iteration!(::SDDP.SDDPModel{SDDP.DefaultValueFunction{SDDP.DefaultCutOracl
e}}, ::SDDP.Settings, ::Bool) at C:\Users\odow003\.julia\v0.6\SDDP\src\SDDP.jl:2
83
 [18] solve(::SDDP.Serial, ::SDDP.SDDPModel{SDDP.DefaultValueFunction{SDDP.Defau
ltCutOracle}}, ::SDDP.Settings) at C:\Users\odow003\.julia\v0.6\SDDP\src\SDDP.jl
:320
 [19] #solve#42(::Int64, ::Float64, ::SDDP.MonteCarloSimulation, ::SDDP.BoundCon
vergence, ::Int64, ::Int64, ::String, ::SDDP.Serial, ::Bool, ::String, ::JuMP.#s
olve, ::SDDP.SDDPModel{SDDP.DefaultValueFunction{SDDP.DefaultCutOracle}}) at C:\
Users\odow003\.julia\v0.6\SDDP\src\SDDP.jl:503
 [20] (::JuMP.#kw##solve)(::Array{Any,1}, ::JuMP.#solve, ::SDDP.SDDPModel{SDDP.D
efaultValueFunction{SDDP.DefaultCutOracle}}) at .\<missing>:0
 [21] include_from_node1(::String) at .\loading.jl:569
 [22] include(::String) at .\sysimg.jl:14
 [23] process_options(::Base.JLOptions) at .\client.jl:305
 [24] _start() at .\client.jl:371
while loading D:\SDDiP\booking_management.jl, in expression starting on line 96
lkapelevich commented 6 years ago

Cheers, will have a look when I get time...

lkapelevich commented 6 years ago

Oh this is different to @EyobZewdie's issue with strengthened benders cuts?

odow commented 6 years ago

Yeah. I think the implementation is a good proof of concept. But it needs a bit of work to make it numerically robust / faster.

lkapelevich commented 6 years ago

Looks like the same bug as #4 (fixed in https://github.com/lkapelevich/SDDiP.jl/commit/162237e7ae5aa4fe932245a68cba6fabb55f7e24 ). I converge to 14.2 after a few hundred iterations.