From 3da0ddfbbd02f4a42fbcc68c674b33ff40fe4d3f Mon Sep 17 00:00:00 2001 From: odow Date: Thu, 26 Nov 2020 15:05:04 +1300 Subject: [PATCH 1/2] Add CallbackNodeStatus attribute --- src/attributes.jl | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/attributes.jl b/src/attributes.jl index 98c52ccae1..def5d91ddb 100644 --- a/src/attributes.jl +++ b/src/attributes.jl @@ -534,6 +534,41 @@ function Base.showerror(io::IO, err::InvalidCallbackUsage) print(io, "InvalidCallbackUsage: Cannot submit $(err.submittable) inside a $(err.callback).") end +""" + CallbackNodeStatusCode + +An Enum of possible return values from calling [`get`](@ref) with +[`CallbackNodeStatus`](@ref). + +Possible values are: + +* CALLBACK_NODE_STATUS_INTEGER: the primal solution available from + [`CallbackVariablePrimal`](@ref) is integer feasible. +* CALLBACK_NODE_STATUS_FRACTIONAL: the primal solution available from + [`CallbackVariablePrimal`](@ref) is integer infeasible. +* CALLBACK_NODE_STATUS_UNKNOWN: the primal solution available from + [`CallbackVariablePrimal`](@ref) might be integer feasible or infeasible. +""" +@enum( + CallbackNodeStatusCode, + CALLBACK_NODE_STATUS_INTEGER, + CALLBACK_NODE_STATUS_FRACTIONAL, + CALLBACK_NODE_STATUS_UNKNOWN, +) + +""" + CallbackNodeStatus(callback_data) + +An optimizer attribute describing the (in)feasibility of the primal solution +available from [`CallbackVariablePrimal`](@ref) during a callback identified by +`callback_data`. + +Returns a [`CallbackNodeStatusCode`](@ref) Enum. +""" +struct CallbackNodeStatus{CallbackDataType} <: AbstractOptimizerAttribute + callback_data::CallbackDataType +end +is_set_by_optimize(::CallbackNodeStatus) = true ## Optimizer attributes From 427a40898f9547c9c75d533edaa4fa705b01243d Mon Sep 17 00:00:00 2001 From: odow Date: Fri, 27 Nov 2020 10:34:29 +1300 Subject: [PATCH 2/2] Add docs and tests --- docs/src/apireference.md | 16 +++++++++++----- test/attributes.jl | 1 + 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/docs/src/apireference.md b/docs/src/apireference.md index aa870d334c..8c2eff8d26 100644 --- a/docs/src/apireference.md +++ b/docs/src/apireference.md @@ -140,10 +140,6 @@ Silent TimeLimitSec RawParameter NumberOfThreads -AbstractCallback -LazyConstraintCallback -HeuristicCallback -UserCutCallback ``` List of attributes useful for optimizers @@ -168,6 +164,17 @@ PrimalStatus DualStatus ``` +Attributes relating to solver callbacks: + +```@docs +AbstractCallback +LazyConstraintCallback +HeuristicCallback +UserCutCallback +CallbackNodeStatus +CallbackNodeStatusCode +CallbackVariablePrimal +``` ### Termination Status The `TerminationStatus` attribute indicates why the optimizer stopped executing. @@ -258,7 +265,6 @@ Calls to `get` and `set` should include as an argument a single `VariableIndex` VariableName VariablePrimalStart VariablePrimal -CallbackVariablePrimal ``` ### Constraints diff --git a/test/attributes.jl b/test/attributes.jl index e503cf5999..f51310eb61 100644 --- a/test/attributes.jl +++ b/test/attributes.jl @@ -3,6 +3,7 @@ @test MOI.is_set_by_optimize(MOI.TerminationStatus()) @test !MOI.is_set_by_optimize(MOI.ConstraintSet()) @test !MOI.is_set_by_optimize(MOI.ObjectiveSense()) + @test MOI.is_set_by_optimize(MOI.CallbackNodeStatus(1)) end @testset "is_copyable" begin @test !MOI.is_copyable(MOI.TerminationStatus())