@@ -69,16 +69,27 @@ Base.broadcastable(::Lazy) = Ref(Lazy())
6969
7070# ## _LazyData
7171
72+ @enum (
73+ _LAZY_CONSTRAINT_STATUS,
74+ _kLAZY_CONSTRAINT_ACTIVE,
75+ _kLAZY_CONSTRAINT_INACTIVE,
76+ _kLAZY_CONSTRAINT_DELETED,
77+ )
78+
7279struct _LazyData{F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
7380 data:: Vector{Tuple{F,S}}
74- active :: Vector{Bool }
81+ status :: Vector{_LAZY_CONSTRAINT_STATUS }
7582 index:: Vector{MOI.ConstraintIndex{F,S}}
7683
7784 function _LazyData{
7885 F,
7986 S,
8087 }() where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
81- return new {F,S} (Tuple{F,S}[], Bool[], MOI. ConstraintIndex{F,S}[])
88+ return new {F,S} (
89+ Tuple{F,S}[],
90+ _LAZY_CONSTRAINT_STATUS[],
91+ MOI. ConstraintIndex{F,S}[],
92+ )
8293 end
8394end
8495
@@ -330,6 +341,27 @@ function MOI.add_constraint(
330341 return MOI. add_constraint (model. inner, f, s)
331342end
332343
344+ # ## MOI.delete!
345+
346+ function MOI. delete (model:: Optimizer , ci:: MOI.ConstraintIndex{F,S} ) where {F,S}
347+ MOI. delete (model. inner, ci)
348+ return
349+ end
350+
351+ function MOI. delete (
352+ model:: Optimizer ,
353+ ci:: MOI.ConstraintIndex{F,LazyScalarSet{S}} ,
354+ ) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
355+ data = _data (model, F, S)
356+ if data. status[ci. value] == _kLAZY_CONSTRAINT_ACTIVE
357+ MOI. delete (model. inner, data. index[ci. value])
358+ data. status[ci. value] = _kLAZY_CONSTRAINT_DELETED
359+ elseif data. status[ci. value] == _kLAZY_CONSTRAINT_INACTIVE
360+ data. status[ci. value] = _kLAZY_CONSTRAINT_DELETED
361+ end
362+ return
363+ end
364+
333365# ## MOI.compute_conflict!
334366
335367MOI. compute_conflict! (model:: Optimizer ) = MOI. compute_conflict! (model. inner)
@@ -361,7 +393,11 @@ function MOI.is_valid(
361393 ci:: MOI.ConstraintIndex{F,LazyScalarSet{S}} ,
362394) where {F,S}
363395 ret = _maybe_data (model, F, S)
364- return ret != = nothing && 1 <= ci. value <= length (ret. data)
396+ if ret == nothing
397+ return false
398+ end
399+ status = get (ret. status, ci. value, _kLAZY_CONSTRAINT_DELETED)
400+ return status != _kLAZY_CONSTRAINT_DELETED
365401end
366402
367403function MOI. get (
@@ -387,7 +423,7 @@ function MOI.add_constraint(
387423) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
388424 data = _data (model, F, S)
389425 push! (data. data, (f, s. set))
390- push! (data. active, false )
426+ push! (data. status, _kLAZY_CONSTRAINT_INACTIVE )
391427 push! (data. index, MOI. ConstraintIndex {F,S} (0 ))
392428 return MOI. ConstraintIndex {F,LazyScalarSet{S}} (length (data. data))
393429end
@@ -430,7 +466,9 @@ function MOI.get(
430466) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
431467 n = MOI. get (model. inner, attr)
432468 if (data = _maybe_data (model, F, S)) != = nothing
433- n -= sum ((data). active)
469+ for status in data. status
470+ n -= status == _kLAZY_CONSTRAINT_ACTIVE
471+ end
434472 end
435473 return n
436474end
@@ -441,7 +479,10 @@ function MOI.get(
441479) where {F<: MOI.AbstractScalarFunction ,S<: MOI.AbstractScalarSet }
442480 ret = MOI. get (model. inner, attr)
443481 if (data = _maybe_data (model, F, S)) != = nothing
444- in_model = Set (ci for (ci, z) in zip (data. index, data. active) if z)
482+ in_model = Set {MOI.ConstraintIndex{F,S}} (
483+ ci for (ci, status) in zip (data. index, data. status) if
484+ status == _kLAZY_CONSTRAINT_ACTIVE
485+ )
445486 ret = filter! (ci -> ! (ci in in_model), ret)
446487 end
447488 return ret
@@ -523,9 +564,9 @@ function _add_if_unbounded(model::Optimizer, data::_LazyData)
523564 for (i, (f, s)) in enumerate (data. data)
524565 if constraints_added >= n
525566 break
526- elseif ! data. active [i]
567+ elseif data. status [i] == _kLAZY_CONSTRAINT_INACTIVE
527568 data. index[i] = MOI. add_constraint (model. inner, f, s)
528- data. active [i] = true
569+ data. status [i] = _kLAZY_CONSTRAINT_ACTIVE
529570 constraints_added += 1
530571 end
531572 end
@@ -539,13 +580,13 @@ function _add_if_feasible(
539580)
540581 needs_solve = false
541582 for (i, (f, s)) in enumerate (data. data)
542- if data. active [i]
583+ if data. status [i] != _kLAZY_CONSTRAINT_INACTIVE
543584 continue
544585 end
545586 y = MOI. Utilities. eval_variables (Base. Fix1 (getindex, x), model, f)
546587 if MOI. Utilities. distance_to_set (y, s) > 0
547588 data. index[i] = MOI. add_constraint (model. inner, f, s)
548- data. active [i] = true
589+ data. status [i] = _kLAZY_CONSTRAINT_ACTIVE
549590 needs_solve = true
550591 end
551592 end
0 commit comments