Skip to content

Commit 39f8ff7

Browse files
committed
[Bridges] fix ConstraintPrimal for GeoMeanBridge
1 parent 2395fba commit 39f8ff7

2 files changed

Lines changed: 135 additions & 4 deletions

File tree

src/Bridges/Constraint/bridges/GeoMeanBridge.jl

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,8 @@ function MOI.get(
373373
output[1] +=
374374
MOI.get(model, _variable_attribute(attr), bridge.xij[1]) / sqrt(N)
375375
end
376+
set = MOI.get(model, MOI.ConstraintSet(), bridge.t_upper_bound_constraint)
377+
output[1] += MOI.constant(set)
376378
return output
377379
end
378380

@@ -382,8 +384,10 @@ function MOI.set(
382384
bridge::GeoMeanBridge{T},
383385
value,
384386
) where {T}
387+
set = MOI.get(model, MOI.ConstraintSet(), bridge.t_upper_bound_constraint)
388+
t_constant = MOI.constant(set)
385389
if bridge.d == 2
386-
new_value = value[1] - value[2]
390+
new_value = value[1] - value[2] - t_constant
387391
MOI.set(model, attr, bridge.t_upper_bound_constraint, new_value)
388392
MOI.set(model, attr, bridge.x_nonnegative_constraint, [value[2]])
389393
return
@@ -396,9 +400,12 @@ function MOI.set(
396400
xij = zeros(T, N - 1)
397401
xij[1] = xl1
398402
_get_x(i) = i > n ? sN * xl1 : value[1+i]
399-
# With sqrt(2)^l*t - xl1, we should scale both the ConstraintPrimal and
400-
# ConstraintDual
401-
MOI.set(model, attr, bridge.t_upper_bound_constraint, value[1] - sN * xl1)
403+
MOI.set(
404+
model,
405+
attr,
406+
bridge.t_upper_bound_constraint,
407+
value[1] - sN * xl1 - t_constant,
408+
)
402409
offset = length(bridge.rsoc_constraints)
403410
for i in l:-1:1
404411
offset_next = offset

test/Bridges/Constraint/test_GeoMeanBridge.jl

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,130 @@ function test_runtests()
519519
return
520520
end
521521

522+
function test_with_constant_d2()
523+
MOI.Bridges.runtests(
524+
MOI.Bridges.Constraint.GeoMeanBridge,
525+
"""
526+
variables: t, x1
527+
[t + 1.0, x1] in GeometricMeanCone(2)
528+
""",
529+
"""
530+
variables: t, x1
531+
1.0 * t + -1.0 * x1 <= -1.0
532+
[1.0 * x1] in Nonnegatives(1)
533+
""",
534+
)
535+
MOI.Bridges.runtests(
536+
MOI.Bridges.Constraint.GeoMeanBridge,
537+
"""
538+
variables: t, x1
539+
[t + -3.0, x1 + 1.0] in GeometricMeanCone(2)
540+
""",
541+
"""
542+
variables: t, x1
543+
1.0 * t + -1.0 * x1 <= 4.0
544+
[1.0 * x1 + 1.0] in Nonnegatives(1)
545+
""",
546+
)
547+
MOI.Bridges.runtests(
548+
MOI.Bridges.Constraint.GeoMeanBridge,
549+
"""
550+
variables: t, x1
551+
[t, x1 + 1.0] in GeometricMeanCone(2)
552+
""",
553+
"""
554+
variables: t, x1
555+
1.0 * t + -1.0 * x1 <= 1.0
556+
[1.0 + x1] in Nonnegatives(1)
557+
""",
558+
)
559+
return
560+
end
561+
562+
function test_with_constant_d3()
563+
MOI.Bridges.runtests(
564+
MOI.Bridges.Constraint.GeoMeanBridge,
565+
"""
566+
variables: t, x1, x2
567+
[t + 1.0, x1, x2] in GeometricMeanCone(3)
568+
""",
569+
"""
570+
variables: t, x1, x2, y
571+
1.0 * t + -0.7071067811865475 * y <= -1.0
572+
[1.0 * x1, 1.0 * x2, 1.0 * y] in RotatedSecondOrderCone(3)
573+
""",
574+
)
575+
MOI.Bridges.runtests(
576+
MOI.Bridges.Constraint.GeoMeanBridge,
577+
"""
578+
variables: t, x1, x2
579+
[t, x1 + 1.0, x2] in GeometricMeanCone(3)
580+
""",
581+
"""
582+
variables: t, x1, x2, y
583+
1.0 * t + -0.7071067811865475 * y <= 0.0
584+
[1.0 + 1.0 * x1, 1.0 * x2, 1.0 * y] in RotatedSecondOrderCone(3)
585+
""",
586+
)
587+
MOI.Bridges.runtests(
588+
MOI.Bridges.Constraint.GeoMeanBridge,
589+
"""
590+
variables: t, x1, x2
591+
[t + -1.0, x1 + 2.0, x2] in GeometricMeanCone(3)
592+
""",
593+
"""
594+
variables: t, x1, x2, y
595+
1.0 * t + -0.7071067811865475 * y <= 1.0
596+
[1.0 * x1 + 2.0, 1.0 * x2, 1.0 * y] in RotatedSecondOrderCone(3)
597+
""",
598+
)
599+
return
600+
end
601+
602+
function test_with_constant_d4()
603+
MOI.Bridges.runtests(
604+
MOI.Bridges.Constraint.GeoMeanBridge,
605+
"""
606+
variables: t, x1, x2, x3
607+
[t + -1.0, x1, x2, x3] in GeometricMeanCone(4)
608+
""",
609+
"""
610+
variables: t, x1, x2, x3, y1, y2, y3
611+
1.0 * t + -0.5 * y1 <= 1.0
612+
[1.0 * x1, 1.0 * x2, 1.0 * y2] in RotatedSecondOrderCone(3)
613+
[1.0 * y2, 1.0 * y3, 1.0 * y1] in RotatedSecondOrderCone(3)
614+
[1.0 * x3, 0.5 * y1, 1.0 * y3] in RotatedSecondOrderCone(3)
615+
""",
616+
)
617+
MOI.Bridges.runtests(
618+
MOI.Bridges.Constraint.GeoMeanBridge,
619+
"""
620+
variables: t, x1, x2, x3
621+
[t + -3.0, x1, x2, x3] in GeometricMeanCone(4)
622+
""",
623+
"""
624+
variables: t, x1, x2, x3, y1, y2, y3
625+
1.0 * t + -0.5 * y1 <= 3.0
626+
[1.0 * x1, 1.0 * x2, 1.0 * y2] in RotatedSecondOrderCone(3)
627+
[1.0 * y2, 1.0 * y3, 1.0 * y1] in RotatedSecondOrderCone(3)
628+
[1.0 * x3, 0.5 * y1, 1.0 * y3] in RotatedSecondOrderCone(3)
629+
""",
630+
)
631+
# MOI.Bridges.runtests(
632+
# MOI.Bridges.Constraint.GeoMeanBridge,
633+
# """
634+
# variables: t, x1, x2
635+
# [t, x1 + 1.0, x2] in GeometricMeanCone(3)
636+
# """,
637+
# """
638+
# variables: t, x1, x2, y
639+
# 1.0 * t + -0.7071067811865475 * y <= 0.0
640+
# [1.0 + 1.0 * x1, 1.0 * x2, 1.0 * y] in RotatedSecondOrderCone(3)
641+
# """,
642+
# )
643+
return
644+
end
645+
522646
end # module
523647

524648
TestConstraintGeomean.runtests()

0 commit comments

Comments
 (0)