diff --git a/src/MathOptLazy.jl b/src/MathOptLazy.jl index 86a8342..ca03e1e 100644 --- a/src/MathOptLazy.jl +++ b/src/MathOptLazy.jl @@ -459,16 +459,25 @@ function MOI.get( model::Optimizer, ::MOI.ListOfConstraintIndices{F,LazyScalarSet{S}}, ) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet} - n = MOI.get(model, MOI.NumberOfConstraints{F,LazyScalarSet{S}}()) - return [MOI.ConstraintIndex{F,LazyScalarSet{S}}(i) for i in 1:n] + ret = MOI.ConstraintIndex{F,LazyScalarSet{S}}[] + if (data = _maybe_data(model, F, S)) !== nothing + for (i, status) in enumerate(data.status) + if status != _kLAZY_CONSTRAINT_DELETED + push!(ret, MOI.ConstraintIndex{F,LazyScalarSet{S}}(i)) + end + end + end + return ret end function MOI.get( model::Optimizer, ::MOI.NumberOfConstraints{F,LazyScalarSet{S}}, ) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet} - ret = _maybe_data(model, F, S) - return ret === nothing ? 0 : length(ret.data) + if (data = _maybe_data(model, F, S)) !== nothing + return count(!=(_kLAZY_CONSTRAINT_DELETED), data.status) + end + return 0 end function MOI.add_constraint( diff --git a/test/runtests.jl b/test/runtests.jl index e57242f..6e45b69 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -408,9 +408,14 @@ function test_delete_lazy_inactive() MOI.add_constraint(model, x, MOI.EqualTo(0.0)) set = MathOptLazy.LazyScalarSet(MOI.EqualTo(1.0)) c = MOI.add_constraint(model, 1.0 * x, set) + F, S = MOI.ScalarAffineFunction{Float64}, typeof(set) @test MOI.is_valid(model, c) + @test only(MOI.get(model, MOI.ListOfConstraintIndices{F,S}())) == c + @test MOI.get(model, MOI.NumberOfConstraints{F,S}()) == 1 MOI.delete(model, c) @test !MOI.is_valid(model, c) + @test isempty(MOI.get(model, MOI.ListOfConstraintIndices{F,S}())) + @test MOI.get(model, MOI.NumberOfConstraints{F,S}()) == 0 MOI.optimize!(model) @test MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL return @@ -425,7 +430,14 @@ function test_delete_lazy_active() c = MOI.add_constraint(model, 1.0 * x, set) MOI.optimize!(model) @test MOI.get(model, MOI.TerminationStatus()) == MOI.INFEASIBLE + F, S = MOI.ScalarAffineFunction{Float64}, typeof(set) + @test MOI.is_valid(model, c) + @test only(MOI.get(model, MOI.ListOfConstraintIndices{F,S}())) == c + @test MOI.get(model, MOI.NumberOfConstraints{F,S}()) == 1 MOI.delete(model, c) + @test !MOI.is_valid(model, c) + @test isempty(MOI.get(model, MOI.ListOfConstraintIndices{F,S}())) + @test MOI.get(model, MOI.NumberOfConstraints{F,S}()) == 0 MOI.optimize!(model) @test MOI.get(model, MOI.TerminationStatus()) == MOI.OPTIMAL return