Skip to content

Commit 2366071

Browse files
authored
Add CallbackNodeStatus attribute (#1199)
* Add CallbackNodeStatus attribute * Add docs and tests
1 parent 6f16730 commit 2366071

3 files changed

Lines changed: 47 additions & 5 deletions

File tree

docs/src/apireference.md

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -140,10 +140,6 @@ Silent
140140
TimeLimitSec
141141
RawParameter
142142
NumberOfThreads
143-
AbstractCallback
144-
LazyConstraintCallback
145-
HeuristicCallback
146-
UserCutCallback
147143
```
148144

149145
List of attributes useful for optimizers
@@ -168,6 +164,17 @@ PrimalStatus
168164
DualStatus
169165
```
170166

167+
Attributes relating to solver callbacks:
168+
169+
```@docs
170+
AbstractCallback
171+
LazyConstraintCallback
172+
HeuristicCallback
173+
UserCutCallback
174+
CallbackNodeStatus
175+
CallbackNodeStatusCode
176+
CallbackVariablePrimal
177+
```
171178
### Termination Status
172179

173180
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`
258265
VariableName
259266
VariablePrimalStart
260267
VariablePrimal
261-
CallbackVariablePrimal
262268
```
263269

264270
### Constraints

src/attributes.jl

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,41 @@ function Base.showerror(io::IO, err::InvalidCallbackUsage)
534534
print(io, "InvalidCallbackUsage: Cannot submit $(err.submittable) inside a $(err.callback).")
535535
end
536536

537+
"""
538+
CallbackNodeStatusCode
539+
540+
An Enum of possible return values from calling [`get`](@ref) with
541+
[`CallbackNodeStatus`](@ref).
542+
543+
Possible values are:
544+
545+
* CALLBACK_NODE_STATUS_INTEGER: the primal solution available from
546+
[`CallbackVariablePrimal`](@ref) is integer feasible.
547+
* CALLBACK_NODE_STATUS_FRACTIONAL: the primal solution available from
548+
[`CallbackVariablePrimal`](@ref) is integer infeasible.
549+
* CALLBACK_NODE_STATUS_UNKNOWN: the primal solution available from
550+
[`CallbackVariablePrimal`](@ref) might be integer feasible or infeasible.
551+
"""
552+
@enum(
553+
CallbackNodeStatusCode,
554+
CALLBACK_NODE_STATUS_INTEGER,
555+
CALLBACK_NODE_STATUS_FRACTIONAL,
556+
CALLBACK_NODE_STATUS_UNKNOWN,
557+
)
558+
559+
"""
560+
CallbackNodeStatus(callback_data)
561+
562+
An optimizer attribute describing the (in)feasibility of the primal solution
563+
available from [`CallbackVariablePrimal`](@ref) during a callback identified by
564+
`callback_data`.
565+
566+
Returns a [`CallbackNodeStatusCode`](@ref) Enum.
567+
"""
568+
struct CallbackNodeStatus{CallbackDataType} <: AbstractOptimizerAttribute
569+
callback_data::CallbackDataType
570+
end
571+
is_set_by_optimize(::CallbackNodeStatus) = true
537572

538573
## Optimizer attributes
539574

test/attributes.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
@test MOI.is_set_by_optimize(MOI.TerminationStatus())
44
@test !MOI.is_set_by_optimize(MOI.ConstraintSet())
55
@test !MOI.is_set_by_optimize(MOI.ObjectiveSense())
6+
@test MOI.is_set_by_optimize(MOI.CallbackNodeStatus(1))
67
end
78
@testset "is_copyable" begin
89
@test !MOI.is_copyable(MOI.TerminationStatus())

0 commit comments

Comments
 (0)