Skip to content

Commit 16ab218

Browse files
authored
[Bridges] add more runtests (#1895)
1 parent 260d6e1 commit 16ab218

File tree

8 files changed

+191
-8
lines changed

8 files changed

+191
-8
lines changed

src/Bridges/Constraint/bridges/indicator_sos.jl

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -182,21 +182,33 @@ function MOI.get(
182182
z = MOI.get(model, MOI.VariablePrimalStart(), bridge.z)
183183
w = MOI.get(model, MOI.VariablePrimalStart(), bridge.slack)
184184
f = MOI.get(model, attr, bridge.affine_index)
185+
if any(isnothing, (z, w, f))
186+
return nothing
187+
end
185188
return [z, f - w]
186189
end
187190

188191
function MOI.set(
189192
model::MOI.ModelLike,
190193
attr::MOI.ConstraintPrimalStart,
191194
bridge::IndicatorSOS1Bridge{T},
192-
value::AbstractVector,
195+
value,
193196
) where {T}
194197
@assert length(value) == 2
195198
MOI.set(model, MOI.VariablePrimalStart(), bridge.z, value[1])
196-
w = something(
197-
MOI.get(model, MOI.VariablePrimalStart(), bridge.slack),
198-
zero(T),
199-
)
200-
MOI.set(model, attr, bridge.affine_index, value[2] + w)
199+
MOI.set(model, MOI.VariablePrimalStart(), bridge.slack, zero(T))
200+
MOI.set(model, attr, bridge.affine_index, value[2])
201+
return
202+
end
203+
204+
function MOI.set(
205+
model::MOI.ModelLike,
206+
attr::MOI.ConstraintPrimalStart,
207+
bridge::IndicatorSOS1Bridge{T},
208+
::Nothing,
209+
) where {T}
210+
MOI.set(model, MOI.VariablePrimalStart(), bridge.z, nothing)
211+
MOI.set(model, MOI.VariablePrimalStart(), bridge.slack, nothing)
212+
MOI.set(model, attr, bridge.affine_index, nothing)
201213
return
202214
end

src/Bridges/Constraint/bridges/interval.jl

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -267,11 +267,16 @@ function MOI.get(
267267
elseif bridge.upper === nothing
268268
return MOI.get(model, attr, bridge.lower)
269269
else
270-
return MOI.get(model, attr, bridge.lower) +
271-
MOI.get(model, attr, bridge.upper)
270+
lower = MOI.get(model, attr, bridge.lower)
271+
if lower === nothing
272+
return nothing
273+
end
274+
return lower + MOI.get(model, attr, bridge.upper)
272275
end
273276
end
274277

278+
_split_dual_start(::Nothing) = nothing, nothing
279+
275280
function _split_dual_start(value)
276281
if value < 0
277282
return zero(value), value

src/Bridges/Constraint/bridges/norm_one.jl

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,12 +169,26 @@ function MOI.set(
169169
return
170170
end
171171

172+
function MOI.set(
173+
model::MOI.ModelLike,
174+
attr::MOI.ConstraintPrimalStart,
175+
bridge::NormOneBridge{T},
176+
::Nothing,
177+
) where {T}
178+
MOI.set.(model, MOI.VariablePrimalStart(), bridge.y, nothing)
179+
MOI.set(model, attr, bridge.nn_index, nothing)
180+
return
181+
end
182+
172183
function MOI.get(
173184
model::MOI.ModelLike,
174185
attr::Union{MOI.ConstraintPrimal,MOI.ConstraintPrimalStart},
175186
bridge::NormOneBridge,
176187
)
177188
nn_primal = MOI.get(model, attr, bridge.nn_index)
189+
if nn_primal == nothing
190+
return nothing
191+
end
178192
t = (nn_primal[1] + sum(nn_primal)) / 2
179193
d = length(bridge.y)
180194
x = (nn_primal[(d+2):end] - nn_primal[2:(d+1)]) / 2
@@ -190,6 +204,9 @@ function MOI.get(
190204
bridge::NormOneBridge,
191205
)
192206
nn_dual = MOI.get(model, attr, bridge.nn_index)
207+
if nn_dual === nothing
208+
return nothing
209+
end
193210
d = length(bridge.y)
194211
x = nn_dual[(d+2):end] - nn_dual[2:(d+1)]
195212
return vcat(nn_dual[1], x)
@@ -218,3 +235,13 @@ function MOI.set(
218235
MOI.set(model, MOI.ConstraintDualStart(), bridge.nn_index, nn_dual)
219236
return
220237
end
238+
239+
function MOI.set(
240+
model::MOI.ModelLike,
241+
::MOI.ConstraintDualStart,
242+
bridge::NormOneBridge,
243+
::Nothing,
244+
)
245+
MOI.set(model, MOI.ConstraintDualStart(), bridge.nn_index, nothing)
246+
return
247+
end

test/Bridges/Constraint/indicator_sos.jl

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -318,6 +318,24 @@ function test_getting_primal_attributes()
318318
return
319319
end
320320

321+
function test_runtests()
322+
MOI.Bridges.runtests(
323+
MOI.Bridges.Constraint.IndicatorSOS1Bridge,
324+
"""
325+
variables: x, z
326+
[z, 2.0 * x] in Indicator{ACTIVATE_ON_ONE}(LessThan(2.0))
327+
z in ZeroOne()
328+
""",
329+
"""
330+
variables: x, z, y
331+
2.0 * x + 1.0 * y <= 2.0
332+
z in ZeroOne()
333+
[y, z] in SOS1([0.4, 0.6])
334+
""",
335+
)
336+
return
337+
end
338+
321339
end # module
322340

323341
TestConstraintIndicatorSOS1.runtests()

test/Bridges/Constraint/interval.jl

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,34 @@ function test_infinite_bounds(::Type{T} = Float64) where {T<:AbstractFloat}
373373
return _test_interval(mock, bridged_mock, set, ci)
374374
end
375375

376+
function test_runtests()
377+
MOI.Bridges.runtests(
378+
MOI.Bridges.Constraint.SplitIntervalBridge,
379+
"""
380+
variables: x
381+
x in Interval(1.0, 2.0)
382+
""",
383+
"""
384+
variables: x
385+
x >= 1.0
386+
x <= 2.0
387+
""",
388+
)
389+
MOI.Bridges.runtests(
390+
MOI.Bridges.Constraint.SplitIntervalBridge,
391+
"""
392+
variables: x
393+
3.0 * x in Interval(1.0, 2.0)
394+
""",
395+
"""
396+
variables: x
397+
3.0 * x >= 1.0
398+
3.0 * x <= 2.0
399+
""",
400+
)
401+
return
402+
end
403+
376404
end # module
377405

378406
TestConstraintSplitInterval.runtests()

test/Bridges/Constraint/ltgt_to_interval.jl

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,54 @@ function test_GreaterOrLessToInterval_unmocked()
229229
return
230230
end
231231

232+
function test_runtests()
233+
MOI.Bridges.runtests(
234+
MOI.Bridges.Constraint.GreaterToIntervalBridge,
235+
"""
236+
variables: x
237+
x >= 1.0
238+
""",
239+
"""
240+
variables: x
241+
x in Interval(1.0, Inf)
242+
""",
243+
)
244+
MOI.Bridges.runtests(
245+
MOI.Bridges.Constraint.GreaterToIntervalBridge,
246+
"""
247+
variables: x
248+
2.0 * x >= 1.0
249+
""",
250+
"""
251+
variables: x
252+
2.0 * x in Interval(1.0, Inf)
253+
""",
254+
)
255+
MOI.Bridges.runtests(
256+
MOI.Bridges.Constraint.LessToIntervalBridge,
257+
"""
258+
variables: x
259+
x <= 1.0
260+
""",
261+
"""
262+
variables: x
263+
x in Interval(-Inf, 1.0)
264+
""",
265+
)
266+
MOI.Bridges.runtests(
267+
MOI.Bridges.Constraint.LessToIntervalBridge,
268+
"""
269+
variables: x
270+
2.0 * x <= 1.0
271+
""",
272+
"""
273+
variables: x
274+
2.0 * x in Interval(-Inf, 1.0)
275+
""",
276+
)
277+
return
278+
end
279+
232280
end # module
233281

234282
TestConstraintToInterval.runtests()

test/Bridges/Constraint/norm_to_lp.jl

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,32 @@ function test_conic_NormOneCone()
573573
return
574574
end
575575

576+
function test_runtests()
577+
MOI.Bridges.runtests(
578+
MOI.Bridges.Constraint.NormOneBridge,
579+
"""
580+
variables: t, x
581+
[t, x] in NormOneCone(2)
582+
""",
583+
"""
584+
variables: t, x, y
585+
[t + -1.0 * y, y + -1.0 * x, y + x] in Nonnegatives(3)
586+
""",
587+
)
588+
MOI.Bridges.runtests(
589+
MOI.Bridges.Constraint.NormInfinityBridge,
590+
"""
591+
variables: t, x
592+
[t, x] in NormInfinityCone(2)
593+
""",
594+
"""
595+
variables: t, x
596+
[t + -1.0 * x, t + x] in Nonnegatives(2)
597+
""",
598+
)
599+
return
600+
end
601+
576602
end # module
577603

578604
TestConstraintNormInfinity.runtests()

test/Bridges/Constraint/scalarize.jl

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,25 @@ function test_scalarize()
208208
return
209209
end
210210

211+
function test_runtests()
212+
MOI.Bridges.runtests(
213+
MOI.Bridges.Constraint.ScalarizeBridge,
214+
"""
215+
variables: x
216+
[2.0 * x + -1.0] in Nonnegatives(1)
217+
[3.0 * x + 1.0] in Nonpositives(1)
218+
[4.0 * x + -5.0] in Zeros(1)
219+
""",
220+
"""
221+
variables: x
222+
2.0 * x >= 1.0
223+
3.0 * x <= -1.0
224+
4.0 * x == 5.0
225+
""",
226+
)
227+
return
228+
end
229+
211230
end # module
212231

213232
TestConstraintScalarize.runtests()

0 commit comments

Comments
 (0)