PSORLab / EAGO.jl

A development environment for robust and global optimization
MIT License
144 stars 16 forks source link

ERROR: MathOptInterface.UpperBoundAlreadySet{MathOptInterface.Interval, MathOptInterface.LessThan} #109

Closed freemin7 closed 1 year ago

freemin7 commented 1 year ago
ERROR: MathOptInterface.UpperBoundAlreadySet{MathOptInterface.Interval{Float64}, MathOptInterface.LessThan{Float64}}: Cannot add `VariableIndex`-in-`MathOptInterface.LessThan{Float64}` constraint for variable MathOptInterface.VariableIndex(15) as a `VariableIndex`-in-`MathOptInterface.Interval{Float64}` constraint was already set for this variable and both constraints set an upper bound.
Stacktrace:
  [1] _throw_if_upper_bound_set_inner(variable::MathOptInterface.VariableIndex, S2::Type, mask::UInt16, T::Type)
    @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/variables_container.jl:126
  [2] _throw_if_upper_bound_set
    @ ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/variables_container.jl:137 [inlined]
  [3] add_constraint
    @ ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/variables_container.jl:256 [inlined]
  [4] add_constraint
    @ ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/model.jl:371 [inlined]
  [5] add_constraint(m::MathOptInterface.Utilities.CachingOptimizer{Cbc.Optimizer, MathOptInterface.Utilities.Model{Float64}}, func::MathOptInterface.VariableIndex, set::MathOptInterface.LessThan{Float64})
    @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/cachingoptimizer.jl:546
  [6] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{Cbc.Optimizer, MathOptInterface.Utilities.Model{Float64}}}, f::MathOptInterface.VariableIndex, s::MathOptInterface.LessThan{Float64})
    @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/Ohzb2/src/Bridges/bridge_optimizer.jl:1666
  [7] add_constraint
    @ ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/types/incremental.jl:84 [inlined]
  [8] update_relaxed_problem_box!(m::EAGO.GlobalOptimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/nonconvex/lower_problem.jl:89
  [9] relax_problem!(m::EAGO.GlobalOptimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/nonconvex/lower_problem.jl:215
 [10] obbt!(m::EAGO.GlobalOptimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/domain_reduction.jl:253
 [11] preprocess!(t::EAGO.DefaultExt, m::EAGO.GlobalOptimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/nonconvex/lower_problem.jl:321
 [12] preprocess!
    @ ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/nonconvex/lower_problem.jl:330 [inlined]
 [13] macro expansion
    @ ./timing.jl:299 [inlined]
 [14] global_solve!(m::EAGO.GlobalOptimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/optimize_nonconvex.jl:285
 [15] optimize!
    @ ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/optimize_nonconvex.jl:354 [inlined]
 [16] optimize!(m::Optimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt})
    @ EAGO ~/.julia/packages/EAGO/XpIwc/src/eago_optimizer/optimize/optimize.jl:39
 [17] optimize!
    @ ~/.julia/packages/MathOptInterface/Ohzb2/src/Bridges/bridge_optimizer.jl:376 [inlined]
 [18] optimize!
    @ ~/.julia/packages/MathOptInterface/Ohzb2/src/MathOptInterface.jl:87 [inlined]
 [19] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.Bridges.LazyBridgeOptimizer{Optimizer{EAGO.Incremental{Cbc.Optimizer}, EAGO.Incremental{Ipopt.Optimizer}, EAGO.DefaultExt}}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
    @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/Ohzb2/src/Utilities/cachingoptimizer.jl:316
 [20] optimize!(model::Model; ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
    @ JuMP ~/.julia/packages/JuMP/Y4piv/src/optimizer_interface.jl:161
 [21] optimize!(model::Model)
    @ JuMP ~/.julia/packages/JuMP/Y4piv/src/optimizer_interface.jl:143
 [22] top-level scope
    @ REPL[59]:1

Package environment:

      Status `~/privatepath/model/Project.toml`
  [07493b3f] Alpine v0.5.1
  [bb8be931] EAGO v0.7.1
  [87dc4568] HiGHS v1.1.4
  [b99e6be6] Hypatia v0.7.0
  [b6b21f68] Ipopt v1.1.0
  [4076af6c] JuMP v1.1.1
  [2ddba703] Juniper v0.9.1
  [2f354839] Pajarito v0.8.0
  [2f01184e] SparseArrays

Offending code: Offending code:


using Ipopt, Alpine, LinearAlgebra, Juniper, EAGO, SparseArrays, JuMP

nn = 4
np = 5
n0 = 1

Qmax = 500
Pmin = 5
Pmax = 45

Aqp = sparse([1,2,2,3,3,4,4,5,5],[1,1,2,1,3,2,4,3,4],[1.,1.,-1.,-1.,1.,1.,-1.,1.,-1.],5,4)
Aq0 = sparse([1],[1],[-1.],5,1)

Demands = fill(25.,(4))
Elevation = [90.,90.,88.,88.]
WaterHeight = [100.;]

nv = 4

## MINLP

mip = optimizer_with_attributes(HiGHS.Optimizer, 
                                         MOI.Silent() => true,
                                         "presolve"   => "on") 

# NLP optimizer
ipopt = optimizer_with_attributes(Ipopt.Optimizer, 
                                        MOI.Silent() => true, 
                                        "sb" => "yes", 
                                        "max_iter"   => 9999)

# Local MINLP feasibility pump
juniper = optimizer_with_attributes(
        Juniper.Optimizer,
       # MOI.Silent() => true,
        "mip_solver" => mip,
        "nl_solver" => ipopt,
    )

# Global optimizer
alpine = optimizer_with_attributes(Alpine.Optimizer, 
                                         "nlp_solver" => ipopt,
                                         "mip_solver" => mip,
                                         "minlp_solver" => juniper)
mnl = Model(EAGO)
@variable(mnl, Pmin <= p[1:nn] <= Pmax)
@variable(mnl, 0 <= q[1:(2*np)] <= Qmax)
@variable(mnl, z[1:(2*np)], Bin)
@variable(mnl, hfq[1:(2*np)])

@constraint(mnl, transpose(Aqp)*(q[1:np] - q[(np+1):(2np)]) - Demands .== 0)

@variable(mnl, b[1:(2*np)])
@constraint(mnl, b[1:np] .== -Aqp*p -Aqp*Demands -Aq0*WaterHeight -hfq[1:np] )
@constraint(mnl, b[(np+1):(2np)] .== +Aqp*p +Aqp*Demands +Aq0*WaterHeight -hfq[(np+1):(2np)])

for i in 1:(2*np)
  @NLconstraint(mnl, 0 <=    q[i]*b[i] )
end

@constraint(mnl, -Aqp*p -Aqp*Demands -Aq0*WaterHeight -hfq[1:np] -100*z[1:np] .<= 0)
@constraint(mnl, +Aqp*p +Aqp*Demands +Aq0*WaterHeight -hfq[(np+1):(2np)] -100*z[(1+np):(2*np)] .<= 0)

@constraint(mnl, z[1:np] + z[(np+1):(2np)] .<= 1)
@constraint(mnl, sum(z) == nv)

for i in 1:(2*np)
  @NLconstraint(mnl, hfq[i] == q[i]^1.852)
end

@objective(mnl,Min,sum(p))

optimize!(mnl)

Related issue: https://github.com/lanl-ansi/Alpine.jl/issues/223

I will narrow down the issue a bit more in the coming days.

javieravz commented 1 year ago

I'm having the same error. How did you solve it?