Skip to content

Commit 049737b

Browse files
Add validation so that parameters cannot be NaN (#173)
* Add validation so that parameters cannot be infinite * update to is_finite * Update src/MOI_wrapper.jl * format --------- Co-authored-by: Joaquim <[email protected]> Co-authored-by: joaquimg <[email protected]>
1 parent 7002857 commit 049737b

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
name = "ParametricOptInterface"
22
uuid = "0ce4ce61-57bf-432b-a095-efac525d185e"
33
authors = ["Tomás Gutierrez <[email protected]>"]
4-
version = "0.10.0"
4+
version = "0.10.1"
55

66
[deps]
77
MathOptInterface = "b8f27783-ece8-5eb3-8dc8-9495eed66fee"

src/MOI_wrapper.jl

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,21 @@ function MOI.supports_add_constrained_variables(
219219
return MOI.supports_add_constrained_variables(model.optimizer, MOI.Reals)
220220
end
221221

222+
function _assert_parameter_is_finite(set::MOI.Parameter{T}) where {T}
223+
if !isfinite(set.value)
224+
throw(
225+
AssertionError(
226+
"Parameter value must be a finite number. Got $(set.value)",
227+
),
228+
)
229+
end
230+
end
231+
222232
function MOI.add_constrained_variable(
223233
model::Optimizer{T},
224234
set::MOI.Parameter{T},
225235
) where {T}
236+
_assert_parameter_is_finite(set)
226237
_next_parameter_index!(model)
227238
p = MOI.VariableIndex(model.last_parameter_index_added)
228239
MOI.Utilities.CleverDicts.add_item(model.parameters, set.value)
@@ -563,6 +574,7 @@ function MOI.set(
563574
cp::MOI.ConstraintIndex{MOI.VariableIndex,MOI.Parameter{T}},
564575
set::MOI.Parameter{T},
565576
) where {T}
577+
_assert_parameter_is_finite(set)
566578
p = MOI.VariableIndex(cp.value)
567579
if !_parameter_in_model(model, p)
568580
error("Parameter not in the model")

test/jump_tests.jl

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,3 +1129,49 @@ function test_get_duals_from_multiplicative_parameters_3()
11291129
@test MOI.get.(model, POI.ParameterDual(), p) 2 * 4.0 / 3
11301130
return
11311131
end
1132+
1133+
function test_parameters_cannot_be_nan_1()
1134+
model = Model(() -> POI.Optimizer(GLPK.Optimizer()))
1135+
@variable(model, x)
1136+
@variable(model, p in Parameter(NaN))
1137+
@constraint(model, c, 3 * x >= p * p)
1138+
@objective(model, Min, sum(x))
1139+
@test_throws AssertionError optimize!(model)
1140+
MOI.set(model, POI.ParameterValue(), p, 20.0)
1141+
return
1142+
end
1143+
1144+
function test_parameters_cannot_be_nan_2()
1145+
optimizer = POI.Optimizer(GLPK.Optimizer())
1146+
model = direct_model(optimizer)
1147+
@variable(model, x[1:2])
1148+
@test_throws AssertionError @variable(model, p in Parameter(NaN))
1149+
@variable(model, p in Parameter(1.0))
1150+
@constraint(model, c, 3 * x[1] + x[2] >= p * p)
1151+
@objective(model, Min, sum(x))
1152+
@test_throws AssertionError MOI.set(model, POI.ParameterValue(), p, NaN)
1153+
return
1154+
end
1155+
1156+
function test_parameter_Cannot_be_inf_1()
1157+
model = Model(() -> POI.Optimizer(GLPK.Optimizer()))
1158+
@variable(model, x)
1159+
@variable(model, p in Parameter(Inf))
1160+
@constraint(model, c, 3 * x >= p * p)
1161+
@objective(model, Min, sum(x))
1162+
@test_throws AssertionError optimize!(model)
1163+
MOI.set(model, POI.ParameterValue(), p, 20.0)
1164+
return
1165+
end
1166+
1167+
function test_parameter_Cannot_be_inf_2()
1168+
optimizer = POI.Optimizer(GLPK.Optimizer())
1169+
model = direct_model(optimizer)
1170+
@variable(model, x[1:2])
1171+
@test_throws AssertionError @variable(model, p in Parameter(Inf))
1172+
@variable(model, p in Parameter(1.0))
1173+
@constraint(model, c, 3 * x[1] + x[2] >= p * p)
1174+
@objective(model, Min, sum(x))
1175+
@test_throws AssertionError MOI.set(model, POI.ParameterValue(), p, Inf)
1176+
return
1177+
end

0 commit comments

Comments
 (0)