@@ -17,7 +17,9 @@ struct Solution
17
17
objval:: Float64
18
18
objbnd:: Float64
19
19
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 )
21
23
22
24
# Used to build the data with allocate-load during `copy_to`.
23
25
# When `optimize!` is called, a the data is used to build `ECOSMatrix`
@@ -69,16 +71,19 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
69
71
end
70
72
end
71
73
74
+ MOI. get (:: Optimizer , :: MOI.SolverName ) = " ECOS"
75
+
72
76
function MOI. is_empty (instance:: Optimizer )
73
77
! instance. maxsense && instance. data === nothing
74
78
end
75
79
76
80
function MOI. empty! (instance:: Optimizer )
77
81
instance. maxsense = false
78
82
instance. data = nothing # It should already be nothing except if an error is thrown inside copy_to
83
+ instance. sol = Solution ()
79
84
end
80
85
81
- MOIU. needs_allocate_load (instance :: Optimizer ) = true
86
+ MOIU. supports_allocate_load ( :: Optimizer , copy_names :: Bool ) = ! copy_names
82
87
83
88
function MOI. supports (:: Optimizer ,
84
89
:: Union {MOI. ObjectiveSense,
89
94
90
95
MOI. supports_constraint (:: Optimizer , :: Type{<:SF} , :: Type{<:SS} ) = true
91
96
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 ... )
94
99
end
95
100
96
101
using Compat. SparseArrays
@@ -285,19 +290,25 @@ end
285
290
# Implements getter for result value and statuses
286
291
function MOI. get (instance:: Optimizer , :: MOI.TerminationStatus )
287
292
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
290
297
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
294
301
elseif flag == ECOS. ECOS_MAXIT
295
- MOI. IterationLimit
302
+ return MOI. IterationLimit
296
303
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
298
307
else
299
- m . solve_stat = MOI. OtherError
308
+ return MOI. OtherError
300
309
end
310
+ # TODO : AlmostDualInfeasible for ECOS.ECOS_DINF + ECOS.ECOS_INACC_OFFSET
311
+ # https://github.com/JuliaOpt/MathOptInterface.jl/issues/601
301
312
end
302
313
303
314
MOI. get (instance:: Optimizer , :: MOI.ObjectiveValue ) = instance. sol. objval
@@ -306,17 +317,21 @@ MOI.get(instance::Optimizer, ::MOI.ObjectiveBound) = instance.sol.objbnd
306
317
function MOI. get (instance:: Optimizer , :: MOI.PrimalStatus )
307
318
flag = instance. sol. ret_val
308
319
if flag == ECOS. ECOS_OPTIMAL
309
- MOI. FeasiblePoint
320
+ return MOI. FeasiblePoint
310
321
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
314
325
elseif flag == ECOS. ECOS_MAXIT
315
- MOI. UnknownResultStatus
326
+ return MOI. UnknownResultStatus
316
327
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
318
333
else
319
- m . solve_stat = MOI. OtherResultStatus
334
+ return MOI. OtherResultStatus
320
335
end
321
336
end
322
337
# Swapping indices 2 <-> 3 is an involution (it is its own inverse)
@@ -347,15 +362,19 @@ end
347
362
function MOI. get (instance:: Optimizer , :: MOI.DualStatus )
348
363
flag = instance. sol. ret_val
349
364
if flag == ECOS. ECOS_OPTIMAL
350
- MOI. FeasiblePoint
365
+ return MOI. FeasiblePoint
351
366
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
355
370
elseif flag == ECOS. ECOS_MAXIT
356
- MOI. UnknownResultStatus
371
+ return MOI. UnknownResultStatus
357
372
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
359
378
else
360
379
m. solve_stat = MOI. OtherResultStatus
361
380
end
0 commit comments