1+ using DataStructures: OrderedDict
12function lower_varname (var:: Variable , idv, order)
23 order == 0 && return var
34 name = Symbol (var. name, :ˍ , string (idv. name)^ order)
@@ -24,43 +25,42 @@ function ode_order_lowering(sys::ODESystem)
2425end
2526
2627function ode_order_lowering (eqs, iv, states)
27- var_order = Dict {Variable,Int} ()
28- vars = Variable[]
29- new_eqs = Equation[]
30- new_vars = Variable[]
28+ var_order = OrderedDict {Variable,Int} ()
3129 D = Differential (iv ())
30+ diff_eqs = Equation[]
31+ diff_vars = Variable[]
32+ alge_eqs = Equation[]
33+ alge_vars = Variable[]
3234
3335 for (i, (eq, ss)) ∈ enumerate (zip (eqs, states))
3436 if isequal (eq. lhs, Constant (0 ))
35- push! (new_vars , ss)
36- push! (new_eqs , eq)
37+ push! (alge_vars , ss)
38+ push! (alge_eqs , eq)
3739 else
3840 var, maxorder = var_from_nested_derivative (eq. lhs)
39- if maxorder > get (var_order, var, 0 )
40- var_order[var] = maxorder
41- any (isequal (var), vars) || push! (vars, var)
42- end
41+ # only save to the dict when we need to lower the order to save memory
42+ maxorder > get (var_order, var, 1 ) && (var_order[var] = maxorder)
4343 var′ = lower_varname (var, iv, maxorder - 1 )
4444 rhs′ = rename_lower_order (eq. rhs)
45- push! (new_vars , var′)
46- push! (new_eqs , D (var′ (iv ())) ~ rhs′)
45+ push! (diff_vars , var′)
46+ push! (diff_eqs , D (var′ (iv ())) ~ rhs′)
4747 end
4848 end
4949
50- for var ∈ vars
51- order = var_order[var]
50+ for (var, order) ∈ var_order
5251 for o in (order- 1 ): - 1 : 1
5352 lvar = lower_varname (var, iv, o- 1 )
5453 rvar = lower_varname (var, iv, o)
55- push! (new_vars , lvar)
54+ push! (diff_vars , lvar)
5655
5756 rhs = rvar (iv ())
5857 eq = Differential (iv ())(lvar (iv ())) ~ rhs
59- push! (new_eqs , eq)
58+ push! (diff_eqs , eq)
6059 end
6160 end
6261
63- return (new_eqs, new_vars)
62+ # we want to order the equations and variables to be `(diff, alge)`
63+ return (vcat (diff_eqs, alge_eqs), vcat (diff_vars, alge_vars))
6464end
6565
6666function rename_lower_order (O:: Expression )
0 commit comments