Skip to content

Commit 8f868ef

Browse files
committed
Updates to MOI v0.6
1 parent 5af11e3 commit 8f868ef

File tree

7 files changed

+50
-73
lines changed

7 files changed

+50
-73
lines changed

src/SemidefiniteOptInterface.jl

Lines changed: 9 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ SDOIOptimizer(sdoptimizer::AbstractSDOptimizer, T=Float64) = SOItoMOIBridge{T}(s
6969

7070
include("load.jl")
7171

72-
function MOI.isempty(optimizer::SOItoMOIBridge)
72+
function MOI.is_empty(optimizer::SOItoMOIBridge)
7373
isempty(optimizer.double) &&
7474
isempty(optimizer.setconstant) &&
7575
isempty(optimizer.blkconstant) &&
@@ -87,7 +87,7 @@ function MOI.isempty(optimizer::SOItoMOIBridge)
8787
end
8888
function MOI.empty!(optimizer::SOItoMOIBridge{T}) where T
8989
for s in optimizer.double
90-
MOI.delete!(m, s)
90+
MOI.delete(m, s)
9191
end
9292
optimizer.double = CI[]
9393
optimizer.setconstant = Dict{Int64, T}()
@@ -123,71 +123,40 @@ function addblkconstant(optimizer::SOItoMOIBridge, ci::CI, x)
123123
x
124124
end
125125

126-
function MOI.supports(optimizer::SOItoMOIBridge,
127-
::Union{MOI.ConstraintFunction,
128-
MOI.ConstraintSet},
129-
::Type{<:CI})
130-
return true
131-
end
132-
function MOI.set!(optimizer::SOItoMOIBridge,
133-
attr::Union{MOI.ConstraintFunction,
134-
MOI.ConstraintSet},
135-
::CI,
136-
value)
137-
throw(MOI.CannotSetAttribute(attr, "Copy-only solver"))
138-
end
139-
140126
function MOI.supports(optimizer::SOItoMOIBridge{T},
141127
::Union{MOI.ObjectiveSense,
142128
MOI.ObjectiveFunction{<:Union{MOI.SingleVariable,
143129
MOI.ScalarAffineFunction{T}}}}) where T
144130
return true
145131
end
146-
function MOI.set!(optimizer::SOItoMOIBridge{T},
147-
attr::Union{MOI.ObjectiveSense,
148-
MOI.ObjectiveFunction{<:Union{MOI.SingleVariable,
149-
MOI.ScalarAffineFunction{T}}}},
150-
value) where T
151-
throw(MOI.CannotSetAttribute(attr, "Copy-only solver"))
152-
end
153132

154-
function MOI.supportsconstraint(::SOItoMOIBridge{T},
155-
::Type{<:Union{VF, AF{T}}},
156-
::Type{<:SupportedSets}) where T
133+
function MOI.supports_constraint(::SOItoMOIBridge{T},
134+
::Type{<:Union{VF, AF{T}}},
135+
::Type{<:SupportedSets}) where T
157136
return true
158137
end
159-
function MOI.addconstraint!(::SOItoMOIBridge{T},
160-
func::Union{VF, AF{T}},
161-
set::SupportedSets) where T
162-
throw(MOI.CannotAddConstraint{typeof(func), typeof(set)}("Copy-only solver"))
163-
end
164138

165-
MOI.copy!(dest::SOItoMOIBridge, src::MOI.ModelLike; copynames=true) = MOIU.allocateload!(dest, src, copynames)
139+
function MOI.copy_to(dest::SOItoMOIBridge, src::MOI.ModelLike;
140+
copy_names = true)
141+
return MOIU.allocate_load(dest, src, copy_names)
142+
end
166143

167144
MOI.optimize!(m::SOItoMOIBridge) = MOI.optimize!(m.sdoptimizer)
168145

169146
# Objective
170147

171-
MOI.canget(m::SOItoMOIBridge, ::MOI.ObjectiveValue) = true
172148
function MOI.get(m::SOItoMOIBridge, ::MOI.ObjectiveValue)
173149
m.objshift + m.objsign * getprimalobjectivevalue(m.sdoptimizer) + m.objconstant
174150
end
175151

176152
# Attributes
177153

178-
MOI.canget(m::AbstractSDOptimizer, ::MOI.TerminationStatus) = true
179154
const SolverStatus = Union{MOI.TerminationStatus, MOI.PrimalStatus, MOI.DualStatus}
180-
MOI.canget(m::SOItoMOIBridge, s::SolverStatus) = MOI.canget(m.sdoptimizer, s)
181155
MOI.get(m::SOItoMOIBridge, s::SolverStatus) = MOI.get(m.sdoptimizer, s)
182156

183157

184-
MOI.canget(m::SOItoMOIBridge, ::MOI.ResultCount) = true
185158
MOI.get(m::SOItoMOIBridge, ::MOI.ResultCount) = 1
186159

187-
MOI.canget(m::SOItoMOIBridge, ::Union{MOI.VariablePrimal,
188-
MOI.ConstraintPrimal,
189-
MOI.ConstraintDual}, ::Type{<:MOI.Index}) = true
190-
191160
function _getblock(M, blk::Int, s::Type{<:Union{NS, ZS}})
192161
diag(block(M, blk))
193162
end

src/constraint.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ nconstraints(f::Union{SVF, SAF}, s) = 1
2828
nconstraints(f::VVF, s) = length(f.variables)
2929
nconstraints(f::VAF, s) = MOI.output_dimension(f)
3030

31-
function _allocateconstraint!(m::SOItoMOIBridge, f, s)
31+
function _allocate_constraint(m::SOItoMOIBridge, f, s)
3232
ci = CI{typeof(f), typeof(s)}(m.nconstrs)
3333
n = nconstraints(f, s)
3434
# Fails on Julia v0.6
@@ -39,8 +39,8 @@ function _allocateconstraint!(m::SOItoMOIBridge, f, s)
3939
createslack!(m, ci, f, s)
4040
ci
4141
end
42-
function MOIU.allocateconstraint!(m::SOItoMOIBridge, f::AF, s::SupportedSets)
43-
_allocateconstraint!(m::SOItoMOIBridge, f, s)
42+
function MOIU.allocate_constraint(m::SOItoMOIBridge, f::AF, s::SupportedSets)
43+
_allocate_constraint(m::SOItoMOIBridge, f, s)
4444
end
4545

4646
function loadslack!(m::SOItoMOIBridge, c::Integer)
@@ -67,7 +67,7 @@ _getconstant(m::SOItoMOIBridge{T}, s::MOI.AbstractSet) where T = zero(T)
6767
function loadcoefficients!(m::SOItoMOIBridge, cs::UnitRange, f::AF, s)
6868
f = MOIU.canonical(f) # sum terms with same variables and same outputindex
6969
if !isempty(cs)
70-
rhs = _getconstant(m, s) .- MOIU._constant(f)
70+
rhs = _getconstant(m, s) .- MOI._constant(f)
7171
for t in f.terms
7272
st = scalar_term(t)
7373
if !iszero(st.coefficient)
@@ -92,7 +92,7 @@ function loadcoefficients!(m::SOItoMOIBridge, cs::UnitRange, f::AF, s)
9292
end
9393
end
9494

95-
function MOIU.loadconstraint!(m::SOItoMOIBridge, ci::CI, f::AF, s::SupportedSets)
95+
function MOIU.load_constraint(m::SOItoMOIBridge, ci::CI, f::AF, s::SupportedSets)
9696
setconstant!(m, ci, s)
9797
cs = m.constrmap[ci]
9898
@assert !isempty(cs)

src/load.jl

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
include("variable.jl")
22
include("constraint.jl")
33

4-
function MOIU.allocate!(optimizer::SOItoMOIBridge, ::MOI.ObjectiveSense, sense::MOI.OptimizationSense)
5-
# To be sure that it is done before load!(optimizer, ::ObjectiveFunction, ...), we do it in allocate!
4+
function MOIU.allocate(optimizer::SOItoMOIBridge, ::MOI.ObjectiveSense, sense::MOI.OptimizationSense)
5+
# To be sure that it is done before load(optimizer, ::ObjectiveFunction, ...), we do it in allocate
66
optimizer.objsign = sense == MOI.MinSense ? -1 : 1
77
end
8-
function MOIU.allocate!(::SOItoMOIBridge, ::MOI.ObjectiveFunction, ::Union{MOI.SingleVariable, MOI.ScalarAffineFunction}) end
8+
function MOIU.allocate(::SOItoMOIBridge, ::MOI.ObjectiveFunction, ::Union{MOI.SingleVariable, MOI.ScalarAffineFunction}) end
99

10-
function MOIU.load!(::SOItoMOIBridge, ::MOI.ObjectiveSense, ::MOI.OptimizationSense) end
10+
function MOIU.load(::SOItoMOIBridge, ::MOI.ObjectiveSense, ::MOI.OptimizationSense) end
1111
# Loads objective coefficient α * vi
1212
function load_objective_term!(optimizer::SOItoMOIBridge, α, vi::MOI.VariableIndex)
1313
for (blk, i, j, coef, shift) in varmap(optimizer, vi)
@@ -18,7 +18,7 @@ function load_objective_term!(optimizer::SOItoMOIBridge, α, vi::MOI.VariableInd
1818
optimizer.objshift += α * shift
1919
end
2020
end
21-
function MOIU.load!(optimizer::SOItoMOIBridge, ::MOI.ObjectiveFunction, f::MOI.ScalarAffineFunction)
21+
function MOIU.load(optimizer::SOItoMOIBridge, ::MOI.ObjectiveFunction, f::MOI.ScalarAffineFunction)
2222
obj = MOIU.canonical(f)
2323
optimizer.objconstant = f.constant
2424
for t in obj.terms
@@ -27,17 +27,17 @@ function MOIU.load!(optimizer::SOItoMOIBridge, ::MOI.ObjectiveFunction, f::MOI.S
2727
end
2828
end
2929
end
30-
function MOIU.load!(optimizer::SOItoMOIBridge{T}, ::MOI.ObjectiveFunction, f::MOI.SingleVariable) where T
30+
function MOIU.load(optimizer::SOItoMOIBridge{T}, ::MOI.ObjectiveFunction, f::MOI.SingleVariable) where T
3131
load_objective_term!(optimizer, one(T), f.variable)
3232
end
3333

34-
function MOIU.allocatevariables!(optimizer::SOItoMOIBridge{T}, nvars) where T
34+
function MOIU.allocate_variables(optimizer::SOItoMOIBridge{T}, nvars) where T
3535
optimizer.free = BitSet(1:nvars)
3636
optimizer.varmap = Vector{Vector{Tuple{Int, Int, Int, T, T}}}(undef, nvars)
3737
VI.(1:nvars)
3838
end
3939

40-
function MOIU.loadvariables!(optimizer::SOItoMOIBridge, nvars)
40+
function MOIU.load_variables(optimizer::SOItoMOIBridge, nvars)
4141
@assert nvars == length(optimizer.varmap)
4242
loadfreevariables!(optimizer)
4343
init!(optimizer.sdoptimizer, optimizer.blockdims, optimizer.nconstrs)

src/mock.jl

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -88,14 +88,12 @@ function setconstraintcoefficient!(optimizer::MockSDOptimizer, val, c::Integer,
8888
push!(optimizer.constraint_coefficients[c], (val, blk, i, j))
8989
end
9090

91-
MOI.canget(mock::MockSDOptimizer, ::MOI.PrimalStatus) = mock.hasprimal
92-
MOI.canget(mock::MockSDOptimizer, ::MOI.DualStatus) = mock.hasdual
9391
MOI.get(mock::MockSDOptimizer, ::MOI.TerminationStatus) = mock.terminationstatus
94-
MOI.set!(mock::MockSDOptimizer, ::MOI.TerminationStatus, value::MOI.TerminationStatusCode) = (mock.terminationstatus = value)
92+
MOI.set(mock::MockSDOptimizer, ::MOI.TerminationStatus, value::MOI.TerminationStatusCode) = (mock.terminationstatus = value)
9593
MOI.get(mock::MockSDOptimizer, ::MOI.PrimalStatus) = mock.primalstatus
96-
MOI.set!(mock::MockSDOptimizer, ::MOI.PrimalStatus, value::MOI.ResultStatusCode) = (mock.primalstatus = value)
94+
MOI.set(mock::MockSDOptimizer, ::MOI.PrimalStatus, value::MOI.ResultStatusCode) = (mock.primalstatus = value)
9795
MOI.get(mock::MockSDOptimizer, ::MOI.DualStatus) = mock.dualstatus
98-
MOI.set!(mock::MockSDOptimizer, ::MOI.DualStatus, value::MOI.ResultStatusCode) = (mock.dualstatus = value)
96+
MOI.set(mock::MockSDOptimizer, ::MOI.DualStatus, value::MOI.ResultStatusCode) = (mock.dualstatus = value)
9997

10098
getX(mock::MockSDOptimizer) = mock.X
10199
getZ(mock::MockSDOptimizer) = mock.Z
@@ -129,27 +127,27 @@ function MOIU.set_mock_optimize!(mock::MockSDOptimizer, opts::Function...)
129127
end
130128
# TODO remove the following methods once it is defined for AbstractMockOptimizer in MOIU
131129
function MOIU.rec_mock_optimize(mock::MockSDOptimizer, opt::Function, opts::Function...)
132-
# TODO replace mock.optimize! = ... by MOI.set!(..., MOIU.MockOptimizeFunction, ...)
130+
# TODO replace mock.optimize! = ... by MOI.set(..., MOIU.MockOptimizeFunction, ...)
133131
# where MOIU.MockOptimizeFunction is a MockModelAttribute
134132
(mock::MockSDOptimizer) -> (opt(mock); mock.optimize! = MOIU.rec_mock_optimize(mock, opts...))
135133
end
136134
MOIU.rec_mock_optimize(mock::MockSDOptimizer, opt::Function) = opt
137135

138136
# TOD remove the following methods once it is defined for AbstractMockSDOptimizer in MOIU
139137
function MOIU.mock_optimize!(mock::MockSDOptimizer, termstatus::MOI.TerminationStatusCode, primal, dual...)
140-
MOI.set!(mock, MOI.TerminationStatus(), termstatus)
138+
MOI.set(mock, MOI.TerminationStatus(), termstatus)
141139
MOIU.mock_primal!(mock, primal)
142140
MOIU.mock_dual!(mock, dual...)
143141
end
144142
# Default termination status
145143
MOIU.mock_optimize!(mock::MockSDOptimizer, primdual...) = MOIU.mock_optimize!(mock, MOI.Success, primdual...)
146144
function MOIU.mock_optimize!(mock::MockSDOptimizer, termstatus::MOI.TerminationStatusCode)
147-
MOI.set!(mock, MOI.TerminationStatus(), termstatus)
145+
MOI.set(mock, MOI.TerminationStatus(), termstatus)
148146
end
149147

150148
# Primal
151149
function MOIU.mock_primal!(mock::MockSDOptimizer, primstatus::MOI.ResultStatusCode, varprim...)
152-
MOI.set!(mock, MOI.PrimalStatus(), primstatus)
150+
MOI.set(mock, MOI.PrimalStatus(), primstatus)
153151
MOIU.mock_varprimal!(mock, varprim...)
154152
end
155153
# Default primal status
@@ -175,7 +173,7 @@ end
175173

176174
# Dual
177175
function MOIU.mock_dual!(mock::MockSDOptimizer, dualstatus::MOI.ResultStatusCode, conduals...)
178-
MOI.set!(mock, MOI.DualStatus(), dualstatus)
176+
MOI.set(mock, MOI.DualStatus(), dualstatus)
179177
MOIU.mock_condual!(mock, conduals...)
180178
end
181179
# Default dual status

src/variable.jl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,27 +61,27 @@ function _constraintvariable!(m::SOItoMOIBridge{T}, vs::VIS, ::DS) where T
6161
end
6262
_var(f::SVF) = f.variable
6363
_var(f::VVF) = f.variables
64-
function MOIU.allocateconstraint!(m::SOItoMOIBridge{T}, f::VF, s::SupportedSets) where T
64+
function MOIU.allocate_constraint(m::SOItoMOIBridge{T}, f::VF, s::SupportedSets) where T
6565
vis = _var(f)
6666
fr = isfree(m, vis)
6767
if fr
6868
blk = _constraintvariable!(m, vis, s)
6969
if isa(s, ZS)
70-
ci = _allocateconstraint!(m, f, s)
70+
ci = _allocate_constraint(m, f, s)
7171
m.zeroblock[ci] = blk
7272
ci
7373
else
7474
CI{typeof(f), typeof(s)}(-blk)
7575
end
7676
else
77-
_allocateconstraint!(m, f, s)
77+
_allocate_constraint(m, f, s)
7878
end
7979
end
8080

8181
_var(f::SVF, j) = f.variable
8282
_var(f::VVF, j) = f.variables[j]
83-
function MOIU.loadconstraint!(m::SOItoMOIBridge, ci::CI, f::VF, s::SupportedSets)
84-
if ci.value >= 0 # i.e. s is ZS or _var(f) wasn't free at allocateconstraint!
83+
function MOIU.load_constraint(m::SOItoMOIBridge, ci::CI, f::VF, s::SupportedSets)
84+
if ci.value >= 0 # i.e. s is ZS or _var(f) wasn't free at allocate_constraint
8585
setconstant!(m, ci, s)
8686
cs = m.constrmap[ci]
8787
@assert !isempty(cs)

test/contconic.jl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
[70.2006, -7.0, -2.0, 4.0]))
1818
MOIT.lin2vtest(cached_mock_optimizer, config)
1919
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
20-
tuple(),
20+
MOI.InfeasiblePoint,
2121
[-0.5, 0.5]))
2222
MOIT.lin3test(cached_mock_optimizer, config)
2323
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
24-
tuple(),
24+
MOI.InfeasiblePoint,
2525
[-1.0]))
2626
MOIT.lin4test(cached_mock_optimizer, config)
2727
end
@@ -43,7 +43,7 @@
4343
[-1.4142, 1.0, -0.7071, -1.0, -0.3536, 1.0, 0.7071, -0.3536]))
4444
MOIT.soc2ptest(MOIB.SOCtoPSD{Float64}(cached_mock_optimizer), config)
4545
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
46-
tuple(),
46+
MOI.InfeasiblePoint,
4747
[-1.0, 1.0, -0.5, 1.0, -0.5]))
4848
MOIT.soc3test(MOIB.SOCtoPSD{Float64}(cached_mock_optimizer), config)
4949
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,

test/runtests.jl

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,21 @@ const MOIB = MOI.Bridges
1212
include("sdpa.jl")
1313

1414
const MOIU = MOI.Utilities
15-
MOIU.@model SDModelData () (EqualTo, GreaterThan, LessThan) (Zeros, Nonnegatives, Nonpositives, PositiveSemidefiniteConeTriangle) () (SingleVariable,) (ScalarAffineFunction,) (VectorOfVariables,) (VectorAffineFunction,)
15+
MOIU.@model(SDModelData,
16+
(),
17+
(MOI.EqualTo, MOI.GreaterThan, MOI.LessThan),
18+
(MOI.Zeros, MOI.Nonnegatives, MOI.Nonpositives,
19+
MOI.PositiveSemidefiniteConeTriangle),
20+
(),
21+
(MOI.SingleVariable,),
22+
(MOI.ScalarAffineFunction,),
23+
(MOI.VectorOfVariables,),
24+
(MOI.VectorAffineFunction,))
1625

1726
mock = SDOI.MockSDOptimizer{Float64}()
1827
mock_optimizer = SDOI.SDOIOptimizer(mock, Float64)
19-
cached_mock_optimizer = MOIU.CachingOptimizer(SDModelData{Float64}(), mock_optimizer)
28+
cached_mock_optimizer = MOIU.CachingOptimizer(SDModelData{Float64}(),
29+
mock_optimizer)
2030
config = MOIT.TestConfig(atol=1e-4, rtol=1e-4)
2131

2232
include("unit.jl")

0 commit comments

Comments
 (0)