From 696dd3f522b96882a6d73a7b7826b8a7fd5cdd50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Legat?= Date: Thu, 2 Aug 2018 13:04:04 +0200 Subject: [PATCH] Add support for ObjectiveBound --- src/MOIWrapper.jl | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/MOIWrapper.jl b/src/MOIWrapper.jl index 6556bca..4c3e4a8 100644 --- a/src/MOIWrapper.jl +++ b/src/MOIWrapper.jl @@ -17,8 +17,9 @@ struct Solution dual_ineq::Vector{Float64} slack::Vector{Float64} objval::Float64 + objbnd::Float64 end -Solution() = Solution(0, Float64[], Float64[], Float64[], Float64[], NaN) +Solution() = Solution(0, Float64[], Float64[], Float64[], Float64[], NaN, NaN) # Used to build the data with allocate-load during `copy!`. # When `optimize!` is called, a the data is used to build `ECOSMatrix` @@ -252,8 +253,16 @@ function MOI.optimize!(instance::ECOSOptimizer) dual_ineq = unsafe_wrap(Array, ecos_prob.z, m)[:] slack = unsafe_wrap(Array, ecos_prob.s, m)[:] ECOS.cleanup(ecos_prob_ptr, 0) - objval = (instance.maxsense ? -1 : 1) * dot(c, primal) + objconstant - instance.sol = Solution(ret_val, primal, dual_eq, dual_ineq, slack, objval) + objval = (instance.maxsense ? -1 : 1) * dot(c, primal) + if ret_val != ECOS.ECOS_DINF + objval += objconstant + end + objbnd = -(dot(b, dual_eq) + dot(h, dual_ineq)) + if ret_val != ECOS.ECOS_PINF + objbnd += objconstant + end + instance.sol = Solution(ret_val, primal, dual_eq, dual_ineq, slack, objval, + objbnd) end # Implements getter for result value and statuses @@ -277,6 +286,8 @@ end MOI.canget(instance::ECOSOptimizer, ::MOI.ObjectiveValue) = true MOI.get(instance::ECOSOptimizer, ::MOI.ObjectiveValue) = instance.sol.objval +MOI.canget(instance::ECOSOptimizer, ::MOI.ObjectiveBound) = true +MOI.get(instance::ECOSOptimizer, ::MOI.ObjectiveBound) = instance.sol.objbnd function MOI.canget(instance::ECOSOptimizer, ::MOI.PrimalStatus) instance.sol.ret_val != ECOS.ECOS_PINF