@@ -374,6 +374,28 @@ function test_eval_univariate_function()
374374 return
375375end
376376
377+ function test_eval_univariate_missing_hessian ()
378+ r = Nonlinear. OperatorRegistry ()
379+ x = 2.0
380+ @test Nonlinear. eval_univariate_function (r, :asec , x) ≈ asec (x)
381+ @test Nonlinear. eval_univariate_gradient (r, :asec , x) ≈
382+ 1 / (abs (x) * sqrt (x^ 2 - 1 ))
383+ @test_throws (
384+ ErrorException (" Hessian is not defined for operator asec" ),
385+ Nonlinear. eval_univariate_hessian (r, :asec , x),
386+ )
387+ return
388+ end
389+
390+ function test_eval_univariate_hessian_bad_id ()
391+ r = Nonlinear. OperatorRegistry ()
392+ err = ErrorException (" Invalid id for univariate operator: -1" )
393+ @test_throws err Nonlinear. eval_univariate_function (r, - 1 , 1.0 )
394+ @test_throws err Nonlinear. eval_univariate_gradient (r, - 1 , 1.0 )
395+ @test_throws err Nonlinear. eval_univariate_hessian (r, - 1 , 1.0 )
396+ return
397+ end
398+
377399function test_eval_univariate_gradient ()
378400 r = Nonlinear. OperatorRegistry ()
379401 for (op, x, y) in [
@@ -594,7 +616,29 @@ function test_eval_multivariate_gradient_mult()
594616 x = [1.1 , 0.0 , 2.2 ]
595617 g = zeros (3 )
596618 Nonlinear. eval_multivariate_gradient (r, :* , g, x)
597- @test g == [0.0 , 1.1 * 2.2 , 0.0 ]
619+ @test g ≈ [0.0 , 1.1 * 2.2 , 0.0 ]
620+ x = [1.1 , 3.3 , 2.2 ]
621+ Nonlinear. eval_multivariate_gradient (r, :* , g, x)
622+ @test g ≈ [3.3 * 2.2 , 1.1 * 2.2 , 1.1 * 3.3 ]
623+ return
624+ end
625+
626+ function test_eval_multivariate_gradient_univariate_mult ()
627+ r = Nonlinear. OperatorRegistry ()
628+ x = [1.1 ]
629+ g = zeros (1 )
630+ Nonlinear. eval_multivariate_gradient (r, :* , g, x)
631+ @test g == [1.0 ]
632+ return
633+ end
634+
635+ function test_eval_multivariate_hessian_shortcut ()
636+ r = Nonlinear. OperatorRegistry ()
637+ x = [1.1 ]
638+ H = LinearAlgebra. LowerTriangular (zeros (1 , 1 ))
639+ for op in (:+ , :- , :ifelse )
640+ @test ! MOI. Nonlinear. eval_multivariate_hessian (r, op, H, x)
641+ end
598642 return
599643end
600644
@@ -670,6 +714,18 @@ function test_eval_multivariate_function_registered()
670714 return
671715end
672716
717+ function test_eval_multivariate_function_registered_log ()
718+ r = Nonlinear. OperatorRegistry ()
719+ f (x... ) = log (x[1 ] - 1 )
720+ Nonlinear. register_operator (r, :f , 2 , f)
721+ x = [1.1 , 2.2 ]
722+ @test Nonlinear. eval_multivariate_function (r, :f , x) ≈ f (x... )
723+ x = [0.0 , 0.0 ]
724+ g = zeros (2 )
725+ @test_throws DomainError Nonlinear. eval_multivariate_gradient (r, :f , g, x)
726+ return
727+ end
728+
673729function test_eval_multivariate_function_method_error ()
674730 r = Nonlinear. OperatorRegistry ()
675731 function f (x... )
@@ -1327,6 +1383,27 @@ function test_convert_to_expr()
13271383 return
13281384end
13291385
1386+ function test_create_binary_switch ()
1387+ target = Expr (
1388+ :if ,
1389+ Expr (:call , :(<= ), :id , 2 ),
1390+ Expr (
1391+ :if ,
1392+ Expr (:call , :(== ), :id , 1 ),
1393+ :a ,
1394+ Expr (:if , Expr (:call , :(== ), :id , 2 ), :b ),
1395+ ),
1396+ Expr (
1397+ :if ,
1398+ Expr (:call , :(== ), :id , 3 ),
1399+ :c ,
1400+ Expr (:if , Expr (:call , :(== ), :id , 4 ), :d ),
1401+ ),
1402+ )
1403+ @test MOI. Nonlinear. _create_binary_switch (1 : 4 , [:a , :b , :c , :d ]) == target
1404+ return
1405+ end
1406+
13301407end # TestNonlinear
13311408
13321409TestNonlinear. runtests ()
0 commit comments