@@ -42,51 +42,53 @@ function generate_initializesystem(sys::AbstractSystem;
4242 diffmap = Dict ()
4343 end
4444
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))
6652 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
7380 end
7481 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
8182
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
9092 end
9193 end
9294
@@ -180,16 +182,24 @@ function generate_initializesystem(sys::AbstractSystem;
180182 pars = Vector {SymbolicParam} (filter (p -> ! haskey (paramsubs, p), parameters (sys)))
181183 is_time_dependent (sys) && push! (pars, get_iv (sys))
182184
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
187190
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))
189201 end
190202
191- eqs_ics = Symbolics. substitute .([eqs_ics; trueobs], (paramsubs,))
192- vars = [vars; collect (values (paramsubs))]
193203 for k in keys (defs)
194204 defs[k] = substitute (defs[k], paramsubs)
195205 end
0 commit comments