Skip to content

Commit 11c8d76

Browse files
authored
Fix modification when stage is left in SCIP_STAGE_SOLVING (#306)
1 parent 23d6581 commit 11c8d76

File tree

1 file changed

+23
-2
lines changed

1 file changed

+23
-2
lines changed

src/MOI_wrapper.jl

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,13 @@ const BOUNDS = Union{
1515
const PtrMap = Dict{Ptr{Cvoid},Union{VarRef,ConsRef}}
1616
const ConsTypeMap = Dict{Tuple{DataType,DataType},Set{ConsRef}}
1717

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+
1825
mutable struct Optimizer <: MOI.AbstractOptimizer
1926
inner::SCIPData
2027
reference::PtrMap
@@ -28,6 +35,8 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
2835
objective_function_set::Bool
2936
conflict_status::MOI.ConflictStatusCode
3037

38+
scip_solve_status::_SCIP_SOLVE_STATUS
39+
3140
function Optimizer(; kwargs...)
3241
scip = Ref{Ptr{SCIP_}}(C_NULL)
3342
@SCIP_CALL SCIPcreate(scip)
@@ -63,6 +72,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer
6372
nothing,
6473
false,
6574
MOI.COMPUTE_CONFLICT_NOT_CALLED,
75+
_kSCIP_SOLVE_STATUS_NOT_CALLED,
6676
)
6777
finalizer(free_scip, scip_data)
6878

@@ -146,7 +156,11 @@ end
146156

147157
"Go back from solved stage to problem modification stage, invalidating results."
148158
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
150164
@SCIP_CALL SCIPfreeTransform(o)
151165
end
152166
return nothing
@@ -316,6 +330,8 @@ function MOI.empty!(o::Optimizer)
316330
o.conflict_status = MOI.COMPUTE_CONFLICT_NOT_CALLED
317331
o.moi_separator = nothing
318332
o.moi_heuristic = nothing
333+
o.scip_solve_status = _kSCIP_SOLVE_STATUS_NOT_CALLED
334+
319335
finalizer(free_scip, o.inner)
320336

321337
return nothing
@@ -403,7 +419,12 @@ function MOI.optimize!(o::Optimizer)
403419
MOI.ScalarAffineFunction{Float64}([], 0.0),
404420
)
405421
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
407428
return nothing
408429
end
409430

0 commit comments

Comments
 (0)