@@ -26,8 +26,7 @@ struct OptimizationSystem <: AbstractTimeIndependentSystem
26
26
""" Array variables."""
27
27
var_to_name:: Any
28
28
observed:: Vector{Equation}
29
- equality_constraints:: Vector{Equation}
30
- inequality_constraints:: Vector
29
+ constraints:: Vector
31
30
"""
32
31
Name: the name of the system. These are required to have unique names.
33
32
"""
@@ -41,24 +40,22 @@ struct OptimizationSystem <: AbstractTimeIndependentSystem
41
40
parameters are not supplied in `ODEProblem`.
42
41
"""
43
42
defaults:: Dict
44
- function OptimizationSystem (op, states, ps, var_to_name, observed, equality_constraints,
45
- inequality_constraints , name, systems, defaults;
43
+ function OptimizationSystem (op, states, ps, var_to_name, observed,
44
+ constraints , name, systems, defaults;
46
45
checks:: Bool = true )
47
46
if checks
48
47
check_units (op)
49
48
check_units (observed)
50
- check_units (equality_constraints)
51
- all_dimensionless ([states; ps]) || check_units (inequality_constraints)
49
+ all_dimensionless ([states; ps]) || check_units (constraints)
52
50
end
53
- new (op, states, ps, var_to_name, observed, equality_constraints,
54
- inequality_constraints , name, systems, defaults)
51
+ new (op, states, ps, var_to_name, observed,
52
+ constraints , name, systems, defaults)
55
53
end
56
54
end
57
55
58
56
function OptimizationSystem (op, states, ps;
59
57
observed = [],
60
- equality_constraints = Equation[],
61
- inequality_constraints = [],
58
+ constraints = [],
62
59
default_u0 = Dict (),
63
60
default_p = Dict (),
64
61
defaults = _merge (Dict (default_u0), Dict (default_p)),
@@ -85,7 +82,7 @@ function OptimizationSystem(op, states, ps;
85
82
isempty (observed) || collect_var_to_name! (var_to_name, (eq. lhs for eq in observed))
86
83
OptimizationSystem (value (op), states, ps, var_to_name,
87
84
observed,
88
- equality_constraints, inequality_constraints ,
85
+ constraints ,
89
86
name, systems, defaults; checks = checks)
90
87
end
91
88
@@ -133,6 +130,13 @@ function DiffEqBase.OptimizationProblem(sys::OptimizationSystem, args...; kwargs
133
130
DiffEqBase. OptimizationProblem {true} (sys:: OptimizationSystem , args... ; kwargs... )
134
131
end
135
132
133
+ function rep_pars_vals! (e:: Expr , p)
134
+ rep_pars_vals! .(e. args, Ref (p))
135
+ replace! (e. args, p... )
136
+ end
137
+
138
+ function rep_pars_vals! (e, p) end
139
+
136
140
"""
137
141
```julia
138
142
function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem,u0map,
@@ -160,9 +164,26 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
160
164
dvs = states (sys)
161
165
ps = parameters (sys)
162
166
167
+ defs = defaults (sys)
168
+ defs = mergedefaults (defs, parammap, ps)
169
+ defs = mergedefaults (defs, u0map, dvs)
170
+
171
+ u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = false )
172
+ p = varmap_to_vars (parammap, ps; defaults = defs, tofloat = false , use_union)
173
+ lb = varmap_to_vars (lb, dvs; check = false , tofloat = false , use_union)
174
+ ub = varmap_to_vars (ub, dvs; check = false , tofloat = false , use_union)
175
+
163
176
f = generate_function (sys, checkbounds = checkbounds, linenumbers = linenumbers,
164
177
expression = Val{false })
165
178
179
+ obj_expr = toexpr (equations (sys))
180
+ pairs_arr = p isa SciMLBase. NullParameters ?
181
+ [Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)] :
182
+ [
183
+ [Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)]. .. ,
184
+ [Symbol (_p) => p[i] for (i, _p) in enumerate (ps)]. .. ,
185
+ ]
186
+ rep_pars_vals! (obj_expr, pairs_arr)
166
187
if grad
167
188
grad_oop, grad_iip = generate_gradient (sys, checkbounds = checkbounds,
168
189
linenumbers = linenumbers,
@@ -190,20 +211,46 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
190
211
hess_prototype = nothing
191
212
end
192
213
193
- _f = DiffEqBase. OptimizationFunction {iip} (f,
194
- SciMLBase. NoAD ();
195
- grad = _grad,
196
- hess = _hess,
197
- hess_prototype = hess_prototype)
214
+ if length (sys. constraints) > 0
215
+ @named cons_sys = NonlinearSystem (sys. constraints, dvs, ps)
216
+ cons = generate_function (cons_sys, checkbounds = checkbounds,
217
+ linenumbers = linenumbers,
218
+ expression = Val{false })[1 ]
219
+ cons_j = generate_jacobian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
220
+ cons_h = generate_hessian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
221
+
222
+ cons_expr = toexpr (equations (cons_sys))
223
+ rep_pars_vals! .(cons_expr, Ref (pairs_arr))
224
+
225
+ if sparse
226
+ cons_jac_prototype = jacobian_sparsity (cons_sys)
227
+ cons_hess_prototype = hessian_sparsity (cons_sys)
228
+ else
229
+ cons_jac_prototype = nothing
230
+ cons_hess_prototype = nothing
231
+ end
198
232
199
- defs = defaults (sys)
200
- defs = mergedefaults (defs, parammap, ps)
201
- defs = mergedefaults (defs, u0map, dvs)
233
+ _f = DiffEqBase. OptimizationFunction {iip} (f,
234
+ SciMLBase. NoAD ();
235
+ grad = _grad,
236
+ hess = _hess,
237
+ hess_prototype = hess_prototype,
238
+ cons = cons,
239
+ cons_j = cons_j,
240
+ cons_h = cons_h,
241
+ cons_jac_prototype = cons_jac_prototype,
242
+ cons_hess_prototype = cons_hess_prototype,
243
+ expr = obj_expr,
244
+ cons_expr = cons_expr)
245
+ else
246
+ _f = DiffEqBase. OptimizationFunction {iip} (f,
247
+ SciMLBase. NoAD ();
248
+ grad = _grad,
249
+ hess = _hess,
250
+ hess_prototype = hess_prototype,
251
+ expr = obj_expr)
252
+ end
202
253
203
- u0 = varmap_to_vars (u0map, dvs; defaults = defs, tofloat = false )
204
- p = varmap_to_vars (parammap, ps; defaults = defs, tofloat = false , use_union)
205
- lb = varmap_to_vars (lb, dvs; check = false , tofloat = false , use_union)
206
- ub = varmap_to_vars (ub, dvs; check = false , tofloat = false , use_union)
207
254
OptimizationProblem {iip} (_f, u0, p; lb = lb, ub = ub, kwargs... )
208
255
end
209
256
@@ -272,18 +319,74 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0,
272
319
p = varmap_to_vars (parammap, ps; defaults = defs, tofloat = false , use_union)
273
320
lb = varmap_to_vars (lb, dvs; check = false , tofloat = false , use_union)
274
321
ub = varmap_to_vars (ub, dvs; check = false , tofloat = false , use_union)
275
- quote
276
- f = $ f
277
- p = $ p
278
- u0 = $ u0
279
- grad = $ _grad
280
- hess = $ _hess
281
- lb = $ lb
282
- ub = $ ub
283
- _f = OptimizationFunction {iip} (f, SciMLBase. NoAD ();
284
- grad = grad,
285
- hess = hess,
286
- hess_prototype = hess_prototype)
287
- OptimizationProblem {$iip} (_f, u0, p; lb = lb, ub = ub, kwargs... )
322
+
323
+ obj_expr = toexpr (equations (sys))
324
+ pairs_arr = p isa SciMLBase. NullParameters ?
325
+ [Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)] :
326
+ [
327
+ [Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)]. .. ,
328
+ [Symbol (_p) => p[i] for (i, _p) in enumerate (ps)]. .. ,
329
+ ]
330
+ rep_pars_vals! (obj_expr, pairs_arr)
331
+
332
+ if length (sys. constraints) > 0
333
+ @named cons_sys = NonlinearSystem (sys. constraints, dvs, ps)
334
+ cons = generate_function (cons_sys, checkbounds = checkbounds,
335
+ linenumbers = linenumbers,
336
+ expression = Val{false })[1 ]
337
+ cons_j = generate_jacobian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
338
+
339
+ cons_h = generate_hessian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
340
+
341
+ cons_expr = toexpr (equations (cons_sys))
342
+ rep_pars_vals! .(cons_expr, Ref (pairs_arr))
343
+
344
+ if sparse
345
+ cons_jac_prototype = jacobian_sparsity (cons_sys)
346
+ cons_hess_prototype = hessian_sparsity (cons_sys)
347
+ else
348
+ cons_jac_prototype = nothing
349
+ cons_hess_prototype = nothing
350
+ end
351
+ quote
352
+ f = $ f
353
+ p = $ p
354
+ u0 = $ u0
355
+ grad = $ _grad
356
+ hess = $ _hess
357
+ lb = $ lb
358
+ ub = $ ub
359
+ cons = $ cons
360
+ cons_j = $ cons_j
361
+ cons_h = $ cons_h
362
+ _f = OptimizationFunction {iip} (f, SciMLBase. NoAD ();
363
+ grad = grad,
364
+ hess = hess,
365
+ hess_prototype = hess_prototype,
366
+ cons = cons,
367
+ cons_j = cons_j,
368
+ cons_h = cons_h,
369
+ cons_jac_prototype = cons_jac_prototype,
370
+ cons_hess_prototype = cons_hess_prototype,
371
+ expr = obj_expr,
372
+ cons_expr = cons_expr)
373
+ OptimizationProblem {$iip} (_f, u0, p; lb = lb, ub = ub, kwargs... )
374
+ end
375
+ else
376
+ quote
377
+ f = $ f
378
+ p = $ p
379
+ u0 = $ u0
380
+ grad = $ _grad
381
+ hess = $ _hess
382
+ lb = $ lb
383
+ ub = $ ub
384
+ _f = OptimizationFunction {iip} (f, SciMLBase. NoAD ();
385
+ grad = grad,
386
+ hess = hess,
387
+ hess_prototype = hess_prototype,
388
+ expr = obj_expr)
389
+ OptimizationProblem {$iip} (_f, u0, p; lb = lb, ub = ub, kwargs... )
390
+ end
288
391
end
289
392
end
0 commit comments