1- extract_idv (eq:: Equation ) = eq. lhs. diff . x
1+ extract_idv (eq:: Equation ) = eq. lhs. op . x
22
3- function lower_varname (var:: Variable , naming_scheme; lower= false )
4- D = var. diff
5- D === nothing && return var
3+ function lower_varname (O:: Operation , naming_scheme; lower= false )
4+ @assert isa (O. op, Differential)
5+
6+ D, x = O. op, O. args[1 ]
67 order = lower ? D. order- 1 : D. order
7- lower_varname (var. name, D. x, order, var. subtype, naming_scheme)
8+
9+ lower_varname (x, D. x, order, naming_scheme)
810end
9- function lower_varname (sym:: Symbol , idv, order:: Int , subtype:: Symbol , naming_scheme)
11+ function lower_varname (var:: Variable , idv, order:: Int , naming_scheme)
12+ sym = var. name
1013 name = order == 0 ? sym : Symbol (sym, naming_scheme, string (idv. name)^ order)
11- return Variable (name, subtype= subtype )
14+ return Variable (name, var . subtype, var . dependents )
1215end
1316
1417function ode_order_lowering (sys:: DiffEqSystem ; kwargs... )
@@ -19,31 +22,34 @@ function ode_order_lowering(sys::DiffEqSystem; kwargs...)
1922end
2023ode_order_lowering (eqs; naming_scheme = " _" ) = ode_order_lowering! (deepcopy (eqs), naming_scheme)
2124function ode_order_lowering! (eqs, naming_scheme)
22- ind = findfirst (x-> ! (isintermediate (x)), eqs)
23- idv = extract_idv (eqs[ind])
25+ idv = extract_idv (eqs[1 ])
2426 D = Differential (idv, 1 )
25- sym_order = Dict {Symbol, Int} ()
26- dv_name = eqs[1 ]. lhs. subtype
27+ var_order = Dict {Variable,Int} ()
28+ vars = Variable[]
29+ dv_name = eqs[1 ]. lhs. args[1 ]. subtype
30+
2731 for eq in eqs
28- isintermediate (eq) && continue
29- sym, maxorder = extract_symbol_order (eq)
32+ var, maxorder = extract_var_order (eq)
3033 maxorder == 1 && continue # fast pass
31- if maxorder > get (sym_order, sym, 0 )
32- sym_order[sym] = maxorder
34+ if maxorder > get (var_order, var, 0 )
35+ var_order[var] = maxorder
36+ var ∈ vars || push! (vars, var)
3337 end
34- eq = lhs_renaming! (eq, D, naming_scheme)
35- eq = rhs_renaming! (eq, naming_scheme)
38+ lhs_renaming! (eq, D, naming_scheme)
39+ rhs_renaming! (eq, naming_scheme)
3640 end
37- for sym in keys (sym_order)
38- order = sym_order[sym]
41+
42+ for var ∈ vars
43+ order = var_order[var]
3944 for o in (order- 1 ): - 1 : 1
40- lhs = D (lower_varname (sym , idv, o- 1 , dv_name , naming_scheme))
41- rhs = lower_varname (sym , idv, o, dv_name , naming_scheme)
45+ lhs = D (lower_varname (var , idv, o- 1 , naming_scheme))
46+ rhs = lower_varname (var , idv, o, naming_scheme)
4247 eq = Equation (lhs, rhs)
4348 push! (eqs, eq)
4449 end
4550 end
46- eqs
51+
52+ return eqs
4753end
4854
4955function lhs_renaming! (eq, D, naming_scheme)
5359rhs_renaming! (eq, naming_scheme) = _rec_renaming! (eq. rhs, naming_scheme)
5460
5561function _rec_renaming! (rhs, naming_scheme)
56- rhs isa Variable && rhs. diff != nothing && return lower_varname (rhs, naming_scheme)
62+ isa ( rhs, Operation) && isa ( rhs. op, Differential) && return lower_varname (rhs, naming_scheme)
5763 if rhs isa Operation
5864 args = rhs. args
5965 for i in eachindex (args)
@@ -63,12 +69,12 @@ function _rec_renaming!(rhs, naming_scheme)
6369 rhs
6470end
6571
66- function extract_symbol_order (eq)
72+ function extract_var_order (eq)
6773 # We assume that the differential with the highest order is always going to be in the LHS
6874 dv = eq. lhs
69- sym = dv. name
70- order = dv. diff . order
71- sym , order
75+ var = dv. args[ 1 ]
76+ order = dv. op . order
77+ return (var , order)
7278end
7379
7480export ode_order_lowering
0 commit comments