diff --git a/src/MOI_wrapper.jl b/src/MOI_wrapper.jl index ef5ca3aa..6139cc49 100644 --- a/src/MOI_wrapper.jl +++ b/src/MOI_wrapper.jl @@ -48,6 +48,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer Nothing, Dict{String,Union{Nothing,MOI.ConstraintIndex}}, } + solution_storage::Vector{Ptr{SCIP_SOL}} function Optimizer(; kwargs...) o = new( @@ -66,6 +67,7 @@ mutable struct Optimizer <: MOI.AbstractOptimizer _kSCIP_SOLVE_STATUS_NOT_CALLED, nothing, nothing, + Ptr{SCIP_SOL}[], ) # Set all parameters given as keyword arguments, replacing the # delimiter, since "/" is used by all SCIP parameters, but is not @@ -112,6 +114,7 @@ function MOI.empty!(o::Optimizer) o.scip_solve_status = _kSCIP_SOLVE_STATUS_NOT_CALLED o.name_to_variable = nothing o.name_to_constraint_index = nothing + o.solution_storage = Ptr{SCIP_SOL}[] return nothing end @@ -428,6 +431,8 @@ function MOI.optimize!(o::Optimizer) finally o.scip_solve_status = _kSCIP_SOLVE_STATUS_FINISHED end + o.solution_storage = + unsafe_wrap(Vector{Ptr{SCIP_SOL}}, SCIPgetSols(o), SCIPgetNSols(o)) return nothing end diff --git a/src/MOI_wrapper/results.jl b/src/MOI_wrapper/results.jl index 06c94d8b..46a97054 100644 --- a/src/MOI_wrapper/results.jl +++ b/src/MOI_wrapper/results.jl @@ -81,15 +81,13 @@ end function MOI.get(o::Optimizer, attr::MOI.ObjectiveValue) assert_solved(o) MOI.check_result_index_bounds(o, attr) - sols = unsafe_wrap(Array{Ptr{SCIP_SOL}}, SCIPgetSols(o), SCIPgetNSols(o)) - return SCIPgetSolOrigObj(o, sols[attr.result_index]) + return SCIPgetSolOrigObj(o, o.solution_storage[attr.result_index]) end function MOI.get(o::Optimizer, attr::MOI.VariablePrimal, vi::MOI.VariableIndex) assert_solved(o) MOI.check_result_index_bounds(o, attr) - sols = unsafe_wrap(Array{Ptr{SCIP_SOL}}, SCIPgetSols(o), SCIPgetNSols(o)) - return SCIPgetSolVal(o, sols[attr.result_index], var(o, vi)) + return SCIPgetSolVal(o, o.solution_storage[attr.result_index], var(o, vi)) end function MOI.get( @@ -99,12 +97,8 @@ function MOI.get( ) assert_solved(o) MOI.check_result_index_bounds(o, attr) - sols = unsafe_wrap(Array{Ptr{SCIP_SOL}}, SCIPgetSols(o), SCIPgetNSols(o)) - return SCIPgetSolVal( - o, - sols[attr.result_index], - var(o, MOI.VariableIndex(ci.value)), - ) + x = MOI.VariableIndex(ci.value) + return SCIPgetSolVal(o, o.solution_storage[attr.result_index], var(o, x)) end function MOI.get( @@ -114,8 +108,8 @@ function MOI.get( ) assert_solved(o) MOI.check_result_index_bounds(o, attr) - sols = unsafe_wrap(Array{Ptr{SCIP_SOL}}, SCIPgetSols(o), SCIPgetNSols(o)) - return SCIPgetActivityLinear(o, cons(o, ci), sols[attr.result_index]) + sols = o.solution_storage[attr.result_index] + return SCIPgetActivityLinear(o, cons(o, ci), sols) end function MOI.get(o::Optimizer, ::MOI.ObjectiveBound)