Skip to content

Commit

Permalink
Trap non-zero process return values in _run_minizinc
Browse files Browse the repository at this point in the history
  • Loading branch information
odow committed Nov 17, 2023
1 parent 2968ff9 commit 55be811
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 13 deletions.
35 changes: 22 additions & 13 deletions src/optimize.jl
Original file line number Diff line number Diff line change
Expand Up @@ -77,16 +77,25 @@ function _run_minizinc(dest::Optimizer)
end
output = joinpath(dir, "model.ozn")
_stdout = joinpath(dir, "_stdout.txt")
_minizinc_exe() do exe
cmd = `$(exe) --solver $(dest.solver) --output-objective -o $(output) $(filename)`
if dest.time_limit_sec !== nothing
limit = round(Int, 1_000 * dest.time_limit_sec::Float64)
cmd = `$cmd --time-limit $limit`
_stderr = joinpath(dir, "_stderr.txt")
try
_minizinc_exe() do exe
cmd = `$(exe) --solver $(dest.solver) --output-objective -o $(output) $(filename)`
if dest.time_limit_sec !== nothing
limit = round(Int, 1_000 * dest.time_limit_sec::Float64)
cmd = `$cmd --time-limit $limit`
end
if dest.options["num_solutions"] > 1
cmd = `$cmd --num-solutions $(dest.options["num_solutions"])`
end
return run(pipeline(cmd, stdout = _stdout, stderr = _stderr))
end
if dest.options["num_solutions"] > 1
cmd = `$cmd --num-solutions $(dest.options["num_solutions"])`
catch
status = "=====ERROR=====\n"
if isfile(_stderr)
status *= read(_stderr, String)
end
return run(pipeline(cmd, stdout = _stdout))
return status
end
if isfile(output)
return read(output, String)
Expand Down Expand Up @@ -196,9 +205,9 @@ function MOI.optimize!(dest::Optimizer{T}, src::MOI.ModelLike) where {T}
m_stat = match(r"=====(.+)=====", ret)
if m_stat !== nothing
@assert length(m_stat.captures) == 1
dest.solver_status = m_stat[1]
dest.solver_status = ret
else
dest.solver_status = "SATISFIABLE"
dest.solver_status = "=====SATISFIABLE====="
variable_map = Dict(
MOI.get(dest.inner, MOI.VariableName(), x) => x for
x in MOI.get(src, MOI.ListOfVariableIndices())
Expand Down Expand Up @@ -232,22 +241,22 @@ function MOI.is_valid(model::Optimizer, x::MOI.VariableIndex)
end

function _has_solution(model::Optimizer)
return model.solver_status == "SATISFIABLE" &&
return model.solver_status == "=====SATISFIABLE=====" &&
!isempty(model.primal_solutions)
end

MOI.get(model::Optimizer, ::MOI.RawStatusString) = model.solver_status

function MOI.get(model::Optimizer, ::MOI.TerminationStatus)
if model.solver_status == "UNSATISFIABLE"
if occursin("=UNSATISFIABLE=", model.solver_status)
return MOI.INFEASIBLE
elseif _has_solution(model)
if 1 < model.options["num_solutions"] <= length(model.primal_solutions)
return MOI.SOLUTION_LIMIT
else
return MOI.OPTIMAL
end
elseif model.solver_status == "UNKNOWN" &&
elseif occursin("UNKNONWN", model.solver_status) &&
model.time_limit_sec !== nothing &&
model.solve_time_sec >= model.time_limit_sec
return MOI.TIME_LIMIT # The solver timed out
Expand Down
8 changes: 8 additions & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1467,6 +1467,14 @@ function test_version_number()
return
end

function test_run_failure()
model = MiniZinc.Optimizer{Float64}("a")
MOI.optimize!(model, MOI.Utilities.Model{Float64}())
@test MOI.get(model, MOI.TerminationStatus()) == MOI.OTHER_ERROR
@test occursin("=ERROR=", MOI.get(model, MOI.RawStatusString()))
return
end

end

TestMiniZinc.runtests()

0 comments on commit 55be811

Please sign in to comment.