@@ -89,30 +89,43 @@ function linearization_function(sys::AbstractSystem, inputs,
89
89
t0 = current_time (prob)
90
90
inputvals = [p[idx] for idx in input_idxs]
91
91
92
- uf_fun = let fun = prob. f
93
- function uff (du, u, p, t)
94
- SciMLBase. UJacobianWrapper (fun, t, p)(du, u)
95
- end
96
- end
97
- uf_jac = PreparedJacobian {true} (uf_fun, similar (prob. u0), autodiff, prob. u0, DI. Constant (p), DI. Constant (t0))
98
- # observed function is a `GeneratedFunctionWrapper` with iip component
99
- h_jac = PreparedJacobian {true} (h, similar (prob. u0, size (outputs)), autodiff, prob. u0, DI. Constant (p), DI. Constant (t0))
100
- pf_fun = let fun = prob. f, setter = setp_oop (sys, input_idxs)
101
- function pff (du, input, u, p, t)
102
- p = setter (p, input)
103
- SciMLBase. ParamJacobianWrapper (fun, t, u)(du, p)
104
- end
105
- end
106
- pf_jac = PreparedJacobian {true} (pf_fun, similar (prob. u0), autodiff, inputvals, DI. Constant (prob. u0), DI. Constant (p), DI. Constant (t0))
107
92
hp_fun = let fun = h, setter = setp_oop (sys, input_idxs)
108
93
function hpf (du, input, u, p, t)
109
94
p = setter (p, input)
110
95
fun (du, u, p, t)
111
96
return du
112
97
end
113
98
end
114
- hp_jac = PreparedJacobian {true} (hp_fun, similar (prob. u0, size (outputs)), autodiff, inputvals, DI. Constant (prob. u0), DI. Constant (p), DI. Constant (t0))
115
-
99
+ if u0 === nothing
100
+ uf_jac = h_jac = pf_jac = nothing
101
+ T = p isa MTKParameters ? eltype (p. tunable) : eltype (p)
102
+ hp_jac = PreparedJacobian {true} (
103
+ hp_fun, zeros (T, size (outputs)), autodiff, inputvals,
104
+ DI. Constant (prob. u0), DI. Constant (p), DI. Constant (t0))
105
+ else
106
+ uf_fun = let fun = prob. f
107
+ function uff (du, u, p, t)
108
+ SciMLBase. UJacobianWrapper (fun, t, p)(du, u)
109
+ end
110
+ end
111
+ uf_jac = PreparedJacobian {true} (
112
+ uf_fun, similar (prob. u0), autodiff, prob. u0, DI. Constant (p), DI. Constant (t0))
113
+ # observed function is a `GeneratedFunctionWrapper` with iip component
114
+ h_jac = PreparedJacobian {true} (h, similar (prob. u0, size (outputs)), autodiff,
115
+ prob. u0, DI. Constant (p), DI. Constant (t0))
116
+ pf_fun = let fun = prob. f, setter = setp_oop (ssimilarys, input_idxs)
117
+ function pff (du, input, u, p, t)
118
+ p = setter (p, input)
119
+ SciMLBase. ParamJacobianWrapper (fun, t, u)(du, p)
120
+ end
121
+ end
122
+ pf_jac = PreparedJacobian {true} (pf_fun, similar (prob. u0), autodiff, inputvals,
123
+ DI. Constant (prob. u0), DI. Constant (p), DI. Constant (t0))
124
+ hp_jac = PreparedJacobian {true} (
125
+ hp_fun, similar (prob. u0, size (outputs)), autodiff, inputvals,
126
+ DI. Constant (prob. u0), DI. Constant (p), DI. Constant (t0))
127
+ end
128
+
116
129
lin_fun = LinearizationFunction (
117
130
diff_idxs, alge_idxs, input_idxs, length (unknowns (sys)),
118
131
prob, h, u0 === nothing ? nothing : similar (u0), uf_jac, h_jac, pf_jac,
@@ -151,12 +164,14 @@ end
151
164
152
165
function PreparedJacobian {true} (f, buf, autodiff, args... )
153
166
prep = DI. prepare_jacobian (f, buf, autodiff, args... )
154
- return PreparedJacobian {true, typeof(prep), typeof(f), typeof(buf), typeof(autodiff)} (prep, f, buf, autodiff)
167
+ return PreparedJacobian {true, typeof(prep), typeof(f), typeof(buf), typeof(autodiff)} (
168
+ prep, f, buf, autodiff)
155
169
end
156
170
157
171
function PreparedJacobian {false} (f, autodiff, args... )
158
172
prep = DI. prepare_jacobian (f, autodiff, args... )
159
- return PreparedJacobian {true, typeof(prep), typeof(f), Nothing, typeof(autodiff)} (prep, f, nothing )
173
+ return PreparedJacobian {true, typeof(prep), typeof(f), Nothing, typeof(autodiff)} (
174
+ prep, f, nothing )
160
175
end
161
176
162
177
function (pj:: PreparedJacobian{true} )(args... )
@@ -279,14 +294,16 @@ function (linfun::LinearizationFunction)(u, p, t)
279
294
end
280
295
fg_xz = linfun. uf_jac (u, DI. Constant (p), DI. Constant (t))
281
296
h_xz = linfun. h_jac (u, DI. Constant (p), DI. Constant (t))
282
- fg_u = linfun. pf_jac ([p[idx] for idx in linfun. input_idxs], DI. Constant (u), DI. Constant (p), DI. Constant (t))
297
+ fg_u = linfun. pf_jac ([p[idx] for idx in linfun. input_idxs],
298
+ DI. Constant (u), DI. Constant (p), DI. Constant (t))
283
299
else
284
300
linfun. num_states == 0 ||
285
301
error (" Number of unknown variables (0) does not match the number of input unknowns ($(length (u)) )" )
286
302
fg_xz = zeros (0 , 0 )
287
303
h_xz = fg_u = zeros (0 , length (linfun. input_idxs))
288
304
end
289
- h_u = linfun. hp_jac ([p[idx] for idx in linfun. input_idxs], DI. Constant (u), DI. Constant (p), DI. Constant (t))
305
+ h_u = linfun. hp_jac ([p[idx] for idx in linfun. input_idxs],
306
+ DI. Constant (u), DI. Constant (p), DI. Constant (t))
290
307
(f_x = fg_xz[linfun. diff_idxs, linfun. diff_idxs],
291
308
f_z = fg_xz[linfun. diff_idxs, linfun. alge_idxs],
292
309
g_x = fg_xz[linfun. alge_idxs, linfun. diff_idxs],
0 commit comments