@@ -70,7 +70,7 @@ struct SquareBridge{T, F<:MOI.AbstractVectorFunction,
7070 G<: MOI.AbstractScalarFunction ,
7171 TT<: MOI.AbstractSymmetricMatrixSetTriangle ,
7272 ST<: MOI.AbstractSymmetricMatrixSetSquare } <: AbstractBridge
73- side_dimension :: Int
73+ square_set :: ST
7474 triangle:: CI{F, TT}
7575 sym:: Vector {Pair{Tuple{Int, Int}, CI{G, MOI. EqualTo{T}}}}
7676end
@@ -113,7 +113,7 @@ function bridge_constraint(::Type{SquareBridge{T, F, G, TT, ST}},
113113 end
114114 @assert length (upper_triangle_indices) == trilen
115115 triangle = MOI. add_constraint (model, f_scalars[upper_triangle_indices], MOI. triangular_form (s))
116- return SquareBridge {T, F, G, TT, ST} (dim , triangle, sym)
116+ return SquareBridge {T, F, G, TT, ST} (s , triangle, sym)
117117end
118118
119119function MOI. supports_constraint (:: Type{SquareBridge{T}} ,
@@ -161,10 +161,38 @@ function MOI.delete(model::MOI.ModelLike, bridge::SquareBridge)
161161end
162162
163163# Attributes, Bridge acting as a constraint
164+ function MOI. get (model:: MOI.ModelLike , attr:: MOI.ConstraintFunction ,
165+ bridge:: SquareBridge{T} ) where T
166+ tri = MOIU. eachscalar (MOI. get (model, attr, bridge. triangle))
167+ dim = MOI. side_dimension (bridge. square_set)
168+ sqr = Vector {eltype(tri)} (undef, dim^ 2 )
169+ sqrmap (i, j) = (j - 1 ) * dim + i
170+ k = 0
171+ for j in 1 : dim
172+ for i in 1 : j
173+ k += 1
174+ sqr[sqrmap (i, j)] = tri[k]
175+ sqr[sqrmap (j, i)] = tri[k]
176+ end
177+ end
178+ for sym in bridge. sym
179+ i, j = sym. first
180+ diff = MOI. get (model, attr, sym. second)
181+ set = MOI. get (model, MOI. ConstraintSet (), sym. second)
182+ upper = sqr[sqrmap (i, j)]
183+ lower = MOIU. operate (- , T, upper, diff)
184+ lower = MOIU. operate! (- , T, lower, MOI. constant (set))
185+ sqr[sqrmap (j, i)] = MOIU. convert_approx (eltype (tri), lower)
186+ end
187+ return MOIU. vectorize (sqr)
188+ end
189+ function MOI. get (:: MOI.ModelLike , :: MOI.ConstraintSet , bridge:: SquareBridge )
190+ return bridge. square_set
191+ end
164192function MOI. get (model:: MOI.ModelLike , attr:: MOI.ConstraintPrimal ,
165193 bridge:: SquareBridge{T} ) where T
166194 tri = MOI. get (model, attr, bridge. triangle)
167- dim = bridge . side_dimension
195+ dim = MOI . side_dimension (bridge . square_set)
168196 sqr = Vector {eltype(tri)} (undef, dim^ 2 )
169197 k = 0
170198 for j in 1 : dim
178206function MOI. get (model:: MOI.ModelLike , attr:: MOI.ConstraintDual ,
179207 bridge:: SquareBridge )
180208 tri = MOI. get (model, attr, bridge. triangle)
181- dim = bridge . side_dimension
209+ dim = MOI . side_dimension (bridge . square_set)
182210 sqr = Vector {eltype(tri)} (undef, dim^ 2 )
183211 k = 0
184212 for j in 1 : dim
0 commit comments