Skip to content

Commit a5df368

Browse files
authored
update for MOI 0.7 (#82)
* update for MOI 0.7 * implement supports_allocate_load * switch to automatic_copy_to * implement SolverName
1 parent 032ad78 commit a5df368

File tree

8 files changed

+60
-32
lines changed

8 files changed

+60
-32
lines changed

REQUIRE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
julia 0.6
22
MathProgBase 0.5 0.8
3-
MathOptInterface 0.6.2 0.7
3+
MathOptInterface 0.7 0.8
44
Compat 0.68
55
BinaryProvider 0.3

src/ECOS.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ function cleanup(problem::Ptr{Cpwork}, keepvars::Int = 0)
152152
ccall((:ECOS_cleanup, ECOS.ecos), Cvoid, (Ptr{Cpwork}, Clong), problem, keepvars)
153153
end
154154

155-
include("MPBWrapper.jl")
156-
include("MOIWrapper.jl")
155+
include("MPB_wrapper.jl")
156+
include("MOI_wrapper.jl")
157157

158158
end # module

src/MOIWrapper.jl renamed to src/MOI_wrapper.jl

Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@ struct Solution
1717
objval::Float64
1818
objbnd::Float64
1919
end
20-
Solution() = Solution(0, Float64[], Float64[], Float64[], Float64[], NaN, NaN)
20+
const OPTIMIZE_NOT_CALLED = -1
21+
Solution() = Solution(OPTIMIZE_NOT_CALLED, Float64[], Float64[], Float64[],
22+
Float64[], NaN, NaN)
2123

2224
# Used to build the data with allocate-load during `copy_to`.
2325
# When `optimize!` is called, a the data is used to build `ECOSMatrix`
@@ -69,16 +71,19 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
6971
end
7072
end
7173

74+
MOI.get(::Optimizer, ::MOI.SolverName) = "ECOS"
75+
7276
function MOI.is_empty(instance::Optimizer)
7377
!instance.maxsense && instance.data === nothing
7478
end
7579

7680
function MOI.empty!(instance::Optimizer)
7781
instance.maxsense = false
7882
instance.data = nothing # It should already be nothing except if an error is thrown inside copy_to
83+
instance.sol = Solution()
7984
end
8085

81-
MOIU.needs_allocate_load(instance::Optimizer) = true
86+
MOIU.supports_allocate_load(::Optimizer, copy_names::Bool) = !copy_names
8287

8388
function MOI.supports(::Optimizer,
8489
::Union{MOI.ObjectiveSense,
@@ -89,8 +94,8 @@ end
8994

9095
MOI.supports_constraint(::Optimizer, ::Type{<:SF}, ::Type{<:SS}) = true
9196

92-
function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike; copy_names = true)
93-
return MOIU.allocate_load(dest, src, copy_names)
97+
function MOI.copy_to(dest::Optimizer, src::MOI.ModelLike; kws...)
98+
return MOIU.automatic_copy_to(dest, src; kws...)
9499
end
95100

96101
using Compat.SparseArrays
@@ -285,19 +290,25 @@ end
285290
# Implements getter for result value and statuses
286291
function MOI.get(instance::Optimizer, ::MOI.TerminationStatus)
287292
flag = instance.sol.ret_val
288-
if flag == ECOS.ECOS_OPTIMAL
289-
MOI.Success
293+
if flag == OPTIMIZE_NOT_CALLED
294+
return MOI.OptimizeNotCalled
295+
elseif flag == ECOS.ECOS_OPTIMAL
296+
return MOI.Optimal
290297
elseif flag == ECOS.ECOS_PINF
291-
MOI.Success
292-
elseif flag == ECOS.ECOS_DINF # Dual infeasible = primal unbounded, probably
293-
MOI.Success
298+
return MOI.Infeasible
299+
elseif flag == ECOS.ECOS_DINF
300+
return MOI.DualInfeasible
294301
elseif flag == ECOS.ECOS_MAXIT
295-
MOI.IterationLimit
302+
return MOI.IterationLimit
296303
elseif flag == ECOS.ECOS_OPTIMAL + ECOS.ECOS_INACC_OFFSET
297-
m.solve_stat = MOI.AlmostSuccess
304+
return MOI.AlmostOptimal
305+
elseif flag == ECOS.ECOS_PINF + ECOS.ECOS_INACC_OFFSET
306+
return MOI.AlmostInfeasible
298307
else
299-
m.solve_stat = MOI.OtherError
308+
return MOI.OtherError
300309
end
310+
# TODO: AlmostDualInfeasible for ECOS.ECOS_DINF + ECOS.ECOS_INACC_OFFSET
311+
# https://github.com/JuliaOpt/MathOptInterface.jl/issues/601
301312
end
302313

303314
MOI.get(instance::Optimizer, ::MOI.ObjectiveValue) = instance.sol.objval
@@ -306,17 +317,21 @@ MOI.get(instance::Optimizer, ::MOI.ObjectiveBound) = instance.sol.objbnd
306317
function MOI.get(instance::Optimizer, ::MOI.PrimalStatus)
307318
flag = instance.sol.ret_val
308319
if flag == ECOS.ECOS_OPTIMAL
309-
MOI.FeasiblePoint
320+
return MOI.FeasiblePoint
310321
elseif flag == ECOS.ECOS_PINF
311-
MOI.InfeasiblePoint
312-
elseif flag == ECOS.ECOS_DINF # Dual infeasible = primal unbounded, probably
313-
MOI.InfeasibilityCertificate
322+
return MOI.InfeasiblePoint
323+
elseif flag == ECOS.ECOS_DINF
324+
return MOI.InfeasibilityCertificate
314325
elseif flag == ECOS.ECOS_MAXIT
315-
MOI.UnknownResultStatus
326+
return MOI.UnknownResultStatus
316327
elseif flag == ECOS.ECOS_OPTIMAL + ECOS.ECOS_INACC_OFFSET
317-
m.solve_stat = MOI.NearlyFeasiblePoint
328+
return MOI.NearlyFeasiblePoint
329+
elseif flag == ECOS.ECOS_PINF + ECOS.ECOS_INACC_OFFSET
330+
return MOI.InfeasiblePoint
331+
elseif flag == ECOS.ECOS_DINF + ECOS.ECOS_INACC_OFFSET
332+
return MOI.NearlyInfeasibilityCertificate
318333
else
319-
m.solve_stat = MOI.OtherResultStatus
334+
return MOI.OtherResultStatus
320335
end
321336
end
322337
# Swapping indices 2 <-> 3 is an involution (it is its own inverse)
@@ -347,15 +362,19 @@ end
347362
function MOI.get(instance::Optimizer, ::MOI.DualStatus)
348363
flag = instance.sol.ret_val
349364
if flag == ECOS.ECOS_OPTIMAL
350-
MOI.FeasiblePoint
365+
return MOI.FeasiblePoint
351366
elseif flag == ECOS.ECOS_PINF
352-
MOI.InfeasibilityCertificate
353-
elseif flag == ECOS.ECOS_DINF # Dual infeasible = primal unbounded, probably
354-
MOI.InfeasiblePoint
367+
return MOI.InfeasibilityCertificate
368+
elseif flag == ECOS.ECOS_DINF
369+
return MOI.InfeasiblePoint
355370
elseif flag == ECOS.ECOS_MAXIT
356-
MOI.UnknownResultStatus
371+
return MOI.UnknownResultStatus
357372
elseif flag == ECOS.ECOS_OPTIMAL + ECOS.ECOS_INACC_OFFSET
358-
m.solve_stat = MOI.NearlyFeasiblePoint
373+
return MOI.NearlyFeasiblePoint
374+
elseif flag == ECOS.ECOS_PINF + ECOS.ECOS_INACC_OFFSET
375+
return MOI.NearlyInfeasibilityCertificate
376+
elseif flag == ECOS.ECOS_DINF + ECOS.ECOS_INACC_OFFSET
377+
return MOI.InfeasiblePoint
359378
else
360379
m.solve_stat = MOI.OtherResultStatus
361380
end
File renamed without changes.

test/MOIWrapper.jl renamed to test/MOI_wrapper.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,12 @@ end
3636
MOIT.contconictest(MOIB.GeoMean{Float64}(MOIB.RSOC{Float64}(optimizer)),
3737
config, exclude)
3838
end
39+
40+
@testset "SolverName" begin
41+
@test MOI.get(optimizer, MOI.SolverName()) == "ECOS"
42+
end
43+
44+
@testset "supports_allocate_load" begin
45+
@test MOIU.supports_allocate_load(optimizer.optimizer, false)
46+
@test !MOIU.supports_allocate_load(optimizer.optimizer, true)
47+
end

test/mpb_linear.jl renamed to test/MPB_linear.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# Wrapper around the ECOS solver https://github.com/ifa-ethz/ecos
44
# See http://github.com/JuliaOpt/ECOS.jl
55
#############################################################################
6-
# test/mpb_linear.jl
6+
# test/MPB_linear.jl
77
# Test the MathProgBase.jl interface for the ECOS.jl solver wrapper
88
#############################################################################
99

test/MPBWrapper.jl renamed to test/MPB_wrapper.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#############################################################################
99

1010
@testset "Test the MPB wrapper with linprog" begin
11-
include("mpb_linear.jl")
11+
include("MPB_linear.jl")
1212
end
1313

1414
import ECOS

test/runtests.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@ end
2121
end
2222

2323
@testset "MathProgBase" begin
24-
include("MPBWrapper.jl")
24+
include("MPB_wrapper.jl")
2525
end
2626

2727
@testset "MathOptInterface" begin
28-
include("MOIWrapper.jl")
28+
include("MOI_wrapper.jl")
2929
end

0 commit comments

Comments
 (0)