From d316b8449f959a60ffc2d0a3c53413ead4d39cd8 Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:14:57 +0200 Subject: [PATCH 1/6] bump MOI (and fix it, no more SemVer) --- Project.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 5aa89b78..9833450c 100644 --- a/Project.toml +++ b/Project.toml @@ -9,7 +9,7 @@ MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee" [compat] CEnum = "^0.1.0" -MathOptInterface = "^0.9.0" +MathOptInterface = "= 0.9.5" julia = "^1.0.0" [extras] From 080e7d693c8c0fbb0c0856e080b3f44cc2c9808a Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:16:55 +0200 Subject: [PATCH 2/6] exclude "number_threads" unit test --- test/MOI_wrapper_cached.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/MOI_wrapper_cached.jl b/test/MOI_wrapper_cached.jl index ae375df7..d19094dd 100644 --- a/test/MOI_wrapper_cached.jl +++ b/test/MOI_wrapper_cached.jl @@ -24,6 +24,7 @@ const CONFIG3 = MOIT.TestConfig(atol=1e-3, rtol=1e-2, duals=false, infeas_certif excluded = [ "feasibility_sense", # TODO: support feasibility sense "solve_qp_edge_cases", # needs objective bridge + "number_threads", # can't set num. threads in single-threaded SCIP! ] MOIT.unittest(BRIDGED2, CONFIG, excluded) end From 3314393cbfa703816f0d9fa217d9a3e5d71fbc37 Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:20:35 +0200 Subject: [PATCH 3/6] exclude delete_soc_variables --- test/MOI_wrapper_cached.jl | 1 + 1 file changed, 1 insertion(+) diff --git a/test/MOI_wrapper_cached.jl b/test/MOI_wrapper_cached.jl index d19094dd..a0c148ea 100644 --- a/test/MOI_wrapper_cached.jl +++ b/test/MOI_wrapper_cached.jl @@ -25,6 +25,7 @@ const CONFIG3 = MOIT.TestConfig(atol=1e-3, rtol=1e-2, duals=false, infeas_certif "feasibility_sense", # TODO: support feasibility sense "solve_qp_edge_cases", # needs objective bridge "number_threads", # can't set num. threads in single-threaded SCIP! + "delete_soc_variables", # SCIP requires non-negative "rhs variable" ] MOIT.unittest(BRIDGED2, CONFIG, excluded) end From caf5c2762571b94a86103232f7011578515d00cd Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:45:25 +0200 Subject: [PATCH 4/6] add type assertion (Int) to get(, ResultCount) --- src/MOI_wrapper/results.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/MOI_wrapper/results.jl b/src/MOI_wrapper/results.jl index 4ef162bb..91ca27e1 100644 --- a/src/MOI_wrapper/results.jl +++ b/src/MOI_wrapper/results.jl @@ -27,7 +27,7 @@ function MOI.get(o::Optimizer, ::MOI.PrimalStatus) return SCIPgetNSols(o) > 0 ? MOI.FEASIBLE_POINT : MOI.NO_SOLUTION end -function MOI.get(o::Optimizer, ::MOI.ResultCount) +function MOI.get(o::Optimizer, ::MOI.ResultCount)::Int status = SCIPgetStatus(o) if status in [SCIP_STATUS_UNBOUNDED, SCIP_STATUS_INFORUNBD] return 0 From 9322649267c93116910e7f0fbec5fbe457ea1370 Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:46:25 +0200 Subject: [PATCH 5/6] check result_index bounds before accessing array --- src/MOI_wrapper/results.jl | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MOI_wrapper/results.jl b/src/MOI_wrapper/results.jl index 91ca27e1..816f46d4 100644 --- a/src/MOI_wrapper/results.jl +++ b/src/MOI_wrapper/results.jl @@ -66,24 +66,28 @@ assert_after_prob(o::Optimizer) = assert_stage(o, SCIP_Stage.(3:10)) 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]) end function MOI.get(o::Optimizer, attr::MOI.VariablePrimal, vi::VI) 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.N], var(o, vi)) end function MOI.get(o::Optimizer, attr::MOI.ConstraintPrimal, ci::CI{SVF,<:BOUNDS}) 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.N], var(o, VI(ci.value))) end function MOI.get(o::Optimizer, attr::MOI.ConstraintPrimal, ci::CI{SAF,<:BOUNDS}) 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.N]) end From 568f56ee4b04656444470126edca9d7a1dd3149a Mon Sep 17 00:00:00 2001 From: Robert Schwarz Date: Fri, 11 Oct 2019 13:54:30 +0200 Subject: [PATCH 6/6] fix get(, PrimalStatus) with field N --- src/MOI_wrapper/results.jl | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/MOI_wrapper/results.jl b/src/MOI_wrapper/results.jl index 816f46d4..d0a09be2 100644 --- a/src/MOI_wrapper/results.jl +++ b/src/MOI_wrapper/results.jl @@ -23,8 +23,12 @@ function MOI.get(o::Optimizer, ::MOI.TerminationStatus) return term_status_map[SCIPgetStatus(o)] end -function MOI.get(o::Optimizer, ::MOI.PrimalStatus) - return SCIPgetNSols(o) > 0 ? MOI.FEASIBLE_POINT : MOI.NO_SOLUTION +function MOI.get(o::Optimizer, attr::MOI.PrimalStatus) + return if 1 <= attr.N <= MOI.get(o, MOI.ResultCount()) + MOI.FEASIBLE_POINT + else + MOI.NO_SOLUTION + end end function MOI.get(o::Optimizer, ::MOI.ResultCount)::Int