Skip to content

Commit 9ecd36d

Browse files
authored
Merge pull request #22 from JuliaOpt/bl/moi7
Update to MOI v0.7
2 parents 2f28e29 + 79e4f02 commit 9ecd36d

File tree

6 files changed

+71
-21
lines changed

6 files changed

+71
-21
lines changed

REQUIRE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
julia 0.6
2-
MathOptInterface 0.6 0.7
2+
MathOptInterface 0.7 0.8
33
Compat 1.0.1

src/SemidefiniteOptInterface.jl

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

7070
include("load.jl")
7171

72+
function MOI.get(optimizer::SOItoMOIBridge, attr::MOI.SolverName)
73+
return MOI.get(optimizer.sdoptimizer, attr)
74+
end
75+
7276
function MOI.is_empty(optimizer::SOItoMOIBridge)
7377
isempty(optimizer.double) &&
7478
isempty(optimizer.setconstant) &&
@@ -89,6 +93,7 @@ function MOI.empty!(optimizer::SOItoMOIBridge{T}) where T
8993
for s in optimizer.double
9094
MOI.delete(m, s)
9195
end
96+
MOI.empty!(optimizer.sdoptimizer)
9297
optimizer.double = CI[]
9398
optimizer.setconstant = Dict{Int64, T}()
9499
optimizer.blkconstant = Dict{Int, T}()
@@ -136,10 +141,10 @@ function MOI.supports_constraint(::SOItoMOIBridge{T},
136141
return true
137142
end
138143

139-
function MOI.copy_to(dest::SOItoMOIBridge, src::MOI.ModelLike;
140-
copy_names = true)
141-
return MOIU.allocate_load(dest, src, copy_names)
144+
function MOI.copy_to(dest::SOItoMOIBridge, src::MOI.ModelLike; kws...)
145+
return MOIU.automatic_copy_to(dest, src; kws...)
142146
end
147+
MOIU.supports_allocate_load(::SOItoMOIBridge, copy_names::Bool) = !copy_names
143148

144149
MOI.optimize!(m::SOItoMOIBridge) = MOI.optimize!(m.sdoptimizer)
145150

@@ -157,15 +162,15 @@ MOI.get(m::SOItoMOIBridge, s::SolverStatus) = MOI.get(m.sdoptimizer, s)
157162

158163
MOI.get(m::SOItoMOIBridge, ::MOI.ResultCount) = 1
159164

160-
function _getblock(M, blk::Int, s::Type{<:Union{NS, ZS}})
165+
function _getblock(M, blk::Integer, s::Type{<:Union{NS, ZS}})
161166
diag(block(M, blk))
162167
end
163-
function _getblock(M, blk::Int, s::Type{<:PS})
168+
function _getblock(M, blk::Integer, s::Type{<:PS})
164169
-diag(block(M, blk))
165170
end
166171
# Vectorized length for matrix dimension d
167172
sympackedlen(d::Integer) = (d*(d+1)) >> 1
168-
function _getblock(M::AbstractMatrix{T}, blk::Int, s::Type{<:DS}) where T
173+
function _getblock(M::AbstractMatrix{T}, blk::Integer, s::Type{<:DS}) where T
169174
B = block(M, blk)
170175
d = Compat.LinearAlgebra.checksquare(B)
171176
n = sympackedlen(d)
@@ -180,17 +185,17 @@ function _getblock(M::AbstractMatrix{T}, blk::Int, s::Type{<:DS}) where T
180185
@assert k == n
181186
v
182187
end
183-
function getblock(M, blk::Int, s::Type{<:MOI.AbstractScalarSet})
188+
function getblock(M, blk::Integer, s::Type{<:MOI.AbstractScalarSet})
184189
vd = _getblock(M, blk, s)
185190
@assert length(vd) == 1
186191
vd[1]
187192
end
188-
function getblock(M, blk::Int, s::Type{<:MOI.AbstractVectorSet})
193+
function getblock(M, blk::Integer, s::Type{<:MOI.AbstractVectorSet})
189194
_getblock(M, blk, s)
190195
end
191196

192-
getvarprimal(m::SOItoMOIBridge, blk::Int, S) = getblock(getX(m.sdoptimizer), blk, S)
193-
function getvardual(m::SOItoMOIBridge, blk::Int, S)
197+
getvarprimal(m::SOItoMOIBridge, blk::Integer, S) = getblock(getX(m.sdoptimizer), blk, S)
198+
function getvardual(m::SOItoMOIBridge, blk::Integer, S)
194199
getblock(getZ(m.sdoptimizer), blk, S)
195200
end
196201

@@ -218,7 +223,7 @@ function _getattribute(m::SOItoMOIBridge, ci::CI{<:AVF}, f)
218223
f.(m, m.constrmap[ci])
219224
end
220225

221-
function getslack(m::SOItoMOIBridge{T}, c::Int) where T
226+
function getslack(m::SOItoMOIBridge{T}, c::Integer) where T
222227
X = getX(m.sdoptimizer)
223228
blk, i, j, coef = m.slackmap[c]
224229
if iszero(blk)
@@ -269,7 +274,7 @@ function MOI.get(m::SOItoMOIBridge, ::MOI.ConstraintDual, ci::CI{<:VF, S}) where
269274
end
270275
end
271276

272-
function getdual(m::SOItoMOIBridge{T}, c::Int) where T
277+
function getdual(m::SOItoMOIBridge{T}, c::Integer) where T
273278
if c == 0
274279
zero(T)
275280
else

src/mock.jl

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,19 +53,38 @@ MockSDOptimizer{T}() where T = MockSDOptimizer{T}(0,
5353
(::MockSDOptimizer) -> begin end,
5454
false,
5555
false,
56-
MOI.Success,
57-
MOI.UnknownResultStatus,
58-
MOI.UnknownResultStatus,
56+
MOI.OptimizeNotCalled,
57+
MOI.NoSolution,
58+
MOI.NoSolution,
5959
BlockMatrix{T}(Matrix{T}[]),
6060
BlockMatrix{T}(Matrix{T}[]),
6161
T[])
6262
mockSDoptimizer(T::Type) = SDOIOptimizer(MockSDOptimizer{T}(), T)
63+
64+
MOI.get(::MockSDOptimizer, ::MOI.SolverName) = "MockSD"
65+
66+
function MOI.empty!(mock::MockSDOptimizer{T}) where T
67+
mock.nconstrs = 0
68+
mock.blkdims = Int[]
69+
mock.constraint_constants = T[]
70+
mock.objective_coefficients = Tuple{T, Int, Int, Int}[]
71+
mock.constraint_coefficients = Vector{Tuple{T, Int, Int, Int}}[]
72+
mock.hasprimal = false
73+
mock.hasdual = false
74+
mock.terminationstatus = MOI.OptimizeNotCalled
75+
mock.primalstatus = MOI.NoSolution
76+
mock.dualstatus = MOI.NoSolution
77+
mock.X = BlockMatrix{T}(Matrix{T}[])
78+
mock.Z = BlockMatrix{T}(Matrix{T}[])
79+
mock.y = T[]
80+
end
6381
coefficienttype(::MockSDOptimizer{T}) where T = T
6482

6583
getnumberofconstraints(optimizer::MockSDOptimizer) = optimizer.nconstrs
6684
getnumberofblocks(optimizer::MockSDOptimizer) = length(optimizer.blkdims)
6785
getblockdimension(optimizer::MockSDOptimizer, blk) = optimizer.blkdims[blk]
68-
function init!(optimizer::MockSDOptimizer{T}, blkdims::Vector{Int}, nconstrs::Integer) where T
86+
function init!(optimizer::MockSDOptimizer{T}, blkdims::Vector{Int},
87+
nconstrs::Integer) where T
6988
optimizer.nconstrs = nconstrs
7089
optimizer.blkdims = blkdims
7190
optimizer.constraint_constants = zeros(T, nconstrs)
@@ -84,12 +103,16 @@ function setobjectivecoefficient!(optimizer::MockSDOptimizer, val, blk::Integer,
84103
end
85104

86105
getconstraintcoefficients(optimizer::MockSDOptimizer, c) = optimizer.constraint_coefficients[c]
87-
function setconstraintcoefficient!(optimizer::MockSDOptimizer, val, c::Integer, blk::Integer, i::Integer, j::Integer)
106+
function setconstraintcoefficient!(optimizer::MockSDOptimizer, val, c::Integer,
107+
blk::Integer, i::Integer, j::Integer)
88108
push!(optimizer.constraint_coefficients[c], (val, blk, i, j))
89109
end
90110

91111
MOI.get(mock::MockSDOptimizer, ::MOI.TerminationStatus) = mock.terminationstatus
92-
MOI.set(mock::MockSDOptimizer, ::MOI.TerminationStatus, value::MOI.TerminationStatusCode) = (mock.terminationstatus = value)
112+
function MOI.set(mock::MockSDOptimizer, ::MOI.TerminationStatus,
113+
value::MOI.TerminationStatusCode)
114+
mock.terminationstatus = value
115+
end
93116
MOI.get(mock::MockSDOptimizer, ::MOI.PrimalStatus) = mock.primalstatus
94117
MOI.set(mock::MockSDOptimizer, ::MOI.PrimalStatus, value::MOI.ResultStatusCode) = (mock.primalstatus = value)
95118
MOI.get(mock::MockSDOptimizer, ::MOI.DualStatus) = mock.dualstatus
@@ -129,7 +152,10 @@ end
129152
function MOIU.rec_mock_optimize(mock::MockSDOptimizer, opt::Function, opts::Function...)
130153
# TODO replace mock.optimize! = ... by MOI.set(..., MOIU.MockOptimizeFunction, ...)
131154
# where MOIU.MockOptimizeFunction is a MockModelAttribute
132-
(mock::MockSDOptimizer) -> (opt(mock); mock.optimize! = MOIU.rec_mock_optimize(mock, opts...))
155+
(mock::MockSDOptimizer) -> begin
156+
opt(mock)
157+
mock.optimize! = MOIU.rec_mock_optimize(mock, opts...)
158+
end
133159
end
134160
MOIU.rec_mock_optimize(mock::MockSDOptimizer, opt::Function) = opt
135161

@@ -140,7 +166,9 @@ function MOIU.mock_optimize!(mock::MockSDOptimizer, termstatus::MOI.TerminationS
140166
MOIU.mock_dual!(mock, dual...)
141167
end
142168
# Default termination status
143-
MOIU.mock_optimize!(mock::MockSDOptimizer, primdual...) = MOIU.mock_optimize!(mock, MOI.Success, primdual...)
169+
function MOIU.mock_optimize!(mock::MockSDOptimizer, primdual...)
170+
MOIU.mock_optimize!(mock, MOI.Optimal, primdual...)
171+
end
144172
function MOIU.mock_optimize!(mock::MockSDOptimizer, termstatus::MOI.TerminationStatusCode)
145173
MOI.set(mock, MOI.TerminationStatus(), termstatus)
146174
end

test/contconic.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
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+
MOI.Infeasible,
2021
MOI.InfeasiblePoint,
2122
[-0.5, 0.5]))
2223
MOIT.lin3test(cached_mock_optimizer, config)
2324
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
25+
MOI.Infeasible,
2426
MOI.InfeasiblePoint,
2527
[-1.0]))
2628
MOIT.lin4test(cached_mock_optimizer, config)
@@ -43,6 +45,7 @@
4345
[-1.4142, 1.0, -0.7071, -1.0, -0.3536, 1.0, 0.7071, -0.3536]))
4446
MOIT.soc2ptest(MOIB.SOCtoPSD{Float64}(cached_mock_optimizer), config)
4547
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
48+
MOI.Infeasible,
4649
MOI.InfeasiblePoint,
4750
[-1.0, 1.0, -0.5, 1.0, -0.5]))
4851
MOIT.soc3test(MOIB.SOCtoPSD{Float64}(cached_mock_optimizer), config)
@@ -61,6 +64,7 @@
6164
[5183.15, 5182.44, -1.4142, 1.0, -0.1768, 1.0, -0.3536, -0.1768]))
6265
MOIT.rotatedsoc1vtest(MOIB.RSOCtoPSD{Float64}(cached_mock_optimizer), config)
6366
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
67+
MOI.Infeasible,
6468
tuple(),
6569
[141.088, -47.8864, 47.5533, -46.2201]))
6670
MOIT.rotatedsoc2test(MOIB.RSOCtoPSD{Float64}(cached_mock_optimizer), config)

test/contlinear.jl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,16 @@
8080
MOIT.linear7test(cached_mock_optimizer, config)
8181

8282
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
83+
MOI.Infeasible,
8384
tuple(),
8485
[1.0]))
8586
MOIT.linear8atest(cached_mock_optimizer, config)
8687
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
88+
MOI.DualInfeasible,
8789
(MOI.InfeasibilityCertificate, [[0.7709], [0.2291], [0.3126]])))
8890
MOIT.linear8btest(cached_mock_optimizer, config)
8991
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
92+
MOI.DualInfeasible,
9093
(MOI.InfeasibilityCertificate, [[0.5], [0.5]])))
9194
MOIT.linear8ctest(cached_mock_optimizer, config)
9295
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
@@ -114,6 +117,7 @@
114117
[-1.0, 0.0]))
115118
MOIT.linear11test(cached_mock_optimizer, config)
116119
MOIU.set_mock_optimize!(mock, (mock) -> MOIU.mock_optimize!(mock,
120+
MOI.Infeasible,
117121
tuple(),
118122
[1.0, 3.0]))
119123
MOIT.linear12test(cached_mock_optimizer, config)

test/runtests.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,17 @@ MOIU.@model(SDModelData,
2525

2626
mock = SDOI.MockSDOptimizer{Float64}()
2727
mock_optimizer = SDOI.SDOIOptimizer(mock, Float64)
28+
@testset "supports_allocate_load" begin
29+
@test MOIU.supports_allocate_load(mock_optimizer, false)
30+
@test !MOIU.supports_allocate_load(mock_optimizer, true)
31+
end
2832
cached_mock_optimizer = MOIU.CachingOptimizer(SDModelData{Float64}(),
2933
mock_optimizer)
34+
@testset "SolverName" begin
35+
@test MOI.get( mock, MOI.SolverName()) == "MockSD"
36+
@test MOI.get( mock_optimizer, MOI.SolverName()) == "MockSD"
37+
@test MOI.get(cached_mock_optimizer, MOI.SolverName()) == "MockSD"
38+
end
3039
config = MOIT.TestConfig(atol=1e-4, rtol=1e-4)
3140

3241
include("unit.jl")

0 commit comments

Comments
 (0)