I can’t seem to get the first motivating example in Dualization.jl to work (at https://jump.dev/Dualization.jl/dev/examples/)
using JuMP, Dualization
model = Model()
@variable(model, x)
@variable(model, y)
@variable(model, z)
@constraint(model, soccon, [x; y; z] in SecondOrderCone())
@constraint(model, eqcon, x == 1)
@objective(model, Min, y + z)
dual_model = dualize(model)
yields
julia> print(model)
Min y + z
Subject to
eqcon : x = 1
soccon : [x, y, z] ∈ MathOptInterface.SecondOrderCone(3)
julia> print(dual_model)
Max _[1]
Subject to
[-_[1], 1, 1] ∈ MathOptInterface.SecondOrderCone(3)
and in particular dual_model doesn’t recover all the constraints.
model = Model()
@variable(model, x)
@variable(model, y >= 0)
@variable(model, z)
@constraint(model, soccon, [1.0 * x + 2.0, y, z] in SecondOrderCone())
@constraint(model, eqcon, x == 1)
@constraint(model, con_le, x + y >= 1)
@objective(model, Min, y + z)
The soccon here is strange.
I would write an aux line @constraint(model, auxcon, aux_decision == 1.0x + 2) @constraint(model, [aux_decision, y, z] in SecondOrderCone()) # [*]
As far as I can tell: in practice you won’t need a dual variable for a SOC constraint like the [*] above. Having auxcon, eqcon and con_le should be sufficient.