Skip to content

Commit c5493ed

Browse files
authored
Add MathOptLazy.NumberOfConstraintsActive (#37)
1 parent 73bd96a commit c5493ed

2 files changed

Lines changed: 32 additions & 0 deletions

File tree

‎src/MathOptLazy.jl‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -631,6 +631,30 @@ MOI.get(model::Optimizer, ::MOI.SimplexIterations) = model.simplex_iterations
631631

632632
MOI.get(model::Optimizer, ::MOI.SolveTimeSec) = model.solve_time_sec
633633

634+
### MathOptLazy.NumberOfConstraintsActive
635+
636+
"""
637+
NumberOfConstraintsActive{F,LazyScalarSet{S}}() where {
638+
F<:MOI.AbstractScalarFunction,
639+
S<:MOI.AbstractScalarSet,
640+
}
641+
642+
Return a count of the number of constraints that are active in the subproblem.
643+
"""
644+
struct NumberOfConstraintsActive{
645+
F<:MOI.AbstractScalarFunction,
646+
S<:LazyScalarSet{<:MOI.AbstractScalarSet},
647+
} <: MOI.AbstractModelAttribute end
648+
649+
MOI.is_set_by_optimize(::NumberOfConstraintsActive) = true
650+
651+
function MOI.get(
652+
model::Optimizer,
653+
::NumberOfConstraintsActive{F,LazyScalarSet{S}},
654+
) where {F<:MOI.AbstractScalarFunction,S<:MOI.AbstractScalarSet}
655+
return count(==(_kLAZY_CONSTRAINT_ACTIVE), _data(model, F, S).status)
656+
end
657+
634658
### MOI.optimize!
635659

636660
function _try_get(model::Optimizer, attr::MOI.AbstractModelAttribute, default)

‎test/runtests.jl‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ function test_jump_cached_knapsack()
4343
@test termination_status(model) == OPTIMAL
4444
@test primal_status(model) == FEASIBLE_POINT
4545
@test all(<=(1 + 1e-6), value(x))
46+
F = MOI.ScalarAffineFunction{Float64}
47+
S = MathOptLazy.LazyScalarSet{MOI.LessThan{Float64}}
48+
@test get_attribute(model, MathOptLazy.NumberOfConstraintsActive{F,S}()) > 0
4649
return
4750
end
4851

@@ -54,10 +57,15 @@ function test_jump_direct_knapsack()
5457
@constraint(model, [i in 1:N], x[i] <= 1, MathOptLazy.Lazy())
5558
@constraint(model, sum(abs(cos(i)) * x[i] for i in 1:N) <= 0.1 * N)
5659
@objective(model, Max, sum(abs(sin(i)) * x[i] for i in 1:N))
60+
F = MOI.ScalarAffineFunction{Float64}
61+
S = MathOptLazy.LazyScalarSet{MOI.LessThan{Float64}}
62+
attr = MathOptLazy.NumberOfConstraintsActive{F,S}()
63+
@test MOI.get(backend(model), attr) == 0
5764
optimize!(model)
5865
@test termination_status(model) == OPTIMAL
5966
@test primal_status(model) == FEASIBLE_POINT
6067
@test all(<=(1 + 1e-6), value(x))
68+
@test get_attribute(model, attr) > 0
6169
return
6270
end
6371

0 commit comments

Comments
 (0)