Skip to content

Commit

Permalink
add_constrained_variable with 2 sets (#2574)
Browse files Browse the repository at this point in the history
  • Loading branch information
blegat authored Nov 6, 2024
1 parent c389e3a commit ddf12ec
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
17 changes: 17 additions & 0 deletions src/Test/test_model.jl
Original file line number Diff line number Diff line change
Expand Up @@ -1226,3 +1226,20 @@ function test_model_show(model::MOI.ModelLike, ::Config{T}) where {T}
@test sprint(show, model) isa String
return
end

function test_model_add_constrained_variable_tuple(
model::MOI.ModelLike,
::Config{T},
) where {T}
F = MOI.VariableIndex
set = (MOI.GreaterThan(zero(T)), MOI.LessThan(one(T)))
@requires MOI.supports_add_constrained_variable(model, typeof(set))
x, (c_l, c_u) = MOI.add_constrained_variable(model, set)
@test c_l == MOI.ConstraintIndex{F,MOI.GreaterThan{T}}(x.value)
@test c_u == MOI.ConstraintIndex{F,MOI.LessThan{T}}(x.value)
@test MOI.get(model, MOI.ConstraintFunction(), c_l) == x
@test MOI.get(model, MOI.ConstraintSet(), c_l) == set[1]
@test MOI.get(model, MOI.ConstraintFunction(), c_u) == x
@test MOI.get(model, MOI.ConstraintSet(), c_u) == set[2]
return
end
59 changes: 59 additions & 0 deletions src/variables.jl
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,65 @@ function add_constrained_variable(model::ModelLike, set::AbstractScalarSet)
return variable, constraint
end

"""
add_constrained_variable(
model::ModelLike,
set::Tuple{<:GreaterThan,<:LessThan},
)
A special-case method to add a scalar variable with a lower and upper bound.
This method should be implemented by optimizers which have native support for
adding a variable with bounds and which cannot performantly modify the variable
bounds after creation.
## Example
```jldoctest
julia> import MathOptInterface as MOI
julia> model = MOI.Utilities.Model{Float64}();
julia> set = (MOI.GreaterThan(1.0), MOI.LessThan(2.0));
julia> x, (c_l, c_u) = MOI.add_constrained_variable(model, set);
julia> c_l
MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.GreaterThan{Float64}}(1)
julia> c_u
MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.LessThan{Float64}}(1)
julia> print(model)
Feasibility
Subject to:
VariableIndex-in-GreaterThan{Float64}
v[1] >= 1.0
VariableIndex-in-LessThan{Float64}
v[1] <= 2.0
```
"""
function add_constrained_variable(
model::ModelLike,
set::Tuple{<:GreaterThan,<:LessThan},
)
set_1, set_2 = set
x, c_1 = add_constrained_variable(model, set_1)
c_2 = add_constraint(model, x, set_2)
return x, (c_1, c_2)
end

function supports_add_constrained_variable(
model::ModelLike,
::Type{Tuple{L,U}},
) where {L<:GreaterThan,U<:LessThan}
return supports_add_constrained_variable(model, L) &&
supports_constraint(model, VariableIndex, U)
end

"""
supports_add_constrained_variables(
model::ModelLike,
Expand Down

0 comments on commit ddf12ec

Please sign in to comment.