Skip to content

Commit 69dc67a

Browse files
update tests
1 parent a3fe85a commit 69dc67a

File tree

2 files changed

+127
-2
lines changed

2 files changed

+127
-2
lines changed

src/NonLinearProgram/nlp_utilities.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ function compute_solution_and_bounds(model::Model; tol = 1e-6)
197197
s_geq =
198198
[model.s[con.value] for con in model_cons_geq] - [form.geq_values[con] for con in model_cons_geq]
199199
primal_idx = [i.value for i in model.cache.primal_vars]
200-
X = [model.x[primal_idx]; s_leq; s_geq]
200+
X = [model.x[primal_idx]; s_geq; s_leq]
201201

202202
# value and dual of the lower bounds
203203
V_L = spzeros(num_vars + num_ineq)
@@ -347,7 +347,7 @@ function build_sensitivity_matrices(
347347
A[j, num_vars+i] = -1
348348
end
349349
for (i, j) in enumerate(leq_locations)
350-
A[j, num_vars+i] = -1
350+
A[j, num_vars+length(geq_locations)+i] = -1
351351
end
352352
# Partial second derivative of the lagrangian wrt primal solution and parameters
353353
∇ₓₚL = spzeros(num_vars + num_ineq, num_parms)

test/nlp_program.jl

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,131 @@ end
116116
=#
117117
################################################
118118

119+
function test_analytical_simple(; P = 2) # Number of parameters
120+
@testset "Bounds Bounds" begin
121+
m = Model(() -> DiffOpt.diff_optimizer(Ipopt.Optimizer, with_parametric_opt_interface=false))
122+
123+
@variable(m, 0 x[1:P] 1)
124+
@variable(m, p[1:P] Parameter.(0.5))
125+
126+
@constraint(m, x .≥ p)
127+
128+
@objective(m, Min, sum(x))
129+
130+
optimize!(m)
131+
@assert is_solved_and_feasible(m)
132+
133+
# Set pertubations
134+
Δp = [0.1 for _ in 1:P]
135+
MOI.set.(m, DiffOpt.ForwardConstraintSet(), ParameterRef.(p), Parameter.(Δp))
136+
137+
# Compute derivatives
138+
DiffOpt.forward_differentiate!(m)
139+
140+
# Test sensitivities
141+
@test all(
142+
isapprox(
143+
[MOI.get(m, DiffOpt.ForwardVariablePrimal(), x[i]) for i in 1:P],
144+
[0.1 for _ in 1:P],
145+
atol = 1e-8,
146+
),
147+
)
148+
end
149+
@testset "Bounds as RHS constraints" begin
150+
m = Model(() -> DiffOpt.diff_optimizer(Ipopt.Optimizer, with_parametric_opt_interface=false))
151+
152+
@variable(m, x[1:P])
153+
@constraint(m, x .≥ 0)
154+
@constraint(m, x .≤ 1)
155+
@variable(m, p[1:P] Parameter.(0.5))
156+
157+
@constraint(m, x .≥ p)
158+
159+
@objective(m, Min, sum(x))
160+
161+
optimize!(m)
162+
@assert is_solved_and_feasible(m)
163+
164+
# Set pertubations
165+
Δp = [0.1 for _ in 1:P]
166+
MOI.set.(m, DiffOpt.ForwardConstraintSet(), ParameterRef.(p), Parameter.(Δp))
167+
168+
# Compute derivatives
169+
DiffOpt.forward_differentiate!(m)
170+
171+
# Test sensitivities
172+
@test all(
173+
isapprox(
174+
[MOI.get(m, DiffOpt.ForwardVariablePrimal(), x[i]) for i in 1:P],
175+
[0.1 for _ in 1:P],
176+
atol = 1e-8,
177+
),
178+
)
179+
end
180+
@testset "Bounds as Mixed constraints" begin
181+
m = Model(() -> DiffOpt.diff_optimizer(Ipopt.Optimizer, with_parametric_opt_interface=false))
182+
183+
@variable(m, x[1:P])
184+
@constraint(m, 0 .≤ x)
185+
@constraint(m, x .≤ 1)
186+
@variable(m, p[1:P] Parameter.(0.5))
187+
188+
@constraint(m, x .≥ p)
189+
190+
@objective(m, Min, sum(x))
191+
192+
optimize!(m)
193+
@assert is_solved_and_feasible(m)
194+
195+
# Set pertubations
196+
Δp = [0.1 for _ in 1:P]
197+
MOI.set.(m, DiffOpt.ForwardConstraintSet(), ParameterRef.(p), Parameter.(Δp))
198+
199+
# Compute derivatives
200+
DiffOpt.forward_differentiate!(m)
201+
202+
# Test sensitivities
203+
@test all(
204+
isapprox(
205+
[MOI.get(m, DiffOpt.ForwardVariablePrimal(), x[i]) for i in 1:P],
206+
[0.1 for _ in 1:P],
207+
atol = 1e-8,
208+
),
209+
)
210+
end
211+
@testset "Bounds as LHS constraints" begin
212+
m = Model(() -> DiffOpt.diff_optimizer(Ipopt.Optimizer, with_parametric_opt_interface=false))
213+
214+
@variable(m, x[1:P])
215+
@constraint(m, 0 .≤ x)
216+
@constraint(m, 1 .≥ x)
217+
@variable(m, p[1:P] Parameter.(0.5))
218+
219+
@constraint(m, x .≥ p)
220+
221+
@objective(m, Min, sum(x))
222+
223+
optimize!(m)
224+
@assert is_solved_and_feasible(m)
225+
226+
# Set pertubations
227+
Δp = [0.1 for _ in 1:P]
228+
MOI.set.(m, DiffOpt.ForwardConstraintSet(), ParameterRef.(p), Parameter.(Δp))
229+
230+
# Compute derivatives
231+
DiffOpt.forward_differentiate!(m)
232+
233+
# Test sensitivities
234+
@test all(
235+
isapprox(
236+
[MOI.get(m, DiffOpt.ForwardVariablePrimal(), x[i]) for i in 1:P],
237+
[0.1 for _ in 1:P],
238+
atol = 1e-8,
239+
),
240+
)
241+
end
242+
end
243+
119244
# f(x, p) = 0
120245
# x = g(p)
121246
# ∂x/∂p = ∂g/∂p

0 commit comments

Comments
 (0)