Skip to content

Commit

Permalink
Update to the new Scaled set (#133)
Browse files Browse the repository at this point in the history
* Simplify test

* Update to the new Scaled set

* Update to the new Scaled set

* Remove checkout in ci

* MOI v1.20
  • Loading branch information
blegat committed Sep 9, 2023
1 parent 6624a98 commit 968e698
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 13 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ Mosek = "6405355b-0ac2-5fba-af84-adbd65488c0e"
Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7"

[compat]
MathOptInterface = "1.6"
MathOptInterface = "1.20"
Mosek = "10.0"
julia = "1.6"

Expand Down
9 changes: 5 additions & 4 deletions src/attributes.jl
Original file line number Diff line number Diff line change
Expand Up @@ -371,7 +371,7 @@ getsolcode(m::Optimizer, N) = m.solutions[N].whichsol

# The dual or primal of an SDP variable block is returned in lower triangular
# form but the constraint is in upper triangular form.
function reorder(k::Integer, set::MOI.ScaledPositiveSemidefiniteConeTriangle, moi_to_mosek::Bool)
function reorder(k::Integer, set::MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle}, moi_to_mosek::Bool)
# `i` is the row in columnwise upper triangular form
# the returned value is in columnwise lower triangular form
if !moi_to_mosek
Expand All @@ -381,15 +381,16 @@ function reorder(k::Integer, set::MOI.ScaledPositiveSemidefiniteConeTriangle, mo
end
j = div(1 + isqrt(8k - 7), 2)
i = k - div((j - 1) * j, 2)
@assert 0 < j <= set.side_dimension
d = MOI.side_dimension(set)
@assert 0 < j <= d
@assert 0 < i <= j
k = MOI.Utilities.trimap(set.side_dimension - j + 1, set.side_dimension - i + 1)
k = MOI.Utilities.trimap(d - j + 1, d - i + 1)
if moi_to_mosek
k = MOI.dimension(set) - k + 1
end
return k
end
function reorder(x::AbstractVector, ::Type{<:Union{MOI.ScaledPositiveSemidefiniteConeTriangle,MOI.PositiveSemidefiniteConeTriangle}}, moi_to_mosek::Bool)
function reorder(x::AbstractVector, ::Type{<:Union{MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle},MOI.PositiveSemidefiniteConeTriangle}}, moi_to_mosek::Bool)
n = MOI.Utilities.side_dimension_for_vectorized_dimension(length(x))
@assert length(x) == MOI.dimension(MOI.PositiveSemidefiniteConeTriangle(n))
y = similar(x)
Expand Down
10 changes: 5 additions & 5 deletions src/constraint.jl
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const VectorConeDomain = Union{MOI.SecondOrderCone,
MOI.DualPowerCone,
MOI.ExponentialCone,
MOI.DualExponentialCone,
MOI.ScaledPositiveSemidefiniteConeTriangle,}
MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle},}

function allocateconstraints(m::Optimizer, N::Int)
numcon = getnumcon(m.task)
Expand Down Expand Up @@ -187,7 +187,7 @@ function get_bound(m::Optimizer,
# elseif dt == MSK_DOMAIN_PRIMAL_GEO_MEAN_CONE
# elseif dt == MSK_DOMAIN_DUAL_GEO_MEAN_CONE
elseif dt == MSK_DOMAIN_SVEC_PSD_CONE
return MOI.ScaledPositiveSemidefiniteConeTriangle(MOI.Utilities.side_dimension_for_vectorized_dimension(solsize(m, ci)))
return MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle}(MOI.Utilities.side_dimension_for_vectorized_dimension(solsize(m, ci)))
else
error("Incompatible cone detected")
end
Expand Down Expand Up @@ -351,7 +351,7 @@ appendconedomain(t::Mosek.Task,::Int,dom::MOI.PowerCone{Float64}) = Mosek.ap
appendconedomain(t::Mosek.Task,::Int,dom::MOI.DualPowerCone{Float64}) = Mosek.appenddualpowerconedomain(t,3,Float64[dom.exponent,1.0-dom.exponent])
appendconedomain(t::Mosek.Task,n::Int,::MOI.SecondOrderCone) = Mosek.appendquadraticconedomain(t,n)
appendconedomain(t::Mosek.Task,n::Int,::MOI.RotatedSecondOrderCone) = Mosek.appendrquadraticconedomain(t,n)
appendconedomain(t::Mosek.Task,n::Int,::MOI.ScaledPositiveSemidefiniteConeTriangle) = Mosek.appendsvecpsdconedomain(t,n)
appendconedomain(t::Mosek.Task,n::Int,::MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle}) = Mosek.appendsvecpsdconedomain(t,n)

# Two `SingleVariable`-in-`S` cannot be set to the same variable if
# the two constraints
Expand Down Expand Up @@ -569,7 +569,7 @@ function MOI.add_constrained_variables(
m ::Optimizer,
dom::MOI.PositiveSemidefiniteConeTriangle
)
N = dom.side_dimension
N = MOI.side_dimension(dom)
if N < 1
error("Invalid dimension for semidefinite constraint, got $N which is ",
"smaller than the minimum dimension 1.")
Expand Down Expand Up @@ -767,7 +767,7 @@ function MOI.is_valid(model::Optimizer,
(dt == MSK_DOMAIN_DUAL_EXP_CONE && S == MOI.DualExponentialCone) ||
(dt == MSK_DOMAIN_PRIMAL_POWER_CONE && S == MOI.PowerCone{Float64}) ||
(dt == MSK_DOMAIN_DUAL_POWER_CONE && S == MOI.DualPowerCone{Float64}) ||
(dt == MSK_DOMAIN_SVEC_PSD_CONE && S == MOI.ScaledPositiveSemidefiniteConeTriangle) )
(dt == MSK_DOMAIN_SVEC_PSD_CONE && S == MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle}) )
end
end
end
Expand Down
6 changes: 3 additions & 3 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -259,13 +259,13 @@ end

@testset "LMIs" begin
optimizer = MosekOptimizerWithFallback()
@test MOI.supports_constraint(optimizer, MOI.VectorAffineFunction{Float64}, MOI.ScaledPositiveSemidefiniteConeTriangle)
@test MOI.supports_constraint(optimizer, MOI.VectorAffineFunction{Float64}, MOI.Scaled{MOI.PositiveSemidefiniteConeTriangle})
bridged = MOI.Bridges.full_bridge_optimizer(optimizer, Float64)
@show MOI.Bridges.bridge_type(bridged, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle) === MOI.Bridges.Constraint.SymmetricMatrixScalingBridge{Float64,MOI.VectorAffineFunction{Float64}}
@show MOI.Bridges.bridge_type(bridged, MOI.VectorAffineFunction{Float64}, MOI.PositiveSemidefiniteConeTriangle) === MOI.Bridges.Constraint.SymmetricMatrixScalingBridge{Float64}
end

function _test_symmetric_reorder(lower, n)
set = MOI.ScaledPositiveSemidefiniteConeTriangle(n)
set = MOI.Scaled(MOI.PositiveSemidefiniteConeTriangle(n))
N = MOI.dimension(set)
@test MosekTools.reorder(lower, MOI.ScaledPositiveSemidefiniteConeTriangle, true) == 1:N
@test MosekTools.reorder(1:N, MOI.ScaledPositiveSemidefiniteConeTriangle, false) == lower
Expand Down

0 comments on commit 968e698

Please sign in to comment.