Skip to content

Commit df3eb6c

Browse files
committed
add tests
1 parent b6895fa commit df3eb6c

1 file changed

Lines changed: 57 additions & 4 deletions

File tree

test/jump.jl

Lines changed: 57 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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
7575
end
@@ -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
721721
end
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, 2x^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+
723776
end # module
724777

725778
TestJuMP.runtests()

0 commit comments

Comments
 (0)