@@ -11,9 +11,35 @@ function generate_initializesystem(sys::ODESystem;
1111 default_dd_guess = 0.0 ,
1212 algebraic_only = false ,
1313 check_units = true , check_defguess = false ,
14+ implicit_dae = false ,
1415 name = nameof (sys), kwargs... )
1516 trueobs, eqs = unhack_observed (observed (sys), equations (sys))
1617 vars = unique ([unknowns (sys); getfield .(trueobs, :lhs )])
18+
19+ if implicit_dae
20+ pre_simplification_sys = sys
21+ while get_parent (pre_simplification_sys) != = nothing
22+ pre_simplification_sys = get_parent (pre_simplification_sys)
23+ end
24+ schedule = get_schedule (sys)
25+ if schedule === nothing
26+ throw (ArgumentError (" The system must be structurally simplified to create an initialization system for an implicit DAE." ))
27+ end
28+ old_eqs = equations (pre_simplification_sys)
29+ inv_dummy_sub = Dict ()
30+ for (k, v) in schedule. dummy_sub
31+ if isequal (default_toterm (k), v)
32+ inv_dummy_sub[v] = k
33+ end
34+ end
35+ new_eqs = Symbolics. fast_substitute .([trueobs; eqs], (inv_dummy_sub,))
36+ filter! (eq -> ! isequal (eq. lhs, eq. rhs), new_eqs)
37+ new_sys = ODESystem (new_eqs, get_iv (sys); name = nameof (sys))
38+ new_sys = dummy_derivative (new_sys; to_index_zero = true , array_hack = false , cse_hack = false )
39+ trueobs = observed (new_sys)
40+ eqs = equations (new_sys)
41+ vars = unique ([unknowns (new_sys); getfield .(trueobs, :lhs )])
42+ end
1743 vars_set = Set (vars) # for efficient in-lookup
1844
1945 idxs_diff = isdiffeq .(eqs)
0 commit comments