-
Notifications
You must be signed in to change notification settings - Fork 94
Closed
Description
import HiGHS
import MathOptInterface as MOI
# works, of course
# model = MOI.instantiate(HiGHS.Optimizer, with_bridge_type = Float64)
# fails
opt = () -> MOI.instantiate(HiGHS.Optimizer, with_bridge_type = Float64)
model = MOI.instantiate(opt, with_cache_type = Float64)
s = MOI.add_variable(model)
vs = MOI.add_constraint(model, MOI.VectorOfVariables([s]), MOI.Zeros(1))
MOI.optimize!(model)
MOI.get(model, MOI.ConstraintDual(), vs)
ERROR: Unable to query the dual of a variable bound that was reformulated using `ZerosBridge`. This usually arises in conic solvers when a variable is fixed to a value. As a work-around, instead of creating a fixed variable using variable bounds like `p == 1`, add an affine equality constraint like `1 * p == 1` (or `[1 * p - 1,] in Zeros(1)`).
Stacktrace:
[1] error(s::String)
@ Base ./error.jl:35
[2] get(::MathOptInterface.Bridges.LazyBridgeOptimizer{…}, ::MathOptInterface.ConstraintDual, ::MathOptInterface.Bridges.Variable.ZerosBridge{…})
@ MathOptInterface.Bridges.Variable ~/.julia/dev/MathOptInterface/src/Bridges/Variable/bridges/ZerosBridge.jl:96
[3] (::MathOptInterface.Bridges.var"#3#4"{…})(bridge::MathOptInterface.Bridges.Variable.ZerosBridge{…})
@ MathOptInterface.Bridges ~/.julia/dev/MathOptInterface/src/Bridges/bridge_optimizer.jl:324
[4] (::MathOptInterface.Bridges.Variable.var"#21#22"{MathOptInterface.Bridges.Variable.Map, MathOptInterface.Bridges.var"#3#4"{…}, Int64})()
@ MathOptInterface.Bridges.Variable ~/.julia/dev/MathOptInterface/src/Bridges/Variable/map.jl:642
[5] call_in_context(map::MathOptInterface.Bridges.Variable.Map, bridge_index::Int64, f::MathOptInterface.Bridges.Variable.var"#21#22"{…})
@ MathOptInterface.Bridges.Variable ~/.julia/dev/MathOptInterface/src/Bridges/Variable/map.jl:627
[6] call_in_context
@ ~/.julia/dev/MathOptInterface/src/Bridges/Variable/map.jl:642 [inlined]
[7] call_in_context
@ ~/.julia/dev/MathOptInterface/src/Bridges/bridge_optimizer.jl:284 [inlined]
[8] call_in_context(b::MathOptInterface.Bridges.LazyBridgeOptimizer{…}, ci::MathOptInterface.ConstraintIndex{…}, f::MathOptInterface.Bridges.var"#3#4"{…})
@ MathOptInterface.Bridges ~/.julia/dev/MathOptInterface/src/Bridges/bridge_optimizer.jl:304
[9] call_in_context
@ ~/.julia/dev/MathOptInterface/src/Bridges/bridge_optimizer.jl:321 [inlined]
[10] get(b::MathOptInterface.Bridges.LazyBridgeOptimizer{…}, attr::MathOptInterface.ConstraintDual, ci::MathOptInterface.ConstraintIndex{…})
@ MathOptInterface.Bridges ~/.julia/dev/MathOptInterface/src/Bridges/bridge_optimizer.jl:1646
[11] _get_fallback(model::MathOptInterface.Utilities.CachingOptimizer{…}, attr::MathOptInterface.ConstraintDual, index::MathOptInterface.ConstraintIndex{…})
@ MathOptInterface.Utilities ~/.julia/dev/MathOptInterface/src/Utilities/cachingoptimizer.jl:1004
[12] get(model::MathOptInterface.Utilities.CachingOptimizer{…}, attr::MathOptInterface.ConstraintDual, index::MathOptInterface.ConstraintIndex{…})
@ MathOptInterface.Utilities ~/.julia/dev/MathOptInterface/src/Utilities/cachingoptimizer.jl:949
[13] top-level scope
@ REPL[361]:1
Some type information was truncated. Use `show(err)` to see complete types
Why would someone do it?
In DiffOpt we need:
- bridges to be general and accept a wider range of models
- copy to move the model to a matrix form used in differentiation
However, some bridges do not support get
ing ConstraintFunction
, so we need the cache outside.
Metadata
Metadata
Assignees
Labels
No labels