Skip to content

Commit 6244d2e

Browse files
Merge pull request #1943 from ValentinKaisermayer/vk-makes-cons_j-and-cons_h-optional
Makes cons_h and cons_j optional
2 parents 3257ea0 + bce903a commit 6244d2e

File tree

3 files changed

+42
-18
lines changed

3 files changed

+42
-18
lines changed

docs/src/tutorials/optimization.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ u0 = [
6666
x => 1.0
6767
y => 2.0
6868
]
69-
prob = OptimizationProblem(sys, u0, grad=true, hess=true)
69+
prob = OptimizationProblem(sys, u0, grad=true, hess=true, cons_j=true, cons_h=true)
7070
solve(prob, IPNewton())
7171
```
7272

src/systems/optimization/optimizationsystem.jl

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
207207
lb = nothing, ub = nothing,
208208
grad = false,
209209
hess = false, sparse = false,
210+
cons_j = false, cons_h = false,
210211
checkbounds = false,
211212
linenumbers = true, parallel = SerialForm(),
212213
use_union = false,
@@ -308,9 +309,16 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
308309
cons, lcons_, ucons_ = generate_function(cons_sys, checkbounds = checkbounds,
309310
linenumbers = linenumbers,
310311
expression = Val{false})
311-
cons_j = generate_jacobian(cons_sys; expression = Val{false}, sparse = sparse)[2]
312-
cons_h = generate_hessian(cons_sys; expression = Val{false}, sparse = sparse)[2]
313-
312+
if cons_j
313+
_cons_j = generate_jacobian(cons_sys; expression = Val{false}, sparse = sparse)[2]
314+
else
315+
_cons_j = nothing
316+
end
317+
if cons_h
318+
_cons_h = generate_hessian(cons_sys; expression = Val{false}, sparse = sparse)[2]
319+
else
320+
_cons_h = nothing
321+
end
314322
cons_expr = toexpr.(subs_constants(constraints(cons_sys)))
315323
rep_pars_vals!.(cons_expr, Ref(pairs_arr))
316324

@@ -344,8 +352,8 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
344352
syms = Symbol.(states(sys)),
345353
paramsyms = Symbol.(parameters(sys)),
346354
cons = cons[2],
347-
cons_j = cons_j,
348-
cons_h = cons_h,
355+
cons_j = _cons_j,
356+
cons_h = _cons_h,
349357
cons_jac_prototype = cons_jac_prototype,
350358
cons_hess_prototype = cons_hess_prototype,
351359
expr = obj_expr,
@@ -396,6 +404,7 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0map,
396404
lb = nothing, ub = nothing,
397405
grad = false,
398406
hess = false, sparse = false,
407+
cons_j = false, cons_h = false,
399408
checkbounds = false,
400409
linenumbers = false, parallel = SerialForm(),
401410
use_union = false,
@@ -477,8 +486,16 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0map,
477486
cons, lcons_, ucons_ = generate_function(cons_sys, checkbounds = checkbounds,
478487
linenumbers = linenumbers,
479488
expression = Val{false})
480-
cons_j = generate_jacobian(cons_sys; expression = Val{false}, sparse = sparse)[2]
481-
cons_h = generate_hessian(cons_sys; expression = Val{false}, sparse = sparse)[2]
489+
if cons_j
490+
_cons_j = generate_jacobian(cons_sys; expression = Val{false}, sparse = sparse)[2]
491+
else
492+
_cons_j = nothing
493+
end
494+
if cons_h
495+
_cons_h = generate_hessian(cons_sys; expression = Val{false}, sparse = sparse)[2]
496+
else
497+
_cons_h = nothing
498+
end
482499

483500
cons_expr = toexpr.(subs_constants(constraints(cons_sys)))
484501
rep_pars_vals!.(cons_expr, Ref(pairs_arr))
@@ -517,8 +534,8 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0map,
517534
cons = $cons[1]
518535
lcons = $lcons
519536
ucons = $ucons
520-
cons_j = $cons_j
521-
cons_h = $cons_h
537+
cons_j = $_cons_j
538+
cons_h = $_cons_h
522539
syms = $(Symbol.(states(sys)))
523540
paramsyms = $(Symbol.(parameters(sys)))
524541
_f = OptimizationFunction{iip}(f, SciMLBase.NoAD();

test/optimizationsystem.jl

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ using ModelingToolkit: get_metadata
4242
sys2.b => 9.0
4343
β => 10.0]
4444

45-
prob = OptimizationProblem(combinedsys, u0, p, grad = true, hess = true)
45+
prob = OptimizationProblem(combinedsys, u0, p, grad = true, hess = true, cons_j = true,
46+
cons_h = true)
4647
@test prob.f.sys === combinedsys
4748
sol = solve(prob, Ipopt.Optimizer(); print_level = 0)
4849
@test sol.minimum < -1e5
@@ -58,12 +59,15 @@ end
5859
@named sys = OptimizationSystem(loss, [x, y], [a, b], constraints = cons)
5960

6061
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0], [a => 1.0, b => 1.0],
61-
grad = true, hess = true)
62+
grad = true, hess = true, cons_j = true, cons_h = true)
6263
@test prob.f.sys === sys
6364
sol = solve(prob, IPNewton())
6465
@test sol.minimum < 1.0
6566
sol = solve(prob, Ipopt.Optimizer(); print_level = 0)
6667
@test sol.minimum < 1.0
68+
69+
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0], [a => 1.0, b => 1.0],
70+
grad = false, hess = false, cons_j = false, cons_h = false)
6771
sol = solve(prob, AmplNLWriter.Optimizer(Ipopt_jll.amplexe))
6872
@test sol.minimum < 1.0
6973
end
@@ -77,7 +81,7 @@ end
7781
@named sys = OptimizationSystem(loss, [x, y, z], [a, b], constraints = cons)
7882
sys = structural_simplify(sys)
7983
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0, z => 0.0], [a => 1.0, b => 1.0],
80-
grad = true, hess = true)
84+
grad = true, hess = true, cons_j = true, cons_h = true)
8185
sol = solve(prob, IPNewton())
8286
@test sol.minimum < 1.0
8387
@test sol.u[0.808, -0.064] atol=1e-3
@@ -86,6 +90,9 @@ end
8690
@test sol.minimum < 1.0
8791
@test sol.u[0.808, -0.064] atol=1e-3
8892
@test sol[x]^2 + sol[y]^2 1.0
93+
94+
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0, z => 0.0], [a => 1.0, b => 1.0],
95+
grad = false, hess = false, cons_j = false, cons_h = false)
8996
sol = solve(prob, AmplNLWriter.Optimizer(Ipopt_jll.amplexe))
9097
@test sol.minimum < 1.0
9198
@test sol.u[0.808, -0.064] atol=1e-3
@@ -178,13 +185,14 @@ end
178185
sys2.b => 9.0
179186
β => 10.0]
180187

181-
prob = OptimizationProblem(combinedsys, u0, p, grad = true, hess = true)
188+
prob = OptimizationProblem(combinedsys, u0, p, grad = true, hess = true, cons_j = true,
189+
cons_h = true)
182190
@test prob.f.sys === combinedsys
183191
sol = solve(prob, Ipopt.Optimizer(); print_level = 0)
184192
@test sol.minimum < -1e5
185193

186194
prob = OptimizationProblem(sys2, [x => 0.0, y => 0.0], [a => 1.0, b => 100.0],
187-
grad = true, hess = true)
195+
grad = true, hess = true, cons_j = true, cons_h = true)
188196
@test prob.f.sys === sys2
189197
sol = solve(prob, IPNewton())
190198
@test sol.minimum < 1.0
@@ -213,7 +221,7 @@ end
213221
])
214222

215223
prob = OptimizationProblem(sys, [x[1] => 2.0, x[2] => 0.0], [], grad = true,
216-
hess = true)
224+
hess = true, cons_j = true, cons_h = true)
217225
sol = Optimization.solve(prob, Ipopt.Optimizer(); print_level = 0)
218226
@test sol.u [1, 0]
219227
@test prob.lb == [0.0, 0.0]
@@ -226,8 +234,7 @@ end
226234
@parameters a b
227235
loss = (a - x)^2 + b * (y - x^2)^2
228236
@named sys = OptimizationSystem(loss, [x, y], [a, b, c])
229-
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0], [a => 1.0, b => 100.0],
230-
grad = true, hess = true)
237+
prob = OptimizationProblem(sys, [x => 0.0, y => 0.0], [a => 1.0, b => 100.0])
231238
@test prob.lb == [-Inf, 0.0]
232239
@test prob.ub == [Inf, Inf]
233240
end

0 commit comments

Comments
 (0)