Skip to content

Commit 0f123b8

Browse files
authored
Add fallback for MOI.AbstractSymmetricMatrixSet{Triangle,Square} (#3424)
1 parent 0b3ee89 commit 0f123b8

File tree

3 files changed

+65
-51
lines changed

3 files changed

+65
-51
lines changed

src/macros.jl

+2-5
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ end
781781

782782
function build_constraint(
783783
_error::Function,
784-
x::Matrix,
784+
x::AbstractMatrix,
785785
set::MOI.AbstractVectorSet,
786786
)
787787
return _error(
@@ -793,10 +793,7 @@ end
793793
function build_constraint(
794794
_error::Function,
795795
::Matrix,
796-
T::Union{
797-
MOI.PositiveSemidefiniteConeSquare,
798-
MOI.PositiveSemidefiniteConeTriangle,
799-
},
796+
T::MOI.PositiveSemidefiniteConeTriangle,
800797
)
801798
return _error("instead of `$(T)`, use `JuMP.PSDCone()`.")
802799
end

src/sd.jl

+63-37
Original file line numberDiff line numberDiff line change
@@ -137,25 +137,6 @@ triangular part of the matrix is constrained to belong to the
137137
"""
138138
struct PSDCone end
139139

140-
function build_constraint(
141-
_error::Function,
142-
f::AbstractMatrix{<:AbstractJuMPScalar},
143-
::Nonnegatives,
144-
extra::PSDCone,
145-
)
146-
return build_constraint(_error, f, extra)
147-
end
148-
149-
function build_constraint(
150-
_error::Function,
151-
f::AbstractMatrix{<:AbstractJuMPScalar},
152-
::Nonpositives,
153-
extra::PSDCone,
154-
)
155-
new_f = _MA.operate!!(*, -1, f)
156-
return build_constraint(_error, new_f, extra)
157-
end
158-
159140
"""
160141
SymmetricMatrixShape
161142
@@ -167,6 +148,7 @@ lower-left triangular part given row by row).
167148
struct SymmetricMatrixShape <: AbstractShape
168149
side_dimension::Int
169150
end
151+
170152
function reshape_vector(
171153
vectorized_form::Vector{T},
172154
shape::SymmetricMatrixShape,
@@ -181,12 +163,14 @@ function reshape_vector(
181163
end
182164
return LinearAlgebra.Symmetric(matrix)
183165
end
166+
184167
function reshape_set(
185168
::MOI.PositiveSemidefiniteConeTriangle,
186169
::SymmetricMatrixShape,
187170
)
188171
return PSDCone()
189172
end
173+
190174
function vectorize(matrix, ::SymmetricMatrixShape)
191175
n = LinearAlgebra.checksquare(matrix)
192176
return [matrix[i, j] for j in 1:n for i in 1:j]
@@ -414,12 +398,7 @@ function build_variable(
414398
)
415399
n = _square_side(_error, variables)
416400
set = MOI.PositiveSemidefiniteConeTriangle(n)
417-
shape = SymmetricMatrixShape(n)
418-
return VariablesConstrainedOnCreation(
419-
_vectorize_variables(_error, variables),
420-
set,
421-
shape,
422-
)
401+
return build_variable(_error, variables, set)
423402
end
424403

425404
function value(
@@ -476,12 +455,7 @@ function build_constraint(
476455
::PSDCone,
477456
) where {V<:AbstractJuMPScalar,M<:AbstractMatrix{V}}
478457
n = LinearAlgebra.checksquare(Q)
479-
shape = SymmetricMatrixShape(n)
480-
return VectorConstraint(
481-
vectorize(Q, shape),
482-
MOI.PositiveSemidefiniteConeTriangle(n),
483-
shape,
484-
)
458+
return build_constraint(_error, Q, MOI.PositiveSemidefiniteConeTriangle(n))
485459
end
486460

487461
"""
@@ -511,12 +485,7 @@ function build_constraint(
511485
::PSDCone,
512486
)
513487
n = LinearAlgebra.checksquare(Q)
514-
shape = SquareMatrixShape(n)
515-
return VectorConstraint(
516-
vectorize(Q, shape),
517-
MOI.PositiveSemidefiniteConeSquare(n),
518-
shape,
519-
)
488+
return build_constraint(_error, Q, MOI.PositiveSemidefiniteConeSquare(n))
520489
end
521490

522491
"""
@@ -742,3 +711,60 @@ function build_constraint(_error::Function, ::AbstractMatrix, ::Zeros)
742711
"`LinearAlgebra.Symmetric` or `LinearAlgebra.Hermitian`.",
743712
)
744713
end
714+
715+
function build_constraint(
716+
_error::Function,
717+
Q::LinearAlgebra.Symmetric{V,M},
718+
set::MOI.AbstractSymmetricMatrixSetTriangle,
719+
) where {V<:AbstractJuMPScalar,M<:AbstractMatrix{V}}
720+
n = LinearAlgebra.checksquare(Q)
721+
shape = SymmetricMatrixShape(n)
722+
return VectorConstraint(vectorize(Q, shape), set, shape)
723+
end
724+
725+
function build_constraint(
726+
_error::Function,
727+
Q::AbstractMatrix{<:AbstractJuMPScalar},
728+
set::MOI.AbstractSymmetricMatrixSetSquare,
729+
)
730+
n = LinearAlgebra.checksquare(Q)
731+
shape = SquareMatrixShape(n)
732+
return VectorConstraint(vectorize(Q, shape), set, shape)
733+
end
734+
735+
function build_constraint(
736+
_error::Function,
737+
f::AbstractMatrix{<:AbstractJuMPScalar},
738+
::Nonnegatives,
739+
extra::Union{
740+
MOI.AbstractSymmetricMatrixSetTriangle,
741+
MOI.AbstractSymmetricMatrixSetSquare,
742+
PSDCone,
743+
},
744+
)
745+
return build_constraint(_error, f, extra)
746+
end
747+
748+
function build_constraint(
749+
_error::Function,
750+
f::AbstractMatrix{<:AbstractJuMPScalar},
751+
::Nonpositives,
752+
extra::Union{
753+
MOI.AbstractSymmetricMatrixSetTriangle,
754+
MOI.AbstractSymmetricMatrixSetSquare,
755+
PSDCone,
756+
},
757+
)
758+
new_f = _MA.operate!!(*, -1, f)
759+
return build_constraint(_error, new_f, extra)
760+
end
761+
762+
function build_variable(
763+
_error::Function,
764+
variables::Matrix{<:AbstractVariable},
765+
set::MOI.AbstractSymmetricMatrixSetTriangle,
766+
)
767+
n = _square_side(_error, variables)
768+
x = _vectorize_variables(_error, variables)
769+
return VariablesConstrainedOnCreation(x, set, SymmetricMatrixShape(n))
770+
end

test/test_constraint.jl

-9
Original file line numberDiff line numberDiff line change
@@ -652,15 +652,6 @@ function test_extension_PSD_constraint_errors(
652652
)
653653
model = ModelType()
654654
@variable(model, X[1:2, 1:2])
655-
err = ErrorException(
656-
"In `@constraint(model, X in MOI.PositiveSemidefiniteConeSquare(2))`:" *
657-
" instead of `MathOptInterface.PositiveSemidefiniteConeSquare(2)`," *
658-
" use `JuMP.PSDCone()`.",
659-
)
660-
@test_throws_strip(
661-
err,
662-
@constraint(model, X in MOI.PositiveSemidefiniteConeSquare(2))
663-
)
664655
err = ErrorException(
665656
"In `@constraint(model, X in MOI.PositiveSemidefiniteConeTriangle(2))`:" *
666657
" instead of `MathOptInterface.PositiveSemidefiniteConeTriangle(2)`," *

0 commit comments

Comments
 (0)