@@ -42,51 +42,53 @@ function generate_initializesystem(sys::AbstractSystem;
42
42
diffmap = Dict ()
43
43
end
44
44
45
- if has_schedule (sys) && (schedule = get_schedule (sys); ! isnothing (schedule))
46
- # 2) process dummy derivatives and u0map into initialization system
47
- # prepare map for dummy derivative substitution
48
- for x in filter (x -> ! isnothing (x[1 ]), schedule. dummy_sub)
49
- # set dummy derivatives to default_dd_guess unless specified
50
- push! (defs, x[1 ] => get (guesses, x[1 ], default_dd_guess))
51
- end
52
- function process_u0map_with_dummysubs (y, x)
53
- y = get (schedule. dummy_sub, y, y)
54
- y = fixpoint_sub (y, diffmap)
55
- if y ∈ vars_set
56
- # variables specified in u0 overrides defaults
57
- push! (defs, y => x)
58
- elseif y isa Symbolics. Arr
59
- # TODO : don't scalarize arrays
60
- merge! (defs, Dict (scalarize (y .=> x)))
61
- elseif y isa Symbolics. BasicSymbolic
62
- # y is a derivative expression expanded; add it to the initialization equations
63
- push! (eqs_ics, y ~ x)
64
- else
65
- error (" Initialization expression $y is currently not supported. If its a higher order derivative expression, then only the dummy derivative expressions are supported." )
45
+ if is_time_dependent (sys)
46
+ if has_schedule (sys) && (schedule = get_schedule (sys); ! isnothing (schedule))
47
+ # 2) process dummy derivatives and u0map into initialization system
48
+ # prepare map for dummy derivative substitution
49
+ for x in filter (x -> ! isnothing (x[1 ]), schedule. dummy_sub)
50
+ # set dummy derivatives to default_dd_guess unless specified
51
+ push! (defs, x[1 ] => get (guesses, x[1 ], default_dd_guess))
66
52
end
67
- end
68
- for (y, x) in u0map
69
- if Symbolics. isarraysymbolic (y)
70
- process_u0map_with_dummysubs .(collect (y), collect (x))
71
- else
72
- process_u0map_with_dummysubs (y, x)
53
+ function process_u0map_with_dummysubs (y, x)
54
+ y = get (schedule. dummy_sub, y, y)
55
+ y = fixpoint_sub (y, diffmap)
56
+ if y ∈ vars_set
57
+ # variables specified in u0 overrides defaults
58
+ push! (defs, y => x)
59
+ elseif y isa Symbolics. Arr
60
+ # TODO : don't scalarize arrays
61
+ merge! (defs, Dict (scalarize (y .=> x)))
62
+ elseif y isa Symbolics. BasicSymbolic
63
+ # y is a derivative expression expanded; add it to the initialization equations
64
+ push! (eqs_ics, y ~ x)
65
+ else
66
+ error (" Initialization expression $y is currently not supported. If its a higher order derivative expression, then only the dummy derivative expressions are supported." )
67
+ end
68
+ end
69
+ for (y, x) in u0map
70
+ if Symbolics. isarraysymbolic (y)
71
+ process_u0map_with_dummysubs .(collect (y), collect (x))
72
+ else
73
+ process_u0map_with_dummysubs (y, x)
74
+ end
75
+ end
76
+ else
77
+ # 2) System doesn't have a schedule, so dummy derivatives don't exist/aren't handled (SDESystem)
78
+ for (k, v) in u0map
79
+ defs[k] = v
73
80
end
74
81
end
75
- else
76
- # 2) System doesn't have a schedule, so dummy derivatives don't exist/aren't handled (SDESystem)
77
- for (k, v) in u0map
78
- defs[k] = v
79
- end
80
- end
81
82
82
- # 3) process other variables
83
- for var in vars
84
- if var ∈ keys (defs)
85
- push! (eqs_ics, var ~ defs[var])
86
- elseif var ∈ keys (guesses)
87
- push! (defs, var => guesses[var])
88
- elseif check_defguess
89
- error (" Invalid setup: variable $(var) has no default value or initial guess" )
83
+ # 3) process other variables
84
+ for var in vars
85
+ if var ∈ keys (defs)
86
+ push! (eqs_ics, var ~ defs[var])
87
+ elseif var ∈ keys (guesses)
88
+ push! (defs, var => guesses[var])
89
+ elseif check_defguess
90
+ error (" Invalid setup: variable $(var) has no default value or initial guess" )
91
+ end
90
92
end
91
93
end
92
94
@@ -180,16 +182,24 @@ function generate_initializesystem(sys::AbstractSystem;
180
182
pars = Vector {SymbolicParam} (filter (p -> ! haskey (paramsubs, p), parameters (sys)))
181
183
is_time_dependent (sys) && push! (pars, get_iv (sys))
182
184
183
- # 8) use observed equations for guesses of observed variables if not provided
184
- for eq in trueobs
185
- haskey (defs, eq. lhs) && continue
186
- any (x -> isequal (default_toterm (x), eq. lhs), keys (defs)) && continue
185
+ if is_time_dependent (sys)
186
+ # 8) use observed equations for guesses of observed variables if not provided
187
+ for eq in trueobs
188
+ haskey (defs, eq. lhs) && continue
189
+ any (x -> isequal (default_toterm (x), eq. lhs), keys (defs)) && continue
187
190
188
- defs[eq. lhs] = eq. rhs
191
+ defs[eq. lhs] = eq. rhs
192
+ end
193
+ append! (eqs_ics, trueobs)
194
+ end
195
+
196
+ eqs_ics = Symbolics. substitute .(eqs_ics, (paramsubs,))
197
+ if is_time_dependent (sys)
198
+ vars = [vars; collect (values (paramsubs))]
199
+ else
200
+ vars = collect (values (paramsubs))
189
201
end
190
202
191
- eqs_ics = Symbolics. substitute .([eqs_ics; trueobs], (paramsubs,))
192
- vars = [vars; collect (values (paramsubs))]
193
203
for k in keys (defs)
194
204
defs[k] = substitute (defs[k], paramsubs)
195
205
end
0 commit comments