@@ -1304,6 +1304,33 @@ function test_toposort_subexpressions()
13041304 return
13051305end
13061306
1307+ function test_eval_user_defined_operator_ForwardDiff_gradient! ()
1308+ model = MOI. Nonlinear. Model ()
1309+ x = MOI. VariableIndex .(1 : 4 )
1310+ p = MOI. Nonlinear. add_parameter (model, 2.0 )
1311+ ex = MOI. Nonlinear. add_expression (model, :($ p * $ (x[1 ])))
1312+ ψ (x) = sin (x)
1313+ t (x, y) = x + 3 y
1314+ MOI. Nonlinear. register_operator (model, :ψ , 1 , ψ)
1315+ MOI. Nonlinear. register_operator (model, :t , 2 , t)
1316+ MOI. Nonlinear. add_constraint (
1317+ model,
1318+ :($ ex^ 3 + sin ($ (x[2 ])) / ψ ($ (x[2 ])) + t ($ (x[3 ]), $ (x[4 ]))),
1319+ MOI. LessThan (0.0 ),
1320+ )
1321+ d = MOI. Nonlinear. Evaluator (model, MOI. Nonlinear. SparseReverseMode (), x)
1322+ MOI. initialize (d, [:Jac ])
1323+ X = [1.1 , 1.2 , 1.3 , 1.4 ]
1324+ g = [NaN ]
1325+ MOI. eval_constraint (d, g, X)
1326+ @test only (g) ≈ 17.148
1327+ @test MOI. jacobian_structure (d) == [(1 , 1 ), (1 , 2 ), (1 , 3 ), (1 , 4 )]
1328+ J = [NaN , NaN , NaN , NaN ]
1329+ MOI. eval_constraint_jacobian (d, J, X)
1330+ @test J ≈ [2.0 ^ 3 * 3.0 * 1.1 ^ 2 , 0.0 , 1.0 , 3.0 ]
1331+ return
1332+ end
1333+
13071334end # module
13081335
13091336TestReverseAD. runtests ()
0 commit comments