@@ -46,7 +46,7 @@ function test_single_variable_objective_forward()
4646 )
4747 @objective (model, Max, x[7 ])
4848 optimize! (model)
49- MOI . set (model, DiffOpt. ForwardObjectiveFunction () , sum (x))
49+ DiffOpt. set_forward_objective_function (model , sum (x))
5050 DiffOpt. forward_differentiate! (model)
5151 @test MOI. get (model, DiffOpt. ForwardVariablePrimal (), x[7 ]) ≈ 0 atol = ATOL
5252 return
@@ -69,7 +69,7 @@ function test_single_variable_objective_reverse()
6969 optimize! (model)
7070 MOI. set (model, DiffOpt. ReverseVariablePrimal (), x[7 ], 1.0 )
7171 DiffOpt. reverse_differentiate! (model)
72- func = MOI . get (model, DiffOpt. ReverseObjectiveFunction () )
72+ func = DiffOpt. get_reverse_objective_function (model )
7373 @test JuMP. coefficient (func, x[7 ]) ≈ 0.0 atol = ATOL rtol = RTOL
7474 return
7575end
@@ -113,11 +113,11 @@ function test_differentiating_trivial_qp_1()
113113 DiffOpt. reverse_differentiate! (model)
114114 DiffOpt. reverse_differentiate! (model)
115115 grad_constraint = JuMP. constant (
116- MOI . get (model, DiffOpt. ReverseConstraintFunction () , ctr_le[1 ]),
116+ DiffOpt. get_reverse_constraint_function (model , ctr_le[1 ]),
117117 )
118118 @test grad_constraint ≈ - 1.0 atol = ATOL rtol = RTOL
119119 # Test some overloads from https://github.com/jump-dev/DiffOpt.jl/issues/211
120- grad_obj = MOI . get (model, DiffOpt. ReverseObjectiveFunction () )
120+ grad_obj = DiffOpt. get_reverse_objective_function (model )
121121 @test JuMP. coefficient (grad_obj, x[1 ], x[2 ]) ≈
122122 DiffOpt. quad_sym_half .(grad_obj, x[1 ], x[2 ]) atol = ATOL rtol = RTOL
123123 @test DiffOpt. quad_sym_half (grad_obj, x[1 ], x[1 ]) ≈
@@ -720,6 +720,59 @@ function test_conic_feasibility()
720720 return
721721end
722722
723+ function test_psd_square ()
724+ # min -x s.t. [p-x 0; 0 x] ∈ PSD
725+ # PSD requires 0 ≤ x ≤ p, so x* = p = 1, dx/dp = 1
726+ model = DiffOpt. conic_diff_model (SCS. Optimizer)
727+ set_silent (model)
728+
729+ @variable (model, x)
730+ @variable (model, p in Parameter (1.0 ))
731+ @objective (model, Min, - x)
732+ @constraint (model, con, [p - x 0 ; 0 x] in PSDCone ())
733+
734+ optimize! (model)
735+ @test is_solved_and_feasible (model)
736+ @test value (x) ≈ 1.0 atol = ATOL rtol = RTOL
737+
738+ DiffOpt. set_forward_parameter (model, p, 1.0 )
739+ DiffOpt. forward_differentiate! (model)
740+ @test DiffOpt. get_forward_variable (model, x) ≈ 1.0 atol = ATOL rtol = RTOL
741+ @test DiffOpt. get_forward_objective (model) ≈ - 1.0 atol = ATOL rtol = RTOL
742+
743+ DiffOpt. empty_input_sensitivities! (model)
744+ DiffOpt. set_reverse_objective (model, 1.0 )
745+ DiffOpt. reverse_differentiate! (model)
746+ @test DiffOpt. get_reverse_parameter (model, p) ≈ - 1.0 atol = ATOL rtol = RTOL
747+ return
748+ end
749+
750+ function test_nlp_forward_constraint_dual ()
751+ # min 2x² + y² + xy + x + y s.t. x + y == p, x ≥ 0, y ≥ 0
752+ # KKT gives x = p/4, y = 3p/4, dual = 7p/4 + 1
753+ # At p=1: dx/dp = 1/4, dy/dp = 3/4, d(dual)/dp = 7/4
754+ model = DiffOpt. nonlinear_diff_model (Ipopt. Optimizer)
755+ set_silent (model)
756+
757+ @variable (model, x >= 0 )
758+ @variable (model, y >= 0 )
759+ @variable (model, p in Parameter (1.0 ))
760+
761+ @constraint (model, c1, x + y == p)
762+ @objective (model, Min, 2 x^ 2 + y^ 2 + x * y + x + y)
763+ optimize! (model)
764+ @test value (x) ≈ 0.25 atol = ATOL rtol = RTOL
765+ @test value (y) ≈ 0.75 atol = ATOL rtol = RTOL
766+
767+ DiffOpt. set_forward_parameter (model, p, 1.0 )
768+ DiffOpt. forward_differentiate! (model)
769+ @test DiffOpt. get_forward_variable (model, x) ≈ 0.25 atol = ATOL rtol = RTOL
770+ @test DiffOpt. get_forward_variable (model, y) ≈ 0.75 atol = ATOL rtol = RTOL
771+ @test DiffOpt. get_forward_constraint_dual (model, c1) ≈ 1.75 atol = ATOL rtol = RTOL
772+ @test DiffOpt. get_forward_objective (model) ≈ 2.75 atol = ATOL rtol = RTOL
773+ return
774+ end
775+
723776end # module
724777
725778TestJuMP. runtests ()
0 commit comments