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,8 +25,7 @@ function ode_order_lowering(sys::ODESystem)
2425end
2526
2627function ode_order_lowering (eqs, iv, states)
27- var_order = Dict {Variable,Int} ()
28- vars = Variable[]
28+ var_order = OrderedDict {Variable,Int} ()
2929 D = Differential (iv ())
3030 diff_eqs = Equation[]
3131 diff_vars = Variable[]
@@ -38,19 +38,16 @@ function ode_order_lowering(eqs, iv, states)
3838 push! (alge_eqs, eq)
3939 else
4040 var, maxorder = var_from_nested_derivative (eq. lhs)
41- if maxorder > get (var_order, var, 0 )
42- var_order[var] = maxorder
43- any (isequal (var), vars) || push! (vars, var)
44- 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)
4543 var′ = lower_varname (var, iv, maxorder - 1 )
4644 rhs′ = rename_lower_order (eq. rhs)
4745 push! (diff_vars, var′)
4846 push! (diff_eqs, D (var′ (iv ())) ~ rhs′)
4947 end
5048 end
5149
52- for var ∈ vars
53- order = var_order[var]
50+ for (var, order) ∈ var_order
5451 for o in (order- 1 ): - 1 : 1
5552 lvar = lower_varname (var, iv, o- 1 )
5653 rvar = lower_varname (var, iv, o)
0 commit comments