Skip to content

Commit b3a40fd

Browse files
committed
Update
1 parent 955bbb7 commit b3a40fd

File tree

2 files changed

+74
-4
lines changed

2 files changed

+74
-4
lines changed

src/Test/test_model.jl

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,3 +1226,20 @@ function test_model_show(model::MOI.ModelLike, ::Config{T}) where {T}
12261226
@test sprint(show, model) isa String
12271227
return
12281228
end
1229+
1230+
function test_model_add_constrained_variale_tuple(
1231+
model::MOI.ModelLike,
1232+
::Config{T},
1233+
) where {T}
1234+
F = MOI.VariableIndex
1235+
set = (MOI.GreaterThan(zero(T)), MOI.LessThan(one(T)))
1236+
@requires MOI.supports_add_constrained_variable(model, typeof(set))
1237+
x, (c_l, c_u) = MOI.add_constrained_variable(model, set)
1238+
@test c_l == MOI.ConstraintIndex{F,MOI.GreaterThan{T}}(x.value)
1239+
@test c_u == MOI.ConstraintIndex{F,MOI.LessThan{T}}(x.value)
1240+
@test MOI.get(model, MOI.ConstraintFunction(), c_l) == x
1241+
@test MOI.get(model, MOI.ConstraintSet(), c_l) == set[1]
1242+
@test MOI.get(model, MOI.ConstraintFunction(), c_u) == x
1243+
@test MOI.get(model, MOI.ConstraintSet(), c_u) == set[2]
1244+
return
1245+
end

src/variables.jl

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,63 @@ function add_constrained_variable(model::ModelLike, set::AbstractScalarSet)
124124
return variable, constraint
125125
end
126126

127-
function add_constrained_variable(model::ModelLike, set1::AbstractScalarSet, set2::AbstractScalarSet)
128-
variable, constraint1 = add_constrained_variable(model, set1)
129-
constraint2 = add_constraint(model, variable, set2)
130-
return variable, constraint1, constraint2
127+
"""
128+
add_constrained_variable(
129+
model::ModelLike,
130+
set::Tuple{<:GreaterThan,<:LessThan},
131+
)
132+
133+
A special-case method to add a scalar variable with a lower and upper bound.
134+
135+
This method should be implemented by optimizers which have native support for
136+
adding a variable with bounds and which cannot performantly modify the variable
137+
bounds after creation.
138+
139+
## Example
140+
141+
```jldoctest
142+
julia> import MathOptInterface as MOI
143+
144+
julia> model = MOI.Utilities.Model{Float64}();
145+
146+
julia> set = (MOI.GreaterThan(1.0), MOI.LessThan(2.0));
147+
148+
julia> x, (c_l, c_u) = MOI.add_constrained_variable(model, set);
149+
150+
julia> c_l
151+
MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.GreaterThan{Float64}}(1)
152+
153+
julia> c_u
154+
MathOptInterface.ConstraintIndex{MathOptInterface.VariableIndex, MathOptInterface.LessThan{Float64}}(1)
155+
156+
julia> print(model)
157+
Feasibility
158+
159+
Subject to:
160+
161+
VariableIndex-in-GreaterThan{Float64}
162+
v[1] >= 1.0
163+
164+
VariableIndex-in-LessThan{Float64}
165+
v[1] <= 2.0
166+
```
167+
"""
168+
function add_constrained_variable(
169+
model::ModelLike,
170+
set::Tuple{<:GreaterThan,<:LessThan},
171+
)
172+
set_1, set_2 = set
173+
x, c_1 = add_constrained_variable(model, set_1)
174+
c_2 = add_constraint(model, x, set_2)
175+
return x, (c_1, c_2)
176+
end
177+
178+
function supports_add_constrained_variable(
179+
model::ModelLike,
180+
::Type{Tuple{L,U}},
181+
) where {L<:GreaterThan,U<:LessThan}
182+
return supports_add_constrained_variable(model, L) &&
183+
supports_constraint(model, VariableIndex, U)
131184
end
132185

133186
"""

0 commit comments

Comments
 (0)