@@ -15,6 +15,13 @@ const BOUNDS = Union{
15
15
const PtrMap = Dict{Ptr{Cvoid},Union{VarRef,ConsRef}}
16
16
const ConsTypeMap = Dict{Tuple{DataType,DataType},Set{ConsRef}}
17
17
18
+ @enum (
19
+ _SCIP_SOLVE_STATUS,
20
+ _kSCIP_SOLVE_STATUS_NOT_CALLED,
21
+ _kSCIP_SOLVE_STATUS_IN_SOLVE,
22
+ _kSCIP_SOLVE_STATUS_FINISHED,
23
+ )
24
+
18
25
mutable struct Optimizer <: MOI.AbstractOptimizer
19
26
inner:: SCIPData
20
27
reference:: PtrMap
@@ -28,6 +35,8 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
28
35
objective_function_set:: Bool
29
36
conflict_status:: MOI.ConflictStatusCode
30
37
38
+ scip_solve_status:: _SCIP_SOLVE_STATUS
39
+
31
40
function Optimizer (; kwargs... )
32
41
scip = Ref {Ptr{SCIP_}} (C_NULL )
33
42
@SCIP_CALL SCIPcreate (scip)
@@ -63,6 +72,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
63
72
nothing ,
64
73
false ,
65
74
MOI. COMPUTE_CONFLICT_NOT_CALLED,
75
+ _kSCIP_SOLVE_STATUS_NOT_CALLED,
66
76
)
67
77
finalizer (free_scip, scip_data)
68
78
146
156
147
157
" Go back from solved stage to problem modification stage, invalidating results."
148
158
function allow_modification (o:: Optimizer )
149
- if ! (SCIPgetStage (o) in (SCIP_STAGE_PROBLEM, SCIP_STAGE_SOLVING))
159
+ if o. scip_solve_status == _kSCIP_SOLVE_STATUS_IN_SOLVE
160
+ # Ignore. We're inside the solver. Any number of things can be happening
161
+ return nothing
162
+ end
163
+ if SCIPgetStage (o) != SCIP_STAGE_PROBLEM
150
164
@SCIP_CALL SCIPfreeTransform (o)
151
165
end
152
166
return nothing
@@ -316,6 +330,8 @@ function MOI.empty!(o::Optimizer)
316
330
o. conflict_status = MOI. COMPUTE_CONFLICT_NOT_CALLED
317
331
o. moi_separator = nothing
318
332
o. moi_heuristic = nothing
333
+ o. scip_solve_status = _kSCIP_SOLVE_STATUS_NOT_CALLED
334
+
319
335
finalizer (free_scip, o. inner)
320
336
321
337
return nothing
@@ -403,7 +419,12 @@ function MOI.optimize!(o::Optimizer)
403
419
MOI. ScalarAffineFunction {Float64} ([], 0.0 ),
404
420
)
405
421
end
406
- @SCIP_CALL SCIPsolve (o)
422
+ try
423
+ o. scip_solve_status = _kSCIP_SOLVE_STATUS_IN_SOLVE
424
+ @SCIP_CALL SCIPsolve (o)
425
+ finally
426
+ o. scip_solve_status = _kSCIP_SOLVE_STATUS_FINISHED
427
+ end
407
428
return nothing
408
429
end
409
430
0 commit comments