Skip to content

Commit

Permalink
implement status and solution queries
Browse files Browse the repository at this point in the history
  • Loading branch information
rschwarz committed Dec 22, 2018
1 parent 041024d commit e74b98d
Showing 1 changed file with 44 additions and 0 deletions.
44 changes: 44 additions & 0 deletions src/MOI_wrapper.jl
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ function register!(o::Optimizer, c::CI{F,S}) where {F,S}
return c
end


## general queries and support

MOI.get(::Optimizer, ::MOI.SolverName) = "SCIP"
Expand All @@ -87,6 +88,7 @@ MOI.supports(::Optimizer, ::MOI.ObjectiveFunction{MOI.ScalarAffineFunction{Float

MOIU.supports_default_copy_to(model::Optimizer, copy_names::Bool) = !copy_names


## model creation, query and modification

function MOI.is_empty(o::Optimizer)
Expand Down Expand Up @@ -239,3 +241,45 @@ function MOI.optimize!(o::Optimizer)
@SC SCIPsolve(o.mscip.scip[])
return nothing
end

term_status_map = Dict(
SCIP_STATUS_UNKNOWN => MOI.OPTIMIZE_NOT_CALLED,
SCIP_STATUS_USERINTERRUPT => MOI.INTERRUPTED,
SCIP_STATUS_NODELIMIT => MOI.NODE_LIMIT,
SCIP_STATUS_TOTALNODELIMIT => MOI.NODE_LIMIT,
SCIP_STATUS_STALLNODELIMIT => MOI.OTHER_LIMIT,
SCIP_STATUS_TIMELIMIT => MOI.TIME_LIMIT,
SCIP_STATUS_MEMLIMIT => MOI.MEMORY_LIMIT,
SCIP_STATUS_GAPLIMIT => MOI.OTHER_LIMIT,
SCIP_STATUS_SOLLIMIT => MOI.SOLUTION_LIMIT,
SCIP_STATUS_BESTSOLLIMIT => MOI.OTHER_LIMIT,
SCIP_STATUS_RESTARTLIMIT => MOI.OTHER_LIMIT,
SCIP_STATUS_OPTIMAL => MOI.OPTIMAL,
SCIP_STATUS_INFEASIBLE => MOI.INFEASIBLE,
SCIP_STATUS_UNBOUNDED => MOI.DUAL_INFEASIBLE,
SCIP_STATUS_INFORUNBD => MOI.INFEASIBLE_OR_UNBOUNDED,
SCIP_STATUS_TERMINATE => MOI.INTERRUPTED,
)

function MOI.get(o::Optimizer, ::MOI.TerminationStatus)
term_status_map[SCIPgetStatus(get_scip(o))]
end

function MOI.get(o::Optimizer, ::MOI.PrimalStatus)
SCIPgetNSols(get_scip(o)) > 0 ? MOI.FEASIBLE_POINT : MOI.NO_SOLUTION
end

function MOI.get(o::Optimizer, ::MOI.ObjectiveValue)
scip = get_scip(o)
return SCIPgetSolOrigObj(scip, SCIPgetBestSol(scip))
end

function MOI.get(o::Optimizer, ::MOI.VariablePrimal, vi::VI)
scip = get_scip(o)
return SCIPgetSolVal(scip, SCIPgetBestSol(scip), get_var(o, vi))
end

function MOI.get(o::Optimizer, ::MOI.ConstraintPrimal, ci::CI{MOI.ScalarAffineFunction{Float64},<:SS})
scip = get_scip(o)
return SCIPgetActivityLinear(scip, get_cons(o, ci), SCIPgetBestSol(scip))
end

0 comments on commit e74b98d

Please sign in to comment.