@@ -4,6 +4,9 @@ using MathOptInterface
44const MOI = MathOptInterface
55const MOIU = MOI. Utilities
66
7+ using Compat
8+ using Compat. LinearAlgebra # for diag
9+
710abstract type AbstractSDOptimizer <: MOI.AbstractOptimizer end
811
912include (" interface.jl" )
@@ -36,8 +39,8 @@ mutable struct SOItoMOIBridge{T, SIT <: AbstractSDOptimizer} <: MOI.AbstractOpti
3639 nconstrs:: Int
3740 nblocks:: Int
3841 blockdims:: Vector{Int}
39- free:: IntSet
40- varmap:: Vector{Vector{Tuple{Int, Int, Int, T, T}}} # Variable Index vi -> blk, i, j, coef, shift # x = sum coef * X[ blk] [i, j] + shift
42+ free:: BitSet
43+ varmap:: Vector{Vector{Tuple{Int, Int, Int, T, T}}} # Variable Index vi -> blk, i, j, coef, shift # x = sum coef * block(X, blk) [i, j] + shift
4144 zeroblock:: Dict{CI, Int}
4245 constrmap:: Dict{CI, UnitRange{Int}} # Constraint Index ci -> cs
4346 slackmap:: Vector{Tuple{Int, Int, Int, T}} # c -> blk, i, j, coef
@@ -46,7 +49,7 @@ mutable struct SOItoMOIBridge{T, SIT <: AbstractSDOptimizer} <: MOI.AbstractOpti
4649 new {T, SIT} (sdoptimizer, Dict {Int64, T} (), Dict {Int, T} (),
4750 zero (T), 1 , zero (T), 0 , 0 ,
4851 Int[],
49- IntSet (),
52+ BitSet (),
5053 Vector{Tuple{Int, Int, Int, T}}[],
5154 Dict {CI, Int} (),
5255 Dict {CI, UnitRange{Int}} (),
@@ -95,7 +98,7 @@ function MOI.empty!(optimizer::SOItoMOIBridge{T}) where T
9598 optimizer. nconstrs = 0
9699 optimizer. nblocks = 0
97100 optimizer. blockdims = Int[]
98- optimizer. free = IntSet ()
101+ optimizer. free = BitSet ()
99102 optimizer. varmap = Vector{Tuple{Int, Int, Int, T}}[]
100103 optimizer. zeroblock = Dict {CI, Int} ()
101104 optimizer. constrmap = Dict {CI, UnitRange{Int}} ()
@@ -114,7 +117,7 @@ function addsetconstant(optimizer::SOItoMOIBridge, ci::CI, x)
114117end
115118function addblkconstant (optimizer:: SOItoMOIBridge , ci:: CI{<:Any, <:Union{NS, PS}} , x)
116119 blk = - ci. value
117- x + optimizer. blkconstant[blk]
120+ x . + optimizer. blkconstant[blk]
118121end
119122function addblkconstant (optimizer:: SOItoMOIBridge , ci:: CI , x)
120123 x
@@ -186,18 +189,18 @@ MOI.canget(m::SOItoMOIBridge, ::Union{MOI.VariablePrimal,
186189 MOI. ConstraintDual}, :: Type{<:MOI.Index} ) = true
187190
188191function _getblock (M, blk:: Int , s:: Type{<:Union{NS, ZS}} )
189- diag (M[ blk] )
192+ diag (block (M, blk) )
190193end
191194function _getblock (M, blk:: Int , s:: Type{<:PS} )
192- - diag (M[ blk] )
195+ - diag (block (M, blk) )
193196end
194197# Vectorized length for matrix dimension d
195198sympackedlen (d:: Integer ) = (d* (d+ 1 )) >> 1
196199function _getblock (M:: AbstractMatrix{T} , blk:: Int , s:: Type{<:DS} ) where T
197- B = M[ blk]
198- d = Base . LinAlg . checksquare (B)
200+ B = block (M, blk)
201+ d = Compat . LinearAlgebra . checksquare (B)
199202 n = sympackedlen (d)
200- v = Vector {T} (n)
203+ v = Vector {T} (undef, n)
201204 k = 0
202205 for j in 1 : d
203206 for i in 1 : j
@@ -228,7 +231,7 @@ function MOI.get(m::SOItoMOIBridge{T}, ::MOI.VariablePrimal, vi::VI) where T
228231 for (blk, i, j, coef, shift) in varmap (m, vi)
229232 x += shift
230233 if blk != 0
231- x += X[ blk] [i, j] * sign (coef)
234+ x += block (X, blk) [i, j] * sign (coef)
232235 end
233236 end
234237 x
@@ -253,9 +256,9 @@ function getslack(m::SOItoMOIBridge{T}, c::Int) where T
253256 zero (T)
254257 else
255258 if i != j
256- coef *= 2 # We should take X[ blk] [i, j] + X[ blk] [j, i] but they are equal
259+ coef *= 2 # We should take block(X, blk) [i, j] + block(X, blk) [j, i] but they are equal
257260 end
258- coef * X[ blk] [i, j]
261+ coef * block (X, blk) [i, j]
259262 end
260263end
261264
@@ -274,7 +277,7 @@ function getvardual(m::SOItoMOIBridge{T}, vi::VI) where T
274277 z = zero (T)
275278 for (blk, i, j, coef) in varmap (m, vi)
276279 if blk != 0
277- z += Z[ blk] [i, j] * sign (coef)
280+ z += block (Z, blk) [i, j] * sign (coef)
278281 end
279282 end
280283 z
@@ -319,7 +322,8 @@ function scalevec!(v, c)
319322 end
320323 v
321324end
322- function MOI. get (m:: SOItoMOIBridge{T} , :: MOI.ConstraintDual , ci:: CI{F, DS} ) where {T,F}
325+ function MOI. get (m:: SOItoMOIBridge{T} , :: MOI.ConstraintDual ,
326+ ci:: CI{<:AF{T}, DS} ) where T
323327 scalevec! (_getattribute (m, ci, getdual), one (T)/ 2 )
324328end
325329
0 commit comments