Skip to content

Commit eb0d3c1

Browse files
authored
[Bridges] add ModifyBridgeNotAllowed (#2307)
1 parent 0cfa93f commit eb0d3c1

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

src/Bridges/bridge_optimizer.jl

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1154,17 +1154,38 @@ function MOI.set(
11541154
return
11551155
end
11561156

1157+
struct ModifyBridgeNotAllowed{C<:MOI.AbstractFunctionModification} <:
1158+
MOI.NotAllowedError
1159+
change::C
1160+
message::String
1161+
1162+
function ModifyBridgeNotAllowed(
1163+
change::MOI.AbstractFunctionModification,
1164+
msg::String = "",
1165+
)
1166+
return new{typeof(change)}(change, msg)
1167+
end
1168+
end
1169+
1170+
function MOI.operation_name(err::ModifyBridgeNotAllowed)
1171+
return "Modifying the bridge with $(err.change)"
1172+
end
1173+
1174+
function MOI.modify(
1175+
::MOI.ModelLike,
1176+
::AbstractBridge,
1177+
change::MOI.AbstractFunctionModification,
1178+
)
1179+
return throw(ModifyBridgeNotAllowed(change))
1180+
end
1181+
11571182
function _modify_bridged_function(
11581183
b::AbstractBridgeOptimizer,
11591184
ci_or_obj,
11601185
change::MOI.AbstractFunctionModification,
11611186
)
11621187
if is_bridged(b, ci_or_obj)
1163-
try
1164-
MOI.modify(recursive_model(b), bridge(b, ci_or_obj), change)
1165-
catch
1166-
MOI.throw_modify_not_allowed(ci_or_obj, change)
1167-
end
1188+
MOI.modify(recursive_model(b), bridge(b, ci_or_obj), change)
11681189
else
11691190
MOI.modify(b.model, ci_or_obj, change)
11701191
end
@@ -1902,11 +1923,7 @@ function MOI.modify(
19021923
modify_bridged_change(b, ci, change)
19031924
else
19041925
if is_bridged(b, ci)
1905-
try
1906-
call_in_context(MOI.modify, b, ci, change)
1907-
catch
1908-
MOI.throw_modify_not_allowed(ci, change)
1909-
end
1926+
call_in_context(MOI.modify, b, ci, change)
19101927
else
19111928
MOI.modify(b.model, ci, change)
19121929
end

test/Bridges/bridge_optimizer.jl

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,7 +1047,10 @@ function test_modify_objective_scalar_quadratic_coefficient_change()
10471047
attr = MOI.ObjectiveFunction{MOI.ScalarQuadraticFunction{T}}()
10481048
MOI.set(model, attr, T(1) * x * x + T(2) * x + T(3))
10491049
change = MOI.ScalarQuadraticCoefficientChange(x, x, T(4))
1050-
@test_throws MOI.ModifyObjectiveNotAllowed MOI.modify(model, attr, change)
1050+
@test_throws(
1051+
MOI.Bridges.ModifyBridgeNotAllowed,
1052+
MOI.modify(model, attr, change),
1053+
)
10511054
return
10521055
end
10531056

@@ -1071,7 +1074,18 @@ function test_modify_constraint_scalar_quadratic_coefficient_change()
10711074
x = MOI.add_variable(model)
10721075
c = MOI.add_constraint(model, T(1) * x * x + T(2) * x, MOI.LessThan(T(1)))
10731076
change = MOI.ScalarQuadraticCoefficientChange(x, x, T(4))
1074-
@test_throws MOI.ModifyConstraintNotAllowed MOI.modify(model, c, change)
1077+
@test_throws(
1078+
MOI.Bridges.ModifyBridgeNotAllowed,
1079+
MOI.modify(model, c, change),
1080+
)
1081+
return
1082+
end
1083+
1084+
function test_show_modify_bridge_not_allowed()
1085+
x = MOI.VariableIndex(1)
1086+
change = MOI.ScalarQuadraticCoefficientChange(x, x, 2.0)
1087+
err = MOI.Bridges.ModifyBridgeNotAllowed(change)
1088+
@test occursin("cannot be performed", sprint(showerror, err))
10751089
return
10761090
end
10771091

0 commit comments

Comments
 (0)