@@ -10,60 +10,48 @@ function lower_varname(var::Variable, idv, order::Int)
1010 return Variable (name, var. subtype, var. dependents)
1111end
1212
13- function ode_order_lowering (sys:: DiffEqSystem ; kwargs... )
14- eqs = sys. eqs
15- eqs_lowered = ode_order_lowering (eqs; kwargs... )
13+ function ode_order_lowering (sys:: DiffEqSystem )
14+ eqs_lowered = ode_order_lowering (sys. eqs, sys. iv)
1615 DiffEqSystem (eqs_lowered, sys. iv)
1716end
18- ode_order_lowering (eqs) = ode_order_lowering! (deepcopy (eqs))
19- function ode_order_lowering! (eqs)
20- idv = extract_idv (eqs[1 ])
21- D = Differential (idv, 1 )
17+ function ode_order_lowering (eqs, iv)
18+ D = Differential (iv, 1 )
2219 var_order = Dict {Variable,Int} ()
2320 vars = Variable[]
24- dv_name = eqs[ 1 ] . var . subtype
21+ new_eqs = similar ( eqs, DiffEq)
2522
26- for eq in eqs
23+ for (i, eq) ∈ enumerate ( eqs)
2724 var, maxorder = extract_var_order (eq)
2825 maxorder == 1 && continue # fast pass
2926 if maxorder > get (var_order, var, 0 )
3027 var_order[var] = maxorder
3128 var ∈ vars || push! (vars, var)
3229 end
33- lhs_renaming! (eq, D)
34- rhs_renaming! (eq)
30+ eq = lhs_renaming (eq, D)
31+ eq = rhs_renaming (eq)
32+ new_eqs[i] = eq
3533 end
3634
3735 for var ∈ vars
3836 order = var_order[var]
3937 for o in (order- 1 ): - 1 : 1
40- lvar = lower_varname (var, idv , o- 1 )
41- rhs = lower_varname (var, idv , o)
38+ lvar = lower_varname (var, iv , o- 1 )
39+ rhs = lower_varname (var, iv , o)
4240 eq = DiffEq (D, lvar, rhs)
43- push! (eqs , eq)
41+ push! (new_eqs , eq)
4442 end
4543 end
4644
47- return eqs
45+ return new_eqs
4846end
4947
50- function lhs_renaming! (eq:: DiffEq , D)
51- eq. var = lower_varname (eq. D, eq. var, lower= true )
52- eq. D = D
53- return eq
54- end
55- rhs_renaming! (eq:: DiffEq ) = _rec_renaming! (eq. rhs)
48+ lhs_renaming (eq:: DiffEq , D) = DiffEq (D, lower_varname (eq. D, eq. var, lower= true ), eq. rhs)
49+ rhs_renaming (eq:: DiffEq ) = DiffEq (eq. D, eq. var, _rec_renaming (eq. rhs))
5650
57- function _rec_renaming! (rhs)
58- isa (rhs, Operation) && isa (rhs. op, Differential) &&
59- return lower_varname (rhs. op, rhs. args[1 ])
60- if rhs isa Operation
61- args = rhs. args
62- for i in eachindex (args)
63- args[i] = _rec_renaming! (args[i])
64- end
65- end
66- rhs
51+ function _rec_renaming (rhs)
52+ isa (rhs, Operation) || return rhs
53+ isa (rhs. op, Differential) && return lower_varname (rhs. op, rhs. args[1 ])
54+ return Operation (rhs. op, _rec_renaming .(rhs. args))
6755end
6856
6957extract_var_order (eq:: DiffEq ) = (eq. var, eq. D. order)
0 commit comments