Skip to content

Bug in bridges with variables-constrained-on-creation #1698

@chriscoey

Description

@chriscoey

I'm on latest JuMP and MOI. This occurred running MOIPajarito's soc2 test here https://github.com/chriscoey/MOIPajarito.jl/blob/336edcf24cb3ee18dddbfaa955e9071a562848c9/test/JuMP_tests.jl#L87.

_soc2: Error During Test at /home/coey/.julia/dev/MOIPajarito/test/JuMP_tests.jl:29
  Got exception outside of a @test
  In `MathOptInterface.ScalarAffineFunction{Float64}`-in-`MathOptInterface.EqualTo{Float64}` constraint: Constant 2.5 of the function is not zero. The function constant should be moved to the set. You can use `MOI.Utilities.normalize_and_add_constraint` which does this automatically.
  Stacktrace:
    [1] throw_if_scalar_and_constant_not_zero
      @ ~/.julia/packages/MathOptInterface/hcTsY/src/constraints.jl:95 [inlined]
    [2] bridged_constraint_function
      @ ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1925 [inlined]
    [3] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, f::MathOptInterface.ScalarAffineFunction{Float64}, s::MathOptInterface.EqualTo{Float64})
      @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1533
    [4] bridge_constraint(#unused#::Type{MathOptInterface.Bridges.Constraint.ScalarSlackBridge{Float64, MathOptInterface.ScalarAffineFunction{Float64}, MathOptInterface.Integer}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, f::MathOptInterface.ScalarAffineFunction{Float64}, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges.Constraint ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/Constraint/slack.jl:182
    [5] add_bridged_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, BridgeType::Type, f::MathOptInterface.ScalarAffineFunction{Float64}, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1469
    [6] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, f::MathOptInterface.ScalarAffineFunction{Float64}, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1544
    [7] bridge_constraint(#unused#::Type{MathOptInterface.Bridges.Constraint.ScalarFunctionizeBridge{Float64, MathOptInterface.Integer}}, model::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, f::MathOptInterface.VariableIndex, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges.Constraint ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/Constraint/functionize.jl:20
    [8] add_bridged_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, BridgeType::Type, f::MathOptInterface.VariableIndex, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1469
    [9] add_constraint(b::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, f::MathOptInterface.VariableIndex, s::MathOptInterface.Integer)
      @ MathOptInterface.Bridges ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:1521
   [10] _copy_constraints(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}, index_map::MathOptInterface.Utilities.IndexMap, cis_src::Vector{MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.Integer}})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/hcTsY/src/Utilities/copy.jl:248
   [11] _pass_constraints(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}, index_map::MathOptInterface.Utilities.IndexMap, variable_constraints_not_added::Vector{Any})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/hcTsY/src/Utilities/copy.jl:303
   [12] default_copy_to(dest::MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, src::MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/hcTsY/src/Utilities/copy.jl:442
   [13] #copy_to#7
      @ ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:421 [inlined]
   [14] copy_to
      @ ~/.julia/packages/MathOptInterface/hcTsY/src/Bridges/bridge_optimizer.jl:421 [inlined]
   [15] optimize!
      @ ~/.julia/packages/MathOptInterface/hcTsY/src/MathOptInterface.jl:80 [inlined]
   [16] optimize!(m::MathOptInterface.Utilities.CachingOptimizer{MathOptInterface.Bridges.LazyBridgeOptimizer{MathOptInterface.Utilities.CachingOptimizer{MOIPajarito.Optimizer, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}}}, MathOptInterface.Utilities.UniversalFallback{MathOptInterface.Utilities.Model{Float64}}})
      @ MathOptInterface.Utilities ~/.julia/packages/MathOptInterface/hcTsY/src/Utilities/cachingoptimizer.jl:285
   [17] optimize!(model::JuMP.Model, optimizer_factory::Nothing; bridge_constraints::Bool, ignore_optimize_hook::Bool, kwargs::Base.Pairs{Symbol, Union{}, Tuple{}, NamedTuple{(), Tuple{}}})
      @ JuMP ~/.julia/packages/JuMP/2IF9U/src/optimizer_interface.jl:195
   [18] optimize! (repeats 2 times)
      @ ~/.julia/packages/JuMP/2IF9U/src/optimizer_interface.jl:167 [inlined]
   [19] _soc2(opt::MathOptInterface.OptimizerWithAttributes)
      @ Main.TestJuMP ~/.julia/dev/MOIPajarito/test/JuMP_tests.jl:87

Not sure how to get an MWE. I don't understand what is going on, but it seems like it is trying to bridge a VariableIndex in Integer to a ScalarAffineFunction in Integer, which doesn't make sense.

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions