martinbiel / StochasticPrograms.jl

Julia package for formulating and analyzing stochastic recourse models.
MIT License
75 stars 25 forks source link

Using @expression with an LShaped.Optimizer #7

Closed rtwalker closed 4 years ago

rtwalker commented 4 years ago

I'm not sure whether this one counts as a bug or a feature request, but using JuMP expressions inside of a model seems to give the LShaped.Optimizer some trouble.

Here is an example using the model from the Quick Start:

simple_model = @stochastic_model begin
    @stage 1 begin
        @decision(model, x₁ >= 40)
        @decision(model, x₂ >= 20)
        objective = @expression(model, 100*x₁ + 150*x₂)
        @objective(model, Min, objective)
        @constraint(model, x₁ + x₂ <= 120)
    end
    @stage 2 begin
        @uncertain q₁ q₂ d₁ d₂
        @variable(model, 0 <= y₁ <= d₁)
        @variable(model, 0 <= y₂ <= d₂)
        @objective(model, Max, q₁*y₁ + q₂*y₂)
        @constraint(model, 6*y₁ + 10*y₂ <= 60*x₁)
        @constraint(model, 8*y₁ + 5*y₂ <= 80*x₂)
    end
end
julia> sp = instantiate(simple_model, [ξ₁, ξ₂])
Stochastic program with:
 * 2 decision variables
 * 2 scenarios of type Scenario
Structure: Deterministic equivalent
Solver name: No optimizer attached.
julia> sp_progressivehedging = instantiate(simple_model, [ξ₁, ξ₂], optimizer = ProgressiveHedging.Optimizer)
Stochastic program with:
 * 2 decision variables
 * 2 scenarios of type Scenario
Structure: Horizontal
Solver name: Progressive-hedging with fixed penalty
julia> sp_lshaped = instantiate(simple_model, [ξ₁, ξ₂], optimizer = LShaped.Optimizer)
ERROR: UndefVarError: x₁ not defined
Stacktrace:
 [1] macro expansion at /Users/ryanwalker/.julia/packages/MutableArithmetics/NuiNA/src/rewrite.jl:227 [inlined]
 [2] #18 at /Users/ryanwalker/.julia/packages/JuMP/YXK4e/src/macros.jl:45 [inlined]
 [3] (::var"#18#23")(::Model, ::NamedTuple{(),Tuple{}}) at ./none:0
 [4] generate_vertical!(::StochasticPrograms.ScenarioProblems{Scenario{NamedTuple{(:q₁, :q₂, :d₁, :d₂),NTuple{4,Float64}}}}, ::var"#18#23", ::var"#21#26", ::NamedTuple{(),Tuple{}}, ::NamedTuple{(),Tuple{}}, ::Decisions, ::Nothing) at /Users/ryanwalker/.julia/dev/StochasticPrograms/src/methods/vertical/generation.jl:65
 [5] generate!(::StochasticProgram{2,Tuple{StochasticPrograms.Stage{NamedTuple{(),Tuple{}}},StochasticPrograms.Stage{NamedTuple{(),Tuple{}}}},VerticalStructure{2,1,Tuple{StochasticPrograms.ScenarioProblems{Scenario{NamedTuple{(:q₁, :q₂, :d₁, :d₂),NTuple{4,Float64}}}}}}}, ::VerticalStructure{2,1,Tuple{StochasticPrograms.ScenarioProblems{Scenario{NamedTuple{(:q₁, :q₂, :d₁, :d₂),NTuple{4,Float64}}}}}}, ::Int64) at /Users/ryanwalker/.julia/dev/StochasticPrograms/src/methods/vertical/generation.jl:40
 [6] generate! at /Users/ryanwalker/.julia/dev/StochasticPrograms/src/methods/vertical/generation.jl:6 [inlined]
 [7] generate!(::StochasticProgram{2,Tuple{StochasticPrograms.Stage{NamedTuple{(),Tuple{}}},StochasticPrograms.Stage{NamedTuple{(),Tuple{}}}},VerticalStructure{2,1,Tuple{StochasticPrograms.ScenarioProblems{Scenario{NamedTuple{(:q₁, :q₂, :d₁, :d₂),NTuple{4,Float64}}}}}}}) at /Users/ryanwalker/.julia/dev/StochasticPrograms/src/methods/generation.jl:92
 [8] instantiate(::StochasticModel{2,Tuple{StageParameters{NamedTuple{(),Tuple{}}},StageParameters{NamedTuple{(),Tuple{}}}}}, ::Array{Scenario{NamedTuple{(:q₁, :q₂, :d₁, :d₂),NTuple{4,Float64}}},1}; instantiation::StochasticPrograms.UnspecifiedInstantiation, optimizer::Type{T} where T, defer::Bool, direct_model::Bool, kw::Base.Iterators.Pairs{Union{},Union{},Tuple{},NamedTuple{(),Tuple{}}}) at /Users/ryanwalker/.julia/dev/StochasticPrograms/src/methods/api.jl:37
 [9] top-level scope at REPL[19]:1
rtwalker commented 4 years ago

Note: I'm happy to try to help with either of the issues I just opened. I did a little digging on each but didn't see an apparent solution to either, so I might need a little guidance.

martinbiel commented 4 years ago

Hey,

I believe the @expression is incorrectly added to the decision generator. Adding a filter for @expression to: https://github.com/martinbiel/StochasticPrograms.jl/blob/master/src/methods/creation.jl#L593-L607 might sort it out!

rtwalker commented 4 years ago

Thanks for the suggestion! I've made the change locally and will try it out. If I don't run into any problems, I'll create a PR later this week.