@@ -29,6 +29,103 @@ function runtests()
2929 return
3030end
3131
32+ function test_obj ()
33+
34+ for (MODEL, SOLVER) in [
35+ (DiffOpt. diff_model, HiGHS. Optimizer),
36+ # (DiffOpt.diff_model, SCS.Optimizer),
37+ # (DiffOpt.diff_model, Ipopt.Optimizer),
38+ # (DiffOpt.quadratic_diff_model, HiGHS.Optimizer),
39+ # (DiffOpt.quadratic_diff_model, SCS.Optimizer),
40+ # (DiffOpt.quadratic_diff_model, Ipopt.Optimizer),
41+ # (DiffOpt.conic_diff_model, HiGHS.Optimizer),
42+ # (DiffOpt.conic_diff_model, SCS.Optimizer),
43+ # (DiffOpt.conic_diff_model, Ipopt.Optimizer),
44+ # (DiffOpt.nonlinear_diff_model, HiGHS.Optimizer),
45+ # (DiffOpt.nonlinear_diff_model, SCS.Optimizer),
46+ # (DiffOpt.nonlinear_diff_model, Ipopt.Optimizer),
47+ ],
48+ # ineq in [true, false],
49+ # _min in [true, false],
50+ # flip in [true, false],
51+ with_bridge_type in [Float64, nothing ]
52+
53+ if isnothing (with_bridge_type) && SOLVER === SCS. Optimizer
54+ continue
55+ end
56+
57+
58+ MODEL = DiffOpt. diff_model
59+ SOLVER = HiGHS. Optimizer
60+ with_bridge_type = Float64
61+ ineq = false
62+ _min = true
63+ flip = false
64+
65+ @testset " $(MODEL) with: $(SOLVER) , $(ineq ? " ineqs" : " eqs" ) , $(_min ? " Min" : " Max" ) , $(flip ? " geq" : " leq" ) bridge:$with_bridge_type " begin
66+ model = MODEL (SOLVER; with_bridge_type)
67+ set_silent (model)
68+
69+ p_val = 4.0
70+ pc_val = 2.0
71+ @variable (model, x)
72+ @variable (model, p in Parameter (p_val))
73+ @variable (model, pc in Parameter (pc_val))
74+ # if ineq
75+ # if !flip
76+ # cons = @constraint(model, con, pc * x >= 3 * p)
77+ # else
78+ # cons = @constraint(model, con, pc * x <= 3 * p)
79+ # end
80+ # else
81+ cons = @constraint (model, con, pc * x == 3 * p)
82+ # end
83+ # sign = flip ? -1 : 1
84+ # if _min
85+ # @objective(model, Min, 2x * sign)
86+ # else
87+ # @objective(model, Max, -2x * sign)
88+ # end
89+
90+ for obj_coef in [- 3 , 2 , 5 ]
91+ @objective (model, Min, obj_coef * x)
92+
93+ optimize! (model)
94+ @test value (x) ≈ 3 * p_val / pc_val atol = ATOL rtol = RTOL
95+
96+ DiffOpt. empty_input_sensitivities! (model)
97+ direction_obj = 2.0
98+ DiffOpt. set_reverse_objective (model, direction_obj)
99+ DiffOpt. reverse_differentiate! (model)
100+ @test DiffOpt. get_reverse_parameter (model, p) ≈ obj_coef * direction_obj * 3 / pc_val atol = ATOL rtol = RTOL
101+ @test DiffOpt. get_reverse_parameter (model, pc) ≈ - obj_coef * direction_obj * 3 * p_val / (pc_val^ 2 ) atol = ATOL rtol = RTOL
102+
103+ DiffOpt. empty_input_sensitivities! (model)
104+ direction_p = 3.0
105+ DiffOpt. set_forward_parameter (model, p, direction_p)
106+ DiffOpt. forward_differentiate! (model)
107+ @test DiffOpt. get_forward_objective (model) ≈ obj_coef * direction_p * 3 / pc_val atol = ATOL rtol = RTOL
108+
109+ # stop differentiating with respect to p
110+ DiffOpt. empty_input_sensitivities! (model)
111+ # differentiate w.r.t. pc
112+ direction_pc = 10.0
113+ DiffOpt. set_forward_parameter (model, pc, direction_pc)
114+ DiffOpt. forward_differentiate! (model)
115+ @test DiffOpt. get_forward_objective (model) ≈
116+ - obj_coef * direction_pc * 3 * p_val / pc_val^ 2 atol = ATOL rtol = RTOL
117+
118+ end
119+
120+
121+ end
122+ end
123+
124+ return
125+ end
126+
127+ # TODO test quadratic obj
128+
32129function test_jump_api ()
33130 for (MODEL, SOLVER) in [
34131 (DiffOpt. diff_model, HiGHS. Optimizer),
0 commit comments