@@ -58,9 +58,8 @@ function linearization_function(sys::AbstractSystem, inputs,
58
58
outputs = mapreduce (vcat, outputs; init = []) do var
59
59
symbolic_type (var) == ArraySymbolic () ? collect (var) : [var]
60
60
end
61
- ssys, diff_idxs, alge_idxs, input_idxs = io_preprocessing (sys, inputs, outputs;
62
- simplify,
63
- kwargs... )
61
+ ssys = structural_simplify (sys; inputs, outputs, simplify, kwargs... )
62
+ diff_idxs, alge_idxs = eq_idxs (ssys)
64
63
if zero_dummy_der
65
64
dummyder = setdiff (unknowns (ssys), unknowns (sys))
66
65
defs = Dict (x => 0.0 for x in dummyder)
@@ -87,9 +86,9 @@ function linearization_function(sys::AbstractSystem, inputs,
87
86
88
87
p = parameter_values (prob)
89
88
t0 = current_time (prob)
90
- inputvals = [p[idx ] for idx in input_idxs ]
89
+ inputvals = [prob . ps[i ] for i in inputs ]
91
90
92
- hp_fun = let fun = h, setter = setp_oop (sys, input_idxs )
91
+ hp_fun = let fun = h, setter = setp_oop (sys, inputs )
93
92
function hpf (du, input, u, p, t)
94
93
p = setter (p, input)
95
94
fun (du, u, p, t)
@@ -113,7 +112,7 @@ function linearization_function(sys::AbstractSystem, inputs,
113
112
# observed function is a `GeneratedFunctionWrapper` with iip component
114
113
h_jac = PreparedJacobian {true} (h, similar (prob. u0, size (outputs)), autodiff,
115
114
prob. u0, DI. Constant (p), DI. Constant (t0))
116
- pf_fun = let fun = prob. f, setter = setp_oop (sys, input_idxs )
115
+ pf_fun = let fun = prob. f, setter = setp_oop (sys, inputs )
117
116
function pff (du, input, u, p, t)
118
117
p = setter (p, input)
119
118
SciMLBase. ParamJacobianWrapper (fun, t, u)(du, p)
@@ -127,12 +126,24 @@ function linearization_function(sys::AbstractSystem, inputs,
127
126
end
128
127
129
128
lin_fun = LinearizationFunction (
130
- diff_idxs, alge_idxs, input_idxs, length (unknowns (sys)),
129
+ diff_idxs, alge_idxs, length (unknowns (sys)),
131
130
prob, h, u0 === nothing ? nothing : similar (u0), uf_jac, h_jac, pf_jac,
132
131
hp_jac, initializealg, initialization_kwargs)
133
132
return lin_fun, sys
134
133
end
135
134
135
+ function eq_idxs (sys:: AbstractSystem )
136
+ eqs = equations (sys)
137
+ alg_start_idx = findfirst (! isdiffeq, eqs)
138
+ if alg_start_idx === nothing
139
+ alg_start_idx = length (eqs) + 1
140
+ end
141
+ diff_idxs = 1 : (alg_start_idx - 1 )
142
+ alge_idxs = alg_start_idx: length (eqs)
143
+
144
+ diff_idxs, alge_idxs
145
+ end
146
+
136
147
"""
137
148
$(TYPEDEF)
138
149
@@ -192,7 +203,7 @@ A callable struct which linearizes a system.
192
203
$(TYPEDFIELDS)
193
204
"""
194
205
struct LinearizationFunction{
195
- DI <: AbstractVector{Int} , AI <: AbstractVector{Int} , II , P <: ODEProblem ,
206
+ DI <: AbstractVector{Int} , AI <: AbstractVector{Int} , I , P <: ODEProblem ,
196
207
H, C, J1, J2, J3, J4, IA <: SciMLBase.DAEInitializationAlgorithm , IK}
197
208
"""
198
209
The indexes of differential equations in the linearized system.
@@ -206,7 +217,7 @@ struct LinearizationFunction{
206
217
The indexes of parameters in the linearized system which represent
207
218
input variables.
208
219
"""
209
- input_idxs :: II
220
+ inputs :: I
210
221
"""
211
222
The number of unknowns in the linearized system.
212
223
"""
@@ -281,6 +292,7 @@ function (linfun::LinearizationFunction)(u, p, t)
281
292
end
282
293
283
294
fun = linfun. prob. f
295
+ input_vals = [linfun. prob. ps[i] for i in linfun. inputs]
284
296
if u != = nothing # Handle systems without unknowns
285
297
linfun. num_states == length (u) ||
286
298
error (" Number of unknown variables ($(linfun. num_states) ) does not match the number of input unknowns ($(length (u)) )" )
@@ -294,15 +306,15 @@ function (linfun::LinearizationFunction)(u, p, t)
294
306
end
295
307
fg_xz = linfun. uf_jac (u, DI. Constant (p), DI. Constant (t))
296
308
h_xz = linfun. h_jac (u, DI. Constant (p), DI. Constant (t))
297
- fg_u = linfun. pf_jac ([p[idx] for idx in linfun . input_idxs] ,
309
+ fg_u = linfun. pf_jac (input_vals ,
298
310
DI. Constant (u), DI. Constant (p), DI. Constant (t))
299
311
else
300
312
linfun. num_states == 0 ||
301
313
error (" Number of unknown variables (0) does not match the number of input unknowns ($(length (u)) )" )
302
314
fg_xz = zeros (0 , 0 )
303
- h_xz = fg_u = zeros (0 , length (linfun. input_idxs ))
315
+ h_xz = fg_u = zeros (0 , length (linfun. inputs ))
304
316
end
305
- h_u = linfun. hp_jac ([p[idx] for idx in linfun . input_idxs] ,
317
+ h_u = linfun. hp_jac (input_vals ,
306
318
DI. Constant (u), DI. Constant (p), DI. Constant (t))
307
319
(f_x = fg_xz[linfun. diff_idxs, linfun. diff_idxs],
308
320
f_z = fg_xz[linfun. diff_idxs, linfun. alge_idxs],
@@ -482,9 +494,8 @@ function linearize_symbolic(sys::AbstractSystem, inputs,
482
494
outputs; simplify = false , allow_input_derivatives = false ,
483
495
eval_expression = false , eval_module = @__MODULE__ ,
484
496
kwargs... )
485
- sys, diff_idxs, alge_idxs, input_idxs = io_preprocessing (
486
- sys, inputs, outputs; simplify,
487
- kwargs... )
497
+ sys = structural_simplify (sys; inputs, outputs, simplify, kwargs... )
498
+ diff_idxs, alge_idxs = eq_idxs (sys)
488
499
sts = unknowns (sys)
489
500
t = get_iv (sys)
490
501
ps = parameters (sys; initial_parameters = true )
0 commit comments