@@ -1233,6 +1233,77 @@ function test_unsafe_vector_view()
1233
1233
return
1234
1234
end
1235
1235
1236
+ function test_classify_linearity_ifelse ()
1237
+ x = MOI. VariableIndex (1 )
1238
+ y = MOI. VariableIndex (2 )
1239
+ model = MOI. Nonlinear. Model ()
1240
+ MOI. Nonlinear. set_objective (model, :(ifelse ($ y, $ x, 1 )))
1241
+ evaluator = MOI. Nonlinear. Evaluator (
1242
+ model,
1243
+ MOI. Nonlinear. SparseReverseMode (),
1244
+ [x, y],
1245
+ )
1246
+ MOI. initialize (evaluator, [:Grad , :Jac , :Hess ])
1247
+ @test MOI. eval_objective (evaluator, [1.2 , 1.0 ]) == 1.2
1248
+ @test MOI. eval_objective (evaluator, [1.2 , 0.0 ]) == 1.0
1249
+ @test isempty (MOI. hessian_lagrangian_structure (evaluator))
1250
+ return
1251
+ end
1252
+
1253
+ function test_classify_linearity_logic ()
1254
+ x = MOI. VariableIndex (1 )
1255
+ y = MOI. VariableIndex (2 )
1256
+ model = MOI. Nonlinear. Model ()
1257
+ MOI. Nonlinear. set_objective (model, :($ x && $ y))
1258
+ evaluator = MOI. Nonlinear. Evaluator (
1259
+ model,
1260
+ MOI. Nonlinear. SparseReverseMode (),
1261
+ [x, y],
1262
+ )
1263
+ MOI. initialize (evaluator, [:Grad , :Jac , :Hess ])
1264
+ @test MOI. eval_objective (evaluator, [1.0 , 1.0 ]) == 1.0
1265
+ @test MOI. eval_objective (evaluator, [0.0 , 1.0 ]) == 0.0
1266
+ @test MOI. eval_objective (evaluator, [1.0 , 0.0 ]) == 0.0
1267
+ @test MOI. eval_objective (evaluator, [0.0 , 0.0 ]) == 0.0
1268
+ @test isempty (MOI. hessian_lagrangian_structure (evaluator))
1269
+ return
1270
+ end
1271
+
1272
+ function test_hessian_sparsity_with_subexpressions ()
1273
+ x = MOI. VariableIndex (1 )
1274
+ y = MOI. VariableIndex (2 )
1275
+ model = MOI. Nonlinear. Model ()
1276
+ expr = MOI. Nonlinear. add_expression (model, :($ x * $ y))
1277
+ expr2 = MOI. Nonlinear. add_expression (model, :($ expr))
1278
+ MOI. Nonlinear. set_objective (model, :(sin ($ expr2)))
1279
+ evaluator = MOI. Nonlinear. Evaluator (
1280
+ model,
1281
+ MOI. Nonlinear. SparseReverseMode (),
1282
+ [x, y],
1283
+ )
1284
+ MOI. initialize (evaluator, [:Grad , :Jac , :Hess ])
1285
+ MOI. hessian_lagrangian_structure (evaluator)
1286
+ return
1287
+ end
1288
+
1289
+ function test_toposort_subexpressions ()
1290
+ x = MOI. VariableIndex (1 )
1291
+ model = MOI. Nonlinear. Model ()
1292
+ a = MOI. Nonlinear. add_expression (model, :($ x))
1293
+ b = MOI. Nonlinear. add_expression (model, :($ x))
1294
+ c = MOI. Nonlinear. add_expression (model, :($ a + $ b))
1295
+ d = MOI. Nonlinear. add_expression (model, :($ c + $ b))
1296
+ MOI. Nonlinear. add_constraint (model, :($ d), MOI. LessThan (1.0 ))
1297
+ MOI. Nonlinear. add_constraint (model, :($ c), MOI. LessThan (1.0 ))
1298
+ evaluator =
1299
+ MOI. Nonlinear. Evaluator (model, MOI. Nonlinear. SparseReverseMode (), [x])
1300
+ MOI. initialize (evaluator, [:Grad , :Jac , :Hess ])
1301
+ g = [NaN , NaN ]
1302
+ MOI. eval_constraint (evaluator, g, [2.0 ])
1303
+ @test g == [6.0 , 4.0 ]
1304
+ return
1305
+ end
1306
+
1236
1307
end # module
1237
1308
1238
1309
TestReverseAD. runtests ()
0 commit comments