@@ -6,6 +6,7 @@ using Ipopt
6
6
using Test
7
7
using FiniteDiff
8
8
import DelimitedFiles
9
+ using SparseArrays
9
10
10
11
include (joinpath (@__DIR__ , " data/nlp_problems.jl" ))
11
12
@@ -674,6 +675,64 @@ function test_differentiating_non_trivial_convex_qp_jump()
674
675
return
675
676
end
676
677
678
+ function test_changing_factorization ()
679
+ P = 2
680
+ m = Model (
681
+ () -> DiffOpt. diff_optimizer (
682
+ Ipopt. Optimizer;
683
+ with_parametric_opt_interface = false ,
684
+ ),
685
+ )
686
+
687
+ @variable (m, x[1 : P])
688
+ @constraint (m, x .≥ 0 )
689
+ @constraint (m, x .≤ 1 )
690
+ @variable (m, p[1 : P] ∈ Parameter .(0.5 ))
691
+
692
+ @constraint (m, x .≥ p)
693
+
694
+ @objective (m, Min, sum (x))
695
+
696
+ optimize! (m)
697
+ @assert is_solved_and_feasible (m)
698
+
699
+ # Set pertubations
700
+ Δp = [0.1 for _ in 1 : P]
701
+ MOI. set .(
702
+ m,
703
+ DiffOpt. ForwardConstraintSet (),
704
+ ParameterRef .(p),
705
+ Parameter .(Δp),
706
+ )
707
+
708
+ # wrong type
709
+ @test_throws MethodError MOI. set (m, DiffOpt. MFactorization (), 2 )
710
+
711
+ # correct type but wrong number of arguments
712
+ MOI. set (m, DiffOpt. MFactorization (), SparseArrays. lu)
713
+
714
+ @test_throws MethodError DiffOpt. forward_differentiate! (m)
715
+
716
+ # correct type and correct number of arguments
717
+ MOI. set (m, DiffOpt. MFactorization (), (M, num_w, num_constraints) -> SparseArrays. lu (M))
718
+
719
+ # Compute derivatives
720
+ DiffOpt. forward_differentiate! (m)
721
+
722
+ # Test sensitivities
723
+ @test all (
724
+ isapprox (
725
+ [
726
+ MOI. get (m, DiffOpt. ForwardVariablePrimal (), x[i]) for
727
+ i in 1 : P
728
+ ],
729
+ [0.1 for _ in 1 : P];
730
+ atol = 1e-8 ,
731
+ ),
732
+ )
733
+ end
734
+
735
+
677
736
end # module
678
737
679
738
TestNLPProgram. runtests ()
0 commit comments