100
100
function generate_gradient (sys:: OptimizationSystem , vs = states (sys), ps = parameters (sys);
101
101
kwargs... )
102
102
grad = calculate_gradient (sys)
103
- return build_function (grad, vs, ps;
103
+ pre = get_preprocess_constants (grad)
104
+ return build_function (grad, vs, ps; postprocess_fbody = pre,
104
105
conv = AbstractSysToExpr (sys), kwargs... )
105
106
end
106
107
@@ -115,13 +116,20 @@ function generate_hessian(sys::OptimizationSystem, vs = states(sys), ps = parame
115
116
else
116
117
hess = calculate_hessian (sys)
117
118
end
118
- return build_function (hess, vs, ps;
119
+ pre = get_preprocess_constants (hess)
120
+ return build_function (hess, vs, ps; postprocess_fbody = pre,
119
121
conv = AbstractSysToExpr (sys), kwargs... )
120
122
end
121
123
122
124
function generate_function (sys:: OptimizationSystem , vs = states (sys), ps = parameters (sys);
123
125
kwargs... )
124
- return build_function (equations (sys), vs, ps;
126
+ eqs = equations (sys)
127
+ consts = collect_constants (eqs)
128
+ if ! isempty (consts) # The SymbolicUtils._build_function method of this case doesn't support postprocess_fbody
129
+ csubs = Dict (c => getdefault (c) for c in consts)
130
+ eqs = substitute (eqs, csubs)
131
+ end
132
+ return build_function (eqs, vs, ps;
125
133
conv = AbstractSysToExpr (sys), kwargs... )
126
134
end
127
135
@@ -186,7 +194,6 @@ symbolically calculating numerical enhancements.
186
194
function DiffEqBase. OptimizationProblem (sys:: OptimizationSystem , args... ; kwargs... )
187
195
DiffEqBase. OptimizationProblem {true} (sys:: OptimizationSystem , args... ; kwargs... )
188
196
end
189
-
190
197
function DiffEqBase. OptimizationProblem {iip} (sys:: OptimizationSystem , u0map,
191
198
parammap = DiffEqBase. NullParameters ();
192
199
lb = nothing , ub = nothing ,
@@ -211,8 +218,13 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
211
218
212
219
f = generate_function (sys, checkbounds = checkbounds, linenumbers = linenumbers,
213
220
expression = Val{false })
214
-
215
- obj_expr = toexpr (equations (sys))
221
+ eqs = equations (sys)
222
+ cs = collect_constants (eqs)
223
+ if ! isempty (cs)
224
+ cmap = map (x -> x => getdefault (x), cs)
225
+ eqs = substitute (eqs, cmap)
226
+ end
227
+ obj_expr = toexpr (eqs)
216
228
pairs_arr = p isa SciMLBase. NullParameters ?
217
229
[Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)] :
218
230
[
@@ -254,8 +266,13 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
254
266
expression = Val{false })[2 ]
255
267
cons_j = generate_jacobian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
256
268
cons_h = generate_hessian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
257
-
258
- cons_expr = toexpr (equations (cons_sys))
269
+ eqs = equations (cons_sys)
270
+ cs = collect_constants (eqs)
271
+ if ! isempty (cs)
272
+ cmap = map (x -> x => getdefault (x), cs)
273
+ eqs = map (x -> x. lhs ~ substitute (x. rhs, cmap), eqs)
274
+ end
275
+ cons_expr = toexpr (eqs)
259
276
rep_pars_vals! .(cons_expr, Ref (pairs_arr))
260
277
261
278
if sparse
@@ -265,7 +282,6 @@ function DiffEqBase.OptimizationProblem{iip}(sys::OptimizationSystem, u0map,
265
282
cons_jac_prototype = nothing
266
283
cons_hess_prototype = nothing
267
284
end
268
-
269
285
_f = DiffEqBase. OptimizationFunction {iip} (f,
270
286
sys = sys,
271
287
syms = nameof .(states (sys)),
@@ -360,16 +376,23 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0,
360
376
lb = varmap_to_vars (lb, dvs; check = false , tofloat = false , use_union)
361
377
ub = varmap_to_vars (ub, dvs; check = false , tofloat = false , use_union)
362
378
363
- obj_expr = toexpr (equations (sys))
379
+ eqs = equations (sys)
380
+ cs = collect_constants (eqs)
381
+ if ! isempty (cs)
382
+ cmap = map (x -> x => getdefault (x), cs)
383
+ eqs = substitute (eqs, cmap)
384
+ end
385
+ obj_expr = toexpr (eqs)
364
386
pairs_arr = p isa SciMLBase. NullParameters ?
365
387
[Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)] :
366
388
[
367
389
[Symbol (_s) => Expr (:ref , :x , i) for (i, _s) in enumerate (dvs)]. .. ,
368
390
[Symbol (_p) => p[i] for (i, _p) in enumerate (ps)]. .. ,
369
391
]
370
392
rep_pars_vals! (obj_expr, pairs_arr)
371
-
393
+ @show sys . constraints
372
394
if length (sys. constraints) > 0
395
+
373
396
@named cons_sys = NonlinearSystem (sys. constraints, dvs, ps)
374
397
cons = generate_function (cons_sys, checkbounds = checkbounds,
375
398
linenumbers = linenumbers,
@@ -378,7 +401,13 @@ function OptimizationProblemExpr{iip}(sys::OptimizationSystem, u0,
378
401
379
402
cons_h = generate_hessian (cons_sys; expression = Val{false }, sparse = sparse)[2 ]
380
403
381
- cons_expr = toexpr (equations (cons_sys))
404
+ eqs = equations (cons_sys)
405
+ cs = collect_constants (eqs)
406
+ if ! isempty (cs)
407
+ cmap = map (x -> x => getdefault (x), cs)
408
+ eqs = map (x -> x. lhs ~ substitute (x. rhs, cmap), eqs)
409
+ end
410
+ cons_expr = toexpr (eqs)
382
411
rep_pars_vals! .(cons_expr, Ref (pairs_arr))
383
412
384
413
if sparse
0 commit comments