From e133f165827d82f6c6c8a84a8bf4dcb158291746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 14 Sep 2021 17:47:43 +0200 Subject: [PATCH 1/4] Add set_with_dimension --- docs/src/submodules/Utilities/reference.md | 1 + src/Utilities/matrix_of_constraints.jl | 37 +++++++++++++++++- test/Utilities/matrix_of_constraints.jl | 45 ++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) diff --git a/docs/src/submodules/Utilities/reference.md b/docs/src/submodules/Utilities/reference.md index b5df0f6361..ccbeeb24ea 100644 --- a/docs/src/submodules/Utilities/reference.md +++ b/docs/src/submodules/Utilities/reference.md @@ -113,6 +113,7 @@ Utilities.set_index Utilities.set_types Utilities.add_set Utilities.rows +Utilities.set_with_dimension ``` ```@docs diff --git a/src/Utilities/matrix_of_constraints.jl b/src/Utilities/matrix_of_constraints.jl index cee2305cc1..8216e452e8 100644 --- a/src/Utilities/matrix_of_constraints.jl +++ b/src/Utilities/matrix_of_constraints.jl @@ -525,8 +525,41 @@ end function_constants(b::Vector, rows) = b[rows] -# FIXME does not work for all sets -set_from_constants(::Vector, ::Type{S}, rows) where {S} = S(length(rows)) +""" + set_with_dimension(::Type{S}, dim) where {S<:MOI.AbstractVectorSet} + +Returns the instance of `S` of [`MathOptInterface.dimension`](@ref) `dim`. +This needs to be implemented for sets of type `S` to be useable with +[`MatrixOfConstraints`](@ref). +""" +function set_with_dimension(::Type{S}, dim) where {S<:MOI.AbstractVectorSet} + return S(dim) +end +function set_with_dimension(::Type{MOI.PositiveSemidefiniteConeTriangle}, dim) + side_dimension = side_dimension_for_vectorized_dimension(dim) + return MOI.PositiveSemidefiniteConeTriangle(side_dimension) +end +function set_with_dimension(::Type{MOI.PositiveSemidefiniteConeSquare}, dim) + return MOI.PositiveSemidefiniteConeSquare(isqrt(dim)) +end +function set_with_dimension(::Type{MOI.LogDetConeTriangle}, dim) + side_dimension = side_dimension_for_vectorized_dimension(dim - 2) + return MOI.LogDetConeTriangle(side_dimension) +end +function set_with_dimension(::Type{MOI.LogDetConeSquare}, dim) + return MOI.LogDetConeSquare(isqrt(dim - 2)) +end +function set_with_dimension(::Type{MOI.RootDetConeTriangle}, dim) + side_dimension = side_dimension_for_vectorized_dimension(dim - 1) + return MOI.RootDetConeTriangle(side_dimension) +end +function set_with_dimension(::Type{MOI.RootDetConeSquare}, dim) + return MOI.RootDetConeSquare(isqrt(dim - 1)) +end + +function set_from_constants(::Vector, ::Type{S}, rows) where {S} + return set_with_dimension(S, length(rows)) +end function MOI.get( model::MatrixOfConstraints, diff --git a/test/Utilities/matrix_of_constraints.jl b/test/Utilities/matrix_of_constraints.jl index 9b0d6bc864..680ca2cbc3 100644 --- a/test/Utilities/matrix_of_constraints.jl +++ b/test/Utilities/matrix_of_constraints.jl @@ -398,6 +398,51 @@ function test_multicone() return end +MOI.Utilities.@product_of_sets( + MatrixSets, + MOI.PositiveSemidefiniteConeTriangle, + MOI.PositiveSemidefiniteConeSquare, + MOI.LogDetConeTriangle, + MOI.LogDetConeSquare, + MOI.RootDetConeTriangle, + MOI.RootDetConeSquare, +) + +function test_matrix_sets(::Type{T}=Int) where {T} + model = MOI.Utilities.GenericOptimizer{ + T, + MOI.Utilities.ObjectiveContainer{T}, + MOI.Utilities.VariablesContainer{T}, + MOI.Utilities.MatrixOfConstraints{ + T, + MOI.Utilities.MutableSparseMatrixCSC{ + T, + T, + MOI.Utilities.OneBasedIndexing, + }, + Vector{T}, + MatrixSets{T}, + }, + }() + function test_set(set) + MOI.empty!(model) + func = MOI.Utilities.zero_with_output_dimension( + MOI.VectorAffineFunction{T}, + MOI.dimension(set), + ) + ci = MOI.add_constraint(model, func, set) + MOI.Utilities.final_touch(model, nothing) + @test MOI.get(model, MOI.ConstraintSet(), ci) == set + end + test_set(MOI.PositiveSemidefiniteConeTriangle(2)) + test_set(MOI.PositiveSemidefiniteConeSquare(2)) + test_set(MOI.LogDetConeTriangle(2)) + test_set(MOI.LogDetConeSquare(2)) + test_set(MOI.RootDetConeTriangle(2)) + test_set(MOI.RootDetConeSquare(2)) + return +end + end TestMatrixOfConstraints.runtests() From 269cfade95ab7f95142db8e07d3a9356853bbc95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Tue, 14 Sep 2021 21:57:10 +0200 Subject: [PATCH 2/4] Fixes --- src/Utilities/matrix_of_constraints.jl | 4 ++-- test/Utilities/matrix_of_constraints.jl | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Utilities/matrix_of_constraints.jl b/src/Utilities/matrix_of_constraints.jl index 8216e452e8..46b1e1cb63 100644 --- a/src/Utilities/matrix_of_constraints.jl +++ b/src/Utilities/matrix_of_constraints.jl @@ -535,11 +535,11 @@ This needs to be implemented for sets of type `S` to be useable with function set_with_dimension(::Type{S}, dim) where {S<:MOI.AbstractVectorSet} return S(dim) end -function set_with_dimension(::Type{MOI.PositiveSemidefiniteConeTriangle}, dim) +function set_with_dimension(::Type{MOI.AbstractSymmetricMatrixSetTriangle}, dim) side_dimension = side_dimension_for_vectorized_dimension(dim) return MOI.PositiveSemidefiniteConeTriangle(side_dimension) end -function set_with_dimension(::Type{MOI.PositiveSemidefiniteConeSquare}, dim) +function set_with_dimension(::Type{MOI.AbstractSymmetricMatrixSetSquare}, dim) return MOI.PositiveSemidefiniteConeSquare(isqrt(dim)) end function set_with_dimension(::Type{MOI.LogDetConeTriangle}, dim) diff --git a/test/Utilities/matrix_of_constraints.jl b/test/Utilities/matrix_of_constraints.jl index 680ca2cbc3..d130ca662d 100644 --- a/test/Utilities/matrix_of_constraints.jl +++ b/test/Utilities/matrix_of_constraints.jl @@ -408,7 +408,7 @@ MOI.Utilities.@product_of_sets( MOI.RootDetConeSquare, ) -function test_matrix_sets(::Type{T}=Int) where {T} +function test_matrix_sets(::Type{T} = Int) where {T} model = MOI.Utilities.GenericOptimizer{ T, MOI.Utilities.ObjectiveContainer{T}, From 8df4cce02555d04e8570d35e23f2ca75ac5e1b69 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 15 Sep 2021 09:37:09 +1200 Subject: [PATCH 3/4] Update matrix_of_constraints.jl --- src/Utilities/matrix_of_constraints.jl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Utilities/matrix_of_constraints.jl b/src/Utilities/matrix_of_constraints.jl index 46b1e1cb63..b6f3fee1bd 100644 --- a/src/Utilities/matrix_of_constraints.jl +++ b/src/Utilities/matrix_of_constraints.jl @@ -535,24 +535,30 @@ This needs to be implemented for sets of type `S` to be useable with function set_with_dimension(::Type{S}, dim) where {S<:MOI.AbstractVectorSet} return S(dim) end -function set_with_dimension(::Type{MOI.AbstractSymmetricMatrixSetTriangle}, dim) + +function set_with_dimension(::Type{<:MOI.AbstractSymmetricMatrixSetTriangle}, dim) side_dimension = side_dimension_for_vectorized_dimension(dim) return MOI.PositiveSemidefiniteConeTriangle(side_dimension) end -function set_with_dimension(::Type{MOI.AbstractSymmetricMatrixSetSquare}, dim) + +function set_with_dimension(::Type{<:MOI.AbstractSymmetricMatrixSetSquare}, dim) return MOI.PositiveSemidefiniteConeSquare(isqrt(dim)) end + function set_with_dimension(::Type{MOI.LogDetConeTriangle}, dim) side_dimension = side_dimension_for_vectorized_dimension(dim - 2) return MOI.LogDetConeTriangle(side_dimension) end + function set_with_dimension(::Type{MOI.LogDetConeSquare}, dim) return MOI.LogDetConeSquare(isqrt(dim - 2)) end + function set_with_dimension(::Type{MOI.RootDetConeTriangle}, dim) side_dimension = side_dimension_for_vectorized_dimension(dim - 1) return MOI.RootDetConeTriangle(side_dimension) end + function set_with_dimension(::Type{MOI.RootDetConeSquare}, dim) return MOI.RootDetConeSquare(isqrt(dim - 1)) end From 672e3df24cc09fc7bcc8315c702926882ace2831 Mon Sep 17 00:00:00 2001 From: Oscar Dowson Date: Wed, 15 Sep 2021 09:38:44 +1200 Subject: [PATCH 4/4] Update matrix_of_constraints.jl --- src/Utilities/matrix_of_constraints.jl | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/Utilities/matrix_of_constraints.jl b/src/Utilities/matrix_of_constraints.jl index b6f3fee1bd..aa0ecbfe6b 100644 --- a/src/Utilities/matrix_of_constraints.jl +++ b/src/Utilities/matrix_of_constraints.jl @@ -536,13 +536,19 @@ function set_with_dimension(::Type{S}, dim) where {S<:MOI.AbstractVectorSet} return S(dim) end -function set_with_dimension(::Type{<:MOI.AbstractSymmetricMatrixSetTriangle}, dim) +function set_with_dimension( + ::Type{S}, + dim, +) where {S<:MOI.AbstractSymmetricMatrixSetTriangle} side_dimension = side_dimension_for_vectorized_dimension(dim) - return MOI.PositiveSemidefiniteConeTriangle(side_dimension) + return S(side_dimension) end -function set_with_dimension(::Type{<:MOI.AbstractSymmetricMatrixSetSquare}, dim) - return MOI.PositiveSemidefiniteConeSquare(isqrt(dim)) +function set_with_dimension( + ::Type{S}, + dim, +) where {S<:MOI.AbstractSymmetricMatrixSetSquare} + return S(isqrt(dim)) end function set_with_dimension(::Type{MOI.LogDetConeTriangle}, dim)