@@ -374,6 +374,28 @@ function test_eval_univariate_function()
374
374
return
375
375
end
376
376
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
+
377
399
function test_eval_univariate_gradient ()
378
400
r = Nonlinear. OperatorRegistry ()
379
401
for (op, x, y) in [
@@ -594,7 +616,29 @@ function test_eval_multivariate_gradient_mult()
594
616
x = [1.1 , 0.0 , 2.2 ]
595
617
g = zeros (3 )
596
618
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
598
642
return
599
643
end
600
644
@@ -670,6 +714,18 @@ function test_eval_multivariate_function_registered()
670
714
return
671
715
end
672
716
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
+
673
729
function test_eval_multivariate_function_method_error ()
674
730
r = Nonlinear. OperatorRegistry ()
675
731
function f (x... )
@@ -1327,6 +1383,27 @@ function test_convert_to_expr()
1327
1383
return
1328
1384
end
1329
1385
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
+
1330
1407
end # TestNonlinear
1331
1408
1332
1409
TestNonlinear. runtests ()
0 commit comments