44# Use of this source code is governed by an MIT-style license that can be found
55# in the LICENSE.md file or at https://opensource.org/licenses/MIT.
66
7+ # Where the objective of a `ModelWithQuad` currently lives.
8+ @enum (_ObjectiveSink, _NONE, _QUAD, _INNER)
9+
710"""
811 ModelWithQuad{T,M}(
912 qp::QPBlockData{T},
1013 inner::M;
11- objective_sink::Symbol = :none ,
14+ objective_sink::_ObjectiveSink = _NONE ,
1215 ) where {T,M}
1316
1417A model layer that owns the variables of the model, stores affine and
@@ -29,8 +32,8 @@ that storage as `parameters::Vector{T}`, like [`Model`](@ref) does:
2932Add constraints with [`add_constraint`](@ref) or `MOI.add_constraint`, and
3033set the objective with [`set_objective`](@ref): affine and quadratic
3134functions are routed to the QP block, everything else to the inner model.
32- `objective_sink` records where the objective currently lives (`:none `,
33- `:quad ` or `:inner `).
35+ `objective_sink` records where the objective currently lives (`_NONE `,
36+ `_QUAD ` or `_INNER `).
3437
3538Create the corresponding evaluator, [`EvaluatorWithQuad`](@ref), with
3639`Evaluator(model, backend)`, or construct it directly from an inner
@@ -41,12 +44,12 @@ mutable struct ModelWithQuad{T,M}
4144 variables:: MOI.Utilities.VariablesContainer{T}
4245 qp:: QPBlockData{T}
4346 inner:: M
44- objective_sink:: Symbol # :none, :quad or :inner
47+ objective_sink:: _ObjectiveSink
4548
4649 function ModelWithQuad {T} (
4750 qp:: QPBlockData{T} ,
4851 inner:: M ;
49- objective_sink:: Symbol = :none ,
52+ objective_sink:: _ObjectiveSink = _NONE ,
5053 ) where {T,M}
5154 model = new {T,M} (
5255 MOI. Utilities. VariablesContainer {T} (),
@@ -223,7 +226,7 @@ function set_objective(
223226) where {T}
224227 MOI. set (model. qp, MOI. ObjectiveFunction {typeof(obj)} (), obj)
225228 set_objective (model. inner, nothing )
226- model. objective_sink = :quad
229+ model. objective_sink = _QUAD
227230 return
228231end
229232
@@ -234,7 +237,7 @@ function set_objective(model::ModelWithQuad{T}, obj) where {T}
234237 obj = _replace_parameters (obj)
235238 end
236239 set_objective (model. inner, obj)
237- model. objective_sink = obj === nothing ? :none : :inner
240+ model. objective_sink = obj === nothing ? _NONE : _INNER
238241 return
239242end
240243
385388
386389function MOI. eval_objective (d:: EvaluatorWithQuad{T} , x) where {T}
387390 sink = d. model. objective_sink
388- if sink == :quad
391+ if sink == _QUAD
389392 return MOI. eval_objective (d. model. qp, x)
390- elseif sink == :inner
393+ elseif sink == _INNER
391394 return MOI. eval_objective (d. inner, x)
392395 else
393396 return zero (T)
396399
397400function MOI. eval_objective_gradient (d:: EvaluatorWithQuad{T} , grad, x) where {T}
398401 sink = d. model. objective_sink
399- if sink == :quad
402+ if sink == _QUAD
400403 MOI. eval_objective_gradient (d. model. qp, grad, x)
401- elseif sink == :inner
404+ elseif sink == _INNER
402405 MOI. eval_objective_gradient (d. inner, grad, x)
403406 else
404407 grad .= zero (T)
534537_has_objective (d:: Evaluator ) = d. model. objective != = nothing
535538
536539function _has_objective (d:: EvaluatorWithQuad )
537- if d. model. objective_sink == :quad
540+ if d. model. objective_sink == _QUAD
538541 return true
539542 end
540543 return _has_objective (d. inner)
0 commit comments