Skip to content

Commit d8bb963

Browse files
authored
[Nonlinear] improve test coverage (#2641)
1 parent 72c1ab6 commit d8bb963

File tree

3 files changed

+159
-0
lines changed

3 files changed

+159
-0
lines changed

.codecov.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
comment: false
2+
ignore:
3+
- 'src/Nonlinear/univariate_expressions_generator.jl'

test/Nonlinear/Nonlinear.jl

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,6 +880,18 @@ function test_evaluate_subexpressions()
880880
return
881881
end
882882

883+
function test_evaluate_manny_arguments()
884+
model = MOI.Nonlinear.Model()
885+
x = MOI.VariableIndex.(1:20)
886+
v = Dict(xi => xi.value for xi in x)
887+
expr = MOI.Nonlinear.add_expression(
888+
model,
889+
Expr(:call, :+, [:(sqrt($(x[i]))) for i in 1:20]...),
890+
)
891+
@test Nonlinear.evaluate(v, model, expr) sum(sqrt(i) for i in 1:20)
892+
return
893+
end
894+
883895
function test_NLPBlockData()
884896
model = Nonlinear.Model()
885897
x = MOI.VariableIndex(1)
@@ -1251,6 +1263,70 @@ function test_univariate_sign()
12511263
end
12521264
end
12531265

1266+
function test_show_Model()
1267+
model = MOI.Nonlinear.Model()
1268+
@test sprint(show, model) ==
1269+
"A Nonlinear.Model with:\n 0 objectives\n 0 parameters\n 0 expressions\n 0 constraints"
1270+
p = MOI.Nonlinear.add_parameter(model, 2.0)
1271+
@test sprint(show, model) ==
1272+
"A Nonlinear.Model with:\n 0 objectives\n 1 parameter\n 0 expressions\n 0 constraints"
1273+
return
1274+
end
1275+
1276+
function test_set_objective_nothing()
1277+
model = MOI.Nonlinear.Model()
1278+
x = MOI.VariableIndex(1)
1279+
MOI.Nonlinear.set_objective(model, :(sin($x)))
1280+
@test sprint(show, model) ==
1281+
"A Nonlinear.Model with:\n 1 objective\n 0 parameters\n 0 expressions\n 0 constraints"
1282+
MOI.Nonlinear.set_objective(model, nothing)
1283+
@test sprint(show, model) ==
1284+
"A Nonlinear.Model with:\n 0 objectives\n 0 parameters\n 0 expressions\n 0 constraints"
1285+
return
1286+
end
1287+
1288+
function test_copy_evaluator()
1289+
model = Nonlinear.Model()
1290+
x = MOI.VariableIndex(1)
1291+
evaluator = Nonlinear.Evaluator(model, Nonlinear.ExprGraphOnly(), [x])
1292+
@test_throws(
1293+
ErrorException("Copying nonlinear problems not yet implemented"),
1294+
copy(evaluator),
1295+
)
1296+
return
1297+
end
1298+
1299+
function test_no_objective()
1300+
model = Nonlinear.Model()
1301+
x = MOI.VariableIndex(1)
1302+
evaluator = Nonlinear.Evaluator(model, Nonlinear.ExprGraphOnly(), [x])
1303+
@test_throws(
1304+
ErrorException(
1305+
"Unable to query objective_expr because no nonlinear objective was set",
1306+
),
1307+
MOI.objective_expr(evaluator),
1308+
)
1309+
return
1310+
end
1311+
1312+
function test_convert_to_expr()
1313+
model = Nonlinear.Model()
1314+
x = MOI.VariableIndex(1)
1315+
expr = MOI.Nonlinear.add_expression(model, :(sin($x)))
1316+
evaluator = Nonlinear.Evaluator(model, Nonlinear.ExprGraphOnly(), [x])
1317+
@test MOI.Nonlinear.convert_to_expr(
1318+
evaluator,
1319+
model[expr];
1320+
moi_output_format = true,
1321+
) == :(sin(x[$x]))
1322+
@test MOI.Nonlinear.convert_to_expr(
1323+
evaluator,
1324+
model[expr];
1325+
moi_output_format = false,
1326+
) == :(sin($x))
1327+
return
1328+
end
1329+
12541330
end # TestNonlinear
12551331

12561332
TestNonlinear.runtests()

test/Nonlinear/ReverseAD.jl

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,87 @@ function test_univariate_operator_with_no_second_order()
11521152
return
11531153
end
11541154

1155+
function test_no_objective()
1156+
model = Nonlinear.Model()
1157+
x = MOI.VariableIndex(1)
1158+
evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x])
1159+
MOI.initialize(evaluator, [:Grad])
1160+
@test_throws(
1161+
ErrorException("No nonlinear objective."),
1162+
MOI.eval_objective(evaluator, [1.0]),
1163+
)
1164+
g = [0.0]
1165+
@test_throws(
1166+
ErrorException("No nonlinear objective."),
1167+
MOI.eval_objective_gradient(evaluator, g, [1.0]),
1168+
)
1169+
return
1170+
end
1171+
1172+
function test_x_power_1()
1173+
model = Nonlinear.Model()
1174+
x = MOI.VariableIndex(1)
1175+
MOI.Nonlinear.set_objective(model, :($x^1))
1176+
evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x])
1177+
MOI.initialize(evaluator, [:Grad, :Hess])
1178+
@test MOI.eval_objective(evaluator, [2.0]) 2.0
1179+
H = [NaN]
1180+
MOI.eval_hessian_lagrangian(evaluator, H, [2.0], 1.5, Float64[])
1181+
@test H == [0.0]
1182+
return
1183+
end
1184+
1185+
function test_variable_first_node_in_tape()
1186+
model = Nonlinear.Model()
1187+
x = MOI.VariableIndex(1)
1188+
expr = MOI.Nonlinear.add_expression(model, :($x))
1189+
MOI.Nonlinear.set_objective(model, :(sin($expr)))
1190+
evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x])
1191+
MOI.initialize(evaluator, [:Grad, :Jac, :Hess])
1192+
H = [NaN]
1193+
MOI.eval_hessian_lagrangian(evaluator, H, [2.0], 1.5, [])
1194+
@test H [-1.5 * sin(2.0)]
1195+
return
1196+
end
1197+
1198+
function test_subexpression_first_node_in_tape()
1199+
model = Nonlinear.Model()
1200+
x = MOI.VariableIndex(1)
1201+
expr = MOI.Nonlinear.add_expression(model, :($x))
1202+
expr2 = MOI.Nonlinear.add_expression(model, :($expr))
1203+
MOI.Nonlinear.set_objective(model, :(sin($expr2)))
1204+
evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x])
1205+
MOI.initialize(evaluator, [:Grad, :Jac, :Hess])
1206+
H = [NaN]
1207+
MOI.eval_hessian_lagrangian(evaluator, H, [2.0], 1.5, [])
1208+
@test H [-1.5 * sin(2.0)]
1209+
return
1210+
end
1211+
1212+
function test_parameter_in_hessian()
1213+
model = Nonlinear.Model()
1214+
x = MOI.VariableIndex(1)
1215+
p = MOI.Nonlinear.add_parameter(model, 3.0)
1216+
MOI.Nonlinear.set_objective(model, :(sin($x + $p)))
1217+
evaluator = Nonlinear.Evaluator(model, Nonlinear.SparseReverseMode(), [x])
1218+
MOI.initialize(evaluator, [:Grad, :Jac, :Hess])
1219+
H = [NaN]
1220+
MOI.eval_hessian_lagrangian(evaluator, H, [2.0], 1.5, [])
1221+
@test H [-1.5 * sin(2.0 + 3.0)]
1222+
return
1223+
end
1224+
1225+
function test_unsafe_vector_view()
1226+
x = Float64[]
1227+
GC.@preserve x begin
1228+
view = MOI.Nonlinear.ReverseAD._UnsafeVectorView(x, 3)
1229+
@test length(x) == 3
1230+
view[2] = 1.0
1231+
@test x[2] == 1.0
1232+
end
1233+
return
1234+
end
1235+
11551236
end # module
11561237

11571238
TestReverseAD.runtests()

0 commit comments

Comments
 (0)