Skip to content

Commit 182c6d4

Browse files
committed
Update
1 parent b2bafaa commit 182c6d4

File tree

11 files changed

+105
-17
lines changed

11 files changed

+105
-17
lines changed

src/Bridges/Constraint/bridges/IndicatorToMILPBridge.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,6 @@ function MOI.delete(
126126
model::MOI.ModelLike,
127127
bridge::IndicatorToMILPBridge{T},
128128
) where {T}
129-
if bridge.slack === nothing
130-
return # final_touch not called, so we can safely skip
131-
end
132129
MOI.delete.(model, bridge.slack_bounds)
133130
MOI.delete(model, bridge.constraint)
134131
MOI.delete(model, bridge.slack::MOI.VariableIndex)

src/Bridges/Constraint/bridges/RSOCtoSOCBridge.jl

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ end
5959

6060
function MOI.Bridges.map_function(::Type{<:RSOCtoSOCBridge{T}}, func) where {T}
6161
scalars = MOI.Utilities.eachscalar(func)
62+
if MOI.dimension(set) < 2
63+
err = DimensionMismatch(
64+
"Unable to reformulate a `RotatedSecondOrderCone` into a " *
65+
"`SecondOrderCone` because the output dimension is too small",
66+
)
67+
throw(err)
68+
end
6269
t, u, x = scalars[1], scalars[2], scalars[3:end]
6370
ts = MOI.Utilities.operate!(/, T, t, sqrt(T(2)))
6471
us = MOI.Utilities.operate!(/, T, u, sqrt(T(2)))

src/Bridges/Constraint/bridges/SOCtoPSDBridge.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,10 +257,11 @@ end
257257
function MOI.Bridges.map_function(::Type{<:RSOCtoPSDBridge{T}}, func) where {T}
258258
scalars = MOI.Utilities.eachscalar(func)
259259
if length(scalars) < 2
260-
error(
260+
err = DimensionMismatch(
261261
"Unable to bridge RotatedSecondOrderCone to PSD because the ",
262262
"dimension is too small: got $(length(scalars)), expected >= 2.",
263263
)
264+
throw(err)
264265
elseif length(scalars) == 2
265266
return func
266267
end

src/Bridges/Constraint/bridges/SOCtoRSOCBridge.jl

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,6 @@ function MOI.Bridges.map_set(
5050
::Type{<:SOCtoRSOCBridge},
5151
set::MOI.SecondOrderCone,
5252
)
53-
if MOI.dimension(set) == 1
54-
error(
55-
"Unable to reformulate a `SecondOrderCone` into a " *
56-
"`RotatedSecondOrderCone` because the dimension of `1` is too " *
57-
"small",
58-
)
59-
end
6053
return MOI.RotatedSecondOrderCone(MOI.dimension(set))
6154
end
6255

@@ -69,6 +62,14 @@ end
6962

7063
function MOI.Bridges.map_function(::Type{<:SOCtoRSOCBridge{T}}, func) where {T}
7164
scalars = MOI.Utilities.eachscalar(func)
65+
if length(scalars) < 2
66+
err = DimensionMismatch(
67+
"Unable to reformulate a `SecondOrderCone` into a " *
68+
"`RotatedSecondOrderCone` because the output dimension is too " *
69+
"small",
70+
)
71+
throw(err)
72+
end
7273
t, u, x = scalars[1], scalars[2], scalars[3:end]
7374
ts = MOI.Utilities.operate!(/, T, t, sqrt(T(2)))
7475
us = MOI.Utilities.operate!(/, T, u, sqrt(T(2)))

src/Bridges/Constraint/bridges/SOS1ToMILPBridge.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,6 @@ function MOI.get(::MOI.ModelLike, ::MOI.ConstraintSet, bridge::SOS1ToMILPBridge)
116116
end
117117

118118
function MOI.delete(model::MOI.ModelLike, bridge::SOS1ToMILPBridge)
119-
if isempty(bridge.variables)
120-
return
121-
end
122119
MOI.delete(model, bridge.equal_to)
123120
for ci in bridge.less_than
124121
MOI.delete(model, ci)

src/Bridges/Constraint/bridges/SOS2ToMILPBridge.jl

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,6 @@ function MOI.get(::MOI.ModelLike, ::MOI.ConstraintSet, bridge::SOS2ToMILPBridge)
116116
end
117117

118118
function MOI.delete(model::MOI.ModelLike, bridge::SOS2ToMILPBridge)
119-
if isempty(bridge.variables)
120-
return
121-
end
122119
MOI.delete(model, bridge.equal_to)
123120
for ci in bridge.less_than
124121
MOI.delete(model, ci)

test/Bridges/Constraint/RSOCBridge.jl

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,26 @@ function test_runtests()
179179
return
180180
end
181181

182+
function test_dimension_mismatch_SOCR()
183+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
184+
model = MOI.Bridges.Constraint.SOCR{Float64}(inner)
185+
@test_throws(
186+
DimensionMismatch,
187+
MOI.add_constrained_variables(model, MOI.SecondOrderCone(1)),
188+
)
189+
return
190+
end
191+
192+
function test_dimension_mismatch_RSOC()
193+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
194+
model = MOI.Bridges.Constraint.RSOC{Float64}(inner)
195+
@test_throws(
196+
DimensionMismatch,
197+
MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(1)),
198+
)
199+
return
200+
end
201+
182202
end # module
183203

184204
TestConstraintRSOC.runtests()

test/Bridges/Constraint/SOCtoPSDBridge.jl

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,16 @@ function test_bridging_cost_RSOCtoPSD()
231231
return
232232
end
233233

234+
function test_dimension_mismatch_RSOC_to_PSD()
235+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
236+
model = MOI.Bridges.Constraint.RSOCtoPSD{Float64}(inner)
237+
@test_throws(
238+
DimensionMismatch,
239+
MOI.add_constrained_variables(model, MOI.RotatedSecondOrderCone(1)),
240+
)
241+
return
242+
end
243+
234244
end # module
235245

236246
TestConstraintSOCtoPSD.runtests()

test/Bridges/Constraint/ScalarSlackBridge.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,21 @@ function test_runtests()
411411
return
412412
end
413413

414+
function test_basis_status()
415+
inner = MOI.Utilities.MockOptimizer(
416+
MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}()),
417+
)
418+
model = MOI.Bridges.Constraint.ScalarSlack{Float64}(inner)
419+
x = MOI.add_variable(model)
420+
c = MOI.add_constraint(model, 1.0 * x, MOI.GreaterThan(1.0))
421+
y = MOI.get(inner, MOI.ListOfVariableIndices())
422+
MOI.set.(inner, MOI.VariableBasisStatus(), y, MOI.BASIC)
423+
@test MOI.get(model, MOI.ConstraintBasisStatus(), c) == MOI.BASIC
424+
d = MOI.add_constraint(model, 1.0 * x, MOI.Interval(1.0, 2.0))
425+
@test MOI.get(model, MOI.ConstraintBasisStatus(), c) == MOI.BASIC
426+
return
427+
end
428+
414429
end # module
415430

416431
TestConstraintSlack.runtests()

test/Bridges/Constraint/SplitIntervalBridge.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,33 @@ function test_runtests_vector()
499499
return
500500
end
501501

502+
function test_get_function()
503+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
504+
model = MOI.Bridges.Constraint.SplitInterval{Float64}(inner)
505+
x = MOI.add_variable(model)
506+
c = MOI.add_constraint(model, 1.0 * x, MOI.Interval(-Inf, Inf))
507+
@test MOI.get(model, MOI.ConstraintFunction(), c) 1.0 * x
508+
return
509+
end
510+
511+
function test_modify_set()
512+
inner = MOI.Utilities.UniversalFallback(MOI.Utilities.Model{Float64}())
513+
model = MOI.Bridges.Constraint.SplitInterval{Float64}(inner)
514+
x = MOI.add_variable(model)
515+
c = MOI.add_constraint(model, 1.0 * x, MOI.Interval(-Inf, Inf))
516+
for set in [
517+
MOI.Interval(-Inf, Inf),
518+
MOI.Interval(1.0, 2.0),
519+
MOI.Interval(2.0, 3.0),
520+
MOI.Interval(-Inf, Inf),
521+
]
522+
MOI.set(model, MOI.ConstraintSet(), c, set)
523+
@test MOI.get(model, MOI.ConstraintSet(), c) == set
524+
@test MOI.get(model, MOI.ConstraintFunction(), c) 1.0 * x
525+
end
526+
return
527+
end
528+
502529
end # module
503530

504531
TestConstraintSplitInterval.runtests()

0 commit comments

Comments
 (0)