@@ -1152,6 +1152,87 @@ function test_univariate_operator_with_no_second_order()
11521152 return
11531153end
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+
11551236end # module
11561237
11571238TestReverseAD. runtests ()
0 commit comments